SysTIck定时器被集成在NVIC中。因而,只要是Cortex-M3内核的单片机,就都有它。这个学习笔记就用SysTIck定时器来完成走马灯的功用。
SysTIck定时器十分简答,只要四个寄存器。这四个寄存器的意义在《Cortex-M3威望攻略》那本书中讲的十分的清楚,这儿不复述了,下面只讲讲在STM32上SysTIck有什么特别之处。依照CMSIS规范,用C言语拜访这四个寄存器时运用的寄存器称号别离如下:
SysTick-》CTRL
SysTick-》LOAD
SysTick-》VAL
SysTick-》CALIB
SysTick-》CALIB的值固定为9000,因而,只要当体系嘀嗒时钟设定为9MHz(HCLK/8的最大值),发生1ms时刻基准。
STM32供给了2个时钟源:
0:AHB/8
1:Processorclock(AHB)
因而,SysTick-》CTRL=7表明运用处理器时钟作为时钟源,使能SysTick,而且使能SysTick中止。SysTick-》CTRL=3时频率降为本来的1/8。
我的开发板上有四个LED,别离对应的GPIO端口D的PD2、PD3、PD4和PD7。
下面是比如程序,依然先是直接设置寄存器。
#include“stm32f10x.h”
#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
#defineGPIO_LED_PORTGPIOD
#defineGPIO_LED1GPIO_Pin_2
#defineGPIO_LED2GPIO_Pin_3
#defineGPIO_LED3GPIO_Pin_4
#defineGPIO_LED4GPIO_Pin_7
#defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
voidLED_Spark(void)
{
staticintstate=0;
switch(state)
{
case0:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
state++;
break;
case1:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
state++;
break;
case2:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED3);
state++;
break;
case3:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED4);
state=0;
break;
default:
state=0;
break;
}
}
intmain(void)
{
SystemInit();
RCC-》APB2ENR|=0x00000020;
GPIOD-》CRL=0x24422244;//PD2PD3PD4PD7SettoOutputmode
SysTick-》LOAD=24000000/200;
SysTick-》CTRL=3;
for(;;)
{
}
}
/**
*@briefThisfunctionhandlesSysTickHandler.
*@paramNone
*@retvalNone
*/
voidSysTick_Handler(void)
{
staticintcount=0;
count++;
if(count==100)
{
LED_Spark();
count=0;
}
}
然后是使用STM32 固件函数库供给的函数的比如。
#include“stm32f10x.h”
#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
#defineGPIO_LED_PORTGPIOD
#defineGPIO_LED1GPIO_Pin_2
#defineGPIO_LED2GPIO_Pin_3
#defineGPIO_LED3GPIO_Pin_4
#defineGPIO_LED4GPIO_Pin_7
#defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
voidLED_Spark(void)
{
staticintstate=0;
switch(state)
{
case0:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
state++;
break;
case1:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
state++;
break;
case2:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3