STM32 Nor Flash DFU

2024-06-04 18:38
文章标签 stm32 flash dfu

本文主要是介绍STM32 Nor Flash DFU,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这次要讲讲怎么实现Nor Flash的升级。
Nor Flash的DFU工程还是基于之前的flash DFU的工程上修改而来。工程的目录如下:
STM32 Nor Flash DFU - ziye334 - ziye334的博客
 
我使用的Nor Flash芯片是M29W128F, 该芯片共有128Mb的空间,通过FSMC挂接在BANK0。 正好在UBS的官方程序里也有使用芯片的例子,所以也就是说管方的Nor Flash的驱动代码是使用 M29W128F这款芯片的。所以我们需要从拷贝fsmc_nor.c和fsmc_nor,h这两个文件添加到我们的USB_User这个组中。还要讲我们之前的flash_if文件修改为nor_if名。这样工程的文件就算齐了,下面就讲讲怎么修改个文件。
首先hw_config、usb_istr、usb_prop、usb_pwr这些个文件不需要修改。最新需要修该的文件是usb_desc.c这个文件的接口描述符,上面说过了,我们使用的Nor Flash芯片是M29W128,总空间为128Mb,即16MB。我设置这些空间都可读可写可擦除,并以64K为单位,所以接口描述符如下:

/*接口字符串描述符*/ uint8_t DFU_StringInterface0[DFU_SIZ_STRING_INTERFACE0] = { DFU_SIZ_STRING_INTERFACE0, 0x03, //Interface 0: "@ NOR Flash: M29W128F /0x64000000/256*064Kg" '@', 0, 'N', 0, 'O', 0, 'R', 0, ' ', 0, 'F', 0, 'l', 0, 'a', 0, 's', 0, /*18*/ 'h', 0, ' ', 0,':', 0, ' ',0,'M',0,'2',0,'9',0,'W',0,'1',0,'2',0,'8',0,'F',0, /*24*/ '/',0,'0',0,'x',0,'6',0,'4',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0, /*22*/ '/', 0, '0', 0, '2', 0, '5', 0, '6', 0, '*', 0, '6', 0, '4', 0, 'K', 0, 'g', 0 /*20*/ };

接下去需要修改的是nor_if.c这个文件,这个文件是介于驱动和MAL层之间的桥梁。这个文件主要是进一步封装一下nor flash的底层驱动程序。这款需要定义NOR_If_Init()、NOR_If_Erase()、NOR_If_Write()、NOR_If_Read()这4个函数,都是调用驱动代码的相关函数:

/******************************************************************************* * Function Name : NOR_If_Init * Description : Initializes the Media on the STM32 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t NOR_If_Init(void) { FSMC_NOR_Init(); return MAL_OK; }/******************************************************************************* * Function Name : NOR_If_Erase * Description : Erase sector * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t NOR_If_Erase(uint32_t Address) { printf("正在擦除Nor Flash\r\n"); /* Erase the destination memory */ FSMC_NOR_EraseBlock(Address & 0x00FFFFFF); printf("擦除成功\r\n"); return MAL_OK; }/******************************************************************************* * Function Name : NOR_If_Write * Description : Write sectors * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t NOR_If_Write(uint32_t Address, uint32_t DataLength) { if ((DataLength & 1) == 1) /* Not an aligned data */ { DataLength += 1; MAL_Buffer[DataLength-1] = 0xFF; } printf("向0x%x地址处写入%d个字节\r\n",Address,DataLength); FSMC_NOR_WriteBuffer((uint16_t *)MAL_Buffer, (Address&0x00FFFFFF), DataLength >> 1); return MAL_OK; }/******************************************************************************* * Function Name : NOR_If_Read * Description : Read sectors * Input : None * Output : None * Return : buffer address pointer *******************************************************************************/ uint8_t *NOR_If_Read(uint32_t Address, uint32_t DataLength) { printf("在0x%x地址处读出%d个字节数据\r\n",Address,DataLength); return (uint8_t*)(Address); }

再接下去就是dfu_mal.c媒体接入层的函数了。这个文件也只定义了5个函数:MAL_Init()、MAL_Erase()、MAL_Write()、MAL_Read()、MAL_GetStatus(),这些函数基本上是调用nor_if.c中定义的相关函数:

