大家把开发上电初始化代码过程中的出错的情况贴出来share一下
设置PMC_MCKR寄存器后,应该等待PMC_SR寄存器的MCKRDY位是否置位.(我错把PMC_SCSR寄存器当成PMC_SR寄存器)
偶写代码时,将PMC的基址错写成偏移量,而且基址是非法立即数,应用ldr指令,而不该用mov指令,以及宏定义PMC_MCKR的地址写错了。标号最好用小写,而且最好标号尽可能清晰些,这两点我也没做到
我在操作PMC_MCKR寄存器犯了另外一个错误,结果调试时,卡了好久 。操作如下mov r1, #0x2 @MCKR的CSS域 = 2ldr r1,[r0, #MCKR]....mov r1, #0x100 @原以为执行后CSS域保持2,但是实际执行后MCKR的CSS域会被清零,程序出错ldr r1,[r0, #MCKR]
at91sam9261的许多寄存器是写使能、写清除 分开并支持写‘0’无效的,但是PMC_MCKR却是普通的读写,所以对该寄存器操作时应该根据寄存器的特性设置,切不可凭偶尔经验。
[ 本帖最后由 lasting007 于 2010-1-17 00:40 编辑 ]
偶犯的其中一个错误和lasting相同,操作PMC_MCKR寄存器出错,在写PMC_MCKR的PRES位将CSS位覆盖而没有重新设置。还有就是对立即数的操作方面,比如将16进制的立即数写成了10进制。
小结:在写代码时一定得细心,不要急躁,出了错误不要手忙脚乱,理清自己的思路,有条理的调试才对。在调试的时候,自己的心态没摆好,调试过程中一点逻辑都没有,简直是个大白痴一样,囧
[ 本帖最后由 HELLO_MAX 于 2010-1-17 01:41 编辑 ]
在初始化dbug时我不小心把PIO_PDR写成PIO_PER,导致串口无输出
在这次的代码中。我的代码里出现在三个问题: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 编辑 ]
我在写PMC_IER时候把0x701写成了0x001最后写的死循环写成了sub pc, pc, #-8导致串口不断输出
我是贾亮暂时还没自己ID借用下lasting的。我的问题:一开始由于设置宏的时候没有按照标准,把R0设置成了BASE+OFSET,给之后的调试增加了很多的难度.又由于在几个参数设置后没有等待导致串口无法输出.最后输出是有了,但是我输入的是'H',输出的是l.
1.上电初始化时最重要也最容易犯的错误就是初始化各个寄存器的流程以及中间的等待过程, 我就是在编写代码时就是对MCKR这个寄存器的初始顺序不对而调了好久, 后来仔细读了手册后才得以纠正。 关于MCKR寄存器的初始化时这样的, 它分为三个域:CSS[1:0], PRES[4:2],MDIV[9:8], 流程是这样的: 如果使用PLL提供时钟的话, 要先对PRES域赋值,然后等待MCKR enable, 然后在对CSS域赋值, 再等待MCKR enbale, 才可以使用。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(9)
设置PMC_MCKR寄存器后,应该等待PMC_SR寄存器的MCKRDY位是否置位.(我错把PMC_SCSR寄存器当成PMC_SR寄存器)
偶写代码时,将PMC的基址错写成偏移量,而且基址是非法立即数,应用ldr指令,而不该用mov指令,以及宏定义PMC_MCKR的地址写错了。标号最好用小写,而且最好标号尽可能清晰些,这两点我也没做到
我在操作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 编辑 ]
偶犯的其中一个错误和lasting相同,操作PMC_MCKR寄存器出错,在写PMC_MCKR的PRES位将CSS位覆盖而没有重新设置。
还有就是对立即数的操作方面,比如将16进制的立即数写成了10进制。
小结:在写代码时一定得细心,不要急躁,出了错误不要手忙脚乱,理清自己的思路,有条理的调试才对。在
调试的时候,自己的心态没摆好,调试过程中一点逻辑都没有,简直是个大白痴一样,囧
[ 本帖最后由 HELLO_MAX 于 2010-1-17 01:41 编辑 ]
在初始化dbug时我不小心把PIO_PDR写成PIO_PER,导致串口无输出
在这次的代码中。我的代码里出现在三个问题:
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 编辑 ]
我在写PMC_IER时候把0x701写成了0x001
最后写的死循环写成了sub pc, pc, #-8导致串口不断输出
我是贾亮暂时还没自己ID借用下lasting的。
我的问题:
一开始由于设置宏的时候没有按照标准,把R0设置成了BASE+OFSET,给之后的调试增加了很多的难度.又由于在几个参数设置后没有等待导致串口无法输出.最后输出是有了,但是我输入的是'H',输出的是l.
1.上电初始化时最重要也最容易犯的错误就是初始化各个寄存器的流程以及中间的等待过程, 我就是在编写代码时就是对MCKR这个寄存器的初始顺序不对而调了好久, 后来仔细读了手册后才得以纠正。 关于MCKR寄存器的初始化时这样的, 它分为三个域:CSS[1:0], PRES[4:2],MDIV[9:8], 流程是这样的: 如果使用PLL提供时钟的话, 要先对PRES域赋值,然后等待MCKR enable, 然后在对CSS域赋值, 再等待MCKR enbale, 才可以使用。