配置定时器:
定时器加一需要的时间配置为(17+1)/72us,即0.25us,arr配置为3,则定时器每1us触发一次update中断(要在cubemx中开启update中断),即定时器中的计数器从0变到0需要1us,每1us计数器就会重新计数。
用到的hal库接口
HAL_TIM_Base_Start_IT(&htim1);//以中断方式启动时基单元,即update时会触发中断
//要重写回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim1)
{
currentus++;
}
}
代码实现:
//在main函数中写入
HAL_TIM_Base_Start_IT(&htim1);
在main函数外面写入
static volatile uint32_t currentus=0;
uint32_t mygettick(void)
{
return currentus;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim1)
{
currentus++;
}
}
应用:
在实际编程中会遇到两种问题:
1、在一段时间后执行一些操作。解决方法:使用延时函数。
2、在一段时间中执行一些操作。解决方法:正是利用本文的方法,实现逻辑如下:
uint32_t a=mygettick();
while(mygettick-a<=一段时间)
{
执行一些操作
}
考虑到一直计数下去会产生溢出问题,所以修改代码如下:
currentus=0;
while(mygettick()<=一段时间)
{
执行一些操作
}
注意以上代码中的一段时间要小于us,大约小于70分钟。
另一种方法如下:
int a=0;
while(一些操作 && a<一段时间)
{
a++;
延时1us
}
比如在15us到60us会有一个脉冲(高电平变为低电平)到A1引脚.代码如下:
delay_us(15)
int a=0;
while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)&&a<(60-15+20))
{
a++;
delay_us(1);
}
//超时了
if(a>(60-15))
{
}
//正常
else
{
a=0;
}