uint16_t (*pMAL_Init) (void); uint16_t (*pMAL_Erase) (uint32_t SectorAddress); uint16_t (*pMAL_Write) (uint32_t SectorAddress, uint32_t DataLength); uint8_t *(*pMAL_Read) (uint32_t SectorAddress, uint32_t DataLength); uint8_t MAL_Buffer[wTransferSize]; /* RAM Buffer for Downloaded Data */NOR_IDTypeDef NOR_ID;extern ONE_DESCRIPTOR DFU_String_Descriptor[7];static const uint16_t TimingTable[3][2] = { /* 扇区擦写时间, 扇区编程时间*/ { SPI_FLASH_SECTOR_ERASE_TIME, SPI_FLASH_SECTOR_WRITE_TIME }, /* SPI Flash */ { M29W128F_SECTOR_ERASE_TIME, M29W128F_SECTOR_WRITE_TIME }, /* NOR Flash M29W128F */ { INTERN_FLASH_SECTOR_ERASE_TIME, INTERN_FLASH_SECTOR_WRITE_TIME }, /* Internal Flash */ }; /******************************************************************************* * Function Name : MAL_Init * Description : STM32初始化的媒体初始化 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t MAL_Init(void) { FSMC_NOR_Init(); NOR_If_Init(); FSMC_NOR_ReadID(&NOR_ID); printf(" Nor Flash ID:0x%x 0x%x\r\n",NOR_ID.Manufacturer_Code,NOR_ID.Device_Code1); FSMC_NOR_ReturnToReadMode(); return MAL_OK; }/******************************************************************************* * Function Name : MAL_Erase * Description : 擦除扇区 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t MAL_Erase(uint32_t SectorAddress) { switch (SectorAddress & MAL_MASK) //参看地址 { case NOR_FLASH_BASE: pMAL_Erase = NOR_If_Erase; break; default: return MAL_FAIL; } return pMAL_Erase(SectorAddress); //指向擦除函数 }/******************************************************************************* * Function Name : MAL_Write * Description : 写扇区 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength) { switch (SectorAddress & MAL_MASK) //查看地址 { case NOR_FLASH_BASE: pMAL_Write = NOR_If_Write; break; default: return MAL_FAIL; } return pMAL_Write(SectorAddress, DataLength);//调用写扇区函数 }/******************************************************************************* * Function Name : MAL_Read * Description : 度扇区 * Input : None * Output : None * Return : Buffer pointer *******************************************************************************/ uint8_t *MAL_Read (uint32_t SectorAddress, uint32_t DataLength) { switch (SectorAddress & MAL_MASK) //查看地址 { case NOR_FLASH_BASE: pMAL_Read = NOR_If_Read; break; default: return 0; } return pMAL_Read (SectorAddress, DataLength);//调用如扇区函数 }/******************************************************************************* * Function Name : MAL_GetStatus * Description : 获取状态 * Input : None * Output : None * Return : MAL_OK *******************************************************************************/ uint16_t MAL_GetStatus(uint32_t SectorAddress , uint8_t Cmd, uint8_t *buffer) { //更具地址查找定时表的对应的选项 uint8_t x = (SectorAddress >> 26) & 0x03 ; /* 0x000000000 --> 0 SPI Flash*/ /* 0x640000000 --> 1 Nor Flash*/ /* 0x080000000 --> 2 Internal Flash*/ uint8_t y = Cmd & 0x01; SET_POLLING_TIMING(TimingTable[x][y]); /* x: 擦除/写 定时 */ /* y: Media */ return MAL_OK; }

最后,我们在main中定义一些测试Nor Flash的一些代码, 按键1按下擦写0x64000000地址开始的那个扇区数据; 按键2按下表示向spi flash的0地址写入一组数据; 按键3按下表示表示向spi flash的0地址写入另一组数据; 按键4按下表示读取0地址开始的数据:

u16 TxBuffer0[8]={0x0000,0x0002,0x0004,0x00080,0x0010,0x0020,0x0040,0x0080}; u16 TxBuffer1[8]={0x0100,0x0200,0x0400,0x08000,0x1000,0x2000,0x4000,0x8000}; u16 RxBuffer[8];

int main(void) { u8 i=8; BSP_Init(); printf(" |===============================================|\r\n"); printf(" STM32 DFU 程序开始 \r\n"); printf("|===============================================|\r\n"); /* Enter DFU mode */ DeviceState = STATE_dfuERROR; //程序指向到这句话,说明DFU跳转不成功 DeviceStatus[0] = STATUS_ERRFIRMWARE; DeviceStatus[4] = DeviceState; USB_Configuration(); //初始化USB while(1) { if(!KEY1_STATE()) { while(!KEY1_STATE()); printf("正在擦除Nor Flash!\r\n"); FSMC_NOR_EraseBlock(0); printf("擦除成功!\r\n"); } if(!KEY2_STATE()) { while(!KEY2_STATE()); i=8; printf("正在擦除,请稍等...\r\n"); FSMC_NOR_EraseBlock(0); printf("擦除完毕,正在写入!"); FSMC_NOR_WriteBuffer(TxBuffer0,0,8); printf("向Nor Flash写入的数据为:\r\n"); while(i--) printf("0x%x ",TxBuffer0[i]); printf("\r\n数据写入完毕!\r\n"); } if(!KEY3_STATE()) { while(!KEY3_STATE()); i=8; printf("正在擦除,请稍等...\r\n"); FSMC_NOR_EraseBlock(0); printf("擦除完毕,正在写入!"); FSMC_NOR_WriteBuffer(TxBuffer1,0,8); printf("向Nor Flash写入的数据为:\r\n"); while(i--) printf("0x%x ",TxBuffer1[i]); printf("\r\n数据写入完毕!\r\n"); } if(!KEY4_STATE()) { while(!KEY4_STATE()); i=8; printf("正在读取数据...\r\n"); FSMC_NOR_ReadBuffer(RxBuffer,0,8); printf("读出来的数据为:\r\n"); while(i--) printf("0x%x ",RxBuffer[i]); printf("\r\n数据读取完毕!\r\n"); } } }

这篇关于STM32 Nor Flash DFU的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030805

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

STM32单片机PWR电源控制详解

文章目录 1. PWR概述 2. 电源结构框图 3. 上电复位和掉电复位 4. 可编程电压监测器 5. 低功耗模式 6. 模式选择 6.1 睡眠模式 6.2 停止模式 6.3 待机模式 7. 代码示例 1. PWR概述 PWR(Power Control)电源控制,负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能。 可编程电压监测器

google gemini1.5 flash视频图文理解能力初探(一)

市面能够对视频直接进行分析的大模型着实不多,而且很多支持多模态的大模型那效果着实也不好。 从这篇公众号不只是100万上下文,谷歌Gemini 1.5超强功能展示得知,Gemini 1.5可以一次性处理1小时的视频、11小时的音频或100,000行代码,并衍生出更多的数据分析玩法。能力覆盖: 跨模式理解和推理,当给出一部 44 分钟的巴斯特-基顿(Buster Keaton)无声电影时,该模型能准

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了,因为种种原因,也有很久一段时间没接触过stm32了。等我捡起来的时候,发现很多都已经忘记了,重新捡起来吧。 每次谈到stm32如何如何,那么该如何解释什么是stm32呢? 1.什么是STM32 stm32

Ubuntu安装火狐Flash Player插件

1、进入官网下载页面选择:.tar.gz,适用于其他Linux。此次文件名为install_flash_player_11_linux.x86_64.tar.gz 2、解压文件 tar -zxvf install_flash_player_11_linux.x86_64.tar.gz 3、利用whereis命令查找mozilla文件夹的路径 whereis mozill

STM32学习 修改系统主频

前面时钟树的学习说明单片机的主频是可以修改的,那么怎么更改系统的主频,这里做一个简单的介绍。首先要明白,单片机的程序是如何运行,这里简单说明一下。 对应的代码在startup_stm32....文件里面,这里是复位程序的汇编代码。 复位子程序是系统上电后第一个执行的程序,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数 _mian,最终调用 main 函数去到 C

使用J-Link Commander查找STM32死机问题

接口:PA13,PA14,请勿连接复位引脚。 输入usb命令 这里我已经连接过了STM32F407VET6了。 再输入connect命令 这里我已经默认选择了SWD接口,4000K速率。 可以输入speed 4000命令选择4000K速率: 写一段崩溃代码进行测试: void CashCode(void){*((volatile uint32_t*) 0x080FFFFF)

[技术笔记] 元器件采购之Flash的国内、外厂商Top5

国外Top5 1、Micron(镁光)半导体 2、Toshiba(东芝) 3、Hynix(海力士) 4、Samsung(三星) 5、Intel(因特尔) 6、SanDisk(闪迪) 7、Nanya(南亚科技) 8、SCSemicon(华芯科技) 中国企业在主流通用型存储器的市场全球市占率比较低,而在NOR Flash利基存储器领域成长了一批优秀企业,包括兆易创新、东芯股份

基于STM32的智能家居安防系统

目录 引言环境准备智能家居安防系统基础代码实现:实现智能家居安防系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:智能家居安防管理与优化问题解决方案与优化收尾与总结 1. 引言 智能家居安防系统通过使用STM32嵌入式系统,结合多种传感器和控制设备,实现对家庭环境的实时监测和安防管理。本文将详细介绍如何在STM32系统中实现一个智能家居

我在高职教STM32——LCD液晶显示(3)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享出来,主要面向广大师生朋友,单片机老鸟就略过吧。欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!