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

news2024/11/17 9:30:51

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)程序。

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

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

相关文章

手把手用GPT开发小程序全流程!就是这么easy~

大家好,我是五竹。 前段时间用GPT开发了一款小程序:GPT真牛批!三天开发一个小程序,三天积累了2000的用户,上周末抽空又接入了流量主,感兴趣的同学可以围观一下。 今天就来带大家走一遍用GPT开发一款小程序的全过程&a…

怎么禁止员工私自修改ip地址

在许多组织中,网络管理员负责配置和管理网络,包括为员工分配静态IP地址。然而,有些员工可能会试图修改这些分配的IP地址,这可能会导致一系列问题,包括网络性能下降、安全风险增加等。 因此,禁止员工私自修…

羊奶加西柚,羊大师教你减少自由基

羊奶加西柚,减少自由基的好处真的是多得数不胜数。无论是从营养角度,还是从健康角度考虑。羊奶富含蛋白质、维生素和矿物质,西柚富含维生素C和抗氧化剂。结合起来,它们可以提供许多健康益处,并为我们的身体抵御自由基的…

轻松搬运!手推小车助力制造企业高效装卸

手推车是一种非常方便高效的搬运工具。它可以帮助我们轻松搬运重物,节省时间和精力。不论是在仓库、工厂、商场还是家庭,手推车都扮演着重要的角色。 在现代物流与生产领域,高效的装卸作业是确保生产流程畅通的重要环节。手推小车作为一种便…

[HCIE] IPSec-VPN (IKE自动模式)

概念: IKE:因特网密钥交换 实验目标:pc1与pc2互通 步骤1:R1与R3配置默认路由 R1: ip route-static 0.0.0.0 0.0.0.0 12.1.1.2 R2: ip route-static 0.0.0.0 0.0.0.0 23.1.1.2 步骤2:配ACL…

如何让大模型更好地完成知识图谱推理?

​ 论文标题: Making Large Language Models Perform Better in Knowledge Graph Completion 论文链接: https://arxiv.org/abs/2310.06671 代码链接:GitHub - zjukg/KoPA: [Paper][Preprint 2023] Making Large Language Models Perform Be…

Intel Software Guard Extensions简介(一)

文章目录 前言一、简介二、enclave相互作用与保护三、enclave生命周期四、数据结构和enclave操作五、enclave page cache六、enclave instructions and intel sgx参考资料 前言 最近开始研究Intel SGX硬件特性,记录下研究过程。 目前安全性主要关注对存储中的静止…

羊大师教你,什么搭配羊奶能够带来全方位的营养?

羊奶作为一种营养价值极高的乳制品,其丰富的营养成分对人体健康有着诸多益处。然而,不同的食物搭配会对羊奶的营养吸收产生不同的影响。为了让大家更好地利用羊奶的营养价值,下面小编羊大师将为大家介绍一些与羊奶搭配的食物,帮助…

代码随想录算法训练营第五十七天|647. 回文子串、516. 最长回文子序列

第九章 动态规划part17 647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是…

【回眸】Tessy单元测试软件使用指南(一)安装篇

安装 在官网上下载安装包,安装完成后打开进入这个界面 注册申请license:在作为服务端的电脑上安装Tessy。安装完成后,启动Tessy会自动生成license服务器的注册码。(注册码用于申请试用或永久的license文件)这个对于我…

拦截器详解

一、概述 什么是拦截器? 是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,用来动态拦截控制方法的执行。 到底是干啥用的? 拦截请求用的,在指定的方法调用前后,执行在拦截器中编写的程序 …

git的使用:本地git下载、sshkey的添加、github仓库创建及文件上传

一、github创建账号 即github注册账号,登录github官网,根据提示注册即可 github官网 二、git客户端下载安装 已有很多git下载安装的博文了,在此就不赘述 三、sshkey的生成与添加 1、sshkey的生成以及查看 // sshkey的生成命令&#xff…

PE文件分析

用PEView及Python程序分析压缩包中的lab01.exe和lab01.dll两个PE文件,关键步骤给出截图: 分析两个文件的文件头中的各部分; 2.找出时间戳,计算出两个文件的生成时间; 注:时间戳为从1970年1月1日0时0分0秒到…

奥特曼不是第一次被开除!离职YC系“被创始人要求离开”

明敏 西风 发自 凹非寺 量子位 | 公众号 QbitAI 钮祜禄奥特曼,竟然不是第一次被“扫地出门”??! 没想到,OpenAI闹剧刚稍微消停了一点,“前传”马上来了。 《华盛顿邮报》从知情人士处获悉,奥…

Anthropic推出Claude 2.1聊天机器人;使用AI工具写作:挑战与策略

🦉 AI新闻 🚀 Anthropic推出Claude 2.1聊天机器人,支持20万个Token输入和提高准确度 摘要:Anthropic推出了Claude 2.1聊天机器人及对应的AI模型,支持输入多达20万个Token,并在准确度上有所改善。Claude已…

【华为OD题库-038】支持优先级的对列-java

题目 实现一个支持优先级的队列,高优先级先出队列,同优先级时先进先出。 如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。 队列存储的数据内容是一个 整数。 输入描述 一组待存入队列的数据(包含内容和优先级)。 输出描述 队列…

人脑工作机制 基本工作原理 神经元 神经网络 学习和记忆 和身体的互动 模仿游戏

人脑的工作机制非常复杂,涉及多个层面的结构和功能。以下是一些关键点,用以概述人脑的基本工作原理: 基本单位 - 神经元: 人脑包含大约860亿个神经元。神经元是脑的基本工作和信号处理单位,通过树突接收信号&#xff0…

记一次简单的PHP反序列化字符串溢出

今天朋友给的一道题&#xff0c;让我看看&#xff0c;来源不知&#xff0c;随手记一下 <?php // where is flag error_reporting(0); class NFCTF{ public $ming,$id,$payload,$nothing;function __construct($iii){$this->ming$ii…

分布式链路追踪实战篇-日志库集成opentelemetry的思路

由上文分布式链路追踪入门篇-基础原理与快速应用可以知道分布式链路追踪的作用&#xff0c;但是距离应用到项目中&#xff0c;我们还需要对项目中一些关键组件进行opentelemetry的集成&#xff0c;例如日志库&#xff0c;ORM、http框架、rpc框架等。 一、日志库如何集成opentel…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…