
2019/1/3新年上班第一天 @星辰
从官方数据手册看到STM32F103配置的外设:定时器共有3种,分别是高级定时器TIM1,TIM8(愚以为电机控制相关)、通用定时器TIM2,TIM3,TIM4,TIM5、基本定时器TIM6,TIM7。
本着物尽其用,各有所长的原则进行介绍
1.基本定时器
用途:①可以提供时间基准,作为设计系统的定周期TASK的触发源
②由于内部直连DAC,可以直接作为数模转换器的触发源
③计数器溢出时产生中断/DMA请求
2.通用定时器
相比较基本定时器的计数功能(触发中断/DMA),新增了四个独立通道:输入比较、输出比较、PWM输出(边沿或中间对齐模式)、单脉冲模式输出。可以使用外部电路控制定时器和定时器互联的同步电路。详情见截图:

3.高级定时器

学习实例:
1.对定时器完成定时功能的例程
以建立合理的单片机系统架构为基本需求,搭建出各个任务的TASK。例如需要1ms和10ms的定周期中断处理函数(TASK),本次使用定时器为基本定时器TIM6,TIM7。
步骤:1)使能定时器模块的时钟,换句话讲就是配置定时器模块的驱动时钟。如图

通用定时器和基本定时器是挂载于APB1时钟总线上的,所以
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN | RCC_APB1ENR_TIM7EN;//enable clock
具体结构体对应的寄存器实现参照头文件:正点原子system_stm32f10x.h
2)配置内部时钟CK_INT经由PSC分频计数器的时钟频率,配置自动重装置寄存器TIMx_ARR的值

由于时钟总线APB1的分频一般会提前配置好,此例中配置好的APB1频率设置为2,则CK_INT的频率为72Mhz。计数器的时钟有内部时钟CK_INT经过PSC预分频器分频后得到,即定时器的CNT计数器每加1或减1的频率。寄存器设置:TIM6->PSC = 7199; 其分频后频率的计算公式为:fck_psc(72Mhz)/psc+1 = 10Khz,CNT每count一次的时间为0.1ms,当达到TIM6_ARR设定的值时产生一次更新中断(SR寄存器的UIF位)。

3)允许更新中断,即使能定时器的更新中断TIM6_DIER |= 0x0001;
4)允许定时器工作,当TIMx_CR1寄存器的CEN位(使能位)被置“1“时,CK_INT即向PSC提供时钟,定时器工作。
5)配置定时器中断分组(使能定时器中断)
6)编写定时器中断处理函数(TASK定周期函数)
总结:寄存器的设置顺序按照上述顺序设置,定时器相关寄存器设置可以函数为单位,统一设置。配置中断分组也应以函数为单位,将工程中所需中断统一配置。结构顺序如下:
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时函数初始化
uart_init(72,115200);
Timer_init_SFR();
INT_init(); //interrupt函数初始化
while(1)
{
}
}
2.通用定时器的各个通道的使用,完成各个不同需求的定时功能,减少定时器使用的个数释放不必要的资源占用。本次使用的定时器为TIM5.
