打印
[STM8]

IAR FOR STM8 (IAP升级程序调试过程中写FLASH遇到的指针问题)

[复制链接]
3516|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chzfmx|  楼主 | 2013-11-24 00:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开发环境:IAR FOR STM8
MCU:STM8L151C8T6
         RAM:       4KBytes
         FLASH:    64KBytes (Addr:0x8000~0x17fff)
最近在做STM8的IAP程序,STM8 程序区起始地址为0x8000,预留10KBytesFLASH空间给bootloader,即APP(应用程序)起始地址为0xA800,写完IAP后调试发现,当APP(应用程序)小于22KBtes时程序运行正常,大于22KBytes则无法运行,程序跑飞,检查后发现对FLASH读写的函数有问题,如下:
unsigned char  *p;
unsigned char flash_Write(unsigned int offset,unsigned char *str,unsigned int len)
{
  unsigned int i=0;
  unsigned int timeOut=0;
  p=(unsigned char *)(0x8000+offset);   
  if(flash_UnLock()) return 1;  
  for(i=0;i<len;i++)
  {
    *p=str[i];
    //*((unsigned char *)(uint32_t)0x8000+offset+i)=str[i];
    timeOut=50000;
    while(--timeOut)
    {
      if((FLASH->IAPSR & 0x04)) break;
    }
    if(timeOut==0) return 2;
    p++;
  }
  flash_Lock();
  return 0;
}
指针p最多能指到地址0xffff,即指针p本身是2Bytes,按照网上查找的资料,在指针变量定义时增加关键字 __far 就可以指定指针p本身为24bits(3Bytes),但实际测试却仍是2Bytes,测试程序如下:
unsigned char __far *p;
main()
{
  while(1)
  {
    p++;
  }
}
用ST_LINK调试监控,p仍是增到0xffff后再自增就归0了,那么该如何让p能指到0xffff之后的地址呢?
沙发
aundry| | 2014-9-2 11:33 | 只看该作者
请问找到问题了吗?我现在也是遇到这种情况,不知道怎么处理

使用特权

评论回复
板凳
liub_2014| | 2014-9-5 16:57 | 只看该作者
定义一个32位的变量,自增变量后在强制转换成指针

使用特权

评论回复
地板
liub_2014| | 2014-9-5 16:59 | 只看该作者
aundry 发表于 2014-9-2 11:33
请问找到问题了吗?我现在也是遇到这种情况,不知道怎么处理


定义一个32位的变量,自增变量后在强制转换成指针

使用特权

评论回复
5
aundry| | 2014-9-6 01:05 | 只看该作者
liub_2014 发表于 2014-9-5 16:59
定义一个32位的变量,自增变量后在强制转换成指针

搞定了,不是这个原因
跟踪下去,是发现就算函数定位为RAM区
但是有些代码,比如官方例程中关于Flash区的写入还是汇编成一个汇编函数
该函数刚好定义在Flash区,所以挂了
如果在前面设置断点,停下来,又可以,直接运行就死掉
如果是一直死掉更好找,真是蛋碎的设计

使用特权

评论回复
6
liub_2014| | 2014-9-6 09:14 | 只看该作者
aundry 发表于 2014-9-6 01:05
搞定了,不是这个原因
跟踪下去,是发现就算函数定位为RAM区
但是有些代码,比如官方例程中关于Flash区的 ...

没办法啊,哥们在做什么项目啊?

使用特权

评论回复
7
aundry| | 2014-10-23 09:20 | 只看该作者
liub_2014 发表于 2014-9-6 09:14
没办法啊,哥们在做什么项目啊?

不好意思,太久没登陆过
现在能正常使用了,官方提供的关于地址那部分代码编译成汇编是在Flash的
所以会出错,我是要做STM8在线升级

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

1

粉丝