其他分享
首页 > 其他分享> > hello world的简要分析

hello world的简要分析

作者:互联网

今天在公司忙了一天,快累死了,回来依然不能阻止我研究1052的热情说到代码运行,一般都是从复位中断开始的,那么我们也从复位中断开始看
代码如下
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main

                CPSID   I               ; Mask interrupts
                LDR     R0, =0xE000ED08
                LDR     R1, =__Vectors
                STR     R1, [R0]
                LDR     R2, [R1]
                MSR     MSP, R2
                LDR     R0, =SystemInit
                BLX     R0
                CPSIE   i               ; Unmask interrupts
                LDR     R0, =__main
                BX      R0
                ENDP


有个很奇怪的数0xE000ED08
可以在m7内核的手册上查到,这是中断向量表的偏移寄存器

<ignore_js_op style="overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: 微软雅黑, 微软雅黑, "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;">

那么复位后的动作就很清楚了,先屏蔽中断,然后加载中断向量表 然后解除屏蔽中断,跳转到SystemInit,跳转到_main(可以理解为到main)
至于这个SystemInit里面是设置看门狗,配置时钟的,以后我们慢慢聊。

main里面主要有
    BOARD_ConfigMPU();
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole(); 这几个函数


其中BOARD_ConfigMPU();主要是设置存储区域保护的
比如MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
就是设置它是第0个区域(最多16个)地址是0xC0000000U  可以获取指令,都可以去访问它,属于设备,不可共享,不可以缓存,大小512MB
下面这个是官方推荐的设置

<ignore_js_op style="overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: 微软雅黑, 微软雅黑, "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;">

BOARD_InitPins();是用来初始化引脚,这个以后再说
BOARD_BootClockRUN();是用来设置各个外设的时钟源,可以在这里修改外设时钟分频
BOARD_InitDebugConsole();就比较神奇了,这个是官方提供用来调试的配置函数(里面比较复杂不太好理解,以后研究研究再分享)
在这里只是配置了串口1的初始化
            lpuart_config_t lpuart_config;
            LPUART_GetDefaultConfig(&lpuart_config);
            lpuart_config.baudRate_Bps = baudRate;
            /* Enable clock and initial UART module follow user configure structure. */
            LPUART_Init((LPUART_Type *)s_debugConsoleIO.ioBase, &lpuart_config, clkSrcFreq);
            LPUART_EnableTx(s_debugConsoleIO.ioBase, true);
            LPUART_EnableRx(s_debugConsoleIO.ioBase, true);


具体配置如下
    config->baudRate_Bps = 115200U;
    config->parityMode = kLPUART_ParityDisabled;
    config->dataBitsCount = kLPUART_EightDataBits;
    config->isMsb = false;
    config->stopBitCount = kLPUART_OneStopBit;
    config->txFifoWatermark = 0;
    config->rxFifoWatermark = 0;
    config->enableRxRTS = false;
    config->enableTxCTS = false;
    config->txCtsConfig = kLPUART_CtsSampleAtStart;
    config->txCtsSource = kLPUART_CtsSourcePin;
    config->rxIdleType = kLPUART_IdleTypeStartBit;
    config->rxIdleConfig = kLPUART_IdleCharacter1;
    config->enableTx = false;
    config->enableRx = false;

接下来就是打印和回显了,在此暂不做讨论今天在公司忙了一天,快累死了,回来依然不能阻止我研究1052的热情说到代码运行,一般都是从复位中断开始的,那么我们也从复位中断开始看
代码如下
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main

                CPSID   I               ; Mask interrupts
                LDR     R0, =0xE000ED08
                LDR     R1, =__Vectors
                STR     R1, [R0]
                LDR     R2, [R1]
                MSR     MSP, R2
                LDR     R0, =SystemInit
                BLX     R0
                CPSIE   i               ; Unmask interrupts
                LDR     R0, =__main
                BX      R0
                ENDP


有个很奇怪的数0xE000ED08
可以在m7内核的手册上查到,这是中断向量表的偏移寄存器

<ignore_js_op style="overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: 微软雅黑, 微软雅黑, "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;">

那么复位后的动作就很清楚了,先屏蔽中断,然后加载中断向量表 然后解除屏蔽中断,跳转到SystemInit,跳转到_main(可以理解为到main)
至于这个SystemInit里面是设置看门狗,配置时钟的,以后我们慢慢聊。

main里面主要有
    BOARD_ConfigMPU();
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole(); 这几个函数


其中BOARD_ConfigMPU();主要是设置存储区域保护的
比如MPU->RBAR = ARM_MPU_RBAR(0, 0xC0000000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);
就是设置它是第0个区域(最多16个)地址是0xC0000000U  可以获取指令,都可以去访问它,属于设备,不可共享,不可以缓存,大小512MB
下面这个是官方推荐的设置

<ignore_js_op style="overflow-wrap: break-word; color: rgb(51, 51, 51); font-family: 微软雅黑, 微软雅黑, "PingFang SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;">

BOARD_InitPins();是用来初始化引脚,这个以后再说
BOARD_BootClockRUN();是用来设置各个外设的时钟源,可以在这里修改外设时钟分频
BOARD_InitDebugConsole();就比较神奇了,这个是官方提供用来调试的配置函数(里面比较复杂不太好理解,以后研究研究再分享)
在这里只是配置了串口1的初始化
            lpuart_config_t lpuart_config;
            LPUART_GetDefaultConfig(&lpuart_config);
            lpuart_config.baudRate_Bps = baudRate;
            /* Enable clock and initial UART module follow user configure structure. */
            LPUART_Init((LPUART_Type *)s_debugConsoleIO.ioBase, &lpuart_config, clkSrcFreq);
            LPUART_EnableTx(s_debugConsoleIO.ioBase, true);
            LPUART_EnableRx(s_debugConsoleIO.ioBase, true);


具体配置如下
    config->baudRate_Bps = 115200U;
    config->parityMode = kLPUART_ParityDisabled;
    config->dataBitsCount = kLPUART_EightDataBits;
    config->isMsb = false;
    config->stopBitCount = kLPUART_OneStopBit;
    config->txFifoWatermark = 0;
    config->rxFifoWatermark = 0;
    config->enableRxRTS = false;
    config->enableTxCTS = false;
    config->txCtsConfig = kLPUART_CtsSampleAtStart;
    config->txCtsSource = kLPUART_CtsSourcePin;
    config->rxIdleType = kLPUART_IdleTypeStartBit;
    config->rxIdleConfig = kLPUART_IdleCharacter1;
    config->enableTx = false;
    config->enableRx = false;

接下来就是打印和回显了,在此暂不做讨论

标签:简要,R0,kLPUART,MPU,BOARD,world,main,config,hello
来源: https://www.cnblogs.com/zhugeanran/p/16379809.html