摘要:本文为你带来关于stm32定时器的使用的便利和优点之处。
使用定时器去计算获取一条的时间html
stm32定时器时钟图以下:segmentfault
定时器2-7:普通定时器
定时器一、8:高级定时器函数
如下,我使用定时器7(如下TIM7)去实现计算获取一条指令的运行时间。spa
1.TIM7初始化code
如下初始化函数中htm
void Timer7_Init(TIM_TypeDef * TIMx, unsigned short arr, unsigned short psc) { TIM_TimeBaseInitTypeDef timer_initstruct; NVIC_InitTypeDef nvic_initstruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); nvic_initstruct.NVIC_IRQChannel = TIM7_IRQn; timer_initstruct.TIM_CounterMode = TIM_CounterMode_Up; timer_initstruct.TIM_Period = arr; timer_initstruct.TIM_Prescaler = psc; TIM_TimeBaseInit(TIMx, &timer_initstruct); TIM_ITConfig(TIMx, TIM_IT_Update, ENABLE); //使能更新中断 nvic_initstruct.NVIC_IRQChannelCmd = ENABLE; nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 1; nvic_initstruct.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&nvic_initstruct); TIM_Cmd(TIMx, ENABLE); //使能定时器 }
2.中断服务函数blog
产生更新中断时进入ip
void TIM7_IRQHandler(void) { if(TIM_GetITStatus(TIM7, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM7, TIM_IT_Update); timer_info.timer7Out++; } }
其中timer_info为结构体,存放更新次数变量(也能够用静态变量)rem
typedef struct { unsigned char timer7Out; } TIM_INFO; extern TIM_INFO timer_info; TIM_INFO timer_info = {0};
3.使用例程get
如下代码为计算usart1发送"hello word!"的时间
#include "stm32f10x.h" #include "delay.h" #include "usart.h" #include "timer.h" void Hardware_Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断控制器分组设置 Delay_Init(); //Systick初始化,用于普通的延时 Usart1_Init(9600); //初始化串口1,波特率9600 Timer6_7_Init(TIM7, 49999, 71); //1us计数一次,50ms中断一次 TIM_Cmd(TIM7, DISABLE); //关闭定时器 TIM_SetCounter(TIM7, 0); //清零计数器 } int main(void) { unsigned int time = 0; Hardware_Init(); //硬件初始化 while(1) { TIM_Cmd(TIM7, ENABLE); //使能定时器计时 UsartPrintf(USART1, "\r\nhello word!!n\r\n"); TIM_Cmd(TIM7, DISABLE); //关闭定时器 time = timer_info.timer7Out * 50000; //测算时间-中断次数*中断周期 time += TIM_GetCounter(TIM7); //获取当前中断前的剩余值 TIM_SetCounter(TIM7, 0); //清零 timer_info.timer7Out = 0; UsartPrintf(USART1, "发送时间: %d微秒\r\n", time); DelayMs(2500); } }
效果以下