Stm32H7系列定时中断设置HAL库

Stm32定时中断配置,在我们的日常调试中,想要以一个固定的时钟频率对传感器定时周期采样时往往会直接在main.c函数的While(1)中进行,通过HAL_Delay()来控制采样频率,但是如果多传感器同时采样的话由于HAL_Delay()的方法时效性不是很准确往往会出现一系列的问题,而使用定时中断的话,只需要进入中断并执行该传感器采集数据函数(或其他你想要以固定频率去做一些事情),采集完成后退出中断,所以在这里我们就来学学如何使用【定时中断】。

在这里我使用的是STM32H7系列,打开STM32CubeMX,点击【Time6】将【Activated】打勾✔(这里定时器是在处理器的内部发生作用的所以不需要占用引脚)。

17c853d8d2aa4c35960422746cec36b2.png

然后点击【Clock Configuration】进入时钟配置界面。

31bb06acb8fc4b30820f840d9094e84a.png

这时我们查看手册,keil5中book里打开stm32H7的datasheet手册

6252196e90c141d8872ae12fb418b6c1.png

一直翻找我们可以看到一个概括的连接图,这里我知道了Time6和Time7基本定时器都接在了APB1上。

13ce2e9fb4d14ef090c48b2a68d93742.png

如图可见,基本定时器 Time6、Time7都接在了APB1中,打开STM32CubeMX的时钟界面

d14e27e04e8f46a9a84a6c743aa71caf.png

可见APB1中有两个时钟源。

上面的时钟源为APB1 Peripheral Clocks(MHz)为外设,下面的即为APB1时钟源为75Mhz,

下面就该填写Time6的parameter Setting了

8f5fe7c100e34561a4bd1e6741bda10e.png

如果我想将我的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(设置定时器中断函数)

c1dbb5b33d294996bea8fd2a22d46481.png

将其勾选。

2cc11bee7e224187b155b401810f3004.png

进入【NVIC】设置中断的优先级,设置抢占优先级为2,响应优先级为0(数值越小优先级越高)。

设置完成后点击重新生成代码。

 

bc6eee47cd7e4250a738af23f74ba041.png

main.c代码中将其进行了初始化,那么如何去使用呢,只需要两部

  1. HAL_TIM_Base_Start_IT(&htim6)
  2. 在main.c函数中添加下面的函数

//Time6定时中断(1毫秒)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  printf("我是测试定时中断的 \r\n ");

}

注意!!在嵌入式中中断只用在快速响应的事件中,不建议用于执行具体时间,推荐用于做状态同步跟随,比如GPIO的SET/RESET。

 

8d65c7603a0648328cbe93a9f698cc83.png

7e2024ea93c247099e5fab4c16feb0e2.png

 

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用HAL库STM32设置串口中断的基本步骤: 1. 配置串口 首先,您需要在CubeMX中配置串口模块,包括波特率、数据位数、停止位数、奇偶校验等参数。然后,您需要在代码中初始化串口,例如: ``` UART_HandleTypeDef huart; huart.Instance = USART1; huart.Init.BaudRate = 9600; huart.Init.WordLength = UART_WORDLENGTH_8B; huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX_RX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart) != HAL_OK) { Error_Handler(); } ``` 在上述代码中,我们初始化了USART1串口,并设置了相应的参数。 2. 开启串口中断 要开启串口中断,您需要使用HAL_UART_Receive_IT函数来启用接收中断。例如: ``` HAL_UART_Receive_IT(&huart, (uint8_t*)rx_buffer, 1); ``` 在上述代码中,我们使用rx_buffer数组来存储接收到的数据,并启用了接收中断。注意,此时我们只启用了接收中断,如果您还需要使用其他类型的中断,例如传输完成中断或错误中断,需要使用相应的函数来启用。 3. 实现中断处理函数 在开启中断后,您需要实现相应的中断处理函数来处理接收、发送和错误等事件。对于USART的接收中断,您可以使用以下代码来实现中断处理函数: ``` void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART1) { //处理接收到的数据 HAL_UART_Receive_IT(&huart, (uint8_t*)rx_buffer, 1); //启用下一次接收中断 } } ``` 在上述代码中,我们首先检查串口实例是否为USART1,然后处理接收到的数据。最后,我们使用HAL_UART_Receive_IT函数启用下一次接收中断,以便接收更多数据。 希望这些步骤能够帮助您在STM32中成功设置串口中断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值