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

发布者:数据梦想最新更新时间:2018-04-13 来源: eefocus关键字: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脚封装的产品的复用功能重定义位:

STM8S103F复用功能重定义位

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

FLASH_CR2

FLASH_NCR2

测试程序实现

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

ST Visual Develop

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

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

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

STVP program option bytes

T1

T2

测试程序:

/* MAIN.C file

Functons    :   操作option byte字节,设置IO复用,来修改TIM2的CH3通道PWM输出管脚PA3 or PD2

Date        :   2015年7月22日

Author      :   yicm

Notes       :   

 */


#include


void 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);

}



关键字:STM8S  选项字节  写操作  IO复用 引用地址:STM8S---选项字节(Option Byte)写操作之IO复用

上一篇:PLC控制与单片机控制的区别
下一篇:STM8S---电源功耗管理之停机模式(halt)实现

推荐阅读最新更新时间:2024-03-16 15:59

stm8s开发(二) GPIO的使用:点亮LED
通用输入输出口(GPIO)是我们使用单片机最基本的,主要功能: ● 端口的各个位可以被单独配置 ● 可选择的输入模式:浮动输入和带上拉输入 ● 可选择的输出模式:推挽式输出和开漏输出 ● 外部中断可以单独使能和关闭 用户手册上描述: 每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR) 总是同相关的。控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。 各种不同配置总结如下: 配置模式 DDR CR1 CR2 配置模式 上拉电阻 输入 0 0 0 悬浮输入
[单片机]
stm8s实现串口中断接,中断发功能
代码演示: 一、首先进行UART1初始化 /*USART1 config*/ void USART1_Init(void) { /*Uart1*/ UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; // 设置波特率,必须注意以下几点: // (1) 必须先写BRR2 // (2) BRR1存放的是分频系数的第11位到第4位, // (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位 // 例如对于波特率位9600时,分频系数=2000000/9600=208 // 对应的十六进制数为00D0,BBR1=
[单片机]
STM8S 三种时钟源的配置HSE\HSI\LSI的配置
1. 关于HSE的时钟配置为主时钟 static void CLK_Config(void) { CLK_DeInit(); // 初始化 CLK_HSECmd(ENABLE); //使能HSE CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); //切换HSE 并关闭其他时钟 为自动模式 /*Enable CSS interrupt */ CLK_ITConfig(CLK_IT_CSSD, ENABLE); /* Enab
[单片机]
<font color='red'>STM8S</font> 三种时钟源的配置HSE\HSI\LSI的配置
STM8S单片机GPIO.C的理解
一、STM8S单片机GPIO.C的组成 实际上,STM8S 系列单片机需要使用的stm8s_gpio.c由以下几个部分组成: void GPIO_DeInit(GPIO_TypeDef* GPIOx) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode) void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins)
[单片机]
STM8S——Analog/digital converter (ADC)
1、ADC1 and ADC2 are 10-bit successive approximation Anolog to Digital Converters. 所谓successive approximation,是逐次逼近的意思; 2、ADC分为ADC1和ADC2,ADC1的功能相比起ADC2更为强大,我们使用的是ADC1; 3、ADC有多种模式:(1)Single mode(2)Continuous mode(3)Buffered continuous mode(4)Single scan mode(5)Continuous scan mode 我们选用Continuous mode来实现,主要实现步骤:
[单片机]
关于STM8S IAR 无法下载程序,以及无法进去中断的问题
之前内有用过STM8 一会再用STM32 做一个小项目时 觉得STM8也有库应该很方便就直接选了它,结果调试的时候各种心酸,本想着一天解决的任务,结果拖了三天。接下来介绍一下遇到的主要问题 以及解决方法。 1、IAR无法下载程序问题 首先关于芯片型号设置就不说了 网上一大堆,主要是Vcap 引脚对地电容的取值,网上普遍说1uF, 由于我做了两个板子 一个PCB一个覆铜板 PCB没问题 ,但是覆铜板1uF 就下不进去程序,后来改成0.1uF才可以。如果软件配置对了,现在不进去很有可能是这个电容的问题。 2、定时器进不去中断问题 尝试了TIM2 TIM4 都进不去,我是用的是风驰 分享的STM8s207寄存器版本的例程,其他都
[单片机]
stm8s跳出中断程序c语言,STM8S I2C总线中断程序
/*========================================================================================================== 本源程序文件内部使用的一些操作指令的宏定义 ==========================================================================================================*/ /*-----------------------------------------------------------------------------
[单片机]
STM8S之时钟设置
在测量一些CATV系统指标中,常常要用到频谱仪,为了使测量结果准确,在频谱仪的使用上常涉及到一个分辨带宽设置的问题。要弄清这个问题,得要知道一些频谱仪的基本原理。图1是频谱仪的基本原理框图。图中的中频频率(输入信号通过与本振信号的和频或差频产生),本振受斜波发生器的控制,在斜波发生器的控制下,本振频率将从低到高的线性变化。这样在显示时,斜波发生器产生的斜波电压加到显示器的X轴上,检波器输出经低通滤波器后接到Y轴上,当斜波发生器对本振频率进行扫描时显示器上将自动绘出输入信号的频谱。检波器输出端的低通滤波器称为视频滤波器,用在分析扫描时对响应进行平滑。 1、分辨带宽 在频谱分析仪中,频率分辨率是一个非常重要的概念,它是由中频滤波
[单片机]
<font color='red'>STM8S</font>之时钟设置
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved