【正点原子STM32连载】 第六十章 串口IAP实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1)实验平台:正点原子APM32F407最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##

第六十章 串口IAP实验

本章将介绍在APM32F407上使用串口进行IAP,以实现简单的IAP功能。通过本章的学习,读者将学习到IAP的使用。
本章分为如下几个小节:
60.1 硬件设计
60.2 程序设计
60.3 下载验证

60.1 硬件设计
60.1.1 例程功能

  1. 程序运行后进入等待接收APP的bin数据的状态
  2. 接收到APP的bin数据后,先后按下KEY0按键和KEY_UP按键,可分别进行将APP的bin数据加载到Flash和跳转到APP的位置执行APP的操作
  3. LED0闪烁,指示程序正在运行
    60.1.2 硬件资源
  4. LED
    LED0 - PF9
  5. 按键
    KEY0 - PE4
    KEY_UP - PA0
  6. USART1(PA9、PA10连接至板载USB转串口芯片上)
  7. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    60.1.3 原理图
    本章实验使用的IAP为软件算法,因此没有对应的连接原理图。
    60.2 程序设计
    60.2.1 IAP的实现
    本章实验提供了用于IAP的驱动代码,如下图所示:

图60.2.1.1 IAP驱动代码
IAP的实现最主要分为两个步骤,分别为加载APP固件至Flash和跳转到APP中运行,为此本实验实现了以上两个函数,如下所示:
void iap_write_appbin(uint32_t appxaddr,uint8_t *appbuf,uint32_t applen);
void iap_load_app(uint32_t appxaddr);
以上两个函数就分别实现了加载APP固件至Flash和跳转到APP运行的功能,这两个函数的使用示例,如下所示:

#include "apm32f4xx.h"
#include "./IAP/iap.h"

#define FLASH_APP_ADDR (0x08010000)
#define APP_MAX_SIZE (120*1024)

static uint8_t appbin[APP_MAX_SIZE];

void example_fun(void)
{
    uint32_t appsize;
    
    /* 通过串口等方式获取APP的二进制数据 */
    appsize = get_app_bin(appbin);
    
    /* 将APP的二进制数据写入Flash的指定地址中 */
    iap_write_appbin(FLASH_APP_ADDR, appbin, appsize);
    
    /* 跳转到APP在Flash中的起始地址运行 */
    iap_load_app(FLASH_APP_ADDR);
}

60.2.2 APP工程修改
APP程序要能够在指定的Flash起始地址运行,需要编译器在编译APP的时候知道APP将被保存在Flash的那个位置,对于MDK软件,可以在Options for Target窗口中设置,如下图所示:
在这里插入图片描述

图60.2.2.1 配置MDK中的Flash空间
上图中将APP程序保存在Flash中的空间配置为0x8010000~(0x8010000+0xF0000),通过这样的配置便可以使APP被保存在指定Flash位置中执行。读者可以自行配置“Start”和“Size”参数,但要注意不能超过Flash的范围,并且也不要覆盖IAP程序(Bootloader)。
上一小节中将APP保存到Flash中的操作操作的是二进制数据,因此APP也应当被编译为二进制文件,然后MDK软件中并没有直接编译出二进制文件的选项,因此需要配置MDK在编译完成后执行指定的命令,如下图所示:
在这里插入图片描述

图60.2.2.2 配置MDK生成二进制文件
完成以上配置后,便可在APP程序编译完成后在工程的Output目录下得到正确的二进制文件。
60.2.3 实验应用代码
本章实验的应用代码,如下所示:

int main(void)
{
    /* 仅保留关键代码,其余代码省略 */
    
    /* 初始化串口 */
    usart_init(115200);
    
    while (1)
    {
    		/* 串口已接收到数据 */
    		if (g_usart_rx_cnt != 0)
    		{
    			/* 新的一次循环串口还没有接收到新数据,
    			 * 则断定串口接收完毕
    			 */
    			if (lastcount == g_usart_rx_cnt)
    			{
    				/* 记录APP固件大小 */
    				applenth = g_usart_rx_cnt;
    				lastcount = 0;
    				g_usart_rx_cnt = 0;
    			}
    			else
    			{
    				lastcount = g_usart_rx_cnt;
    			}
    		}
    		
    		key = key_scan(0);
    		switch (key)
    		{
    			case KEY0_PRES:
    			{
    				/* 将串口接收到的APP二进制数据写入Flash中的指定位置 */
    				iap_write_appbin(FLASH_APP1_ADDR, g_usart_rx_buf, applenth);
    				break;
    			}
    			case WKUP_PRES:
    			{
    				/* 跳转到Flash的指定位置执行APP程序 */
    				iap_load_app(FLASH_APP1_ADDR);
    				break;
    			}
    		}
    		
    		delay_ms(100);
    }
}

