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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

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》前者工程用于bootboot的主要功能是引导后面的app

2.修改代码

代码的执行流程为boot引导appboot阶段启动时向串口输出调试信息“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 application's 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路径中

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

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

5.修改FM33LG04X.icf链接文件

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

 

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

6.编译工程

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

7.查看map文件

其中

A0是向量表所属地址0x00004000

P1是代码段所属地址0x00004000

P2是堆栈段所属地址0x20000000表示RAM的CSTACKHEAP

8.调试程序

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

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6