新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2020-3-10
- 在线时间
- 1 小时
|
1金钱
我自己写了个LED的闪烁程序作为基础,初始化了串口,然后准备初始化MMU时,发现TTBCR寄存器无法正常访问。如果我直接读取TTBCR寄存器的话值为0x0;
如果往里面写0xffffffff的话,读出来为0x37;
如果往里面写0x22的话,读出来为0x22;
从未遇到过这种问题,请大神们帮忙指明方向,感激不敬!
启动代码如下
_start:
dsb
isb
//disable watch dog
ldr r0, =0x10060000
mov r1, #0
str r1, [r0]
bl ledUartInit
//set stack
ldr sp, =0x02050000
bl led_blink
led_blink函数原型如下
void led_blink()
{
u8 uart_num_default = 2;
GPL2CON = 0x00000001;
GPK1CON = 0x00000010;
uart_putcs(uart_num_default,"--hello world!--\r\n");
mmuInit();
uart_putcs(uart_num_default,"--mmuInit End!--\r\n");
while(1)
{}
}
mmuInit 原型如下
T_VOID mmuInit(T_VOID)
{
u32 v = read_cpsr();
uart_putcs(2,"\r\ncpsr: ");
uart_put32Hex(v);
uart_putcs(2,"\r\n");
mmuDisable();
mmuSetTTBCR();
__asm__ __volatile__("dsb");
__asm__ __volatile__("isb");
}
mmuSetTTBCR 原型如下
T_VOID mmuSetTTBCR(T_VOID)
{
u32 v = 0, ttbcr = 0;
v = read_ttbcr();
__asm__ __volatile__("dsb");
__asm__ __volatile__("isb");
uart_putcs(2,"\r\nttbcr: ");
uart_put32Hex(v);
uart_putcs(2,"\r\n");
ttbcr = 0x25C22580;
write_ttbcr(ttbcr);
v = read_ttbcr();
__asm__ __volatile__("dsb");
__asm__ __volatile__("isb");
uart_putcs(2,"\r\nttbcr: ");
uart_put32Hex(v);
uart_putcs(2,"\r\n");
}
write_ttbcr
0x4000089C: SUB sp,sp,#4
0x400008A0: STR r0,[sp,#0]
0x400008A4: LDR r0,[sp,#0]
0x400008A8: MCR p15,0,r0,c2,c0,2
0x400008BC: ADD sp,sp,#4
0x400008C0: BX lr
read_ttbcr
0x40000420: SUB sp,sp,#4
0x40000424: MRC p15,0,r0,c2,c0,2
0x40000428: STR r0,[sp,#0]
0x4000042C: LDR r0,[sp,#0]
0x40000430: ADD sp,sp,#4
0x40000434: BX lr
程序如上,还请各位大神帮忙排查下问题,各种资料都查了,实在找不到问题了。
|
|