STM32第8定时器中断与OLED 1秒计时功能的实现指南
1.接线图:
2.程序:注意里面有一个时钟计算
定时器.c文件
#include "stm32f10x.h" // Device header
//extern uint16_t Num; //声明全局变量Num 可以跨文件使用变量
void Timer_Init(void)
{
//1.开启时钟 打开TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//2.选择内部时钟源 这个可以省略,默认就是内部时钟
TIM_InternalClockConfig(TIM2);
//3.配置时基单元 初始化TIM
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruccture;
TIM_TimeBaseInitStruccture.TIM_ClockDivision =TIM_Channel_1;
//1分频 可以选择1,2,3,4分频。
TIM_TimeBaseInitStruccture.TIM_CounterMode =TIM_CounterMode_Up;
//向上计数 可以选择向上、向下、三种中央对齐的模式
TIM_TimeBaseInitStruccture.TIM_Period =10000-1;
//周期 ARR自动重装器的值 定义一秒 参考公式 定时频率=72M/(PSC+1)/(ARR+1) 范围0-65535之
间
TIM_TimeBaseInitStruccture.TIM_Prescaler =7200-1;
//PSC预分频器的值,定时1s也就是定时频率为1Hz 1000 000=1M PSC=7200,ARR=10000即
1HZ=72M/(7200+1)/(10000+1)
TIM_TimeBaseInitStruccture.TIM_RepetitionCounter =0 ;
//重复计数器的值 高级计数器才有的 这里不需要用 给0
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruccture);
//4.更新中断 开启中断到NVIC的通道
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
//指定中断分组 在模块里每个程序要有一个 在主程序里放一次就行
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//5.配置NOIC 配置中断优先级
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn ; //指定通道 TIM2通道
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; //指定中断通道使能或者不使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_Init(&NVIC_InitStructure);
//6.启动定时器
TIM_Cmd(TIM2,ENABLE);
}
//void TIM2_IRQHandler(void )
//{
// if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //如果更新标识位等于1
// {
// Num++;
// TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除标志位
// }
//}
mian.c文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
uint16_t Num;
int main(void)
{
OLED_Init();
Timer_Init();
OLED_ShowString(1,1,"Num");
while(1)
{
OLED_ShowNum(1,5,Num,5);
}
}
void TIM2_IRQHandler(void )
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //如果更新标识位等于1
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除标志位
}
}
3.知识点:数据库函数解释:
TIM常用的函数:
void TIM_DeInit(TIM_TypeDef* TIMx); //被指定的TIM会被复位
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //TIM定义结构体(某个定时器,结构体)时基单元
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//把结构体赋一个默认值
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器(定时器,使能或者不使能) 运行控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出信号的(定时器,配置哪个中断输出,使能还是。)
时钟源选择6个函数
void TIM_InternalClockConfig(TIM_TypeDef* TIMx); //选择内部时钟 (定时器)
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRX其他定时器时钟(定时器,接入哪个要接入的定时器)
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//TIX捕获通道的时钟(定时器,TIX具体引脚,极性和滤波器)
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//选择ETR外部时钟模式1(定时器,外部触发预分频器,极性和滤波器)
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR外部时钟模式2((定时器,外部触发预分频器,极性和滤波器))
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//单独配置ETR引脚的预分频器、极性、滤波器
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode); //单独写预分频值的 (定时器,预分频值,写入的模式,)
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode); 改变计数器的计数模式 (定时器,选择新的计数器模式)
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); // 自动重装器预装功能配置(定时器,使能还是,)
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); //获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频的值
下面是获取标志位和清除标志位
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
作者:普通网友