今日调试了STM32的守时器功用,STM32守时器比较多,但调试都是相同的,寄存器都是逐个对应的。就拿TIM2举例说明。在网上搜了很多关于守时器的设置,但大多数都是一个版别,并且都是针对库函数操作的,让人看起来一头雾水,关于初学者很是晦气(我也是初学者)。下面我将自己的守时器设置进程逐个记录下来,以供咱们参阅,咱们一起学习……
首要界说守时器头文件,也便是界说寄存器以供操作:
//*************************************************************************
//
// TIM2-Register
//
//*************************************************************************
#define TIM2_CR1 (*((volatile unsigned long *)0x40000000))
#define TIM2_CR2 (*((volatile unsigned long *)0x40000004))
#define TIM2_DIER (*((volatile unsigned long *)0x4000000C))
#define TIM2_SR (*((volatile unsigned long *)0x40000010))
#define TIM2_EGR (*((volatile unsigned long *)0x40000014))
#define TIM2_CNT (*((volatile unsigned long *)0x40000024))
#define TIM2_PSC (*((volatile unsigned long *)0x40000028))
#define TIM2_ARR (*((volatile unsigned long *)0x4000002C))
然后装备守时器TIM2:
void TIM2_Configuration(void)
{
RCC_APB1ENR|=0x00000001; //位0 IM2EN TIM2守时器时钟使能
TIM2_PSC |=19999; //设置预分频,完成1ms,20M ,20000/20M
TIM2_ARR = 1000; //1s发生一次中止
TIM2_DIER |=0X1; //答应tim2更新中止
SETENA0|=0x10000000; //答应T2中止
TIM2_CR1 |=0X1;//发动tim2相当于//TIM_Cmd(TIM2, ENABLE); //是能守时器
}
注:RCC_APB1ENR,SETENA0前面的文章现已界说过
中止函数处理:
void TIM2_IRQHandler(void)
{
if(TIM1_SR&0x01)
{
TIM1_SR&=0xFFFE; //清中止标志
USART1_DR=0xAA;
while((USART1_SR)&0x80==0);
}
解说:1S中止来一次,向串口发送一字节数据0xAA;
接下来就在main()函数中增加装备守时器就可以了:
int main()
{
SystemInit0(); //体系(时钟)初始化
stm32_GpioSetup (); //GPIO初始化
stm32_UsartSetup (); //串口初始化
TIM2_Configuration(); //TIM1初始化
while(1)
{
GPIO_PORTB_ODR|=(1<<5); //LED闪耀
delay(10); //延时
GPIO_PORTB_ODR&=~(1<<5);
delay(10);
}
}
当然以上TIM2的装备必须在体系(时钟)初始化今后,由于这些外设的作业要有时钟来历的,知道了时钟来历,和频率才干计算出守时的时刻等参数,本程序是根据全部时钟都设置成20M来履行的。前面的几个初始化函数以及寄存器设置都是调用的前面文章中设置好的。
好了,检查串口(9600),调试成功,1S发送1个0xAA,这样看起来是很简单,但调试的进程是困难的,要一次次的试验,一个寄存器一个寄存器的进行装备,学习原本便是一个缓慢并且艰苦的进程,可是当你看到LED在闪耀,串口上收到数据时,说有的支付都是值得的,天道酬勤,全部困难都是纸老虎!