stm32的HAL库函数flash无法写入的问题

这篇具有很好参考价值的文章主要介绍了stm32的HAL库函数flash无法写入的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录一下对flash编程操作时出现的问题以及解决办法

问题:在使用HAL库中的HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)函数时发现总是没办法写入(明明写之前使用void FLASH_PageErase(uint32_t PageAddress)函数擦除了flash),查阅资料说是可能是因为固件库HAL_FLASH_Program函数有问题,建议换成寄存器直接操作,但是换成后发现仍有问题,读写入地址的数据任然是0xffffffff。

多次尝试发现,在第一次使用FLASH_PageErase擦除flash以及HAL_FLASH_Program写flash,烧录后,读取写入地址数据是0xffffffff,但是紧接着在代码中注释掉FLASH_PageErase这行,再次烧录,就会发现写入地址处的数据是程序中要写的数据,但是reset后就会发现,HAL_FLASH_Program函数的写入状态有问题,如下图所示:

stm32的HAL库函数flash无法写入的问题,stm32,嵌入式硬件,单片机

stm32的HAL库函数flash无法写入的问题,stm32,嵌入式硬件,单片机

 stm32的HAL库函数flash无法写入的问题,stm32,嵌入式硬件,单片机

以上可以猜测一下,可能是固件库 FLASH_PageErase函数有问题,选择用寄存器直接操作,直接照搬正点原子的寄存器函数,如下所示:

static uint8_t stmflash_get_error_status(void)
{
    uint32_t res;
    res = FLASH->SR;

    if (res & (1 << 0))return 1;    /* BSY = 1      , 忙 */
    if (res & (1 << 2))return 2;    /* PGERR = 1    , 编程错误*/
    if (res & (1 << 4))return 3;    /* WRPRTERR = 1 , 写保护错误 */
    
    return 0;   /* 没有任何错误 操作完成. */
}

static uint8_t stmflash_wait_done(uint32_t time)
{
    uint8_t res;

    do
    {
        res = stmflash_get_error_status();

        if (res != 1)
        {
            break;      /* 非忙, 无需等待了, 直接退出 */
        }
        
        time--;
    } while (time);

    if (time == 0)res = 0XFF;   /* 超时 */

    return res;
}

/**
 * @brief       擦除扇区
 * @param       saddr   : 扇区地址 0 ~ 256
 * @retval      执行结果
 *   @arg       0   : 已完成
 *   @arg       2   : 编程错误
 *   @arg       3   : 写保护错误
 *   @arg       0XFF: 超时
 */
static uint8_t stmflash_erase_sector(uint32_t saddr)
{
    uint8_t res = 0;  /* STM32F103擦除的时候是指定半字地址 */
    res = stmflash_wait_done(0X5FFFFF);     /* 等待上次操作结束, >20ms */

    if (res == 0)
    {
        FLASH->CR |= 1 << 1;    /* 页擦除 */
        FLASH->AR = saddr;      /* 设置页地址(实际是半字地址) */
        FLASH->CR |= 1 << 6;    /* 开始擦除 */
        res = stmflash_wait_done(0X5FFFFF); /* 等待操作结束, >20ms */

        if (res != 1)   /* 非忙 */
        {
            FLASH->CR &= ~(1 << 1); /* 清除页擦除标志 */
        }
    }

    return res;
}

然后主函数中添加如下代码:

/* USER CODE BEGIN 1 */
	__IO uint32_t addr = 0x08020000;
	uint32_t applength = 0;
	uint16_t status;
/* USER CODE END 1 */

/* USER CODE BEGIN 2 */
	printf("更换为正点原子的寄存器擦除函数后的结果:\r\n");
	HAL_FLASH_Unlock();
  stmflash_erase_sector(addr);
	status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, 0x01f360b45);
	HAL_FLASH_Lock();
	applength = *(uint32_t *)addr;
	printf("写入flash中的数据是%x\r\n",applength);
	printf("flash的写函数返回值是%x\r\n",status);
