stm32定时器编写
在现有的实验模板中修改成定时器代码:
1、打开项目:
添加文件:
2、在timer.h中完成定时器中断实现步骤:
在timer.h中完成定时器中断实现的前4个步骤:
初始化定时器:主要配置arr,和psc文件
初始化完成后,需要到timer.c中编写初始化函数:
a.使能定时器函数:
使能定时器3的时钟:
拿到函数:
b.初始化定时器:
拿到定时器初始化函数:
配置文件路径:
并且加入定时器的库:
此时就可以通过右击,查看文件中的具体函数:
如下所示:就是 TIM_TimeBaseInit 的具体函数:
代码解读:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
第一个参数为定时器的选择,此处我们选择定时器3;
第二个参数是一个结构体,通常通过定义一个变量去取地址,以获取结构体参数;类似gpio,串口的配置;
实例代码如下:
//timer.c
#include "timer.h"
void TIM3_Iint(u16 arr,u16 psc)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
TIM_TimeBaseInitStrue.TIM_Period = arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseInitStrue.TIM_Prescaler = psc; //Ô¤·ÖƵϵÊý
TIM_TimeBaseInitStrue.TIM_CounterMode = TIM_CounterMode_Up; //¼ÆÊýģʽ£¨ÏòÉÏ£©
TIM_TimeBaseInitStrue.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
}
备注:
计数有效性的参数设置方法:
TIM_TimeBaseInitStrue.TIM_CounterMode = TIM_CounterMode_Up;
c、开启定时器中断,配置NVIC。
在tim.h中找到中断函数:
在tim.c库中找到中断函数,查看具体使用方法。
将函数放入timer.c文件中,配置使用:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
TIM_ITConfig 需要三个参数:
第一个参数:TIMx: 中断号(TIM3)。
第二个参数:TIM_IT: 中断有效性类型(选择更新中断)。
第三个参数:NewState: 是否使能(ENABLE)。
实例:含义就是使能中断器3的更新功能;
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
还需配置中断优先级设置:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
通过 NVIC_Init 函数设置中断优先级:
参数是一个结构体,通常通过定义一个变量去取地址,以获取结构体参数;类似gpio,串口的配置;
实例:
//定时器3 的优先级设置:
NVIC_InitTypeDef NVIC_InitTypeStrue;
NVIC_InitTypeStrue.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitTypeStrue.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitTypeStrue.NVIC_IRQChannelSubPriority = 0x03;
NVIC_InitTypeStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitTypeStrue);
d、使能定时器
//使能定时器3
TIM_Cmd(TIM3,ENABLE);
此时定时器的初始化就完成了:
3、写入中断服务函数:
中断服务函数通过启动文件中找到:
标志位:
两个参数:
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
入口参数:
第一个是:定时器3;
第二个是:哪个中断标志位,我们选择,更新中断标志;
实例:
具体函数:
最终完成timer.c;
此处中断3不断计数,达到固定值后,进入函数中实现 led1 的翻转。
中断函数完成后,开始写main.c函数:
a、设置中断优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
b、初始化延时函数:
delay_init(168);
c、初始化定时器3;
为了防止定时器函数名称冲突,更改一下函数:
改为如下:
main.c中的代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
LED_Init();
TIM3_Int_Init(4999,8399);
while(1)
{
LED0 =! LED0;
delay_ms(500);
}
}
编译烧写就可以实现两led灯闪烁。