之前使用SysTick滴答定時器都是通過查找內(nèi)核編程手冊配置寄存器讓SysTick滴答定時器工作的。其實在內(nèi)核相關(guān)的頭文件core_cm4.h中已經(jīng)有SysTick滴答定時器的相關(guān)配置了。
條件__Vendor_SysTickConfig == 0成立,配置函數(shù)才能使用。
剛好在stm32f4xx.h中定義了__Vendor_SysTickConfig = 0,所以可以使用該配置函數(shù)。
觀察函數(shù)__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks),其中的寄存器和我們在Systick查詢定時中用到的寄存器其實是一樣的。
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//SysTick_LOAD_RELOAD_Msk為24,如果裝載值超過24位,返回錯誤信息
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */
SysTick- >LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
//設(shè)中斷端優(yōu)先級
NVIC_SetPriority (SysTick_IRQn, (1UL < < __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
SysTick- >VAL = 0UL; /* 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 (0UL); /* Function successful */
}
這種方式?jīng)]有分頻,時鐘速度為168Mhz,每秒可計數(shù)168000000次,每毫秒可計數(shù)168000次,每微秒計數(shù)168次。裝載值為24位,最大為16777215,可以算得最大延時時間為100ms。
這次的程序不需要上次寫的delay文件了,只要在主文件加入SysTick配置函數(shù)的頭文件core_cm4.h,根據(jù)想要定時的時間,計算相應(yīng)的數(shù)值,初始化SysTick配置函數(shù)。再調(diào)用中斷接口封裝中斷函數(shù),就可以實現(xiàn)SysTick中斷了。
如果中斷函數(shù)像之前那樣可能會看不到現(xiàn)象,因為定時時間過短,人眼可能識別不出led燈在閃爍,這里可以添加個計數(shù),相當(dāng)于定時更長時間才執(zhí)行想要的程序。
#include "stm32f4xx.h"
#include "led.h"
#include "core_cm4.h"
int main()
{
LED_Init(); //初始化LED燈
SysTick_Config(8400000);//延時50ms 168000000/8400000=20 1000/20=50
while(1)
{
}
}
void SysTick_Handler()
{
static u8 cnt = 0;
SysTick- >CTRL &=~ (1< 16); //清計數(shù)標(biāo)志位
cnt++;
if(cnt == 10)
{
LED_Toggle(DS0); //LED燈閃爍
cnt = 0;
}
}
編譯工程項目并燒入開發(fā)板,LED燈閃爍,SysTick配置函數(shù)調(diào)用成功。
-
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107752 -
寄存器
+關(guān)注
關(guān)注
31文章
5295瀏覽量
119837 -
定時器
+關(guān)注
關(guān)注
23文章
3232瀏覽量
114334 -
串口中斷
+關(guān)注
關(guān)注
0文章
64瀏覽量
13847 -
STM32F4
+關(guān)注
關(guān)注
3文章
194瀏覽量
27974
發(fā)布評論請先 登錄
相關(guān)推薦
評論