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  使用总结  定时器 引用地址:STM8S003F3使用总结——定时器

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

推荐阅读最新更新时间:2024-11-13 10:05

Exynos4412裸机开发 —— 看门狗定时器
一、看门狗定时器概述 看门狗(WatchDog Timer) 定时器和PWM的定时功能目的不一样。它的特点是,需要不同的接收信号(一些外置看门狗芯片)或重新设置计数器,保持计数值不为0。一旦一些时间接收不到信号,或计数值为0,看门狗将发出复位信号复位系统或产生中断。 看门狗的作用是微处理器收到干扰进入错误状态后,使系统在一定时间间隔内复位。因此看门狗是保证系统长期、可靠和稳定运行的有效措施。目前大部分的嵌入式芯片内部都集成了看门狗定时器来提高系统运行的可靠性。 4412处理器的看门狗是当系统被故障干扰时,用于处理器的复位操作,也可以作为一个通用的16位定时器来请求中断操作。看门狗定时器产生128个PCLK周期的复位信号。主
[单片机]
Exynos4412裸机开发 —— 看门狗<font color='red'>定时器</font>
ARM中断源之定时器中断
实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。 走到这里,大家肯定对Linux的中断处理有概念了,下面我们通过一个具体的实例,来了解Linux内核处理中断的全过程,那就是定时器中断。在详细分析这个过程之前,我们把Linux时间管理的概念先缕一缕。 在当前的80x86体系结构上,内核显式地与几种时钟和定时器电路打交道,其主要分为了时钟和定时器两大类: - 时钟电路同时用于跟踪当前时间和产生精确的时间度量。 - 定时器电路由内核编程,所以它们以固定的、
[单片机]
STM32定时器 输入捕获实现双边沿检测
STM32的定时器有输入捕获功能,在STM32F10x_tim.h中对于TIM_Input_Capture_Polarity有如下定义 #define TIM_ICPolarity_Rising ((uint16_t)0x0000) #define TIM_ICPolarity_Falling ((uint16_t)0x0002) #define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) #define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) ||
[单片机]
s3c2440定时器简介
S3c2440 有5 个16 位的定时器。定时器0、1、2、3 有脉宽调制功能(PWM)。定时器4有一个没有输出引脚的内部定时器。定时器0 有一个用于大电流设备的死区生成器。 定时器0 和1 共享一个8 位的预分频器(预定标器),定时器2,3,4 共享另一个8 位预分 频器. 定时器的时钟源为PCLK,首先经过预分频器降低频率后,进入第二个分频.可以生成5 种不同的分频信号(1/2,1/4,1/8,1/16 和TCLK) 定时器启动后,TCNTn开始减一计数,当TCNTn 等于TCMPn时, TOUTn 反转, TCNTn继续减数. 当TCNTn= 0 时, TOUTn 再次反转,并触发中断(中断已经使能).
[单片机]
STM32定时器的输入滤波机制
STM32的定时器输入通道都有一个滤波单元,分别位于每个输入通路上(下图中的黄色框)和外部触发输入通路上(下图中的兰色框),它们的作用是滤除输入信号上的高频干扰。 具体操作原理如下: 在TIMx_CR1中的CKD 可以由用户设置对输入信号的采样频率基准,有三种选择: 1)采样频率基准fDTS=定时器输入频率fCK_INT 2)采样频率基准fDTS=定时器输入频率fCK_INT/2 3)采样频率基准fDTS=定时器输入频率fCK_INT/4 然后使用上述频率作为基准对输入信号进行采样,当连续采样到N次个有效电平时,认为一次有效的输入电平。 实际的采样频率和采样次数可以由用户程序根据需要选择;外部触发输入通道的滤波参数
[单片机]
STM32<font color='red'>定时器</font>的输入滤波机制
STM8S——8位基本定时器(TIM4)
简介:该定时器由一个带可编程预分频器的8位自动重载的向上计数器所组成,它可以用来作为时基发生器,具有溢出中断功能。 主要功能: (1)8位向上计数的自动重载计数器; (2)3位可编程的预分配器(可在运行中修改),提供1、2、4、8、16、32、64、128这8种分频比例; (3)中断产生:更新中断(溢出,计数器初始化)。 代码实现: 1 /* Includes ------------------------------------------------------------------*/ 2 #include stm8s.h 3 4 /* Private define -------------
[单片机]
STM32F103C8T6定时器TIM4通道1、2输出PWM
这美妙的波形,真好,我他喵的终于把你弄出来了。 STM32F103C8T6使用定时器TIM4进行双通道的PWM输出: 下面的图是从STM32中文参考手册中截取的,定时器TIM4的通用和复用功能I/O 我选用的是TIM4_CH1和TIM4_CH2也就是PB6和PB7输出。 注意事项: 输出PWM是属于IO口的复用功能,所以在设置GPIO_Mode的时候一定要设置为GPIO_Mode_AF_PP也就是推挽复用。 我就是被这个卡了好长时间……,感觉自己蠢到家了。 我是用的正点原子的精英板学的32,所以一些写代码的习惯都是学的正点原子的。 下面是代码 timer.c #include timer.h //TIM
[单片机]
STM32F103C8T6<font color='red'>定时器</font>TIM4通道1、2输出PWM
单片机C语言程序设计:定时器控制交通指示灯
/* 名称:定时器控制交通指示灯 说明:东西向绿灯亮 5s 后,黄灯闪烁,闪烁 5 次亮红灯, 红灯亮后,南北向由红灯变成绿灯,5s 后南北向黄灯闪烁, 闪烁 5 次后亮红灯,东西向绿灯亮,如此往复。 */ #include reg51.h #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向指示灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; //南北向指示灯 sbit YELLOW_B=P0^4; sbit
[单片机]
单片机C语言程序设计:<font color='red'>定时器</font>控制交通指示灯
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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