当前位置:首页 > 单片机 > 单片机
[导读]功能实现目标??通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用,可以设置为PA3或者PD2输出。通过STVP方式操作链接选项字节??选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中

功能实现目标


??通过对选项字节的写操作来实现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:ErroronOptionBytes(complementarybytes).ReprogramOptionBytesofdeviceError:

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

测试程序:
/*MAIN.CfileFunctons:操作optionbyte字节,设置IO复用,来修改TIM2的CH3通道PWM输出管脚PA3orPD2Date:2015年7月22日Author:yicmNotes:*/#includevoidCLK_init(void){CLK_ICKR"=0X01;//使能内部高速时钟HSICLK_CKDIVR=0x08;//16M内部RC经2分频后系统时钟为8Mwhile(!(CLK_ICKR&0x02));//HSI准备就绪CLK_SWR=0xe1;//HSI为主时钟源}voidInit_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;}voidInit_Tim2(void){TIM2_CCMR3|=0X70;//设置定时器2三通道(PD2)输出比较三模式TIM2_CCMR3|=0X04;//输出比较3预装载使能TIM2_CCER2|=0x03;//通道3使能,低电平有效,配置为输出//初始化时钟分频器为1,即计数器的时钟频率为Fmaster=8M/64=0.125MHZTIM2_PSCR=0X07;//初始化自动装载寄存器,决定PWM方波的频率,Fpwm=0.125M/62500=2HZTIM2_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;}voidWrite_Option_Byte(void){unsignedcharopt[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*/*((unsignedchar*)0x4800)=opt[0];*((unsignedchar*)0x4801)=opt[1];*((unsignedchar*)0x4802)=~opt[1];*((unsignedchar*)0x4803)=opt[2];*((unsignedchar*)0x4804)=~opt[2];*((unsignedchar*)0x4805)=opt[3];*((unsignedchar*)0x4806)=~opt[3];*((unsignedchar*)0x4807)=opt[4];*((unsignedchar*)0x4808)=~opt[0];*((unsignedchar*)0x4809)=opt[5];*((unsignedchar*)0x480A)=~opt[5];/*等待写结束*/while(!(FLASH_IAPSR&0x04));}main(){inti;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;
}



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

今天查看STM32资料时,对输出速度2M 10M 50M不是很了解,再加上移植ARF2496K程序到STM32时出现意外情况。一、STM8S端作为接收端和发送端时接收到的数据都正常。二、发送端(STM8S),接收端(ST...

关键字: io口 stm32f stm8s 输出速率

STM8S单片机开发环境由三大部分组成,包括PC机上的开发软件(集成开发软件、驱动程序等)、调试&编程器ST-LINK、目标单片机电路板。如下图所示:1、PC机上开发软件PC机上的软件包括:ST-LINK驱动程序...

关键字: stm8s 单片机入门 开发环境

一直理解STM8S定时器有点问题,所以在做定时器时候,出现了好奇怪的问题.比如,今次在理解预装载值时候出现问题,导致动态调整预装载值均无法得到自己预期的效果.我们可以看参考手册定时器这块的描述,或者上网找一些文章

关键字: stm8s 定时器溢出 重装载

Ⅰ、写在前面完事开头难,只要肯努力;师傅领进门,修行看个人;当你看到本文,说明你是幸运的,作者接下来推出的一系列STM8S教程,将助你踏入STM8S的世界。本文是STM8S教程的开始,写给刚入门STM8S的朋友。学习本文

关键字: gpio stm8s 基础知识

一、 STM8S 外部中断进行唤醒先了解一下STM8S的中断资源再看看STM8S的中断管理。STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先...

关键字: stm8s 窗口看门狗 中断唤醒 定时唤醒

前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到...

关键字: iic stm8s 主机通信

因为没有中断的清除标志位,这一点与其它单片机是不同的。EXTI_CR1 触发边沿的设置要在总中断没开时才能写入!PD7 是 不可屏蔽的最高优先级的硬件中断(TLI)设置顺序:最好先关中断 设置边沿 开启引脚 最后开总中断...

关键字: stm8s 外部中断

// PXn引脚的初始化// 输出配置void GPIO_Init(void){PX_DDR |= 1

关键字: gpio stm8s 引脚功能

STM8 电源管理2012-06-08 22:47:55|分类:STM8|字号订阅默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外...

关键字: stm8s 停机模式 电源管理

1 打开STVP2 PROJECT/NEW,乱取个名来建立项目3 PROJECT EDITION,首先在Configuration选好芯片,最重要的就是在SerialNumbering中来设置了勾住Enable Seri...

关键字: stm8s 地址增量 烧写方法
关闭
关闭