硬汉嵌入式论坛

 找回密码
 立即注册
查看: 936|回复: 5
收起左侧

[技术讨论] 关于在F103ZET6,按word写入内部flash时无法写入问题

[复制链接]

2

主题

11

回帖

17

积分

新手上路

积分
17
发表于 2024-10-29 11:36:42 | 显示全部楼层 |阅读模式
本帖最后由 mrliosen 于 2024-10-29 11:38 编辑

[C] 纯文本查看 复制代码
uint8_t bsp_WriteCpuFlash(uint32_t _ulFlashAddr, uint8_t *_ucpSrc, uint32_t _ulSize)
{
        uint32_t i;
        uint8_t ucRet;
        uint16_t usTemp;
        HAL_StatusTypeDef status = HAL_OK;
        
        uint32_t _ulFlashAddrTemp =  _ulFlashAddr;
        
        
        SEGGER_RTT_SetTerminal(1);
        SEGGER_RTT_printf(0,"flash writing front!\n");
        

        /* 如果偏移地址超过芯片容量,则不改写输出缓冲区 */
        if (_ulFlashAddr + _ulSize > FLASH_BASE_ADDR + FLASH_SIZE)
        {
                return 1;
        }

        /* 长度为0 时不继续操作  */
        if (_ulSize == 0)
        {
                return 0;
        }


        ucRet = bsp_CmpCpuFlash(_ulFlashAddr, _ucpSrc, _ulSize);

        if (ucRet == FLASH_IS_EQU)
        {
                return 0;
        }
        
        
        
        
        
        
        

        __set_PRIMASK(1);                  /* 关中断 */

        /* FLASH 解锁 */
        HAL_FLASH_Unlock();
        

          /
        /*boot里擦除快一些*/
        for (i = 0; i < _ulSize / 4; i++)        /* 未处理非4字节整数倍个数情况 */
        {
                //uint32_t FlashWord[4];
                uint32_t FlashWord;
                
                memcpy((char *)&FlashWord, _ucpSrc, 4);
                _ucpSrc += 4; /*对传入的地址也+4*/
                
                //FLASH_TYPEPROGRAM_WORD
                if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
                {
                        _ulFlashAddr = _ulFlashAddr + 4; /* increment for the next Flash word*/                                
                }                
                else
                {
                        goto err;
                }
         }
        
        /* 2019-10-03 长度不是4字节整数倍 */
        if (_ulSize % 4)
        {
                
                uint8_t FlashWord[4];
                
                FlashWord[0] = 0;
                FlashWord[1] = 0;
                FlashWord[2] = 0;
                FlashWord[3] = 0;
                
                                
                memcpy((char *)FlashWord, _ucpSrc, _ulSize % 4);
                
                
                if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
                {
                        ; // _ulFlashAddr = _ulFlashAddr + 32; /* increment for the next Flash word*/                        
                }                
                else
                {
                        goto err;
                }
        }
        
        
        
        

          /* Flash 加锁,禁止写Flash控制寄存器 */
        HAL_FLASH_Lock();

          __set_PRIMASK(0);                  /* 开中断 */

        /*检查写入和内存中的数据是否一样*/
        ucRet = bsp_CmpCpuFlash(_ulFlashAddrTemp, _ucpSrc, _ulSize);

        if (ucRet == FLASH_IS_EQU)
        {
                return 0;   /* 成功 */
        }    
    
        return 2;   /* 错误 */
        
        
        
err:
          /* Flash 加锁,禁止写Flash控制寄存器 */
          HAL_FLASH_Lock();

          __set_PRIMASK(0);                  /* 开中断 */

        return 2;        

}




硬汉哥,为什么这个写入奇数字节时比如3字节,做了末尾补0,但是就是写入后,读出来的东西就是乱码,调试后发现是%4取余这段代码除了问题,这时什么情况?可以帮忙看一吗?
比如写入的数据是字符 “hel”读出来的数据缺失乱码。
[C] 纯文本查看 复制代码
/* 2019-10-03 长度不是4字节整数倍 */
if (_ulSize % 4)
{

uint8_t FlashWord[4];

FlashWord[0] = 0;
FlashWord[1] = 0;
FlashWord[2] = 0;
FlashWord[3] = 0;


memcpy((char *)FlashWord, _ucpSrc, _ulSize % 4);


if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, _ulFlashAddr, ((uint32_t)FlashWord)) == HAL_OK)
{
; // _ulFlashAddr = _ulFlashAddr + 32; /* increment for the next Flash word*/
}
else
{
goto err;
}
}



回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-10-29 12:24:50 | 显示全部楼层
考虑自己写入前手动补齐到4字节整数倍,不要执行代码里面的%4了
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2024-10-29 13:24:24 | 显示全部楼层
不是按照16bit来写入的吗

STM32F10x Flash Programming (Chinese).pdf

234.75 KB, 下载次数: 3

回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2024-10-29 14:17:53 | 显示全部楼层
tajiong 发表于 2024-10-29 13:24
不是按照16bit来写入的吗

HAL库是有按word来写入的功能。
回复

使用道具 举报

2

主题

11

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2024-10-29 14:18:50 | 显示全部楼层
eric2013 发表于 2024-10-29 12:24
考虑自己写入前手动补齐到4字节整数倍,不要执行代码里面的%4了

硬汉哥 你写的库好像都有这样写的,你有遇到过这个问题吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-10-29 15:01:07 | 显示全部楼层
mrliosen 发表于 2024-10-29 14:18
硬汉哥 你写的库好像都有这样写的,你有遇到过这个问题吗?

这个早期是同事做的驱动,别用他%4的部分了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:29 , Processed in 0.057855 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表