Chinaunix

标题: Power-on init code常见错误集 [打印本页]

作者: conke    时间: 2010-01-16 23:33
标题: Power-on init code常见错误集
大家把开发上电初始化代码过程中的出错的情况贴出来share一下
作者: 469412293    时间: 2010-01-17 00:00
设置PMC_MCKR寄存器后,应该等待PMC_SR寄存器的MCKRDY位是否置位.(我错把PMC_SCSR寄存器当成PMC_SR寄存器)
作者: Fancy_Jeans    时间: 2010-01-17 00:33
偶写代码时,将PMC的基址错写成偏移量,而且基址是非法立即数,应用ldr指令,而不该用mov指令,以及宏定义PMC_MCKR的地址写错了。标号最好用小写,而且最好标号尽可能清晰些,这两点我也没做到
作者: lasting007    时间: 2010-01-17 00:38
标题: 回复 #1 conke 的帖子
我在操作PMC_MCKR寄存器犯了另外一个错误,结果调试时,卡了好久 。操作如下
mov r1, #0x2           @MCKR的CSS域 = 2
ldr   r1,[r0, #MCKR]
....
mov r1, #0x100         @原以为执行后CSS域保持2,但是实际执行后MCKR的CSS域会被清零,程序出错
ldr   r1,[r0, #MCKR]

at91sam9261的许多寄存器是写使能、写清除 分开并支持写‘0’无效的,但是PMC_MCKR却是普通的读写,所以对该寄存器操作时应该根据寄存器的特性设置,切不可凭偶尔经验。

[ 本帖最后由 lasting007 于 2010-1-17 00:40 编辑 ]
作者: HELLO_MAX    时间: 2010-01-17 01:33
标题: 回复 #1 conke 的帖子
偶犯的其中一个错误和lasting相同,操作PMC_MCKR寄存器出错,在写PMC_MCKR的PRES位将CSS位覆盖而没有重新设置。
还有就是对立即数的操作方面,比如将16进制的立即数写成了10进制。

小结:在写代码时一定得细心,不要急躁,出了错误不要手忙脚乱,理清自己的思路,有条理的调试才对。在
调试的时候,自己的心态没摆好,调试过程中一点逻辑都没有,简直是个大白痴一样,囧

[ 本帖最后由 HELLO_MAX 于 2010-1-17 01:41 编辑 ]
作者: CFA8888    时间: 2010-01-17 01:37
在初始化dbug时我不小心把PIO_PDR写成PIO_PER,导致串口无输出
作者: taoxie17    时间: 2010-01-17 02:41
在这次的代码中。我的代码里出现在三个问题:
1。DEBG_CR中BIT4,和BIT6都要至1,但看错了,所以写成了0x30,应该改为0x50。
2。PMC_MCKR的CSS域,选择的plla,应该是写2的,但却写成了1。
3。最主要的指令错误,ldr,str指令出错.

eg:
       ldr r0, str
       ldr r1, [r0]     @1  这里涉及到时问题是对齐。 每次取一个字(四字节)
       .....
       str r1, ......
      add r0, r0, #1  @2  而这里地址每次加一. 这样一来,先不说结果正确与否,从逻辑上来说都是错的。
      .....
      str:
          .word hello
      hello:
          .asciz "hello,abcd!\n"

分析错误:1。逻辑/指令上的错误 @1处每次取一个字(四字节),而@2处每次加一个字节地址,导致,ldr/str指令不对齐。
           2. 结果错误..        @1处的原意是要每次取一个字节,然后通过串口写出,显示,再执得地址加一.取字节指令:ldrb。存储字节指令:strb。

[ 本帖最后由 taoxie17 于 2010-1-17 10:11 编辑 ]
作者: crosszhang    时间: 2010-01-17 08:32
我在写PMC_IER时候把0x701写成了0x001
最后写的死循环写成了sub pc, pc, #-8导致串口不断输出

作者: lasting007    时间: 2010-01-17 09:48
我是贾亮暂时还没自己ID借用下lasting的。
我的问题:
一开始由于设置宏的时候没有按照标准,把R0设置成了BASE+OFSET,给之后的调试增加了很多的难度.又由于在几个参数设置后没有等待导致串口无法输出.最后输出是有了,但是我输入的是'H',输出的是l.
作者: paocaka    时间: 2010-01-17 10:12
1.上电初始化时最重要也最容易犯的错误就是初始化各个寄存器的流程以及中间的等待过程, 我就是在编写代码时就是对MCKR这个寄存器的初始顺序不对而调了好久, 后来仔细读了手册后才得以纠正。 关于MCKR寄存器的初始化时这样的, 它分为三个域:CSS[1:0], PRES[4:2],MDIV[9:8], 流程是这样的: 如果使用PLL提供时钟的话, 要先对PRES域赋值,然后等待MCKR enable, 然后在对CSS域赋值, 再等待MCKR enbale, 才可以使用。
作者: syukayo    时间: 2010-01-17 10:12
1. 遇到问题:
        程序中发送20个字符c给uart, 屏幕上显示20个问号.

2. 解决方案
        首先以为是波特率设置有误, 修改几个值后发现问题如故. 于是开始检查clock初始化设置. 结果发现在设置CKGR_PLLAR锁相环寄存器值上有问题,只填了几个有大小的因子值,忘记了第29位必须置为1的条件,导致CLOCK初始化错误。置1后程序正常。
作者: stevenwang87061    时间: 2010-01-17 12:03
在串口输出中,需要把输出的值str到DBGU_THR中,我错误的认为是ldr进去,导致信息打印不出来。
作者: setset01    时间: 2010-01-17 12:14
标题: 初级问题
这次下bootloader精简版..主要出现了以下几个致命错误,耽误了很多时间......

1)写代码时,完全没有考虑代码运行环境,栈没有初始化就用上,结果sp(r13)默认是0,把代码段的代码覆盖了(没有开启MMU).......还好没酿成大错..(上面的代码都执行了。而且不要重复执行.....)

2)另外,在写代码的时候,封装不完整,(框架没想好)。

3)而在烧录的时候犯了一个致命的错误,没有检查文件是否是最新的就直接烧。。~.~| 失败了好多回才发现
作者: setset01    时间: 2010-01-17 12:30
更正下观点,上面是从代码的执行结果看的。
1)2)是致命错误
3)是低级错误。
作者: hanfengqq    时间: 2010-01-17 23:39
我调试时遇到的错误是只设了Debug unit的基值,而没有设GPIO的基值。
作者: sonmous_long    时间: 2010-01-18 02:15
1, 直接用ldr r0, #PMC_BASE。
2,忘了对引脚的初始化。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2