STM8S---选项字节(Option Byte)写操作之IO复用
功能实现目标
通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用。能够设置为PA3或者PD2输出。
选项字节
选项字节包含芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。除了ROP(读出保护)字节,每一个选项字节必须被保存两次。一个是通常的格式(OPTx)和一个用来备份互补格式的(NOPTx)。选项字节能够通过应用程序在IAP模式下改动,可是ROP选项仅仅能在ICP模式(通过SWIM)下被改动。
有关SWIM编程过程的内容能够參考STM8S闪存编程手冊(PM0051)和STM8 SWIM通信协议和调试模块用户手冊(UM0470)。
不同的芯片的选项字节大小不一样,详细的能够參考芯片数据手冊。如用STM8S103F3来举例。选项字节例如以下:
STM8S103F对于20脚封装的产品的复用功能重定义位:
由此可知我们要将OPT2字节中的AFR1位进行写操作,通过写0。则portA3复用功能TIM2_CH3,通过写1,portD2复用功能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 :
*/
#include<stm8s003f3p.h>
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; //设置PD2port为输出模式
PD_CR1 |= 0X04; //设置PD2port为推挽输出模式
PD_CR2 &= 0XFD;
PA_DDR |= 0X08; //设置PA3port为输出模式
PA_CR1 |= 0X08; //设置PA3port为推挽输出模式
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---选项字节(Option Byte)写操作之IO复用的更多相关文章
- STM32写选项字节(option bytes)的正确姿势
STM32 的 Flash information block 部分,包含有特殊的选项字节,可以用于系统配置等信息, 其中还有两个有效字节(实际四个字节,两个是校验字节)的用户自定义数据字节. 在尝试 ...
- 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream
一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...
- java笔记之IO2写操作
IO流的分类 流向: 输入流 读出数据 输出流 写出数据 数据类型 字节流 字节输入流 读取数据 inputstream 字节输出流 写出数据 outputstream 字符流 字符输入流 读取数据 ...
- [CortexM0--stm32f0308]Option Byte
问题描写叙述 option byte,算是IC中比較简单的功能,就是用户能够写入数据,对IC的某些功能进行配置.而IC在reset时,会载入当中的内容,进行推断,从而使用户的配置生效. option ...
- spark shuffle写操作之SortShuffleWriter
提出问题 1. spark shuffle的预聚合操作是如何做的,其中底层的数据结构是什么?在数据写入到内存中有预聚合,在读溢出文件合并到最终的文件时是否也有预聚合操作? 2. shuffle数据的排 ...
- NoSQL生态系统——事务机制,行锁,LSM,缓存多次写操作,RWN
13.2.4 事务机制 NoSQL系统通常注重性能和扩展性,而非事务机制. 传统的SQL数据库的事务通常都是支持ACID的强事务机制.要保证数据的一致性,通常多个事务是不可能交叉执行的,这样就导致了可 ...
- MongoDB—— 写操作 Core MongoDB Operations (CRUD)
MongoDB使用BSON文件存储在collection中,本文主要介绍MongoDB中的写操作和优化策略. 主要有三种写操作: Create Update ...
- Java写操作
//:ThinkingInJava/net.mindview.io/write2File.java package net.mindview.io; import java.io.BufferedRe ...
- Linux数据写操作改进
Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...
随机推荐
- 主DNS服务-反向解析
上篇说了主DNS正向解析 当中是有个小问题的,什么问题呢? 试问当我们输入wwww或ww或更多w的时候它还能解析出来吗? 或者不输入w的时候还能解析吗? 上篇没有定义是解析不了的,怎么定义呢?很简单, ...
- MySql压缩版安装及避免1055错误和msvcp120.dll丢失
MySql压缩版安装及避免1055错误和msvcp120.dll丢失 MySQL压缩版的安装快速方便,5.7及最新的8版本安装方式大致相同. 在使用group by分组时,可能会遇到1055错误. 另 ...
- docker系列之分区挂载和数据卷
容器中的文件系统是独立的, 一旦容器被删除, 则文件系统也会被删除. 如果想容器和实体机在文件系统层面打通, 可以把指定目录挂载到容器当中: docker run -d -p 5000:22 -v / ...
- 【php】 检测 ie ie11 edge浏览器
来源 php.net 官网评论截取 -- Declan kelly Please note that Internet Explorer 11 no longer contains MSIE in i ...
- Flask 系列之 构建 Swagger UI 风格的 WebAPI
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 环境初始化 # 创建项目目录 mkdir helloworl ...
- Python9-集合-day7
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的. 以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试 ...
- python红包随机生成(隔板法)
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- skkyk:线段树浅谈
推荐前辈学姐博客文章,写的很细 https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html 学学半,此随笔主要是加深自己对线段树的理解 题目:洛谷P ...
- caffe+vs2013+window10+GPU(CPU)配置
参考:http://www.echojb.com/cuda/2017/03/15/350138.html https://www.zhihu.com/question/56111727 第一步:首先确 ...
- BZOJ 2134 单选错位 ——期望DP
发现概率是∑1/两道题答案相同的概率, 稍加化简 #include <map> #include <ctime> #include <cmath> #include ...