Stm32定时中断配置,在我们的日常调试中,想要以一个固定的时钟频率对传感器定时周期采样时往往会直接在main.c函数的While(1)中进行,通过HAL_Delay()来控制采样频率,但是如果多传感器同时采样的话由于HAL_Delay()的方法时效性不是很准确往往会出现一系列的问题,而使用定时中断的话,只需要进入中断并执行该传感器采集数据函数(或其他你想要以固定频率去做一些事情),采集完成后退出中断,所以在这里我们就来学学如何使用【定时中断】。
在这里我使用的是STM32H7系列,打开STM32CubeMX,点击【Time6】将【Activated】打勾✔(这里定时器是在处理器的内部发生作用的所以不需要占用引脚)。
然后点击【Clock Configuration】进入时钟配置界面。
这时我们查看手册,keil5中book里打开stm32H7的datasheet手册
一直翻找我们可以看到一个概括的连接图,这里我知道了Time6和Time7基本定时器都接在了APB1上。
如图可见,基本定时器 Time6、Time7都接在了APB1中,打开STM32CubeMX的时钟界面
可见APB1中有两个时钟源。
上面的时钟源为APB1 Peripheral Clocks(MHz)为外设,下面的即为APB1时钟源为75Mhz,
下面就该填写Time6的parameter Setting了
如果我想将我的Time6分频为1MHz那么我的分频系数就填写74(这里有盆友会问为什么不是75,而要写74呢?其实是因为初始为0代表不分频,1代表二分频,所以在心里要默认加1位,所以74就代表75分频了)
Counter Period (AutoReload Register - 16 bits value ) 就与我们的定时中断时间关系很大了,这里为啥我要写999呢?
{
因为假设我想把定时中断的周期时间定位1毫秒(1/1000秒)
我的time6时钟周期为1s/1Mhz=(1/10^6)s
(Counter Period)*我的中断周期=我想要的中断周期
设:(Counter Period)为x
X*(1/10^6)= 1/1000
解得: x=1000
又因为同上需要减个一,所以Counter Period的值为999.
}
这里设置好后,我们进入NVIC_Setting(设置定时器中断函数)
将其勾选。
进入【NVIC】设置中断的优先级,设置抢占优先级为2,响应优先级为0(数值越小优先级越高)。
设置完成后点击重新生成代码。
main.c代码中将其进行了初始化,那么如何去使用呢,只需要两部
- HAL_TIM_Base_Start_IT(&htim6)
- 在main.c函数中添加下面的函数
//Time6定时中断(1毫秒)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
printf("我是测试定时中断的 \r\n ");
}
注意!!在嵌入式中中断只用在快速响应的事件中,不建议用于执行具体时间,推荐用于做状态同步跟随,比如GPIO的SET/RESET。
标签:HAL,中断,Time6,Stm32H7,APB1,定时,时钟 From: https://blog.csdn.net/kirioo/article/details/139320736