请选择 进入手机版 | 继续访问电脑版
搜索

1

主题

2

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-6-26 15:08:05 7699 浏览 1 回复

4412裸机程序开发,协处理器寄存器TTBCR操作不正常

我使用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 |= (1U << 31);
        //SH1 OUTER SHARE
        ttbcr |= (2U << 28);
        //ORGN1 Normal memory, Outer Write-Back Write-Allocate Cacheable
        ttbcr |= (1U << 26);
        //IRGN1 Normal memory, Outer Write-Back Write-Allocate Cacheable
        ttbcr |= (1U << 24);
        //EPD1 生成转换错误TTBR1
        ttbcr |= (1U << 23);
        //A1 TTBR1定义了ASID
        ttbcr |= (1U << 22);
        //T1SZ = 2 T0SZ= 0  用户空间0-3G,内核空间3G-4G
        ttbcr |= (2U << 16);


        //SH0 OUTER SHARE
        ttbcr |= (2U << 12);
        //ORGN0        Normal memory, Outer Write-Back Write-Allocate Cacheable
        ttbcr |= (1U << 10);
        //IRGN0 Normal memory, Outer Write-Back Write-Allocate Cacheable
        ttbcr |= (1U << 8);
        //EPD0生成转换错误TTBR1
        ttbcr |= (1U << 7);
        //T0SZ = 0    T1SZ = 2  用户空间0-3G,内核空间3G-4G
        ttbcr |= (0U << 0);

        v = write_ttbcr(ttbcr);
        __asm__ __volatile__("dsb");
        __asm__ __volatile__("isb");
        uart_putcs(2,"\r\nttbcr: ");
        uart_put32Hex(v);
        uart_putcs(2,"\r\n");

        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

程序如上,还请各位大神帮忙排查下问题,各种资料都查了,实在找不到问题了。

回复

使用道具 举报

1

主题

2

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2022-6-26 15:34:00
对了,忘了说,cpsr的值为600001D3,是SVC模式
回复 点赞

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

 
快速回复 返回顶部 返回列表