完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
flash的初始化,flash和清除一些flash的异常状态标识
uint16_t MEM_If_Init_FS(无效) { HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); } uint16_t MEM_If_DeInit_FS(无效) { HAL_FLASH_Lock(); } flash的指令操作 uint16_t MEM_If_Erase_FS(uint32_t start_Add,uint32_t end_Add) { /* 用户代码开始 3 */ uint32_t 用户起始扇区; uint32_t 扇区错误; FLASH_EraseInitTypeDef pEraseInit; /* 解锁 Flash 使能 Flash 控制寄存器访问 *************/ MEM_If_Init_FS(); /* 获取开始用户闪存区的扇区 */ UserStartSector = GetSector(start_Add); pEraseInit.TypeErase = TYPEERASE_SECTORS; pEraseInit.Sector = UserStartSector; pEraseInit.NbSectors = GetSector(end_Add)-UserStartSector+1 ; pEraseInit.VoltageRange = VOLTAGE_RANGE_3; 如果(HAL_FLASHEx_Erase(&pEraseInit, &SectorError) != HAL_OK) { /* 页面擦除时出错 */ 返回(1); } 返回(USBD_OK); /* 用户代码结束 3 */ } 注意这里使用GetSector()函数获取的,是一个整型数字(对于F4就是0~11)。 其中的 NbSectors 是需要清除的扇区的个数。 下面是获取部门编号的 我们先按照用户上的手册在u***d_dfu_.h中定义一些文件如果写的领域地址地址 #define ADDR_FLASH_SECTOR_0 ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 KB */ #define ADDR_FLASH_SECTOR_1 ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 KB */ #define ADDR_FLASH_SECTOR_2 ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 KB */ #define ADDR_FLASH_SECTOR_3 ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 KB */ #define ADDR_FLASH_SECTOR_4 ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 KB */ #define ADDR_FLASH_SECTOR_5 ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 KB */ #define ADDR_FLASH_SECTOR_6 ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 KB */ #define ADDR_FLASH_SECTOR_7 ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 KB */ #define ADDR_FLASH_SECTOR_8 ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 KB */ #define ADDR_FLASH_SECTOR_9 ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 KB */ #define ADDR_FLASH_SECTOR_10 ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 KB */ #define ADDR_FLASH_SECTOR_11 ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 KB */ 再在u***d_dfu_if.c文件中添加函数: /** * @brief 获取给定地址的扇区 * @param 地址: Flash 地址 * @retval 给定地址的扇区 */ 静态 uint32_t GetSector(uint32_t 地址) { uint32_t 扇区 = 0; if((地址《ADDR_FLASH_SECTOR_1) && (地址》= ADDR_FLASH_SECTOR_0)) { 扇区 = FLASH_SECTOR_0; } else if((地址《 ADDR_FLASH_SECTOR_2) && (地址 》= ADDR_FLASH_SECTOR_1)) { 扇区 = FLASH_SECTOR_1; } else if((地址《 ADDR_FLASH_SECTOR_3) && (地址 》= ADDR_FLASH_SECTOR_2)) { 扇区 = FLASH_SECTOR_2; } else if((地址《 ADDR_FLASH_SECTOR_4) && (地址 》= ADDR_FLASH_SECTOR_3)) { 扇区 = FLASH_SECTOR_3; } else if((地址《 ADDR_FLASH_SECTOR_5) && (地址 》= ADDR_FLASH_SECTOR_4)) { 扇区 = FLASH_SECTOR_4; } else if((地址《 ADDR_FLASH_SECTOR_6) && (地址 》= ADDR_FLASH_SECTOR_5)) { 扇区 = FLASH_SECTOR_5; } else if((地址《 ADDR_FLASH_SECTOR_7) && (地址 》= ADDR_FLASH_SECTOR_6)) { 扇区 = FLASH_SECTOR_6; } else if((地址《 ADDR_FLASH_SECTOR_8) && (地址 》= ADDR_FLASH_SECTOR_7)) { 扇区 = FLASH_SECTOR_7; } else if((地址《 ADDR_FLASH_SECTOR_9) && (地址 》= ADDR_FLASH_SECTOR_8)) { 扇区 = FLASH_SECTOR_8; } else if((地址《 ADDR_FLASH_SECTOR_10) && (地址 》= ADDR_FLASH_SECTOR_9)) { 扇区 = FLASH_SECTOR_9; } else if((地址《 ADDR_FLASH_SECTOR_11) && (地址 》= ADDR_FLASH_SECTOR_10)) { 扇区 = FLASH_SECTOR_10; } 别的 { 扇区 = FLASH_SECTOR_11; } 返回扇区; } flash的写入操作 uint16_t MEM_If_Write_FS(uint8_t *src, uint8_t *dest, uint32_t Len) { /* 用户代码开始 3 */ uint32_t i = 0; 对于(i = 0; 我《伦;i+=4) { /* 设备电压范围应该是[2.7V 到 3.6V],操作将 按字节完成 */ if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)(dest+i), *(uint32_t*)(src+i)) == HAL_OK) { /* 检查写入的值 */ if(*(uint32_t *)(src + i) != *(uint32_t*)(dest+i)) { /* Flash 内容与 SRAM 内容不匹配 */ 返回2; } } 别的 { /* 在闪存中写入数据时发生错误 */ 返回 1; } } 返回(HAL_OK); /* 用户代码结束 3 */ } flash的读出操作 uint8_t *MEM_If_Read_FS (uint8_t *src, uint8_t *dest, uint32_t Len) { /* 返回一个有效地址以避免硬故障 */ /* 用户代码开始 4 */ uint32_t i = 0; uint8_t *psrc = src; 对于(i = 0; 我《伦;我++) { dest[i] = *psrc++; } 返回 HAL_OK; /* 用户代码结束 4 */ } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:34 , Processed in 0.864391 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号