目录前言一、代码和使用二、使用和验证1.引入头文件2.初始化3.使用和验证总结前言 接触HAL库差不多两年了,一直苦于HAL库没有自带微秒级的延时,网上的前辈们给出的解决方案要么是改写HAL_Delay的延时时间,要么就是额外占用一个定时器来实现,不太方便移植,以下是我给出的解决方案。软件平台:STM32 Cube IDE 1.5....
之间,否则下次在Cube中有所更改,再重新生成文件,不在规定区域的代码会消失 1voiddelay_us(uint16_t us)2{3uint16_t differ=0xffff-us-5;456HAL_TIM_Base_Start(&htim7);7__HAL_TIM_SetCounter(&htim7,differ);8while(differ <0xffff-5)9{10differ = __HAL_TIM_GetCounter(&htim7);11}12HAL_...
它是一个24位的倒计数定时器,标准库的滴答定时器可以有毫秒、微妙延时,但是HAL库只有 HAL_Delay()...
#define CPU_FREQUENCY_MHZ 72 // STM32时钟主频 void delay_us(__IO uint32_t delay) { int last, curr, val; int temp; while (delay != 0) { temp = delay > 900 ? 900 : delay; last = SysTick->VAL; curr = last - CPU_FREQUENCY_MHZ * temp; if (curr >= 0) { do { val = ...
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);delay_us(100); }/* USER CODE END 3 */ 烧录程序,通过逻辑分析仪观察PA1电平变化: 可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设,延时效果较好。
/* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); delay_us(100); } /* USER CODE END 3 */ 烧录程序,通过逻辑分析仪观察PA1电平变化: 可以看到PA1高电平持续时间和低电平持续时间都和符合100us的预设...
#defineCPU_FREQUENCY_MHZ72// STM32时钟主频voiddelay_us(__IO uint32_t delay){int last,curr,val;int temp;while(delay!=0){temp=delay>900?900:delay;last=SysTick->VAL;curr=last-CPU_FREQUENCY_MHZ*temp;if(curr>=0){do{val=SysTick->VAL;}while((val<last)&&(val>=curr));}else{curr+=...
因为STM32HAL库中仅有对HAl_Delay()毫秒级的延时,为实现精确的微秒级延时,就不得不修改Systick,但由于HAL库内部使用其作为超时判断等操作,对其修改会发生不可预期的错误,不建议修改。因此,使用通用定时器进行定时操作。 2019-06-04 14:55:47 stm32微秒定时器精选资料分享 ...
cube切换了时钟haldelay还不行是因为不管是在main中的task还是中断服务函数,调用HAL_Delay系统就处于卡死状态,起初怀疑优先级过低导致,但NVIC配置Base SysTick优先级高于中断优先级也不触发Base SysTick中断。
前面章节的实验我们使用的是HAL库里自带的API函数HAL_Delay来实现毫秒级别延时的,如果使用到更高精度的...