STM32F10x 學(xué)習(xí)筆記之SysTick 定時(shí)器
SysTick定時(shí)器被集成在NVIC中。因此,只要是Cortex-M3內(nèi)核的單片機(jī),就都有它。這個(gè)學(xué)習(xí)筆記就用SysTick定時(shí)器來實(shí)現(xiàn)走馬燈的功能。
SysTick定時(shí)器非常簡答,只有四個(gè)寄存器。這四個(gè)寄存器的含義在《Cortex-M3權(quán)威指南》那本書中講的非常的清楚,這里不復(fù)述了,下面只講講在STM32上SysTick有什么特殊之處。按照CMSIS標(biāo)準(zhǔn),用C語言訪問這四個(gè)寄存器時(shí)使用的寄存器名稱分別如下:
SysTick->CTRL
SysTick->LOAD
SysTick->VAL
SysTick->CALIB
SysTick->CALIB的值固定為9000,因此,只有當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9MHz(HCLK/8的最大值),產(chǎn)生1ms時(shí)間基準(zhǔn)。
STM32提供了2個(gè)時(shí)鐘源:
0:AHB/8
1:Processorclock(AHB)
因此,SysTick->CTRL=7表示使用處理器時(shí)鐘作為時(shí)鐘源,使能SysTick,并且使能SysTick中斷。SysTick->CTRL=3時(shí)頻率降為原來的1/8。
我的開發(fā)板上有四個(gè)LED,分別對(duì)應(yīng)的GPIO端口D的PD2、PD3、PD4和PD7。
下面是例子程序,仍然先是直接設(shè)置寄存器。
#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 固件函數(shù)庫提供的函數(shù)的例子。
#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