ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hello world的简要分析

2022-06-15 21:02:43  阅读:186  来源: 互联网

标签:简要 R0 kLPUART MPU BOARD world main config hello


今天在公司忙了一天,快累死了,回来依然不能阻止我研究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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有