获取系统启动以来的微秒数

配置定时器:

定时器加一需要的时间配置为(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()<=一段时间)
{

执行一些操作

}

注意以上代码中的一段时间要小于2^{32}-1us,大约小于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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值