#include <board.h> void rt_hw_us_delay(rt_uint32_t us) { rt_uint32_t delta; /* 获得延时经过的 tick 数 */ us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND)); /* 获得当前时间 */ delta = SysTick->VAL; /* 循环获得当前时间, 直到达到指定的时间后退出循环 */ while (del...
这是因为delay_us()这个函数在HAL库中是没有的额,以前使用裸机的时候是我自己实现的,这里我们既然使用了 RT-Thread ,在我们《RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器)》中正好介绍到过 RT-Thread 中有 us 延时函数,我们拿过来用用试试看。 我们把所有delay_us改成rt_hw_us_delay,记得包含一下...
使用hwtimer可以提高定时精度和us级定时,配合回调函数和信号量也不用担心系统自带的us延迟函数 void rt_hw_us_delay(rt_uint32_t us)造成的阻塞问题 芯片:stm32g070 使用hwtimer需要改动的地方如下 board.h中打开timer的相关宏定义,比如使用timer15就打开 board.c中添加对应timer的HAL_TIM_Base_MspInit();初始化...
函数声明:void rt_hw_us_delay(rt_uint32_t us); 应用场景:应用于某些场景下对高精度延时有要求的情况下
void rt_hw_us_delay(rt_uint32_t us) { rt_uint32_t delta; /* 获得延时经过的 tick 数 */ us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND)); /* 获得当前时间 */ delta = SysTick->VAL; /* 循环获得当前时间,直到达到指定的时间后退出循环 */ ...
我们把所有delay_us改成rt_hw_us_delay,记得包含一下头文件: 然后把文件驱动文件中中所有的HAL_Delay改成rt_thread_mdelay,比如: 感觉已经好了……那么接下来看看效果。 2.2 使用测试 上面我们驱动移植好了,我们直接来测试一下,这里我们还是新建一个线程把,这个温湿度读取的线程我根据经验,设置为192字节,然后每隔...
#include <board.h>voidrt_hw_us_delay(rt_uint32_t us) { rt_uint32_t delta;/*获得延时经过的 tick 数*/us= us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND));/*获得当前时间*/delta= SysTick->VAL;/*循环获得当前时间,直到达到指定的时间后退出循环*/while(delta - SysTick->VAL<us);...
rt_hw_us_delay(50000); } void led_tick_thread(void *parameter) { rt_timer_t led1_timer; led1_timer = rt_timer_create("ledtim1", led1_timeout, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER); if (led1_timer != RT_NULL) { ...
定时器的高精度延时rt_hw_us_delay 线程间同步 临界区: 当多个线程同时访问一块共享内存块,这块区域就是临界区,需要通过线程间的IPC机制来访问,以保证临界区的数据的可靠性 线程同步核心思想 访问临界区的时候只允许一个线程或者一类线程访问 进入/退出临界区方式 ...
定时器的高精度延时rt_hw_us_delay 线程间同步 临界区: 当多个线程同时访问一块共享内存块,这块区域就是临界区,需要通过线程间的IPC机制来访问,以保证临界区的数据的可靠性 线程同步核心思想 访问临界区的时候只允许一个线程或者一类线程访问 进入/退出临界区方式 ...