STM8S---选项字节(Option Byte)写操作之IO复用

2017-11-14 10:17:26编辑:什么鱼 关键字:STM8S  选项字节  写操作  IO复用

功能实现目标


  通过对选项字节写操作来实现TIM2的CH3通道的PWM输出IO复用,可以设置为PA3或者PD2输出。 
通过STVP方式操作链接

选项字节

  选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份互补格式的(NOPTx)。选项字节可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被修改。有关SWIM编程过程的内容可以参考STM8S闪存编程手册(PM0051)和STM8 SWIM通信协议和调试模块用户手册(UM0470)。 
  不同的芯片的选项字节大小不一样,具体的可以参考芯片数据手册。如用STM8S103F3来举例,选项字节如下:

  STM8S103F对于20脚封装的产品的复用功能重定义位:

  由此可知我们要将OPT2字节中的AFR1位进行写操作,通过写0,则端口A3复用功能TIM2_CH3,通过写1,端口D2复用功能TIM2_CH3。接下来通过程序实现这个功能,可以修改AFR1的值来看PWM输出是否切换了管脚,如果能,则是实现了写操作。 
  选项字节存放在EEPROM中,所以可以通过读写EEPROM一样的操作方式来修改选项字节。应用程序可以直接向目标地址进行写操作。地址从上面的图中我们已经知道了:0x4803,0x4804。寄存器的配置可以查阅参考手册(RM0016)。 
  相关寄存器操作:

测试程序实现

  注意:实现程序擦写Option Bytes时,不能运行应用程序,否则会出现错误!不过还是觉得这点麻烦啊,还不如用STVP来擦写,要是能够放在应用程序中共存来擦写就好了,用程序实现复用就这么麻烦吗?希望能探索找到好的方法,最后只找到了个不靠谱的,就是在擦写后加上延时,但是这个时管用时不管用。还是再查阅资料看看是怎么回事?

  但是用STVP擦写时又遇到了这个错误:

Error : Error on Option Bytes (complementary bytes). Reprogram Option Bytes of device
Error : < OPTION BYTE verifying failed.

  用STVP来擦写Option Bytes了,先将ROP设置为ON,然后再擦写Option Bytes,会出现两个提示框,选择是(Y),再之后又将ROP设置为OFF,再次擦写Option Bytes,则又可以用STVD通过stlink来烧写程序并仿真了。

