Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690508
  • 博文数量: 192
  • 博客积分: 1875
  • 博客等级: 上尉
  • 技术积分: 2177
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 23:21
个人简介

有时候,就是想窥视一下不知道的东东,因为好奇!

文章分类

全部博文(192)

文章存档

2024年(8)

2023年(3)

2020年(1)

2019年(1)

2018年(1)

2017年(2)

2016年(69)

2015年(53)

2014年(14)

2013年(1)

2012年(5)

2011年(25)

2010年(9)

分类: 其他平台

2015-09-12 17:53:12

stm8s207RBT6的片上flash读写修改备忘

1. 新项目用到stm8s207RBT6芯片,需要用片上flash保存数据。考虑将数据保存到0x18000之后的空间。
2. 用固件库函数读/写flash: 分别用FLASH_ReadByte()/FLASH_ProgramByte()两个函数(所在文件stm8s_flash.c)。
    两函数代码如下:

点击(此处)折叠或打开

  1. void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
  2. {
  3.     /* Check parameters */
  4.     assert_param(IS_FLASH_ADDRESS_OK(Address));
  5.     *(PointerAttr uint8_t*) (uint16_t)Address = Data;
  6. }

点击(此处)折叠或打开

  1. uint8_t FLASH_ReadByte(uint32_t Address)
  2. {
  3.     /* Check parameter */
  4.     assert_param(IS_FLASH_ADDRESS_OK(Address));
  5.     
  6.     /* Read byte */
  7.     return(*(PointerAttr uint8_t *) (uint16_t)Address);

  8. }
3. 测试中发现,执行到调用此两函数的地方后,死机。注释掉此两函数后,不会死机。
4. 查看代码发现对参数Address进行了强制类型转换:uint32_t类型转换成uint16_t。也就意味着对地址0x18000后的读写直接变成了对0x8000后的读写。对stm8s207rb而言,0x8000是执行代码的起始地址,对其修改会造成执行代码的混乱。
5. 去除代码中的强制类型转换。如下:

点击(此处)折叠或打开

  1. void FLASH_ProgramByte(uint32_t Address, uint8_t Data)
  2. {
  3.     /* Check parameters */
  4.     assert_param(IS_FLASH_ADDRESS_OK(Address));
  5.     *(PointerAttr uint8_t*)Address = Data;
  6. }

点击(此处)折叠或打开

  1. uint8_t FLASH_ReadByte(uint32_t Address)
  2. {
  3.     /* Check parameter */
  4.     assert_param(IS_FLASH_ADDRESS_OK(Address));
  5.     
  6.     /* Read byte */
  7.     return(*(PointerAttr uint8_t *) Address);

  8. }
 测试中没有发生死机。之后读出后的值与写入数据比较,两者相同。
6. 使用STVP工具读出操作后的PROGRAM MEMORY内容。在指定的地址0x1AC58位置找到指定写入的内容,与写入的一致。
  操作uint16_t最大值(0xFFFF)以上的存贮地址的目的。

结语:显然从商家手上得到的固件库函数本身限制了片上flash的读写范围。如果要操作大于0xFFFF的地址,需要解除此限制. 或抛开固件库,直接将地址转换成指针,对其取值或赋值。
阅读(5390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~