4.嵌入式单片机之TIM
4.1 Sys Tick定时器
4.1.1 滴答定时器
Sys Tick
阈值:24 位数据寄存器 (0-2^24-1(16 777 215))
自动重装载:1000
计数器:计数
分频:1 个系统时钟周期就是 1s/主频 Hz 的时间,
那1 个系统时钟周期就是(1/72 000 000)秒,即 1/72微秒,所以计数 72 000 次时就是 1ms。
主频72MHz,分频72计算时间位1us(72000000/72)
分频72000计算时间位1ms(72000000/72000)
void SysTick_Handler(void){}
;
4.3 基本定时器
TIM6和TIM7互相独立,不共享任何资源。
阈值:16位(0-65 535)
预分频:16位
主频:72MHz
4.3.1 代码实现
//TIM6计时器相关配置:
void Tim6_Config(void)
{
RCC->APB1ENR |=(1<<4);//打开时钟
// TIM6控制寄存器
TIM6->CR1 |=(1<<7);//ARPE:自动重装载预装载使能
TIM6->CR1 &=~(1<<3);//0:更新时计数器不停止|1:停止
TIM6->DIER |=(1<<0);//打开更新中断,DIER:中断使能寄存器
TIM6->CNT = 0;//计数器
TIM6->PSC = 72-1;//预分频:PSC+1
TIM6->ARR =1000-1;//自动重装载
NVIC_SetPriority(TIM6_IRQn,6);//设置中断优先级
NVIC_EnableIRQ(TIM6_IRQn);
TIM6->CR1 |=(1<<0);//计数器使能
}
//TIM6的中断服务函数:
uint16_t time=0;
void TIM6_IRQHandler(void)
{
if(TIM6->SR &(1<<0))//判断状态是否为1
{
TIM6->SR &=~(1<<0);//软件清除中断
time++;
}
}
//1秒打印一次
if(time>1000){
printf("忽如一夜春风来,千树万树梨花开\r\n");
time=0;//重新计数
}
if(time>1000){
printf("忽如一夜春风来,千树万树梨花开\r\n");
time=0;//重新计数
}