c语言串口通信_STM32串口IAP分享
点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!
什么是IAP?
IAP
是In Application Programming
的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
在重新编程过程中可以使用任意类型的通信协议,如UART、I2S、SPI等。这篇笔记分享的是使用UART方式IAP。
串口IAP实验
先理一理流程(本实验是以STM32F103ZET6
为例):
1、实验说明
做这个实验需要准备两个keil
工程,一个工程用于编写IAP程序,另一个工程用于编写我们的应用程序(要实现某些功能的程序),这里我们以一个点灯程序为例。最终,两份工程编译出来的可执行文件都需要烧写到芯片的FLASH
中。只不过需要烧写到不同的地址,简单的示意图如下:
这里,使用的STM32的型号为STM32F103ZET6,其FLASH大小是512KB,0x08000000为其FLASH被映射的地址,程序被烧写到的就是这个地址。此处,我们的IAP程序烧写到这个地址,根据IAP程序的大小,我们在keil里可以设置合适的IAP结束地址。
注意:在没有IAP程序的情况下,0x08000000这个地址就是应用程序烧写的地址。
2、工程说明
本实验用到的两个工程可按照文末的方式获取,其中IAP工程移植至ST官方例程。下面对两个工程进行简单的说明
IAP工程:
(1)需要在target
选项卡里设置我们IAP程序的起始地址与大小,如:
这里我们的IAP程序起始地址设为0x08000000,大小设为0x3000,即IAP所能用的FLASH空间为12KB。其中IAP所能占的占空间的大小可根据IAP的实际大小进行修改。
(2)需要修改程序中我们需要跳转到的应用程序的地址(即IAP程序的结束地址):
LED工程:
(1)需要在target
选项卡里设置我们LED程序的起始地址与大小,如:
这里我们的LED程序起地址设为0x08003000,大小设为0x10000,即LED所能用的FLASH空间为64KB。其中结束地址可根据LED应用程序的实际大小进行修改。
(2)生成对应的.bin
文件。这需要在User
选项卡里添加如下命令(即编译后执行的命令):
其中,fromelf.exe
是我们keil安装目录下的一个可执行程序,可以把.axf
文件转换成.bin
文件。要在keil中直接调用fromelf命令,必须要把fromelf.exe
所在目录添加到环境变量中。添加环境变量的方法如下(该方法来自于《【野火】零死角玩转STM32—F429挑战者V2.pdf》):
本文以 Win7 系统为例添加工具链的路径到 PATH 环境变量,其它系统是类似的。
(1) 右键电脑系统的计算机图标
,在弹出的菜单中选择属性
,如图:
(2) 在弹出的属性页面依次点击高级系统设置 ->环境变量
,在用户变量一栏中找到名为PATH
的变量,若没有该变量,则新建一个。编辑PATH
变量,在它的变量值中输入工具链的路径,如本机的是;D:\work\keil5\ARM\ARMCC\bin
,注意要使用分号;
让它与其它路径分隔开,输入完毕后依次点确定
,如图:
(3) 打开 Windows 的命令行,点击系统的开始菜单
,在搜索框输入cmd
,在搜索结果中点击cmd.exe
即可打开命令行, 如图:
(4) 在弹出的命令行窗口中输入fromelf
回车,若窗口打印出 formelf
的帮助说明,那么路径正常,就可以开始后面的工作了;若提示不是内部名外部命令,也不是可运行的程序…
信息,说明路径不对,请重新配置环境变量,并确认该工作目录下有编译工具链。
这个过程本质就是让命令行通过“PATH”路径找到fromelf.exe
程序运行 。
学会配置fromelf.exe
,也就学会配置了MinGW
。MinGW是一个工具集,包含编译C与C++的gcc、g++,使用它就可以在Windows命令行下编译C程序。相关笔记:使用Notepad++来开发C程序
3、IAP源码说明
(1)主函数:
int main(void){ FLASH_Unlock(); /* FLASH解锁 */ KEY_Init(); /* 按键初始化 */ IAP_Init(); /* IAP初始化 */
/* 按键按下则进入主菜单开始更新程序(注意:需要按下复位键的同时按下该按键触发程序更新) */if (GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0x00) { SerialPutString("\r\n======================================================================"); SerialPutString("\r\n= (C) COPYRIGHT 2010 STMicroelectronics ="); SerialPutString("\r\n= ="); SerialPutString("\r\n= In-Application Programming Application (Version 3.3.0) ="); SerialPutString("\r\n= ="); SerialPutString("\r\n= By MCD Application Team ="); SerialPutString("\r\n======================================================================"); SerialPutString("\r\n\r\n"); Main_Menu (); }/* 保持运行用户应用程序 */else {/* Test if user code is programmed starting from address "ApplicationAddress" */if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) {/* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress;/* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } }
while (1){}
return 0;}
可见,我们按下复位的同时按下PE2
对应的按键即可触发应用程序更新操作,否则跳转到应用程序的起始地址执行应用程序(断点重启也是默认执行应用程序),这里的ApplicationAddress
就是我们上面设置的0x08003000
。
(2)主菜单函数Main_Menu
这个函数里就是该IAP程序的功能,根据其中的打印信息:
可以知道,该IAP有三个功能(分别输入键盘上的数字1、2、3进行选择):一是下载程序(电脑->STM32);二是上传程序(STM32->电脑);三是执行新程序(即刚下载完成的程序)。
(3)下载程序功能函数SerialDownload
首先,上位机使用Ymodem协议进行数据下发,STM32根据协议解析数据,拿到有用的数据,并把这些数据写入FLASH对应的地址中,即ApplicationAddress。关于Ymodem协议及SerialDownload函数这里不展开讨论。
4、下载验证
(1)下载IAP程序
可以使用J-link等调试器进行下载,也可用串口ISP
进行下载,我们选用的是串口ISP
进行下载,借用的工具是FlyMcu
:
这里下载的是.hex
文件,如果下载.bin
文件,则会提示如下错误:
程序文件不是0x8000000和0x20000000区域的
使用ISP方式下载需要进行的硬件操作是:BOOT0引脚拉高,BOOT1引脚接地
。即系统存储器被选为启动区域:
在点击开始编程
按钮后,需要按下板子上的复位键,即可下载程序。
(2)通过IAP程序引导下载LED程序
上面提到下载程序使用的是Ymodem协议,所以得选用带有Ymodem协议传输方式的上位机软件来把应用程序下载到板子里。可以选用SecureCRT
,也可以选用超级终端。这里选用的是超级终端:
首先按下数字键1触发下载程序操作,此时会不断打印CCCCC...
。然后点传送->发送文件
,选择要下载的.bin
文件及Ymodem
协议。下载完成后按下数字3即可执行新下载得应用程序:
终于,LED闪烁起来了,点灯项目成功。断电重启之后默认执行的是这个点灯程序,要想下载新的程序,按下复位的同时按下PE2
所对应的按键(需要一定的手速)即可触发更新程序操作。
本篇笔记相关的代码及工具可在后台回复关键词:串口IAP,进行获取。
End:以上就是本次的笔记分享,如有错误,欢迎之处!如果这篇笔记对你有帮助的话,欢迎收藏、转发、在看~
猜你喜欢:
C语言代码优化的一些技巧(一)
【RT-Thread】线程的基本知识
《替代串口打印,嵌入式中另一种打印调试的方法》
【C语言笔记】指针函数与函数指针?
《为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?》
我的个人博客:
https://zhengnianli.github.io
查看往期笔记:
聊天界面输入m获取往期笔记目录
c语言串口通信_STM32串口IAP分享相关推荐
- c语言串口通信_stm32 串口通信收发说明
很多网友在stm32 串口通信收发中,发现接收发送函数中,数据都是指针指向首字符的字符串中,下一步进行后续操作就非常吃力了.其实这是对C语言指针的不能熟练应用有关.指针是C语言的灵魂,也是最难的部分, ...
- 树莓派已经通过网络连接通过串口通信在串口调试小助手打印与操作
在树莓派编译运行 树莓派已经通过网络连接通过串口通信在串口调试小助手打印C gcc xxx.c -lwiringPi 源码 #include <wiringSerial.h> #inclu ...
- 串口通信及串口转蓝牙相关知识
之前没有接触过硬件相关的工作, 因此对硬件的知识一知半解. 最近由于项目需要, 用到了串口通信以及串口跟蓝牙之间通信相关的东西.记录下来, 希望对新手有所帮助. 如有疏漏之处, 欢迎指正. 1 串口通 ...
- 树莓派串口通信 USB串口通信 常用串口命令
树莓派串口通信 USB串口通信 文章目录 树莓派串口通信 USB串口通信 准备 发送数据 接收数据 如果不知道树莓派怎么使用USB串口通信的,欢迎浏览我的另一篇博客文章: 树莓派使用USB串口通信 C ...
- android c语言串口通信,安卓串口通信能用的modebus CRC16计算,附对应的C语言CRC16
最近写安卓串口通信需要用到modebus 的crc16通信,网上找了很多都是字符串的,我需要byte的,由于java没有无符号数,转换有点小麻烦,对着C一步步测试,最终测试无误 代码如下: //jav ...
- python串口通信_python串口编程实例 - 全文
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python具有丰富和强大的库.它常被昵称为胶水语言,能够把用其 ...
- java串口通信DataRecive_串口通信之DataReceive事件触发时机
环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...
- micropython串口通信_MicroPython-ESP32串口通信-1Z实验室
出品:1Z实验室 (1ZLAB: Make Things Easy) 概要 在本节课程阿凯为大家讲解了串口通信的接线方式,ESP32中的串口UART资源与相关API, 并给出了一个UART的小应用实例 ...
- android qt 串口通信,Qt串口通信开发之QSerialPort模块详细使用方法与实例
Qt串口通信开发之QSerialPort模块详细使用方法与实例 发布时间:2020-10-23 12:19:05 来源:脚本之家 阅读:111 作者:沧海一笑-dj Qt串口通信基础及名词说明 串口通 ...
最新文章
- HDU - 2767 Proving Equivalences tanjar强连通-DAG性质
- oracle 删除补全日志组_【REDO】删除REDO LOG重做日志组后需要手工删除对应的日志文件(转)...
- navicat保存查询语句_MySQL数据库安装创建及Navicat客户端连接
- Conda官方下载安装步骤及conda用法详细介绍
- The prefix context for element context:component-scan is not bound.
- Docker for windows 10
- 写MySQL存储过程实现动态执行SQL
- 实验 4 [bx]和 loop 的使用
- 进程间通信机制(管道、信号、共享内存/信号量/消息队列)、线程间通信机制(互斥锁、条件变量、posix匿名信号量)...
- keil uvision4完整破解版下载
- 六句顺口溜教你速记100以内质数表
- chrome/firefox插件ie tab,解决无法使用网银的问题
- ps快捷键大全(表格汇总)
- 北京市公布533家接种点名单 (zz)
- 【pyqt5学习】——添加菜单栏动作action,给动作触发triggered绑定事件
- POJ 4001 xiangqi(模拟)
- 抽奖系统的实现(两种)
- 怎么用u盘重装系统?石大师u盘重装win10系统步骤
- 【How2RE】 UPX壳及脱壳方式
- Vue Mixin 与小程序 Mixins 应用