16.3.2.2.3SysTick初始化函數(shù)
列表3:代碼清單17?3 SysTick初始化函數(shù)
左右滑動查看完整內(nèi)容
/** *@brief啟動系統(tǒng)滴答計時器 SysTick *@paramIT_frequency: 滴答計時器每秒的中斷次數(shù) *@retval無 */ voidSysTick_Init(uint32_t IT_frequency) { /* SystemCoreClock 在這里默認為 200M * SystemCoreClock / 1000 1ms 中斷一次 * SystemCoreClock / 100000 10us 中斷一次 * SystemCoreClock / 1000000 1us 中斷一次 */ IT_Period =SystemCoreClock/ IT_frequency; uint32_t err =SysTick_Config (IT_Period); assert(err==0);//capture error }
SysTick_Init函數(shù)里面調(diào)用了SysTick_Config()這個固件庫函數(shù),通過設置該固件庫函數(shù)的形參,就決定了系統(tǒng)定時器經(jīng)過多少時間就產(chǎn)生一次中斷。
16.3.2.2.4SysTick中斷時間的計算
SysTick定時器的計數(shù)器是向下遞減計數(shù)的,計數(shù)一次的時間TDEC=1/CLKICLK,當重裝載寄存器中的值VALUELOAD減到0的時候,產(chǎn)生中斷,可知中斷一次的時間TINT=VALUELOAD*TDEC=VALUELOAD/CLKICLK,其中CLKICLK=200MHZ。
如果設置VALUELOAD為200,那中斷一次的時間TINT=200/200M=1us。不過1us的中斷沒啥意義,整個程序的重心都花在進出中斷上了,根本沒有時間處理其他的任務。
左右滑動查看完整內(nèi)容
IT_Period =SystemCoreClock/ IT_frequency;//IT_frequency 為中斷的頻率 (單位為 Hz) SysTick_Config(IT_Period)//IT_Period 為中斷一次的時間 (單位為時鐘節(jié)拍數(shù))
SysTick_Config()的形參我們配置為 IT_Period。例如,當IT_frequency為1000,IT_Period=SystemCoreClock/IT_frequency=200M/1000=200K,從剛剛分析我們知道這個形參的值最終是寫到重裝載寄存器LOAD中的,從而可知我們現(xiàn)在把SysTick定時器中斷一次的時間TINT=200k/200M=1ms。
16.3.2.2.5SysTick定時時間的計算
當設置好中斷時間TINT后,我們可以設置一個變量t,用來記錄進入中斷的次數(shù),那么變量t乘以中斷的時間TINT就可以計算出需要定時的時間。
16.3.2.2.6SysTick定時函數(shù)
現(xiàn)在我們定義一個延時函數(shù),類似官方的延時函數(shù)“R_BSP_SoftwareDelay”,形參為delay和unit,這兩個形參相乘就得出我們需要的延時時間 TSUM,因此進入中斷的次數(shù) t=TSUM/TINT。
列表4:代碼清單17?4 SysTick延時函數(shù)
左右滑動查看完整內(nèi)容
/**
*@brief延時程序
*@paramdelay: 延時的單位時間
*@paramunit: 延時的單位
*@retval無
*/
voidSysTick_Delay(uint32_t delay, sys_delay_units_t unit)
{
uint32_tSumTime= delay * unit;//計算總延時時間 (單位為時鐘節(jié)拍數(shù))
IT_nums =SumTime/IT_Period;
while(IT_nums !=0);
}
SysTick_Delay()中我們等待IT_nums為0,當IT_nums為0的時候表示延時時間到。變量 IT_nums在中斷函數(shù)中遞減,即SysTick每進一次中斷即TINT的時間IT_nums遞減一次。
16.3.2.2.7sys_delay_units_t
列表5:代碼清單17?5 sys_delay_units_t
左右滑動查看完整內(nèi)容
typedefenum
{
SYS_DELAY_UNITS_SECONDS=200000000,///< Requested delay amount?
→is?in?seconds
SYS_DELAY_UNITS_MILLISECONDS?=?200000,?///< Requested delay amount?
→is?in?milliseconds
SYS_DELAY_UNITS_MICROSECONDS?=?200///< Requested delay amount?
→is?in?microseconds
} sys_delay_units_t;
16.3.2.2.8SysTick中斷服務函數(shù)
列表6:代碼清單17?6 SysTick中斷服務函數(shù)
左右滑動查看完整內(nèi)容
/** *@briefSysTick 的中斷服務函數(shù) *@param無 *@retval無 */ externvoidSysTick_Handler(void);//需要先 extern 聲明一下避免編譯器警告 voidSysTick_Handler(void) { if(IT_nums !=0x00) { IT_nums--; } }
16.3.2.2.9hal_entry入口函數(shù)
列表7:
代碼清單17?7由main函數(shù)轉(zhuǎn)入的hal_entry函數(shù)
左右滑動查看完整內(nèi)容
voidhal_entry(void)
{
/*TODO:add your own code here */
R_BSP_PinAccessEnable ();//啟用對 PFS 寄存器的訪問, 因為后面寫 IO 口都用
BSP 內(nèi)聯(lián)函數(shù)
SysTick_Init(1000);//初始化系統(tǒng)時鐘, 設置中斷頻率為 1000Hz
while(1)
{
R_BSP_PinWrite (LED_G, BSP_IO_LEVEL_LOW);//點亮綠色 LED
SysTick_Delay(1, SYS_DELAY_UNITS_SECONDS);//延時 1s
R_BSP_PinWrite (LED_G, BSP_IO_LEVEL_HIGH);//熄滅綠色 LED
SysTick_Delay(1, SYS_DELAY_UNITS_SECONDS);//延時 1s
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
主函數(shù)中初始化了SysTick,然后在一個while循環(huán)中以1s的頻率讓LED閃爍。

-
中斷
+關注
關注
5文章
912瀏覽量
43538 -
定時器
+關注
關注
23文章
3359瀏覽量
121666 -
函數(shù)
+關注
關注
3文章
4405瀏覽量
66798 -
Systick
+關注
關注
0文章
67瀏覽量
13860
原文標題:SysTick初始化函數(shù)、定時函數(shù)、延時函數(shù)、中斷服務函數(shù)——瑞薩RA系列FSP庫開發(fā)實戰(zhàn)指南(42)
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
RT-Thread自動初始化詳解
自動初始化機制原理詳解
請問哪個函數(shù)初始化了SysTick_Handler中斷?
STM32外部中斷端口初始化函數(shù)
中斷初始化和中斷函數(shù)的代碼示例
USART初始化結(jié)構(gòu)體詳解
SEED-DEC2812函數(shù)
CC2530中斷初始化和中斷函數(shù)
STM32—關于SYSTICK系統(tǒng)時鐘的詳解及學習筆記
Systick定時器幾個簡單的函數(shù)簡介
OP-TEE的內(nèi)核初始化函數(shù)調(diào)用

SysTick初始化函數(shù)和中斷服務函數(shù)詳解
評論