STM32F10x之SysTick 定時(shí)器

姓名:周崇杰? ?學(xué)號(hào):16140120059? ? 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化

轉(zhuǎn)載自:http://blog.csdn.net/u011318735/article/details/17620315,有刪節(jié)

【嵌牛導(dǎo)讀】:STM32F1系列的產(chǎn)品的SysTick定時(shí)器操作簡(jiǎn)單,功能強(qiáng)大,本文將會(huì)通過庫(kù)函數(shù)講解該定時(shí)器的使用。

【嵌牛鼻子】:STM32單片機(jī),SysTick定時(shí)器。

【嵌牛提問】:STM32單片機(jī)的SysTick定時(shí)器如何操作以及編程呢?

【嵌牛正文】:

SysTick定時(shí)器被集成在NVIC中。因此,只要是Cortex-M3內(nèi)核的單片機(jī),就都有它。這個(gè)學(xué)習(xí)筆記就用SysTick定時(shí)器來實(shí)現(xiàn)走馬燈的功能。

SysTick定時(shí)器非常簡(jiǎn)答,只有四個(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:?Processor?clock?(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"

#define?RCC_GPIO_LED?????????????????????????????????RCC_APB2Periph_GPIOD

#define?GPIO_LED_PORT????????????????????????????????GPIOD

#define?GPIO_LED1????????????????????????????????????GPIO_Pin_2

#define?GPIO_LED2????????????????????????????????????GPIO_Pin_3

#define?GPIO_LED3????????????????????????????????????GPIO_Pin_4

#define?GPIO_LED4????????????????????????????????????GPIO_Pin_7

#define?GPIO_LED_ALL?????????????????????????????????GPIO_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;//PD2?PD3?PD4?PD7?Set?to?Output?mode

SysTick->LOAD?=?24000000/200;

SysTick->CTRL?=?3;

for(;;)

{

}

}

/**

*?@brief??This?function?handles?SysTick?Handler.

*?@param??None

*?@retval?None

*/

voidSysTick_Handler(void)

{

staticintcount?=?0;

count?++;

if(count?==?100)

{

LED_Spark();

count?=?0;

}

}

然后是利用STM32 固件函數(shù)庫(kù)提供的函數(shù)的例子。

#include?"stm32f10x.h"

#define?RCC_GPIO_LED?????????????????????????????????RCC_APB2Periph_GPIOD

#define?GPIO_LED_PORT????????????????????????????????GPIOD

#define?GPIO_LED1????????????????????????????????????GPIO_Pin_2

#define?GPIO_LED2????????????????????????????????????GPIO_Pin_3

#define?GPIO_LED3????????????????????????????????????GPIO_Pin_4

#define?GPIO_LED4????????????????????????????????????GPIO_Pin_7

#define?GPIO_LED_ALL?????????????????????????????????GPIO_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)

{

GPIO_InitTypeDef?GPIO_InitStructure;

SystemInit();

SysTick_Config(SystemCoreClock/100);

/*?Enable?GPIOB,?GPIOC?and?AFIO?clock?*/

RCC_APB2PeriphClockCmd(RCC_GPIO_LED,?ENABLE);//RCC_APB2Periph_AFIO

/*?LEDs?pins?configuration?*/

GPIO_InitStructure.GPIO_Pin?=?GPIO_LED_ALL;

GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_Out_PP;

GPIO_Init(GPIO_LED_PORT,?&GPIO_InitStructure);

for(;;)

{

}

}

/**

*?@brief??This?function?handles?SysTick?Handler.

*?@param??None

*?@retval?None

*/

voidSysTick_Handler(void)

{

staticintcount?=?0;

count?++;

if(count?==?100)

{

LED_Spark();

count?=?0;

}

}

需要說明的是,若是用 SysTick_Config 函數(shù)來設(shè)置SysTick的中斷頻率,時(shí)鐘源就不能人為的指定了,這時(shí)使用的時(shí)鐘源就是內(nèi)核的頻率。

SystemCoreClock 是個(gè)全局變量,它的值就是內(nèi)核的運(yùn)行頻率,不過前提要調(diào)用 SystemInit() 函數(shù)來設(shè)置內(nèi)核的頻率。如果內(nèi)核的頻率是字節(jié)寫寄存器來設(shè)置的,SystemCoreClock 的值就不一定對(duì)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 姓名:周崇杰 學(xué)號(hào):16040120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 1,157評(píng)論 0 0
  • 姓名:周崇杰 學(xué)號(hào):16140120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 4,907評(píng)論 0 5
  • 其實(shí)這篇文章主要是介紹自己為其寫的GPIO庫(kù),自己借鑒了原子寫的STM32,野火寫的K60,還有LPC官方庫(kù),然后...
    楊奉武閱讀 1,035評(píng)論 0 0
  • 開發(fā)環(huán)境:STM32F103ZET6 STM32CubeMX Keil5 使用STM32CubeMx創(chuàng)建...
    停下浮躁的心閱讀 2,223評(píng)論 0 2
  • 姓名:周崇杰 學(xué)號(hào):16140120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 2,443評(píng)論 0 5

友情鏈接更多精彩內(nèi)容