历史上的今天
今天是:2025年01月13日(星期一)
2020年01月13日 | STM8S003F3使用总结——定时器
2020-01-13 来源:eefocus
STM8S003F3有三个定时器,分别为16位高级定时器TIM1、16位通用定时器TIM2和8位基础定时器TIM4。其中,TIM1和TIM2支持PWM输出,本项目中用到了TIM1-CH1和TIM2-CH1两个通道作为PWM输出,以及TIM4作为时基,下面进入正文。
编译环境:IAR for STM8 3.10.2
库版本:V2.2.0
1.定时器
关于定时器没什么好说的,直接看下配置代码
void TIM1_Init(u16 psc, u16 arr, u16 duty)
{
TIM1_TimeBaseInit(psc, TIM1_COUNTERMODE_UP, arr, 0);
TIM1_OC1Init(TIM1_OCMODE_PWM1,
TIM1_OUTPUTSTATE_ENABLE,
TIM1_OUTPUTNSTATE_ENABLE,
duty,
TIM1_OCPOLARITY_LOW,
TIM1_OCNPOLARITY_HIGH,
TIM1_OCIDLESTATE_SET,
TIM1_OCNIDLESTATE_RESET);
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
TIM1_OC1PreloadConfig(ENABLE);
TIM1_CtrlPWMOutputs(ENABLE);
TIM1_Cmd(ENABLE);
}
void TIM2_Init(TIM2_Prescaler_TypeDef TIM2_Prescaler, u16 arr, u16 duty)
{
TIM2_TimeBaseInit(TIM2_Prescaler, arr);
TIM2_OC1Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
duty,
TIM2_OCPOLARITY_HIGH);
TIM2_OC1PreloadConfig(ENABLE);
TIM2_Cmd(ENABLE);
}
其中TIM2_Prescaler_TypeDef定义为:
typedef enum
{
TIM2_PRESCALER_1 = ((uint8_t)0x00),
TIM2_PRESCALER_2 = ((uint8_t)0x01),
TIM2_PRESCALER_4 = ((uint8_t)0x02),
TIM2_PRESCALER_8 = ((uint8_t)0x03),
TIM2_PRESCALER_16 = ((uint8_t)0x04),
TIM2_PRESCALER_32 = ((uint8_t)0x05),
TIM2_PRESCALER_64 = ((uint8_t)0x06),
TIM2_PRESCALER_128 = ((uint8_t)0x07),
TIM2_PRESCALER_256 = ((uint8_t)0x08),
TIM2_PRESCALER_512 = ((uint8_t)0x09),
TIM2_PRESCALER_1024 = ((uint8_t)0x0A),
TIM2_PRESCALER_2048 = ((uint8_t)0x0B),
TIM2_PRESCALER_4096 = ((uint8_t)0x0C),
TIM2_PRESCALER_8192 = ((uint8_t)0x0D),
TIM2_PRESCALER_16384 = ((uint8_t)0x0E),
TIM2_PRESCALER_32768 = ((uint8_t)0x0F)
}TIM2_Prescaler_TypeDef;
void TIM4_Init(TIM4_Prescaler_TypeDef TIM4_Prescaler, u8 arr)
{
TIM4_DeInit();
TIM4_TimeBaseInit(TIM4_Prescaler, arr);
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
TIM4_Cmd(ENABLE);
}
其中TIM4_Prescaler_TypeDef定义为:
typedef enum
{
TIM4_PRESCALER_1 = ((uint8_t)0x00),
TIM4_PRESCALER_2 = ((uint8_t)0x01),
TIM4_PRESCALER_4 = ((uint8_t)0x02),
TIM4_PRESCALER_8 = ((uint8_t)0x03),
TIM4_PRESCALER_16 = ((uint8_t)0x04),
TIM4_PRESCALER_32 = ((uint8_t)0x05),
TIM4_PRESCALER_64 = ((uint8_t)0x06),
TIM4_PRESCALER_128 = ((uint8_t)0x07)
} TIM4_Prescaler_TypeDef;
高级定时器之所以高级是有原因的,更多的参数使功能更强大,当然这也不是绝对的,在项目开发中,有时候逻辑简化能使参数归一,但是并不影响实际功能。这里的参数一个是开放给开发者,一个是用户,并没有太大可比性,只是说明一种观点。
PWM1和PWM2两种模式的区别
TIM_OCMode_PWM1:
当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。
当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。
TIM_OCMode_PWM2:
当计时器值小于比较器设定值时则TIMX输出脚此时输出有效低电位。
当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出高电位。
------------------------------------------------------------我是分隔线-----------------------------------------------------------------
下面划重点
下面划重点
下面划重点
当一切准备就绪后,却发现PWM怎么都无法输出,折腾了好久,后来只好回归手册,在引脚说明表中对引脚说明如下:

很明显,这两个IO要作为PWM输出需要复用,但是复用方法很特殊,需要修改对应option bit,这里需要修改AFR0位才能输出PWM。那么现在的问题就是如何配置AFR0这个位了。
2.Option-Bytes配置
网上查找了相关问题后,这里做一下总结。
AFR0等选项组成Option-Bytes,那么如何配置Option-Bytes,这里总结三种方法。
基于IAR
点击顶部菜单栏ST-LINK–>Option Bytes…

打开Option Bytes选项框,右键置位Alternate Active

基于STVP
如图所示,点击底部切换到OPTION BYTE界面,选择对应配置字即可。

基于程序代码
选项字节在片内地址如下:


从表中可见,需要将OPT2的最低位AFR0置1,代码如下:
#define OPTION_BYTES_ADDR 0x4803
void Set_OptionByte(void)
{
u16 Option_Bytes;
Option_Bytes = FLASH_ReadOptionByte(OPTION_BYTES_ADDR);
if(Option_Bytes & 0x01 == 0)
{
FLASH_ProgramOptionByte(OPTION_BYTES_ADDR, (u8)Option_Bytes | 0x01);
}
}
上一篇:STM8的AWU应用体会
下一篇:TM1638测试程序STM8S
史海拾趣
|
本人现在有一个“英创EM9260”套件,想在上面做一个简单的串口程序,实现给一个电度表发送字符串并接收其返回的字符串,然后通过一个lcd屏幕显示返回的字符串。我把套件提供的一个串口通信的示例程序做了简单的修改,但是只能实现发送数据,回收的 ...… 查看全部问答> |
|
新手学习uboot,对于地址重定位的问题始终没有搞明白,请高手指点 Q1:start.s最初是在0x0000开始的地址处开始执行,中间有个过程是把自己以及uboot的其他代码搬移到0x3ff8 0000的位置,可是程序是怎么跳转到0x3ff8000处(或者所在的ram中)运行 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:10 编辑 模块的核心是ISD4004语音芯片,其引脚如图5所示。ISD4004语音芯片采用CMOS技术,内含晶体振荡器、防混叠滤波器、平滑滤波器、自动静噪、音频功率放大器及高密度多电平闪烁存储阵列等,因此只需很 ...… 查看全部问答> |
|
—体验式销售与LED智能灯具推广 《实践论》在论及亲身实践对认识真理的重要性时说道:你要知道梨子的滋味,就得亲口尝一尝。LED智能灯具的推广实践,充分证明了这条至理名言。 这是因为,LED光源作为新一代节能高效光源的代表,智能灯具作为“ ...… 查看全部问答> |
|
//******************************************************************************// MSP-FET430P140 Demo - ADC12, Sample A0, Set P1.0 if A0 > 0.5*AVcc//// Description: A single sample is made on A0 with reference to AV ...… 查看全部问答> |
|
我想用定时器A实现 :当串口发送了配置参数后对定时器A,B进行初始化,配置参数包含定时器定时的值 ,初始化程序如下//*******************************************************/ //******************定时器A初始化************************/ // ...… 查看全部问答> |
|
Getting Started with the Stellaris LaunchPad- Chapter 2 $(\'flv_bWH\').innerHTML=(AC_FL_RunContent(\'width\', \'600\', \'height\', \'475\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', \'http://www.tudou.com/v/u_Cpj2_hoYk/&rpid=106547959&resourceId=1065 ...… 查看全部问答> |




