1、前言
CM4內(nèi)核的處理和CM3一樣,內(nèi)部都包含了一個(gè)SysTick定時(shí)器,SysTick 是一個(gè)24 位的倒計(jì)數(shù)定時(shí)器,當(dāng)計(jì)到0 時(shí),將從RELOAD 寄存器中自動(dòng)重裝載定時(shí)初值。只要不把它在SysTick 控制及狀態(tài)寄存器中的使能位清除,就永不停息。這樣可以用systick來實(shí)現(xiàn)延時(shí)定時(shí)功能,不用再占用系統(tǒng)定時(shí)器。systick也多用做系統(tǒng)的時(shí)鐘節(jié)拍,如freeRTOS等OS,再啟動(dòng)調(diào)度器的時(shí)候,就會(huì)將systick配置成其系統(tǒng)時(shí)鐘,給系統(tǒng)提供心跳。systick中有4個(gè)寄存器CTRL、LOAD、VAL、CALIB
2、systick配置注意事項(xiàng)
使用CubeMX配置生成的代碼中,會(huì)自動(dòng)生成一個(gè) SystemClock_Config() 的函數(shù),用于配置單片機(jī)時(shí)鐘,其中就會(huì)配置systick
void SystemClock_Config() { ........... LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); LL_SetSystemCoreClock(32000000); #ifndef SYSTICK_IRQ LL_Init1msTick(32000000); //使能systick但是不開啟systick中斷 #else SysTick_Config(SystemCoreClock / 1000);//使能systick同時(shí)開啟systick中斷 #endif }
但是這里 需要注意的是,是不是需要開啟 systick 中斷!!!!
1、如果只是想用systick來作為延時(shí)用,程序不想被中斷打斷,就只需要使能systick而不用開啟systick中斷,調(diào)用 LL_Init1msTick 即可
void LL_Init1msTick(uint32_t HCLKFrequency) ---> LL_InitTick(HCLKFrequency, 1000U); ---> __STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) { /* Configure the SysTick to have interrupt in 1ms time base */ SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ }
但是需要自己編寫延時(shí)函數(shù),不能使用HAL庫(kù)提供的HAL_Delay()。原因如下:HAL_Delay的實(shí)現(xiàn)是依靠一個(gè)uwTickFreq變量,uwTickFreq是在HAL_IncTick中累加的,需要在 SysTick_Handler中斷函數(shù)中周期調(diào)用,這樣HAL_Delay才會(huì)有一個(gè)基準(zhǔn)
__weak void HAL_IncTick(void) { uwTick += uwTickFreq; } __weak uint32_t HAL_GetTick(void) { return uwTick; } __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); uint32_t wait = Delay; /* Add a period to guaranty minimum wait */ if (wait < HAL_MAX_DELAY) { wait += (uint32_t)(uwTickFreq); } while((HAL_GetTick() - tickstart) < wait) { } }
自定義的us延時(shí)
void my_delay_us(uint32_t nus) { uint32_t temp; uint32_t fac_us = SystemCoreClock/1000000; //為系統(tǒng)時(shí)鐘的1/1000000 SysTick->LOAD = nus*fac_us; //時(shí)間加載 SysTick->VAL = 0x00; //清空計(jì)數(shù)器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //開始倒數(shù) do { temp = SysTick->CTRL; } while((temp & 0x01) &&! (temp&(1 << 16))); //等待時(shí)間到達(dá) SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; //關(guān)閉計(jì)數(shù)器 SysTick->VAL = 0X00; //清空計(jì)數(shù)器 }
2、如果想用systick座系統(tǒng)的時(shí)鐘節(jié)拍,需要開啟systick中斷,可以直接調(diào)用 SysTick_Config 來配置,也可以使用 HAL_Init 來配置,HAL_Init 配置最終也會(huì)調(diào)用 SysTick_Config 函數(shù)
HAL_Init(void) ---> HAL_InitTick(uint32_t TickPriority) ---> SysTick_Config(uint32_t ticks) { 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 */ }
這樣配置完成之后,還需要再systick的中斷中調(diào)用 osSystickHandler 和 HAL_IncTick
void SysTick_Handler(void) { osSystickHandler();//為OS提供系統(tǒng)時(shí)鐘節(jié)拍 HAL_IncTick();//為HAL庫(kù)提供時(shí)鐘基準(zhǔn) }
編輯:hfy
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44621瀏覽量
638572 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121172 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3255瀏覽量
115374 -
STM32單片機(jī)
+關(guān)注
關(guān)注
59文章
549瀏覽量
58823 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13149
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
上位機(jī)如何實(shí)現(xiàn)發(fā)送參數(shù)給單片機(jī),單片機(jī)保存接收的參數(shù)重復(fù)運(yùn)行指定的功能
STM32單片機(jī)的特點(diǎn)介紹
基于STM32單片機(jī)的智能加濕器設(shè)計(jì)
![基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的智能加濕器設(shè)計(jì)](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
stm32單片機(jī)用什么軟件編程
stm32單片機(jī)引腳介紹及功能
stm32和51單片機(jī)的區(qū)別是什么
第19.1 章-星瞳科技 OpenMV視覺循跡功能 超詳細(xì)OpenMV與STM32單片機(jī)通信
![第19.1 章-星瞳科技 OpenMV視覺循跡<b class='flag-5'>功能</b> 超詳細(xì)OpenMV與<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>通信](https://file1.elecfans.com/web2/M00/02/F3/wKgZoma-1qCAL7BHAAYfPbQU4sQ227.png)
簡(jiǎn)述單片機(jī)定時(shí)器的工作原理
stm32單片機(jī)的優(yōu)勢(shì)有哪些?
揭秘:單片機(jī)硬件與軟件延時(shí)之大不同!
![揭秘:<b class='flag-5'>單片機(jī)</b>硬件與軟件<b class='flag-5'>延時(shí)</b>之大不同!](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
基于STM32單片機(jī)的聲光控節(jié)能燈系統(tǒng)設(shè)計(jì)
![基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的聲光控節(jié)能燈系統(tǒng)設(shè)計(jì)](https://file1.elecfans.com/web2/M00/F4/67/wKgaomZ8zcuAWW9iAAATvXlzz20248.jpg)
51、STM32單片機(jī)的編程方式一樣嗎?
![51、<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的編程方式一樣嗎?](https://file.elecfans.com/web2/M00/9B/3D/poYBAGQjnauAVXOgAABFcEbXdEE684.png)
STM32單片機(jī)最小化系統(tǒng)設(shè)計(jì)原理
![<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>最小化系統(tǒng)設(shè)計(jì)原理](https://file1.elecfans.com/web2/M00/D7/37/wKgaomYnW52AF_HPAAA3igTwXnU901.png)
Systick到底是用作延時(shí)好還是用作定時(shí)好?都有什么優(yōu)缺點(diǎn)?
基于STM32單片機(jī)的瓦斯監(jiān)測(cè)與控制
![基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機(jī)</b>的瓦斯監(jiān)測(cè)與控制](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
評(píng)論