双Bank OTA升级:N32L40X BootLoader (一)

news2024/11/23 12:25:31

 什么是双Bank升级:将Flash划分为以下4个区域。

BootLoader区:程序进行升级的引导程序,根据Upade_Flag来判断程序是跳转Bank1区运行程序或是将Bank2区的程序搬运到Bank1区,然后在运行程序。

Upade_Flag区:判断BootLoader是否能跳转IAP程序的标志位。

Bank1区:用户程序区。

Bank2区:接收升级程序的备份区域,如果接收完成后就进入BootLoader将此区域的程序搬运到Bank1区。

1.芯片:N32L406CB(国名技术)

2.开发环境:keil5

对于单片机做IAP功能,首先我们要了解它的Flash大小。我们查看他的数据手册看下Flash大小。

由上图可知Flash为128k。

然后我们再看下Flash页分布。

 由上图可知,Flash为128k,64页每页2k。

那么我们就将Flash进行从低地址到高地址进行划分,6k为BootLoader,2k为判断升级标志位。50k为Bank1空间,50k为Bank2空间.

设置BootLoader工程Flash空间为6kb

BootLoader升级代码如下。

#include "main.h"
#include "n32l40x_flash.h"


typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;

#define FLASH_Updata_Flag_ADDR	(0x08000000 + 3*2048)
#define FLASH_Bank1_ADDR	(0x08000000 + 4*2048)
#define FLASH_Bank2_ADDR	(0x08000000 + 34*2048)
#define FLASH_Page_Num		(30)
#define FLASH_Page_Size		(2048)
uint8_t Buff[FLASH_Page_Size] = {0};

void Jump_To_App(uint32_t address)
{
    if (((*(__IO uint32_t*)address) & 0x2FFE0000) == 0x20000000)
    {
        JumpAddress = *(__IO uint32_t*) (address + 4);
        
		Jump_To_Application = (pFunction) JumpAddress;
			
        __set_MSP(*(__IO uint32_t*) address);
		
        Jump_To_Application();
    }
}

void Read_Flash_Data(u8* pBuffer, u32 NumToRead, u32 ReadAddr)
{
    u32 i;
    for (i = 0; i < NumToRead; i++)
    {
        *((u8*)pBuffer + i) = *((u8*)ReadAddr + i);
    }
}

void Write_Flash_Data(uint8_t *data, uint16_t DataLen, uint32_t DstAddr)
{
	uint16_t i = 0;
	uint32_t Data;
	FLASH_Unlock();
	for(i = 0; i < DataLen; i += 4)
	{
		Data = data[i + 0] << 0;
		Data |= data[i + 1] << 8; 
		Data |= data[i + 2] << 16; 
		Data |= data[i + 3] << 24; 
		if (FLASH_COMPL != FLASH_ProgramWord(DstAddr + i, Data))
		{

		}
		//DBG("DstAddr + i %x\r\n", DstAddr + i);
	}
	FLASH_Lock();
}

bool BankFlashErase(u32 Bank_Addr, uint8_t Page)
{
	uint8_t i = 0;
	FLASH_Unlock();
	for(i = 0; i < Page; i++)
	{
		if (FLASH_COMPL != FLASH_EraseOnePage(Bank_Addr + FLASH_Page_Size * i))
		{
			
		}
		//DBG("Bank_Addr = %x\r\n", Bank_Addr + FLASH_Page_Size * i);
	}
	FLASH_Lock();
}



