最近一直在忙STM32的学习,在学习中遇到了很多问题,也通过各类尝试解决问题,在这里我经过博文的形式写出来,也但愿可以帮到碰见一样问题的人们。对于STM32系列的芯片,有一个好处就是官方给出了一个固件库,这个可以很方便你们伙的编程。省去了使用寄存器的方法。可是固件库的学习也有不少让人麻烦的地方。好比更新速度快,这样你们能够在一棵树上吊死。只认一个版本的固件库。在这里我所用的是3.5标准固件库。css
STM32内核中有一个系统定时器,它是一个24位递减计数器。工做原理是系统时基定时器设定初值并使能后,每通过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会从新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。html
在很早的固件库中,提供了不少函数,来对SysTick进行设置,可是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的全部的驱动函数,这样作的目的,多是简化Systick 的设置,但是下降了用户对SysTick的可控性。编程
在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。函数
其中这个函数定义在Core_cm3.h中 ,源代码以下所示:学习
/** * @brief Initialize and start the SysTick counter and its interrupt. * * @param ticks number of ticks between two interrupts * @return 1 = failed, 0 = successful * * Initialise the system tick timer and its interrupt and start the * system tick timer / counter in free running mode to generate * periodical interrupts. */ static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ }
从上面的函数中能够看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。大大简化了程序。ui
其中ticks 表明的是初值。例如系统时钟是72Mhz 那么要产生1ms的时基,那么咱们能够这样去写。spa
SysTick_Config(SystemCoreClock/1000); 固然也能够写成:SysTick_Config(72000);code
了解了这些,咱们能够用它来作一个简单的延时函数delay_ms(u16 time);htm
代码以下:blog
void delay_ms(u16 time) { nTime = time; /* nTime 是个全局变量 可设 extern u16 nTime; */ while(nTime); }
在 中断函数中直接 加入nTime--;
在主函数 初始化过程当中 加入 SysTick_Config(72000);
这样就OK 了 试试吧。
原文连接:http://blog.sina.com.cn/s/blog_49cb42490100s60d.html
--------------------------------------End--------------------------------------------------------