从上面的代码中可以看出,程序是通过串口接收APP的二进制数据的,因此串口驱动中的串口接收缓存因该设置的足够大,以能够容纳APP的二进制数据,本实验中串口接收缓存的配置如下所示:
/* 定义最大接收120KB数据 */
#define USART_REC_LEN (120 * 1024)
在判断APP二进制数据接收完毕后,便可通过KEY0按键调用函数iap_write_appbin()将APP的二进制数据写入Flash中的FLASH_APP1_ADDR位置中,FLASH_APP1_ADDR是一个宏,该宏的定义如下所示:
#define FLASH_APP1_ADDR 0x08010000
需要注意的是,APP写入的位置应当与上一小节中配置MDK软件的指定Flash位置相同。
将APP的二进制数据写入到Flash中后,此时运行的依旧是IAP(Bootloader)程序,此时可以按下KEY_UP按键来跳转到Flash中APP的位置执行APP程序。
60.3 下载验证
在完成编译和烧录操作后,可以看到LCD上显示了本实验的相关实验信息,此时程序正在等待串口接收APP的二进制数据,此时便可通过串口调试助手将实现编译生成的APP二进制文件发送给MCU,待发送完毕后按下KEY0按键,将APP的二进制数据写入到Flash中,若写入成功,LCD上将会有相应的提示,此时便可按下KEY_UP按键将程序跳转到APP的保存位置中运行,若指定的Flash位置保存了正确的APP固件,那么便可看到MCU正在运行APP程序,而非IAP(Bootloader)程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AD9528学习笔记

前言 AD9528是ADI的一款时钟芯片,由2-stage PLL组成,并且集成JESD204B/JESD204C SYSREF信号发生器,SYSREF发生器输出单次、N次或连续信号,并与PLL1和PLL2输出同步,从而可以实现多器件之间的同步。 AD9528总共有14路输…

<精学社>LCD1602移屏操作

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

Linux:配置Ubuntu系统的镜像软件下载地址

一、原理介绍 好处:从国内服务器下载APT软件,速度快。 二、配置 我这里配置的是清华大学的镜像服务器地址 https://mirrors.tuna.tsinghua.edu.cn/ 1、备份文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、清空sources.list ec…

CS5511规格书|CS5511方案应用说明|DP转双路LVDS/eDP芯片方案