int main(void)
{
	int i = 0;
	
	#ifdef USE_USART
	USART2_Configuration();
	#endif
	
	Read_Flash_Data(Buff, 1, FLASH_Updata_Flag_ADDR);
	if(Buff[0] == 0x55)
	{
		BankFlashErase(FLASH_Updata_Flag_ADDR, 1);
		#ifdef USE_USART
		printf("cheeck Bank2 Data\r\n");
		#endif
		BankFlashErase(FLASH_Bank1_ADDR, FLASH_Page_Num);
		for(i = 0; i < FLASH_Page_Num; i++)
		{
			Read_Flash_Data(Buff, FLASH_Page_Size, FLASH_Bank2_ADDR + FLASH_Page_Size * i);
			Write_Flash_Data(Buff, FLASH_Page_Size, FLASH_Bank1_ADDR + FLASH_Page_Size * i);
		}
		#ifdef USE_USART
		printf("data move successful\r\n");
		#endif
	}
	else
	{
		#ifdef USE_USART
		printf("Jump_To_App = %x\r\n", FLASH_Bank1_ADDR);
		#endif
	}		

    while (1)
    {
		Jump_To_App(FLASH_Bank1_ADDR);
    }
}

双Bank OTA升级:N32L40X IAP (二):跳转链接

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

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

相关文章

OpenCV自带的HAAR级联分类器对脸部(人脸、猫脸等)的检测识别

在计算机视觉领域&#xff0c;检测人脸等是一种很常见且非常重要的应用&#xff0c;我们可以先通过开放计算机视觉库OpenCV来熟悉这个人脸识别领域。另外OpenCV关于颜色的识别&#xff0c;可以查阅&#xff1a;OpenCV的HSV颜色空间在无人车中颜色识别的应用HSV颜色识别的跟踪实…

WAIC2023:图像内容安全黑科技助力可信AI发展

目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束&#xff0c;恰逢全球大模型和生成式人工智能蓬勃兴起之时&#xff0c;今年参…

MQTT 与 Kafka|物联网消息与流数据集成实践

MQTT 如何与 Kafka 一起使用&#xff1f; MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议&#xff0c;专为受限网络环境下的设备通信而设计。Apache Kafka 是一个分布式流处理平台&#xff0c;旨在处理大规模的实时数据流。 Kafka 和 MQTT 是实现物…

模拟实现atoi函数

请记住那些对你好的人&#xff0c;因为他们本可以不这么做 文章目录 atoi函数介绍 模拟实现 大家好&#xff0c;我是纪宁。 atoi函数&#xff0c;它的功能是将数字字符转化为数字。我第一次见这个函数还是在大一上在刷蓝桥杯的时候&#xff0c;有一个关于回文数字的题&#x…

08.计算机网络——其他重要协议和技术

文章目录 DNSICMPNAT代理服务器 DNS DNS是一整套从域名映射到IP的系统 ​ TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是IP地址不方便记忆&#xff0c;于是人们发明域名&#xff0c;其本质是一个字符串&#xff0c;映射了它和IP地址的关系。 …

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)-附代码

融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES) 文章目录 融合黄金正弦算法和纵横交叉策略的秃鹰搜索算法(GSCBES)1.秃鹰优化算法2.改进秃鹰优化算法2.1 基于纵横交叉策略2.2 基于惯性权重的位置更新2.3 黄金正弦捕食机制 3.实验结果4.参考文献5.Matlab代码6.python代码…

FreeRTOS-列表和列表项

列表和列表项&#xff1a; 列表是FreeRTOS中的一个数据结构&#xff0c;用来跟踪FreeRTOS中的任务。 列表项就是存放在列表中的项目&#xff0c;属于列表的子集。 列表就相当于一个链表&#xff0c;列表项就相当于节点&#xff0c;在FreeRTOS中的列表是一个双向的环形链表。 …

基于FPGA的视频接口之PAL(NTSC)编码

简介 PAL又称帕尔制&#xff0c;是咱们中国早期视频所是使用的视频广播模式&#xff0c;基本上现在的电视都兼容这种视频模式&#xff0c;使用的接口也是传统的BNC插头&#xff0c;有兴趣的伙伴可以看看电视屁股后面是不是有一个单独的BNC接口&#xff0c;百分之98就是支持PAL格…

FastReport.Net FastReport.Core 2023.2.23 Crack

