历史上的今天
今天是:2024年09月30日(星期一)
2021年09月30日 | stm8s 定时器1 延时_STM8S_库函数_定时器自动装载TIM1
2021-09-30 来源:eefocus
这里说下使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1,这是个高级定时器。
首先,咱们看一下STM8S103F3P6上有几个定时器,打开数据手册,可以看到如下内容:

可以看到,咱们使用的单片机,有三个定时器:TIM1、TIM2、TIM4。而TIM1是一个高级控制定时器。具体有多高级,咱们看下介绍。由于内容比较多,我这里直接放数据手册里的截图:
可以看到,TIM1的功能是非常丰富的,从基本的定时、自动装载、PWM输出、输入捕获、输出比较、单脉冲输出到各种事件的中断,都有相应的功能。
稍后的几节内容,会依次展示三个例程:
1、自动装载计时
2、测量输入信号的脉冲宽度
3、输出PWM
这一节主要说自动装载计时。 接下来,通过代码实现一个功能:
1秒的一个定时,时间到了以后,板上的LED闪烁,用到的功能:分频,向上计数,自动重装载,重复计数器。代码如下,首先看主函数:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "timer1_config.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void main(void)
{
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);
timer1_init();
while (1);
}
主函数里进行两个操作:PB4初始化、TIM1初始化。PB4不用说了,外接一个LED,低电平点亮,前面的内容里说过了。
TIM1初始化的代码我们看下:
/***************************************
* TIMER1初始化
* 1秒一次中断
***************************************/
void timer1_init(void)
{
disableInterrupts();
TIM1_DeInit();
TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);
TIM1_Cmd(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
enableInterrupts();
}
由于库函数的命名比较规范,所以可以从函数名字猜出每个函数的功能:
1、关闭全局中断
2、TIM1寄存器恢复默认设置
3、TIM1时基初始化,这个函数的具体内容下面说
4、TIM1使能,也就是开始计数
5、TIM1的向上计数溢出中断使能
6、全局中断使能
这里面相对复杂的是第三步,我们详细看下这个函数:
/**
* @brief Initializes the TIM1 Time Base Unit according to the specified parameters.
* @param TIM1_Prescaler specifies the Prescaler value.
* @param TIM1_CounterMode specifies the counter mode from @ref TIM1_CounterMode_TypeDef .
* @param TIM1_Period specifies the Period value.
* @param TIM1_RepetitionCounter specifies the Repetition counter value
* @retval None
*/
void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,
TIM1_CounterMode_TypeDef TIM1_CounterMode,
uint16_t TIM1_Period,
uint8_t TIM1_RepetitionCounter)
这是库函数里面的函数定义部分,我只取了注释部分和函数名称部分,具体的代码不需要看。
结合注释和括号里的参数名称,我们可以知道这几个参数的功能:
TIM1_Prescaler-分频系数
TIM1_CounterMode-计数模式
TIM1_Period-定时周期
TIM1_RepetitionCounter-重复定时次数
STM8S相比8051的定时器有两个突出的地方,一个是计数模式,我们可以选择向上计数、向下计数、中央对其模式。
另一个就是重复定时次数,51里面,要实现一个比较长的定时,需要自己定一个变量,每次定时结束,变量加一;STM8S这里不需要,有一个专门的寄存器完成这个功能。
所以,上面那个函数的功能就是:
TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);
系统时钟做100(0x63=99)分频,向上计数模式,定时周期1000(分频后的时钟),重复计数20(0x13=19)次。
最后,在中断函数里,我们控制LED进行状态的翻转,代码如下:
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
}
内容很简单,清中断标志,然后PB4状态翻转。
编译、下载、上电,功能正常!很简单,打完收工!
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 当将模拟信号转换成方波脉冲后,再将脉冲信号送入单片机,那么单片机是怎样处理这个脉冲信号的? … 查看全部问答> |
|
note:usb address and data registers will not valid until usb clock is running 这是什么造成的呢?… 查看全部问答> |
|
技术在于积累! 第一次刚接触LED驱动是从一块DEMO板: DC输入,输出是低电流大致200MA的; 因为客户的需求,后来公司头一次想用SMD802开发一块非隔离的7*1w 450MA驱动板;那时候没买样板,也没找专门的IC厂商,要求技 ...… 查看全部问答> |
|
最近做了一个题目,使用蓝牙接收到的数据在LED点阵上显示出来,但是前提是不知道要接收的数据的内容。该如何实现接收到的数据用编程直接转换成LED点阵上能识别的二进制数。是该做一个字库还是有其他什么别的方法。请专业人士帮忙解决一下。谢谢。… 查看全部问答> |
|
windows ce stream driver wizard 搜遍了整个网络也没有找到windows ce stream driver wizard这个工具,哪位大哥大姐弟弟妹妹能够慷慨解囊,帮小弟一把,不胜感激。小弟的邮箱是:cougarz@somagic.com.cn… 查看全部问答> |
|
哪位达人用过《EVC高级编程及其应用开发》这本书上基础数据库的例子? 我在wince下试了这个程序,可是不好使阿,添加不了,也删除不了,请问是还需要安装什么程序还是本身实例程序有问题啊?… 查看全部问答> |
|
今天用Proteus仿真的ADC0809。。。但实际0809不工作啊。。。。 单片机的对应ST脚的P口接上0809时就被拉低了。Proteus仿真什么问题都没有。0809要注意什么问题么?有两个问题:1,我希望设定的是500K,用定时器方式2也是设成255。可从P口出来的就是50K 啊。2,ST脚被拉低,但不接0809时单片机P口是正常的 ...… 查看全部问答> |
|
我在使用msp430F149的JTAG模块下载时,一开始还能下载运行,试了有两三天,突然一天不能下载了,后来就再也不能下了,软件提示不能发现目标。然后又贴了一块板子,结果这块好了半天就又出现和前面一样的现象。很是郁闷 量了下载口各个引脚的电压 ...… 查看全部问答> |






