打印

stm8s块擦除问题

[复制链接]
4179|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxs9933|  楼主 | 2009-10-28 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pSysdata.addr = 10;
  pSysdata.chanel = 4;
  /*写到块中的数据*/
  pSysdata.type[0] = 0;
  pSysdata.type[1] = 1;
  pSysdata.type[2] = 2;
  pSysdata.type[3] = 3;
  pSysdata.cutdown[0] = 0;
  pSysdata.cutdown[1] = 1;
  pSysdata.cutdown[2] = 1;
  pSysdata.cutdown[3] = 0;
  pSysdata.cutdlytime[0] = 1;
  pSysdata.cutdlytime[1] = 2;
  pSysdata.cutdlytime[2] = 3;
  pSysdata.cutdlytime[3] = 4;
  

Write2Flash(FLASHADDR_PSYDATA, (u8 *)(&pSysdata), sizeof(pSysdata));

/*调用到库中的操作部分*/
void FLASH_EraseBlock(u16 BlockNum, FLASH_MemType_TypeDef MemType)
{
    u16 timeout = OPERATION_TIMEOUT;
#ifdef PointerAttr_Far
    u32 StartAddress = 0;
#else /* PointerAttr_Near */
    PointerAttr u32 *pwFlash;
    u32 StartAddress = 0;
#endif /*PointerAttr_Far*/
    /* Check parameters */
    if (MemType == FLASH_MEMTYPE_PROG)
    {
        StartAddress = FLASH_PROG_START_PHYSICAL_ADDRESS;
    }
    else
    {
        StartAddress = FLASH_DATA_START_PHYSICAL_ADDRESS;
    }
#ifdef PointerAttr_Far
    /* Point to the first block address */
    StartAddress = StartAddress + ((u32)BlockNum * FLASH_BLOCK_SIZE);
    /* Enable erase block mode */
   
    FLASH->CR2 |= FLASH_CR2_ERASE;
    ON_ALARM_LED(); //程序可正常跑到这里
    FLASH->NCR2 &= (u8)(~FLASH_NCR2_NERASE);//似乎是这里擦除始能出现问题
    //while (!(FLASH->IAPSR & FLASH_IAPSR_EOP));
    OFF_ALARM_LED();
    ON_COMMUICATION_LED();//程序没有到这里
    *((PointerAttr u8*) StartAddress) = FLASH_CLEAR_BYTE;
    *((PointerAttr u8*) StartAddress + 1) = FLASH_CLEAR_BYTE;
    *((PointerAttr u8*) StartAddress + 2) = FLASH_CLEAR_BYTE;
    *((PointerAttr u8*) StartAddress + 3) = FLASH_CLEAR_BYTE;
   
#else /*PointerAttr_Near*/
    /* Point to the first block address */
    pwFlash = (PointerAttr u32 *)(StartAddress + ((u32)BlockNum * FLASH_BLOCK_SIZE));
    /* Enable erase block mode */
    FLASH->CR2 |= FLASH_CR2_ERASE;
    FLASH->NCR2 &= (u8)(~FLASH_NCR2_NERASE);
    *pwFlash = (u32)0;
#endif /*PointerAttr_Far*/
#if defined (STM8S208) || defined(STM8S207) || defined(STM8S105)
    /* Waiting until High voltage flag is cleared*/
    while ((FLASH->IAPSR & FLASH_IAPSR_HVOFF) != 0x00 || (timeout == 0x00))
    {
        timeout--;
        ON_COMMUICATION_LED();
    }
#endif /* STM8S208, STM8S207, STM8S105 */
}

/*始能那里出现问题后main中的程序就停止了*/
沙发
有意思| | 2009-10-28 22:25 | 只看该作者
在FLASH_EraseBlock此之前已经对datarom解锁

使用特权

评论回复
板凳
liuxiaoyun1210| | 2012-9-14 13:47 | 只看该作者
对了FLASH_EraseBlock解锁也不能块擦,只能单字节写。

使用特权

评论回复
地板
zsyzww| | 2015-12-25 16:59 | 只看该作者
本帖最后由 zsyzww 于 2015-12-25 17:03 编辑

RAM中运行程序
1、可使用COMSIC中的函数_fctcpy将FLASH中的代码拷贝到RAM中,并运行。
2、需要在程序中应用int_fctcpy(charname);(无需加头文件,只需声明下函数就可以了)(char _fatcpy(char name))
3、定义函数代码如下
#pragmasection(CODE_IN_RAM)//将下面定义的未初始化变量定义到段CODE_IN_RAM中
voidDelayUs(uchart)
{
        while(t--);
}
#pragmasection()//返回到正常的section.

“CODE_IN_RAM”为自己的取的一个名字可以是其他名字之后在菜单栏选择Project->Settings弹出下面菜单选项
之后选择Linker选项,在Linker选项下
Category中选择Input此项后


在Ram中参建一个“.CODE_IN_RAM”段。并在Option中填入“-ic”下面是一份完整的代码
#include<iostm8s103.h>//stm8s系列的头文件#defineucharunsignedcharint_fctcpy(charname);

#pragmasection(CODE_IN_RAM)//将下面定义的未初始化变量定义到.namesection中
voidDelayUs(uchart)
{
        while(t--);
}
#pragmasection()//返回到正常的section.@tinyunsignedchartemp_C;

main()
{
        _fctcpy('C');//将pragmasection(CODE_IN_RAM)中的函数赋值到RAM中//参数‘C’是CODE_IN_RAM的第一个字母
        DelayUs(20);
        while(1)
        {
        
        }
}

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