STM32通用定时器(原理结构体库函数中断闪烁灯)
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32通用定时器(原理结构体库函数中断闪烁灯)相关的知识,希望对你有一定的参考价值。
摘自:stm32定时器与定时器中断
作者:打酱油的
发布时间: 2021-04-11 01:04:09
网址:https://blog.csdn.net/weixin_46098612/article/details/115493737
摘自:stm32通用定时器结构体函数+定时器实现led闪烁
作者:点灯小哥
发布时间: 2021-03-09 12:13:32
网址:https://blog.csdn.net/weixin_46016743/article/details/114579672
定时器概念
1.定时器种类
注:主要使用通用定时器
2.通用计时器特点描述
3.定时器中断触发条件
4.定时器计数模式
分为向上,向下,向上向下模式
5.通用定时器作用用途
6.工作过程
对照着STM32中文参考手册14.1章节,红色部分重点关注
1、时钟来源:
A.内部时钟APB1分频器ckl_int(主要)
B.其他通用定时器 外部引脚2,3,4
C.其他定时器
D.外部通道(略)
2、时基单元(时间控制单元) :
①预分频(除法)
②计数器时钟
③自动重装载值
3、输入部分:
①输入引脚
②边沿检测
4、输出部分 :
A 输出比较寄存器
B周期—重装载值
C占空比—比较值
通用定时器结构体函数
注:真正使用的只有前3个成员,后两个属于高级寄存器才使用
配置步骤
使用通用定时器实现LED灯每隔一秒亮一次
tim.c
#include "stm32f10x.h" // Device header
#include "tim.h"
void tim_config(void)
{
TIM_TimeBaseInitTypeDef TIMinitStructure;//2.配置定时器时钟结构体
NVIC_InitTypeDef NVICinitStructure;//3.开启定时器中断,配置中断结构体 属于系统内核中断
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);//1.使能时钟 定时器时钟
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1);//中断服务组
TIMinitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //1分频 也就是不分频
TIMinitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式 选向上
TIMinitStructure.TIM_Period = 10000-1; //Tout 自动重装载值
TIMinitStructure.TIM_Prescaler = 7200-1; //分配器计数值
TIM_TimeBaseInit( TIM2, &TIMinitStructure);
TIM_Cmd( TIM2, ENABLE); //要有定时器使能
//凡是带有IT都表示中断
TIM_ITConfig( TIM2, TIM_IT_Update, ENABLE);//配置定时器与中断线联系创建
//中断源
NVICinitStructure.NVIC_IRQChannel = TIM2_IRQn;//中断通道 中断源是系统定时器2
NVICinitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级
NVICinitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级
NVICinitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init( &NVICinitStructure );
}
tim.h
#include "stm32f10x.h" // Device header
void tim_config(void);//声明
main.c
#include "stm32f10x.h" // Device header
#include "usart.h"
#include "led.h"
#include "tim.h"
void delay(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i=12000;
while(i--);
}
}
int main(void)
{
LED_Init();
tim_config();
GPIO_SetBits( GPIOC, GPIO_Pin_13);//初始化关灯
while(1)
{
}
}
//4. 配置定时器中断服务函数 函数名必须和固件库一样
void TIM2_IRQHandler(void)
{
static uint16_t temp;//静态变量
if(TIM_GetITStatus( TIM2, TIM_IT_Update) != RESET) //判断定时器中断标志位是否被打开 在头文件stm32f10x_tim.h里
{ //每秒开启一次中断 定时器本质也就是计数器 不用再写delay函数一直占用CPU的资源了
if(temp++ %2 == 1) //求余 奇偶判断
{
GPIO_ResetBits( GPIOC, GPIO_Pin_13);
}
else
{
GPIO_SetBits( GPIOC, GPIO_Pin_13);
}
}
TIM_ClearITPendingBit( TIM2, TIM_IT_Update);//最后要做定时器清除中断标志位
}
以上是关于STM32通用定时器(原理结构体库函数中断闪烁灯)的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103VET6基于STM32CubeMX创建定时器中断控制LED闪烁