概述:CS5511是一个将DP/eDP输入转换为LVDS信号的桥接芯片,此外,CS5511可以用作在DP/eDP输入到DP/eDP输出场景中桥接芯片。CS5511的高级接收器支持VEDA DisplayPort(DP)1.3和嵌入式DisplayPort(eDP&#xf…

这是一个最简单的爱国主义为主题的网页首页

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>爱国主题网页</title> <style> body { font-family: Arial, sans-serif; …

pytest系列——pytest-instafail插件之命令行实时输出错误信息

前言 1、pytest 运行全部用例的时候&#xff0c;在控制台会先显示用例的运行结果(.或F)&#xff1b;等待用例全部运行完成后最后把报错信息全部一起抛出到控制台。 2、这样我们每次都需要等用例运行结束&#xff0c;才知道为什么报错&#xff0c;不方便实时查看报错信息。 3…

数据挖掘之PCA-主成分分析

PCA的用处&#xff1a;找出反应数据中最大变差的投影&#xff08;就是拉的最开&#xff09;。 在减少需要分析的指标同时&#xff0c;尽量减少原指标包含信息的损失&#xff0c;以达到对所收集数据进行全面分析的目的 但是什么时候信息保留的最多呢&#xff1f;具体一点&#…

Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和

进入贪心了&#xff0c;我觉得本专题是最烧脑的专题 Leetcode 455. 分发饼干 题目链接 455 分发饼干 让大的饼干去满足需求量大的孩子即是本题的思路&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…

joplin笔记同步 到腾讯云S3

创建存储桶 打开腾讯云的存储桶列表&#xff0c;点击“创建存储桶”&#xff0c;输入名称&#xff0c;选择地域&#xff08;建议选择离自己较近的地域以降低访问时延&#xff09;和访问权限&#xff08;建议选择“私有读写”&#xff09;。 s3 存储桶&#xff1a; 存储桶的名称…

windows环境下使用arthas不启动服务替换文件

场景&#xff1a; windows环境&#xff0c;如果现场环境客户正在使用项目&#xff0c;如果要替换项目中的一个class文件&#xff0c;但是又不能重启服务改怎么处理&#xff0c;今天介绍使用arthas中的retransform命令动态替换及使用注意的事项。 环境&#xff1a; windows,arth…

葡萄酒怎么按照饮用时间分类?

不同的葡萄酒搭配不同的餐食&#xff0c;会让饮酒人有不一样的感受和体会&#xff0c;所以&#xff0c;葡萄酒是分场合并且有饮用时间的。云仓酒庄的品牌雷盛红酒分享一般按照饮用时间分类可以把葡萄酒分为三大类&#xff0c;分别是餐前酒、佐餐酒和餐后酒。 餐前酒&#xff1…

java编程:使用递归 循环和位运算实现将10进制转为2进制

1 递归 /*** 递归&#xff1a;十进制转二进制* param decimal 待转换的十进制数* param binary 转换后的二进制数*/public static void decimalToBinaryByRecursion(int decimal,StringBuilder binary){if(decimal < 0){return;}decimalToBinaryByRecursion(decimal/2,bina…

Mysql数据库 18.Mysql SQL优化

SQL优化 一、插入优化 多条插入语句&#xff0c;影响执行效率 优化方案 1、批量插入&#xff1a; 在一条insert语句中多条数据&#xff0c;但是如果数据量过大&#xff0c;也不能完全使用一条语句语句&#xff0c;建议数据量为一次性插入1000条以下的数据 如果数据量多大&…

CTFUB-web前置技能-HTTP协议

burp抓包,抓第二次的 修改请求方式为CTFHUB

软文写作如何布局?媒介盒子分享三大类型

好的软文需要有清晰的结构和流畅的语言&#xff0c;让读者能够很快理解和接受文案的内容&#xff0c;因此在写文案之前&#xff0c;需要先列出思路和框架&#xff0c;明确文案的主题和重点&#xff0c;选择合适的语言和表达方式。让文案更加生动易懂&#xff0c;下面就让媒介盒…

uniapp开发的微信小程序进行代码质量控制,分包+压缩js+组件按需注入等

小程序代码分包的操作请看另外一篇文章&#xff1a;uniapp分包优化&#xff0c;包括分包路由跳转规则-CSDN博客 JS文件压缩&#xff1a;在工具「详情」-「本地设置」中开启「上传代码时自动压缩脚本文件」的设置 代码包&#xff1a;组件 > 启用组件按需注入解决办法 在小程…

5分钟搞定!学会使用pytest测试框架!

本文将会把关于 Pytest 的内容分上下两篇&#xff0c;上篇主要涉及关于 pytest 概念以及功能组件知识的介绍&#xff0c;下篇主要以一个 Web 项目来将 Pytest 运用实践中。 为什么要做单元测试 相信很多 Python 使用者都会有这么一个经历&#xff0c;为了测试某个模块或者某个…

设计历史记录逻辑参考

目录 一、场景描述 二、我找到的页面功能参考 1、查看历史记录列表 2、历史记录详情 3、不同版本的比较 一、场景描述 我经常在做文档记录&#xff0c;但是有时候有误删的内容&#xff0c;也可能不知道改了什么。 这时我想回头再看看&#xff0c;该如何处理呢&#xff1…

【亚太杯B题论文已更新】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——论文无偿分享&#xff01;&#xff01;&#xff01; B题第一问论文代码已出&#xff0c;其他赛题及后续论文代码会持续更新。 祝各位小伙伴都能在比赛中发挥出色&#xff0c;取得心仪的成绩呦&#xff01;一起加油&#xff…

AI模型训练——入门篇(一)

前言 一文了解NLP&#xff0c;并搭建一个简单的Transformers模型&#xff08;含环境配置&#xff09; 一、HuggingFace 与NLP 自从ChatGPT3 问世以来的普及性使用&#xff0c;大家或许才真正觉察AI离我们已经越来越近了&#xff0c;自那之后大家也渐渐的开始接触stable diff…