stm8s207RBT6的片上flash读写修改备忘
1. 新项目用到
stm8s207RBT6芯片,需要用片上flash保存数据。考虑将数据保存到0x18000之后的空间。
2. 用固件库函数读/写flash: 分别用FLASH_ReadByte()/FLASH_ProgramByte()两个函数(所在文件stm8s_flash.c)。
两函数代码如下:
-
void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
-
{
-
/* Check parameters */
-
assert_param(IS_FLASH_ADDRESS_OK(Address));
-
*(PointerAttr uint8_t*) (uint16_t)Address = Data;
-
}
-
uint8_t FLASH_ReadByte(uint32_t Address)
-
{
-
/* Check parameter */
-
assert_param(IS_FLASH_ADDRESS_OK(Address));
-
-
/* Read byte */
-
return(*(PointerAttr uint8_t *) (uint16_t)Address);
-
-
}
3. 测试中发现,执行到调用此两函数的地方后,死机。注释掉此两函数后,不会死机。
4. 查看代码发现对参数Address进行了强制类型转换:uint32_t类型转换成uint16_t。也就意味着对地址0x18000后的读写直接变成了对0x8000后的读写。对stm8s207rb而言,0x8000是执行代码的起始地址,对其修改会造成执行代码的混乱。
5. 去除代码中的强制类型转换。如下:
-
void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
-
{
-
/* Check parameters */
-
assert_param(IS_FLASH_ADDRESS_OK(Address));
-
*(PointerAttr uint8_t*)Address = Data;
-
}
-
uint8_t FLASH_ReadByte(uint32_t Address)
-
{
-
/* Check parameter */
-
assert_param(IS_FLASH_ADDRESS_OK(Address));
-
-
/* Read byte */
-
return(*(PointerAttr uint8_t *) Address);
-
-
}
测试中没有发生死机。之后读出后的值与写入数据比较,两者相同。
6. 使用STVP工具读出操作后的PROGRAM MEMORY内容。在指定的地址0x1AC58位置找到指定写入的内容,与写入的一致。
操作uint16_t最大值(0xFFFF)以上的存贮地址的目的。
结语:显然从商家手上得到的固件库函数本身限制了片上flash的读写范围。如果要操作大于0xFFFF的地址,需要解除此限制. 或抛开固件库,直接将地址转换成指针,对其取值或赋值。
阅读(5390) | 评论(0) | 转发(0) |