/* USER CODE END 2 */

 烧录后结果以及reset结果如下:

stm32的HAL库函数flash无法写入的问题,stm32,嵌入式硬件,单片机

成功解决问题 !文章来源地址https://www.toymoban.com/news/detail-721943.html

到了这里,关于stm32的HAL库函数flash无法写入的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯嵌入式STM32 G431 hal库开发速成——ADC与DAC

    模数转换器(ADC):它将模拟信号转换为单片机能够处理的数字信号。在很多应用中,比如温度传感器、压力传感器等,信号最初都是模拟形式的。ADC 读取这些模拟信号,然后将它们转换为数字形式,以便单片机可以读取和处理。 数模转换器(DAC):它执行相反的操作,将

    2024年02月01日
    浏览(62)
  • 蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)板子介绍

    我写蓝桥杯嵌入式大概用到的外设,都是非常常用的。我在这里汇总一下。 蓝桥杯嵌入式基础模块——GPIO的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-CSDN博客 蓝桥杯嵌入式基础模块——串口的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-C

    2024年02月02日
    浏览(49)
  • STM32F103C8T6(HAL库函数 - 内部Flash操作)

    STM32F103C8T6 内部Flash 为 64KB,本次将对他多余空间进行读写。 数据手册下载 STM32F103x8/STM32F103xB 数据手册 包含Flash Memory Page分布 STM32F设备命名 设备容量类型 中容量类型 内部空间介绍 Flash Memory 从 0x0800 0000 ~ 0x0801 FFFF 页分布1K每页, STM32F103C8T6 只有64KByte, 那就是64页 使用 controll

    2024年01月21日
    浏览(64)
  • 蓝桥杯嵌入式基础模块——LCD显示器的基本使用(新板)STM32G431(HAL库开发)

            在蓝桥杯嵌入式官方给我们提供好了,LCD显示的底层源码,我们只需要,记住里面的API函数,会用这些函数就行。         在官方给的资料中找到这个文件名字DK117_G4 Data Packet-开发板驱动文件里面就是所有的底层文件有两种类型,一种是基于HAL库的一种是标准库

    2024年02月09日
    浏览(62)
  • STM32通过串口接受文件写入Flash

            上次突发奇想,自己想做一个字库,就是把字模文件写入到FLASH里面;当时没有上位机,如果自己一个一个拆分发送很麻烦,所以自己找了很多资料,最后实现了字库。         这个方法没有协议,所以有一定的概率出错。但是临时用一用是足够了。如果需要高稳

    2024年02月10日
    浏览(42)
  • STM32 使用HAL库操作FLASH

    本文参考 :STM32CubeMX学习笔记(51)——读写内部Flash - 简书 STM32F103C8T6 stmhalflash.h stmhalflash.c 使用示例

    2024年02月12日
    浏览(40)
  • 【STM32】HAL库Flash读写操作及配置

    【STM32】HAL库Flash读写操作及配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确定程序地址的范围(如果太小了

    2024年02月03日
    浏览(46)
  • STM32CubeMX-Flash Hal库 内部Flash掉电存储

    本文将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。从而做到掉电存储。不同型号的STM32,其FLASH:容量也有所不同,最小的只有 16K字节,最大的则达到了1024K字节。此处我们使用的是 STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下

    2024年02月13日
    浏览(42)
  • 关于STM32使用HAL_UART_Receive()无法接收数据的问题

    一、问题发现         在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据

    2024年02月11日
    浏览(49)
  • STM32 HAL 库 串口 函数HAL_UART_Transmit的BUG问题 及解决方法

    近期在开发图传项目的时候,由于需要发送的数据量及其庞大,因此在处理的时候, 发现STM32HAL库的串口函数,在处理海量数据的时候, 存在bug, 导致不能将指定数量的数据全部发送出去。  例如, 我以200个字节为一个数据包, 使用HAL_UART_Transmit函数,通过串口发送。 那么

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包