OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 260|回复: 6

库函数操作选项字节问题

[复制链接]

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
发表于 2017-12-20 16:14:30 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 595953427 于 2017-12-20 17:33 编辑

最近刚接触STM8单片机,学习用库函数操作,现在遇到库函数不能修改选项字节的问题,请大神帮忙解答一下。编译没有问题,就是不能修改选项字节。

[C] 纯文本查看 复制代码
void Set_Beep_OptionByte(void)
{
        uint16_t Beep_Option_status;
        Beep_Option_status=FLASH_ReadOptionByte(Beep_OptionAdd);
        if(!(Beep_Option_status&0x8000))
        {
                FLASH_ProgramOptionByte(Beep_OptionAdd,(uint8_t)((Beep_Option_status|0x8000)>>8));
        }
}


最佳答案

查看完整内容[请看2#楼]

问题解决,在写选项字节之前没有对FLASH_DATA解锁,写之前先解锁,写完后再加锁就OK了
回复

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
 楼主| 发表于 2017-12-20 16:14:31 | 显示全部楼层
问题解决,在写选项字节之前没有对FLASH_DATA解锁,写之前先解锁,写完后再加锁就OK了
回复

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
 楼主| 发表于 2017-12-20 16:33:01 | 显示全部楼层
有没有人遇到过这种情况?大家的选项字节都是在烧录软件里面设置的吗?
回复

使用道具 举报

  离线 

22

主题

1494

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3368
金钱
3368
注册时间
2016-5-29
在线时间
501 小时
发表于 2017-12-20 16:40:25 | 显示全部楼层
选项字节修改比较容易呀.和处理EEPROM比较相似.注意选项字节有一个检验反码位置.也要写.不然无效.并且修改后要重启.
深圳富美莱怡家智能科技有限公司
主营:可视对讲,智能家居安防,灯光控制,空调控制
智能门窗,门锁.
回复

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
 楼主| 发表于 2017-12-20 17:15:06 | 显示全部楼层
FLASH_ProgramOptionByte(Beep_OptionAdd,(uint8_t)((Beep_Option_status|0x8000)>>8));
我看过这个函数的内容,里面有往下一个地址写了一个反数,应该不是这里的问题
回复

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
 楼主| 发表于 2017-12-20 17:31:11 | 显示全部楼层
下面是库函数里面的原代码,
[C] 纯文本查看 复制代码
void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data)//编程指定地址的选项字节
{
    /* Check parameter */
    assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address));//检查地址是否正确

    /* Enable write access to option bytes */
    FLASH->CR2 |= FLASH_CR2_OPT;//打开操作选项字节寄存器
    FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NOPT);

    /* check if the option byte to program is ROP*/
    if (Address == 0x4800)//如果地址是读保护选项
    {
       /* Program option byte*/
       *((NEAR uint8_t*)Address) = Data;//写入指定的选项字节数据
    }
    else//地址不是读保护选项
    {
       /* Program option byte and his complement */
       *((NEAR uint8_t*)Address) = Data;//写入指定选项字节数据到指定地址
       *((NEAR uint8_t*)((uint16_t)(Address + 1))) = (uint8_t)(~Data);//在下一个地址写入反数
    }
    FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);//等待操作完成

    /* Disable write access to option bytes */
    FLASH->CR2 &= (uint8_t)(~FLASH_CR2_OPT);//关闭操作选项字节寄存器
    FLASH->NCR2 |= FLASH_NCR2_NOPT;
}
回复

使用道具 举报

  离线 

3

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2017-12-20
在线时间
6 小时
 楼主| 发表于 2017-12-20 17:32:22 | 显示全部楼层
我知道为什么了,没有给FLASH_DATA解锁,写选项字节之前先解锁,写完后再加锁就OK了,这参考程序真是坑爹
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-1-21 01:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */