STM8S003F3使用总结——定时器

2020-01-13来源: eefocus关键字:STM8S003F3  使用总结  定时器

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

}

}


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

上一篇:STM8的AWU应用体会
下一篇:TM1638测试程序STM8S

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

推荐阅读

STM8S003F3使用总结——串口
STM8作为低成本芯片一直受到广大用户青睐,最近一个项目使用了STM8S003F3P6这款芯片,主要实现的功能就是串口接收指令控制PWM输出。这里对这款芯片使用过程中遇到的问题进行总结。编译环境:IAR for STM8 3.10.2库版本:V2.2.01.STM8S003F3与STM8S103F3差异除了以上差异,两款芯片可pin-to-pin兼容,片内外设资源一致。2.串口通信STM8S003F不支持DMA,因此使用中断方式接收。中断向量表如下:typedef enum { UART1_IT_TXE        = (uint16_t)0x0277, /*!< Transmit
发表于 2019-11-30
STM8S003F3使用总结——串口
stm8s003f3使用杂记
转换模式,怎么从缓存区读回各路转换结果?用GETBUFFERVALUE(直接写寄存器组的序号就行)函数。之前要调用相应的配置函数:ADC1_DataBufferCmd(FunctionalState NewState);参考RM0016——page366中关于数据缓存寄存器的介绍。此时要用DMA传送结果。8:为什么已经修改了stm8s.h文件,ADC1部分的定义还是会在编译时提示没有定义呢?甚至把那部分的定义放到主函数里也不行呢。这种无厘头的问题------重新建个工程就行了。>我*?!!!事实再一次证明,新建工程也不管用啊!!!conf没改好吧??(我已经放弃了,包含了iostm8s003f3的源文件然后用寄存器写的
发表于 2019-11-30
STM8S003F3 使用内置的Data EEPROM的操作接口
操作系统:win10 64bit平台:STM8S003F3 IDE: IAR For STM8/* Data EEPROM 操作初始化 */void Init_Flash(void){  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);} /************************************************函数名称 : EE_FLASH_WriteNByte功    能 : 写EEPROM参    数 : pBuffer ----- 写入数据区首地址   
发表于 2019-11-30
stm8s103f3p6的延时函数
使用stm8s时本来期望能够产生1us精度的脉冲,但是调来调去也没能实现。目前的情况是使用内部16MHz的RC时钟源,然后给到timer4,再经 8分频产生一个25us的中断,我能搞出来的最小中断周期是15us左右,考虑到那不是一个很好的整数,主要是当要延时整数比如100,1000时没办法除尽,所以就只好取25us为一个最小单位了。如果有人能用定时器产生1us的脉冲请指点一下。多谢。 下面上代码吧: 基本的思路就是使用timer4每隔25us计数一次,然后延时函数对timer4的中断次数进行统计。完成指定的延时时间后退出while循环。#include"stm8s.h"uint8_t
发表于 2019-11-28
STM8S103F3P6核心板原理图设计
Encounter problems:1.无法执行DRC检查2.图纸页面无法设置Solution:1.选中.dsn文件,即便可以执行DRC检查2.设置schematic page properties   3.瓷片电容封装RAD是瓷片电容的封装,一般104.103.222.33.这些的封装是RAD0.1,而RAD0.2的就是比较大,可以说是元器件管脚的距离是200mil。。RAD0.1封装是无极性电容,0.1是指这个电容在电路板上的焊盘间距为100mil(1mil=0.0254mm)。RB.1/.2封装是指有极性电容,后面的.1/.2是指这个电容在电路板上两引脚之间的间距是100mil,它的外径是200mil。
发表于 2019-11-27
STM8S103F3P6核心板原理图设计
关于stm32的堆、栈、内存管理以及外扩ram的使用总结
确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等,但一般都是放在只读数据段中 。   栈区:由系统自动分配,栈区的分配运算内置于处理器的指令集,当函数执行结束时由系统自动释放。存放局部变量。栈的缺点是:容量有限,当相应的区间被释放时,局部变量不可再使用。查询栈容量的命令:ulimits -s。栈是一块连续的区域,向高地址扩展,栈顶和容量是事先约定好的。堆区:在程序的执行过程中才能分配,由程序员决定,编译器在编译时无法为他们分配空间,只有在程序运行时分配,所以被称为动态分配。堆是不连续的区域,向高地址扩展。由于系统
发表于 2020-01-12
小广播
何立民专栏 单片机及嵌入式宝典

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

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