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

news2024/10/5 16:22:52

目录

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 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引导app,ARM 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的CSTACK,HEAP

8.调试程序

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初始C语言 - 函数

C语言中函数的分类: 1.库函数:C语言自带的函数,包含大量频繁使用的功能 2.自定义函数:有些库函数没有的,需要程序员自己设计一、库函数通过MSDN、cplusplus.com、cppreference.com这些网站,查看学习函数的作用和用法在使用库函数时…

portswigger靶场中目录遍历

portswigger靶场中目录遍历1.Bp靶场介绍1.1.访问靶场1.2.注意事项2.目录变量漏洞2.1.文件路径遍历2.1.1.开启靶场2.1.2.点击详情2.1.3.抓包2.1.4.修改参数2.1.5.过关2.2.用绝对路径旁路阻止遍历序列2.2.1.开启靶场2.2.2.修改参数2.2.3.过关2.3.非递归地剥离遍历序列2.3.1.开启靶…

Windows下让Qt5 QCamera响应UVC摄像头硬件按钮拍图

QCamera相机类提供了一些基本的功能,包括拍照和录制功能(Windows不支持录制视频),但也有很多接口是没有封装的,比如有些UVC摄像头有物理按键,可以进行拍图等操作,但是QCamera没法响应硬件按钮的…

通信原理与MATLAB(十五):码间干扰和无码间干扰条件

目录1.码间干扰2.无码间干扰条件2.1 时域条件2.2 频域条件3.满足无码间干扰条件的滤波器3.1 理想低通滤波器3.2 余弦滚降滤波器4.不同滚降系数的余弦滚降滤波器时频域图4.1 代码4.2 结果图5.理想低通滤波器和升余弦滚降滤波器(α1)对比1.码间干扰 如下图所示,码间干…

Vue 基础之侦听器

Vue 基础之侦听器描述侦听器侦听器的创建侦听器的应用选项immediate 选项deep 选项未使用 deep 选项使用 deep 选项侦听目标对象中的单个属性描述 项目描述IDEVScode操作系统Windows 10 专业版Vue.js2.6.12 侦听器 侦听器允许开发者对数据进行监视,并指定数据发生…

数据分析-深度学习 Pytorch Day4

一:概述当你想训练好一个神经网络时,你需要做好三件事情:一个合适的网络结构,一个合适的训练算法,一个合适的训练技巧:合适的网络结构:包括网络结构和激活函数,你可以选择更深的卷积…

打工人必学的法律知识(四)——《中华人民共和国劳动法》

中华人民共和国劳动法http://www.npc.gov.cn/npc/c30834/201901/ffad2d4ae4da4585a041abf66e74753c.shtml 目录 第一章 总  则 第二章 促进就业 第三章 劳动合同和集体合同 第四章 工作时间和休息休假 第五章 工  资 第六章 劳动安全卫生 第七章 女职工和未…

大数据技术之Hadoop(HDFS)——超详细

第1章 HDFS概述 1.1 HDFS产出背景及定义 1)HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文…

误删照片音视频文件不要担心 几种方法解救慌乱的你 别再病急乱投医啦 [附软件]

误删照片音视频文件不要担心 几种方法解救慌乱的你 方法1:从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差不多的 相册->右上角三个点->设置->云空间 进入云存储空间 点击云盘->我的备份->就能看到你自动上传的照片 相册-&…

【Linux】共享内存

目录 一、共享内存 1.1 申请共享内存块 1.2 释放共享内存块 1.3 挂接共享内存 二、共享内存的使用 2.1 Server端与Client端 2.2 挂接与运行 三、共享内存总结 3.1 共享内存的特点 3.2 共享内存实现访问控制 一、共享内存 共享内存是最快的IPC形式。一旦这样的内存映…

xxl-job原理(版本2.3.1)

一、xxl-job架构图 1、调度中心 ​ 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块。 2、执行器 负责接收调度请求并执行任…

CSS注入 2.0

看过CSS注入1.0的朋友,不相信对CSS注入有了一个概念性的理解,在上一篇文章中我只是简单复现了一下波兰老哥的CSS注入过程,阐述了其大致原理。对于其中很大一部分技术细节,代码细节并未做深入的理解(当时我也看不懂,哈哈…

什么是分布式事务

上一篇文章已经讲完分布式了,那暖男说要讲分布式事务那就一定会讲,只是我估计大家没料到暖男这么快就肝好了吧? 事务想必大家并不陌生,至于什么是 ACID,也是老生常谈了。不过暖男为了保证文章的完整性确保所有人都听得…

uniapp-微信小程序分包操作步骤详解

1、在原来的pages的同级下新建一个目录:package1 (名字自己随便起。想分几个包就建几个新目录。比如package2、package3……) 结构是并列的: 2、把想要放进分包里去的模块都剪切在新目录里面去。 (就是以前全都放在…

移动端 - 搜索组件(suggest篇)

这一篇博客是和 search-input篇 衔接的, 需要的可以看上文 移动端 - 搜索组件(search-list篇) 这里我们需要去封装这么一个组件 先说一下大致的方向: 1. 根据父组件传入的关键字数据发送请求获取后端数据, 进行模板渲染 2. 处理一些边界情况(后端返回数据为空, 初次加载数据…

《小猫猫大课堂》三轮3——字符函数和字符串函数及其模拟实现

宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重…

C语言——自定义类型详解(结构体,联合体,枚举,位段)

专栏:C语言 个人主页:HaiFan. 专栏简介:本专栏主要更新一些C语言的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。 结构体前言一、结构体1.结构体类型的声明2.结构体…

黑马学ElasticSearch(十)

目录: (1)自动补全-安装品分词器 (2)自动补全-自定义分词器 (3)自动补全-DSL实现自动补全查询 (4) 自动补全-修改酒店索引库结构 (5)自动补全…

测试开发——用例篇(如何设计一个测试用例,设计测试用例的一些具体方法)

目录 一、测试用例的基本要素 二、设计测试用例的万能公式 (在没有需求文档的情况下) 1、水杯的测试用例 2、一个网站的登录测试用例 三、基于需求进行测试用例的设计 四、测试用例的具体设计方法 1、等价类 2、边界问题 3、判定表(因果图&#…

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例小总结什么是协程 相对于协程,你可能对进程和线程更为熟悉。进程一般代表一个应用服务,在一个应用服务中可以创建多个…