测试程序:
/* MAIN.C file
Functons    :   操作option byte字节,设置IO复用,来修改TIM2的CH3通道PWM输出管脚PA3 or PD2
Date        :   2015年7月22日
Author      :   yicm
Notes       :   
 */#includevoid CLK_init(void)
{
    CLK_ICKR "= 0X01;           //使能内部高速时钟 HSI
    CLK_CKDIVR = 0x08;          //16M内部RC经2分频后系统时钟为8M
    while(!(CLK_ICKR&0x02));    //HSI准备就绪 
    CLK_SWR=0xe1;               //HSI为主时钟源 }void Init_GPIO(void)
{    /*设置为推挽输出,PD2接了LED灯*/
    PD_DDR |= 0X04;             //设置PD2端口为输出模式
    PD_CR1 |= 0X04;             //设置PD2端口为推挽输出模式
    PD_CR2 &= 0XFD;

    PA_DDR |= 0X08;             //设置PA3端口为输出模式
    PA_CR1 |= 0X08;             //设置PA3端口为推挽输出模式
    PA_CR2 |= 0XF7;
}void Init_Tim2(void)
{
    TIM2_CCMR3 |=   0X70;   //设置定时器2三通道(PD2)输出比较三模式
    TIM2_CCMR3 |= 0X04;     //输出比较3预装载使能

    TIM2_CCER2 |= 0x03;     //通道3使能,低电平有效,配置为输出

    // 初始化时钟分频器为1,即计数器的时钟频率为Fmaster=8M/64=0.125MHZ
    TIM2_PSCR = 0X07;   
    //初始化自动装载寄存器,决定PWM 方波的频率,Fpwm=0.125M/62500=2HZ
    TIM2_ARRH = 62500/256;
    TIM2_ARRL = 62500%256;    //初始化比较寄存器,决定PWM 方波的占空比:5000/10000 = 50%
    TIM2_CCR3H = 31250/256;
    TIM2_CCR3L = 31250%256;    //启动计数;更新中断失能
    TIM2_CR1 |= 0x81;    //TIM2_IER |= 0x00;        }void Write_Option_Byte(void)
{   
    unsigned char opt[6] = {0,0,0x00,0,0,0};    /*解锁Flash*/
    do
    {
        FLASH_DUKR = 0xAE;
        FLASH_DUKR = 0x56;      
    }    while(!(FLASH_IAPSR & 0X08));    /*对选项字节进行写操作使能*/
    FLASH_CR2 = 0X80;    /*互补控制寄存器*/
    FLASH_NCR2 = 0X7F;    /*写操作,0x02:PD2。0x00:PA3*/
    *((unsigned char *)0x4800) = opt[0];

    *((unsigned char *)0x4801) = opt[1];
    *((unsigned char *)0x4802) = ~opt[1];

    *((unsigned char *)0x4803) = opt[2];
    *((unsigned char *)0x4804) = ~opt[2];

    *((unsigned char *)0x4805) = opt[3];
    *((unsigned char *)0x4806) = ~opt[3];

    *((unsigned char *)0x4807) = opt[4];
    *((unsigned char *)0x4808) = ~opt[0];

    *((unsigned char *)0x4809) = opt[5];
    *((unsigned char *)0x480A) = ~opt[5];  

    /*等待写结束*/
    while(!(FLASH_IAPSR & 0x04));
}

main()
{    int i;

    Write_Option_Byte();    //运行程序时,屏蔽  
    for(i=0;i<10000;++i);   //延时效果,有时加上延时,能够使擦写和应用程序同时不屏蔽也能管用

    CLK_init();             //擦写时屏蔽,否则下次stlink仿真时会出错
    Init_GPIO();            //擦写时屏蔽,否则下次stlink仿真时会出错
    Init_Tim2();            //擦写时屏蔽,否则下次stlink仿真时会出错
    while (1);
}


用程序改写选项字参考,转自:http://www.stmcu.org/module/forum/thread-606022-1-1.html

先看外设时钟门控寄存器配置没有,我有stm8s103的选项字节配置你参考下:
void FLASH_Init(void)
{
//解锁数据 EEPROM
FLASH_DUKR = 0xae;
delay_us(1);
FLASH_DUKR = 0x56;
delay_us(1);
//判断解锁是否成功,即判断 FLASH_IAPSR 寄存器的 DUL 位是否为 1
while(!(FLASH_IAPSR & 0x08));
delay_us(1);
//使能选项字节写操作
FLASH_CR2 = 0x80;
delay_us(1);
FLASH_NCR2 = 0x7f;
delay_us(1);
*((unsigned char *)0x4803) = 0x01;
delay_us(1);
*((unsigned char *)0x4804) = 0xfe;
}



关键字:STM8S  选项字节  写操作  IO复用

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2017111435941.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8 选项字节的写入
下一篇:1602液晶介绍(电路和引脚图)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

C51、STM32和S3C2440中断体系的比较

/* 名称:C51、STM32和S3C2440中断体系的比较 说明:对于这三个芯片的中断体系来说,就我目前了解的, 我说:差不多。这里说的差不多,是中断的本质上差不多,都是首先中断源提出申请(比如触发了外部中断,定时器中断等),然后经过中断源屏蔽寄存器,再然后中断优先级的比较,最后CPU相应中断。(我去,这好像又回到了计算机组成原理啊)。不同的是细节,C51作为低级一点的芯片,其中断少,中断能达到的功能也少,相对来说较为简单些(无论是设计还是具体使用)。而STM32和S3C2440来说,其提供的功能较多,设计起来和使用起来要复杂的多(使用的时候得配置好多好多寄存器)。目前总结的,差不多就是这些吧。*/
发表于 2018-07-21 14:40:54

STM8S0 TIM1_PWM互补输出

;      // Deadtime generator    TIM1_BKR |= 0x80;}三、采用IAR仿真需设置:选择IAR菜单ST-Link,选择Option Bytes,配置如图程序如下:亲测可以使用。#include <iostm8s003f3.h>/*//TIM1_CH1_PWM互补+死区void PWM2_INIT(){    CLK_PCKENR2 |= 0x80;//开启定时器1
发表于 2018-06-29 20:21:35

STM32’s I2C 硬件BUG引发的血案

下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段, 因此,在这里说的这是STM32的BUG其实是我的代码的错误:    I2C2->DR = inerAddress[1];    while( (I2C2->SR1&Q_I2C_SR1_BIT_BTF)==0 );    I2C2->SR2;   // 正解2010-4-1 1:44,一直都不相信STM32 的I2C接口会存在问题,因为工作经验无数次告诉我,嵌入式系统设计中的99.999
发表于 2018-06-03 09:26:09
STM32’s I2C 硬件BUG引发的血案

关于STM8S IAR 无法下载程序,以及无法进去中断的问题

的STM8s207寄存器版本的例程,其他都好 就是定时器不管用,各种都尝试了,就是进不去。后来对比发现 头文件对定时器地址定义不同,大家可以对比看一下 首先是stm8s103.h的头文件中对TIM2的定义/*-------------------------------------------------------------------------   *      TIM2 register definitions   
发表于 2018-06-02 20:32:53

stm8s 时钟库函数选择内部RC初始化

//本文选择16M内部RC震荡,分频为1 即系统时钟为16M  void CLK_HSICmd(FunctionalState NewState)  {        /* Check the parameters */      assert_param(IS_FUNCTIONALSTATE_OK(NewState));     
发表于 2018-06-02 20:32:00

STM8S207使用外部24M晶振不起振的解决办法

。6、具体添加办法如下图,在STVD环境下,右击 No wait state 在弹出的菜单中,选择 1 wait state 就可以了,然后再烧录就正常了。7、查找资料:4.4.2  Memory access/ wait state configurationThe Flash/ data EEPROM access time allows the device to run atup to 16 MHz without wait states.When using the high-speed external clock (HSE) at higher frequencies up to 24 MHz
发表于 2018-06-02 19:59:33

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved