定时器类型:
定时器类型定时器类型定
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本章学习到的TIM函数:
TIM_InternalClockConfig(TIM2) | 设置 TIMx 内部时钟,默认是开启的 | |||||||||||||||
TIM_TimeBaseStructure. |
|
|||||||||||||||
TIM_ClearFlag |
清除标志位 ,让计数从0开始。(TIMx,TIM_IT_Upadate(更新中断)) |
|||||||||||||||
TIM_ITConfig | 使能中断 | |||||||||||||||
void TIM2_IRQHandler(void) | 通道函数名是规定的,startup_stm32f10x_hd.s文件可查 | |||||||||||||||
TIM_GetITStatus | 获取中断标志位(TIMx,TIM_IT_Upadate(更新中断)) | |||||||||||||||
TIM_ClearITPendingBit |
清除中断待处理位 (TIMx,TIM_IT_Upadate(更新中断)) |
|||||||||||||||
TIM_GetCounter | TIM计数器的值(TIMx) |
Timer.c
#include "stm32f10x.h" // Device header
void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //RCC使能时钟 TIM2挂载APB1总线
TIM_InternalClockConfig(TIM2); //设置 TIMx 内部时钟,默认是开启的
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分屏参数
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1 ; //定时器周期,设定自动重载寄存器的值
TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1 ; //定时器预分频器,设定 TIMx_PSC寄存器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值,设置为x时,时间周期翻x倍
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); //初始化
TIM_ClearFlag(TIM2,TIM_IT_Update); //清楚标志位,让计数从0开始
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断源
NVIC_InitTypeDef NVIC_InitStruture;
NVIC_InitStruture.NVIC_IRQChannel = TIM2_IRQn; //配置抢占优先级
NVIC_InitStruture.NVIC_IRQChannelCmd = ENABLE; //配置通道是否开启
NVIC_InitStruture.NVIC_IRQChannelPreemptionPriority = 2 ; //抢占优先级
NVIC_InitStruture.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_Init(&NVIC_InitStruture);
TIM_Cmd(TIM2,ENABLE); //启动定时器
}
/*
void TIM2_IRQHandler(void) //定时器产生中断时被执行,通道函数名是规定的,startup_stm32f10x_hd.s文件可查
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) //判断标志位
{
Num ++; //每更新一次标志位加1
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除标志位
}
}
*/
main.c
#include "stm32f10x.h" // Device header
#include "Timer.h"
#include "OLED.h"
uint16_t Num; //全局变量,用于接收中断次数
int main(void)
{
Timer_Init();
OLED_Init();
OLED_ShowString(1,1,"Num:");
while(1)
{
OLED_ShowNum(1,5,Num,5);
OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5); //TIM计数器的值
}
}
void TIM2_IRQHandler(void) //定时器产生中断时被执行,通道函数名是规定的,startup_stm32f10x_hd.s文件可查
{
if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) //判断标志位
{
Num ++; //每更新一次标志位加1
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除标志位
}
}