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;
接下来就是打印和回显了,在此暂不做讨论
代码如下
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;
接下来就是打印和回显了,在此暂不做讨论