IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 国民技术N32G030F6S7使用ymodem协议更新固件 -> 正文阅读

[嵌入式]国民技术N32G030F6S7使用ymodem协议更新固件

一、环境介绍

MCU:?N32G030F6S7 TSSOP20

代码开发工具:?Keil5

上位机工具:SecureCRT

协议:?ymodem

本篇文章主要讲解如何在国民技术N32G030F6S7工程里添加移植ymodem协议,最终完成串口升级固件,因为主要是讲ymodem协议栈的移植。

工程源码下载地址:
?

二、ymodem协议

协议通讯过程如图,不需要彻底明白,只需要了解便可。

1、单片机发送'C'字符给上位机

2、上位机发送文件名,文件大小等信息给单片机,数据开头为SOH(0X01)

3、单片机接收数据校验成功后返回ACK给上位机,然后再发送'C'等待上位机发送固件(固件已1K数据包的形式进行发送)

截图链接:https://blog.csdn.net/lcmsir/article/details/80550821

三、移植过程讲解

1、跳转程序

#define MMU_VTOR ((__IO unsigned*)(0x40024C30))				//用宏定义把0x40024C30这个地址用MMU_VTOR这个名字来代替
#define _VTOREN() (*MMU_VTOR = (*MMU_VTOR) | 0x88000000);	//对MMU_VTOR跟0x8800_0000做或等于操作,也就是将这个寄存器的bit31和bit27都置一,然后用宏定义取名为_VTOREN(),由名字可以判断出来这是这个寄存器的使能操作
#define _VTORVALUE() (*MMU_VTOR = (*MMU_VTOR) | APPOffset);	//对MMU_VTOR跟0x4000做或等于操作,然后用宏定义取名为_VTORVALUE(),由名字可以判断出来这是往寄存器里面写偏移量

/* Private functions ---------------------------------------------------------*/
typedef  void (*iapfun)(void);									// 定义一个函数类型的参数. 
iapfun jump2app; 


void iap_load_app(u32 appxaddr)
{
//	if(((*(vu32*)appxaddr)&0x0FFFFFFF) < 1024*144)		// 检查栈顶地址是否合法.
	{ 
		jump2app = (iapfun)*(vu32*)(appxaddr+4);				
		__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
		jump2app();										// 跳转到APP.
	}
}

void Bsp_Run_APP(void)
{
				SerialPutString("RUN APP...\r\n");
		_VTOREN();
		_VTORVALUE();
		
		iap_load_app(APPLICATION_ADDRESS);
}

注意:

? ? ? ? 1)M0没有中断偏移寄存器,即VTOR

????????2)APPOffset位偏移量

? ? ? ? 3)此段代码是向原厂索要的,直接用便可(我也不懂)

2、ymodem移植文件修改

1)、command.c

? ? ? ?此文件只需要修改两个函数:

????????void SerialPutChar(uint8_t c);? ? ? ? //发送字节

????????

void SerialPutChar(uint8_t c)
{
  USART_SendData(USART1, c);
	  while (USART_GetFlagStatus(USART1, USART_FLAG_TXC) == RESET)
  {
  }
}

2)、flash_if.c

? ? ? ? 此文件为对flash操作的底层文件,需要将其中操作函数使用该芯片库函数代替。

3)、flash_if.h

/* Includes ------------------------------------------------------------------*/
#include "n32g030.h"

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
#define USER_FLASH_LAST_PAGE_ADDRESS  0x08007E00	//倒数第二页的首地址
#define USER_FLASH_END_ADDRESS        0x08007FFF /* 32 KBytes */
#define FLASH_PAGE_SIZE               0x200      /* 512 bytes */

/* define the address from where user application will be loaded,
   the application address should be a start sector address 
	 定义加载用户应用程序的地址,申请地址应该是一个起始扇区地址
	 预留Bootloader空间为16K 
*/
#define APPOffset								(16*1024)        //APP地址偏移量
#define APPLICATION_ADDRESS     (uint32_t)(0x08000000 |APPOffset)

/* Get the number of Sector from where the user program will be loaded */
#define  FLASH_PAGE_NUMBER      (uint32_t)((APPLICATION_ADDRESS - 0x08000000) >> 12)

/* Compute the mask to test if the Flash memory, where the user program will be
   loaded, is write protected */
#define  FLASH_PROTECTED_PAGES   ((uint32_t)~((1 << FLASH_PAGE_NUMBER) - 1))

/* define the user application size */
#define USER_FLASH_SIZE   (USER_FLASH_END_ADDRESS - APPLICATION_ADDRESS + 1)

注意:移植时候这里的芯片参数得根据实际进行修改

? ? ? ? (1)、USER_FLASH_LAST_PAGE_ADDRESS? ? ? ? ?//flash倒数第二页的首地址

? ? ? ? (2)、USER_FLASH_END_ADDRESS? ? ? ? ? ? ? ? ? ? ? ?//flash最后一页的尾地址

? ? ? ? (3)、FLASH_PAGE_SIZE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //flash一页的大小

? ? ? ? (4)、APPOffset? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//APP地址偏移量? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

四、keil配置

? ? ? ? 1)、IAP工程里的地址按照正常来写便可

????????2)、APP工程里面的ROM开始地址为APPLICATION_ADDRESS,ROM大小为USER_FLASH_END_ADDRESS-APPLICATION_ADDRESS。我预留给bootloader的空间为16K,所以APP的地址得从0x08004000开始,ROM空间为0x4000

五、效果演示

六、工程代码下载链接

国民技术N32G030F6S7使用ymodem协议更新固件 APP+IAP.zip

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 00:04:22  更:2021-07-07 00:04:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 16:30:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码