1. 程式人生 > >STM32F0_SYSTICK在STM32CUBEMX中的設定

STM32F0_SYSTICK在STM32CUBEMX中的設定

     用過STM32CUBEMX的童鞋們都知道,程式碼生成的時候預設HAL_Delay延時單位為ms,當程式中要用到us延時的時候該怎麼辦呢!

     最終評估下來,感覺原子的思路比較靠譜,不帶OS的設計理念是搞清楚SYSTICK的RELOAD暫存器的數值代表什麼,程式碼生成時預設為47999,也就是說

     定時器從47999減1減到0的時候,時間過了1000us,換算後得出數值從47減到1的時候時間過了1us.

void HAL_Delay_us(__IO uint32_t delay_us)
{
	uint32_t first_value = 0;            
	uint32_t current_value = 0;       
	uint32_t reload = SysTick ->LOAD; 
	
	
	uint32_t nus_number = delay_us * ((reload + 1) / 1000);
	uint32_t change_number = 0;

        first_value = SysTick ->VAL;
	while(1)
	{
		  current_value = SysTick ->VAL;
		  if(current_value != first_value)
			{

				 if(current_value < first_value)
				 {
					   change_number += first_value - current_value;
					   //change_number = first_value - current_value + change_number;
				 }
				
				 else
				 {
					  change_number += reload - current_value + first_value;
				 }
				 first_value = current_value;  
				 if(change_number >= nus_number)
				 {
					  break;
				 }
			}
	}
}
無需更改任何其它程式碼,直接在需要的地方插入HAL_Delay_us(nus);