FastReport.Net & FastReport.Core 2023.2.23适用于 .NET 7、.NET Core、Blazor、ASP.NET、MVC 和 Windows 窗体的全功能报告库。它可用于 Microsoft Visual Studio 2022 和 JetBrains Rider。 利用数据呈现领域专家针对 .NET 7、.NET Core、Blazor、ASP.NET、MVC、Windo…

【Windows】cmd和powershell命令合集

文章目录 1 前言2 一些规则3 cmd命令合集4 bat语法学习5 powershell命令合集6 powershell语法学习 1 前言 在日常使用过程中&#xff0c;总是会遇到不记得或无法区分cmd命令和powershell命令的情况&#xff0c;因为在Windows的工作大部分都是可视化的鼠标点击&#xff0c;用到命…

CLH自旋锁原理

CLH自旋锁 JUC中显式锁基于AQS抽象队列同步器&#xff0c;而AQS是CLH锁的一个变种。 在争夺锁激烈的情况下&#xff0c;为了减少CAS空自旋&#xff08;CAS需要CPU进行内部通信保证缓存一致性造成流量过大引起总线风暴&#xff09;&#xff0c;Java轻量级锁会升级为重量级锁&a…

大数据学习03-Hive分布式集群部署

系统环境&#xff1a;centos7 软件版本&#xff1a;jdk1.8、zookeeper3.4.8、hadoop2.8.5、hive1.1.0 一、安装 hive官网 下载hive安装包&#xff0c;上传到linux服务器上&#xff0c; 解压安装包 tar -zxvf apache-hive-1.1.0-bin.tar.gz -C /home/local/重命名文件 mv …

腾讯云轻量应用服务器搭建Typecho博客网站全流程

腾讯云轻量应用服务器自带Typecho应用模板镜像&#xff0c;腾讯云提供的Typecho模板镜像是基于CentOS 7.6 64位操作系统&#xff0c;并已预置Nginx、PHP、MariaDB软件程序&#xff0c;使用Typecho应用模板可以快速搭建博客、企业官网、电商及论坛等各类网站。腾讯云服务器网分享…

C# 反转链表

206 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3…

Python中的标签编码和独热编码

在机器学习项目中&#xff0c;我们通常处理具有不同分类列的数据集&#xff0c;其中一些列的元素在有序变量类别中&#xff0c;例如列收入水平具有低&#xff0c;中或高的元素&#xff0c;在这种情况下&#xff0c;我们可以用1&#xff0c;2&#xff0c;3替换这些元素。其中1表…

【100天精通python】Day9:数据结构_字典、集合

目录 目录 1 字典 1.1 字典的基本操作示例 1.2 字典推导式 2 集合 2.1 集合的常用操作示例 3 列表、元组、字典、集合的区别 1 字典 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种无序的数据结构&#xff0c;用于存储键值对的集合。每个…

flask 读取文件夹文件,展示在页面,可以通过勾选删除

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import os import globapp Flask(__name__)app.route(/, methods[GET, POST]) def index():if request.method POST:to_delete request.form.getlist(checks)for file in to_delete…

Spring Security 的工作原理/总体架构

目录 1、过滤器的视角 2、DelegatingFilterProxy 委派过滤器代理&#xff08;类&#xff09; 2、FilterChainProxy 过滤器链代理&#xff08;类&#xff09; 4、SecurityFilterChain 安全过滤器链&#xff08;接口&#xff09; 5、Security Filters 安全过滤器实例 6、Sp…

解锁潜力,驭数赋能:大数据与云计算的强强联合

随着数字化时代的来临&#xff0c;大数据和云计算已成为信息技术领域的两大热门话题。大数据指的是以海量、高速、多样化的数据为基础&#xff0c;通过分析和挖掘来获得有价值的信息和洞察。而云计算则是一种基于网络的计算模式&#xff0c;通过将数据和应用程序存储在云端服务…

day31-Password Generator(密码生成器)

50 天学习 50 个项目 - HTMLCSS and JavaScript day31-Password Generator&#xff08;密码生成器&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&q…