之前使用SysTick滴答定時器都是通過查找內核編程手冊配置寄存器讓SysTick滴答定時器工作的。其實在內核相關的頭文件core_cm4.h中已經有SysTick滴答定時器的相關配置了。
條件__Vendor_SysTickConfig == 0成立,配置函數才能使用。
剛好在stm32f4xx.h中定義了__Vendor_SysTickConfig = 0,所以可以使用該配置函數。
觀察函數__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 */
//設中斷端優先級
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 */
}
這種方式沒有分頻,時鐘速度為168Mhz,每秒可計數168000000次,每毫秒可計數168000次,每微秒計數168次。裝載值為24位,最大為16777215,可以算得最大延時時間為100ms。
這次的程序不需要上次寫的delay文件了,只要在主文件加入SysTick配置函數的頭文件core_cm4.h,根據想要定時的時間,計算相應的數值,初始化SysTick配置函數。再調用中斷接口封裝中斷函數,就可以實現SysTick中斷了。
如果中斷函數像之前那樣可能會看不到現象,因為定時時間過短,人眼可能識別不出led燈在閃爍,這里可以添加個計數,相當于定時更長時間才執行想要的程序。
#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); //清計數標志位
cnt++;
if(cnt == 10)
{
LED_Toggle(DS0); //LED燈閃爍
cnt = 0;
}
}
編譯工程項目并燒入開發板,LED燈閃爍,SysTick配置函數調用成功。
-
led燈
+關注
關注
22文章
1592瀏覽量
108060 -
寄存器
+關注
關注
31文章
5355瀏覽量
120517 -
定時器
+關注
關注
23文章
3250瀏覽量
114917 -
串口中斷
+關注
關注
0文章
64瀏覽量
13923 -
STM32F4
+關注
關注
3文章
194瀏覽量
28071
發布評論請先 登錄
相關推薦
評論