uparam中的变量的尺寸与MCU的flash写入宽度相关?

发布于 2021-03-02 09:52:08

我使用的是STM32F103VET6的开发板,内部Flash的写入宽度为16,
在使用uparam中定义变量时发现如果定义rt_int8_trt_uint8_t的变量,会报错。

这是否意味着uparam中的变量的尺寸与MCU的flash写入宽度相关?

查看更多

关注者
0
被浏览
113
2 个回答
2pw
2pw 2021-03-09

应该是flash写入驱动有问题; uparam的flash是调用fal接口写入的,变量的尺寸与MCU的flash写入宽度无关,唯一可能是fal读写flash驱动有问题。详细的错误可以贴图一下

flashman2002
flashman2002 2021-03-10

也不能说是错误,uparam的flash写入依赖fal,而具体实现在HAL_Drivers中的drv_flash_f1.c的驱动程序中:

int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t* buf, size_t size)
{
    rt_err_t    result   = RT_EOK;
    rt_uint32_t end_addr = addr + size;

    if (addr % 4 != 0) {
        LOG_E("write addr must be 4-byte alignment");
        return -RT_EINVAL;
    }

其后使用了ST的官方代码:

HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *((rt_uint32_t*)buf))

我查了一下st的官方代码st23f1xx)hal_flash.c,其实有以下几种实现:FLASH_TYPEPROGRAM_WORD和FLASH_TYPEPROGRAM_HALFWORD,也就是说可以32位写入,或16位写入,缺少FLASH_TYPEPROGRAM_BYTE写入方式的实现,所以目前只有修改为最小16位写入了,即:

static int fal_flash_write(long offset, const rt_uint8_t* buf, size_t size)
{
    rt_err_t    result   = RT_EOK;
    rt_uint32_t addr     = stm32_onchip_flash.addr + offset;
    rt_uint32_t end_addr = addr + size;

    LOG_D("addr = %x", addr);
    if (addr % 2 != 0) {
        LOG_E("write addr must be 2-byte alignment");
        return -RT_EINVAL;
    }

    if ((end_addr) > STM32_FLASH_END_ADDRESS) {
        LOG_E("write outrange flash size! addr is (0x%p)", (void*)(addr + size));
        return -RT_EINVAL;
    }

    HAL_FLASH_Unlock();

    while (addr < end_addr) {
        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, *((rt_uint16_t*)buf)) == HAL_OK) {

问题是为什么st的官方不支持byte方式的写入?请指点一二。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览