stm32 cubemx hal 工程中 微秒延迟 delay_us

时间:2023-03-09 08:26:39
stm32 cubemx hal 工程中 微秒延迟 delay_us

参考的正点原子的代码

测试平台

stm32f429i-disco

配了一个gpio

stm32 cubemx hal 工程中 微秒延迟 delay_us

时钟

stm32 cubemx hal 工程中 微秒延迟 delay_us

gpio

stm32 cubemx hal 工程中 微秒延迟 delay_us

/* USER CODE BEGIN 0 */
typedef uint8_t u8;
typedef uint32_t u32; u8 fac_us; void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS //?????? OS.
u32 reload;
#endif HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//SysTick ??? HCLK
fac_us=SYSCLK; //?????? OS,fac_us ????? #if SYSTEM_SUPPORT_OS //?????? OS.
reload=SYSCLK; //???????? ??? K
reload*=/delay_ostickspersec; //?? delay_ostickspersec ??????
//reload ? 24 ????,???:16777216,? 180M ?,?? 0.745s ??
fac_ms=/delay_ostickspersec; //?? OS ?????????
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;//?? SYSTICK ??
SysTick->LOAD=reload; //? 1/OS_TICKS_PER_SEC ?????
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //?? SYSTICK
#else
#endif
} void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=;
u32 reload=SysTick->LOAD; //LOAD ??
ticks=nus*fac_us; //??????
told=SysTick->VAL; //?????????
while()
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow<told)tcnt+=told-tnow;//???? SYSTICK ??????????.
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //????/????????,???.
}
};
}
/* USER CODE END 0 */
int main(void)
{ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); /* Configure the system clock */
SystemClock_Config(); /* Initialize all configured peripherals */
MX_GPIO_Init(); /* USER CODE BEGIN 2 */
delay_init();
/* USER CODE END 2 */ /* Infinite loop */
/* USER CODE BEGIN WHILE */
while ()
{
/* USER CODE END WHILE */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);
delay_us();
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);
delay_us();
/* USER CODE BEGIN 3 */ }
/* USER CODE END 3 */ }

实际测试, 函数调用能带来几百ns的误差.