contex-m基于IAR工程从boot阶段引导app

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了contex-m基于IAR工程从boot阶段引导app相关的知识,希望对你有一定的参考价值。


目录

​​1.修改工程​​

​​2.修改代码​​

​​Boot代码​​

​​App代码​​

​​3.修改FM33LG04x.icf​​

​​4.修改IAR工程icf配置路径​​

​​5.修改FM33LG04X.icf链接文件​​

​​6.编译工程​​

​​7.查看map文件​​

​​8.调试程序​​


1.修改工程

本次调试的demo为《UART0 DMA发送_串口中断示例》,以下修改都是基于该工程;将工程分别重命名为《UART0 DMA发送_串口中断示例-boot》,《UART0 DMA发送_串口中断示例-app》,前者工程用于boot,boot的主要功能是引导后面的app;

2.修改代码

代码的执行流程为,boot引导app,boot阶段启动时向串口输出调试信息“bootload app start”,然后获取app在flash中的app地址(0x00004000),地址的内容即为app的向量表+程序代码,所以0x00004000+4,即指向的是Reset_Handler函数,设置堆栈,执行Reset_Handler函数即完成了跳转

Boot代码

int main(void)

/* Initialize FL Driver Library */
FL_Init();

/* Configure the system clock */
MF_Clock_Init();

/* Initialize all configured peripherals */
MF_Config_Init();

DMA_Uart0_TX();
FL_DelayMs(1000); //一定要延时,否则boot的调试信息会被app的调试信息覆盖

/*boot跳转到app*/
boot_jump_app();

while(1)

//DMA_Uart0_TX();
//FL_DelayMs(1000);


void DMA_Uart0_TX(void)

static uint8_t TestTxData[] = "bootload app start!";

FL_UART_SetTXIFMode(UART0, FL_UART_TXIF_MODE_AFTER_DMA); //DMA妯″紡涓嬪彂閫佸畬鏈€鍚庝竴甯ф暟鎹?鍚庯紝鍏佽?镐腑鏂?淇″彿杈撳嚭

FL_DMA_Enable(DMA);

Uart0DMA_Config(TestTxData, sizeof(TestTxData));

FL_UART_EnableTX(UART0);

#define APP_START_ADDRESS 0x00004000  //app在flash中位置

typedef void (*pFunction)(void);

void boot_jump_app(void)

unsigned int dwIapToAppAddr;
pFunction pfIapToAppFun;

__disable_irq();
dwIapToAppAddr = *(__IO unsigned int*) (APP_START_ADDRESS + 4);//获取APP Reset_Handler
pfIapToAppFun = (pFunction) dwIapToAppAddr;
/* Initialize user applications Stack Pointer */
dwIapToAppAddr = *(__IO unsigned int*) APP_START_ADDRESS;
__set_MSP(*(__IO unsigned int*) APP_START_ADDRESS);//设置APP堆栈
pfIapToAppFun();

App代码

int main(void)

/* Initialize FL Driver Library */
FL_Init();

/* Configure the system clock */
MF_Clock_Init();

/* Initialize all configured peripherals */
MF_Config_Init();

//DMA_Uart0_TX();
while(1)

DMA_Uart0_TX();
FL_DelayMs(1000);


void DMA_Uart0_TX(void)

static uint8_t TestTxData[] = "app running";

FL_UART_SetTXIFMode(UART0, FL_UART_TXIF_MODE_AFTER_DMA); //DMA妯″紡涓嬪彂閫佸畬鏈€鍚庝竴甯ф暟鎹�鍚庯紝鍏佽�镐腑鏂�淇″彿杈撳嚭

FL_DMA_Enable(DMA);

Uart0DMA_Config(TestTxData, sizeof(TestTxData));

FL_UART_EnableTX(UART0);

3.修改FM33LG04x.icf

将2中重命名的两个工程,在其工程目录分别新建icf目录,将IAR工具链路径中的链接配置文件添加到icf目录中,我的IAR安装路径是D:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 8.0\\arm\\config\\linker\\FMSH\\FM33LG04x.icf,所以拷贝FM33LG04x.icf到icf路径中

contex-m基于IAR工程从boot阶段引导app_串口

4.修改IAR工程icf配置路径

boot工程和app工程分别按照如下方式修改:$PROJ_DIR$\\icf\\FM33LG04X.icf

contex-m基于IAR工程从boot阶段引导app_单片机_02

5.修改FM33LG04X.icf链接文件

contex-m基于IAR工程从boot阶段引导app_嵌入式硬件_03

由于boot引导app,ARM Cortex-M架构​​芯片​​​一般带有片上闪存(flash)。ARM Cortex-M手册规定在片上闪存(flash)起始地址处需要有一个有效的中断向量表。芯片上电或复位(会触发reset_Handler中断程序)后,​​cpu​​​首先从中断向量表中读出栈指针(MSP)和入口函数地址(复位向量,即程序执行的起始位置)。将栈指针和入口函数地址载入栈指针(cm0_msp)​​寄存器​​​和寻址寄存器(cm0_pc)后,cpu会从复位向量 (一般是​​ROM​​/FLASH)开始执行程序。 

contex-m基于IAR工程从boot阶段引导app_嵌入式硬件_04

程序镜像=向量表+程序代码,所以app和boot的镜像格式相同,但编译生成的程序镜像在flash的地址不一样,都包括向量表+程序代码。所以,我们通过修改FM33LG04X.icf连接文件可以改变程序映像(向量表+程序代码)在flash的存储位置

contex-m基于IAR工程从boot阶段引导app_堆栈_05

6.编译工程

分别编译app、boot工程,然后下载到contex-m0 mcu中(补充:需要烧录两个程序,分别为boot、app)

7.查看map文件

contex-m基于IAR工程从boot阶段引导app_单片机_06

其中

A0是向量表,所属地址0x00004000

P1是代码段,所属地址0x00004000

P2是堆栈段,所属地址0x20000000,表示RAM的CSTACK,HEAP

contex-m基于IAR工程从boot阶段引导app_程序代码_07

contex-m基于IAR工程从boot阶段引导app_单片机_08

8.调试程序

调试版上电启动,串口工具输出如下信息

contex-m基于IAR工程从boot阶段引导app_嵌入式硬件_09

 

以上是关于contex-m基于IAR工程从boot阶段引导app的主要内容,如果未能解决你的问题,请参考以下文章

Keil中的工程移植到IAR中需要做哪些修改?

IAR修改工程名称Tab键设置

IAR工程STM8S208RB基于ST标准库下按键检测

IAR工程STM8S208RB基于ST标准库独立看门狗(IWDG)

基于IAR6或者IAR7建立STM32开发工程(通过实际测试,使用IAR6.30.4)

IAR工程STM8S208RB基于ST标准库蜂鸣器(BEEP)驱动