STM32Cube HAL库中断处理机制,回调函数实现原理
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
1HAL库中断处理机制
之前使用标准外设库开发时,中断程序(函数)由我们自己实现。
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
uint32_t isrflags = READ_REG(huart->Instance->SR);
uint32_t cr1its = READ_REG(huart->Instance->CR1);
uint32_t cr3its = READ_REG(huart->Instance->CR3);
uint32_t errorflags = 0x00U;
uint32_t dmarequest = 0x00U;
/* If no error occurs */
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
if(errorflags == RESET)
{
/* UART in mode Receiver -------------------------------------------------*/
if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{
UART_Receive_IT(huart);
return;
}
}
/* If some errors occur */
if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
{
/*
·
·删减了部分代码
·
*/
} /* End if some error occurs */
/* UART in mode Transmitter ------------------------------------------------*/
if(((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
{
UART_Transmit_IT(huart);
return;
}
/* UART in mode Transmitter end --------------------------------------------*/
if(((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
{
UART_EndTransmit_IT(huart);
return;
}
}
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
//删除了前面代码
/* If no error occurs */
errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
if (errorflags == 0U)
{
/* UART in mode Receiver ---------------------------------------------------*/
if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
&& (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
|| ((cr3its & USART_CR3_RXFTIE) != 0U)))
{
if (huart->RxISR != NULL)
{
huart->RxISR(huart);
}
return;
}
}
//删除了后面代码
}
看了上面USART中断处理的函数,大家有没有得到什么启发?
其实,HAL库里面处理机制基本一致,只是实现方式上有所不同。
如果你摸清楚了HAL库基本原理,相信阅读HAL库源码,或者使用HAL库编写应用代码不是问题。
2回调函数实现原理
在HAL库中存在大量类似HAL_XXX_XXXCallback这样的函数,这些都是回调函数。
---来自百度百科
HAL库中断处理使用了较多的回调函数,还是拿UART接收中断来举例说明。
初始化配置好UART中断接收,如果有中断请求,就会执行回调函数HAL_UART_RxCpltCallback。
看上面回调函数的定义,通过特定条件调用『回调函数』,这里触发的条件就是中断。
3
扩展说明这里也简单说几点:
1.初学者想直接使用HAL不是不行,需要有一定C语言功底
针对大部分初学者来说,是不建议直接上手HAL。但是,有部分C功底较好的,还是建议直接上手。
2.学HAL,建议参看官网例程
很多人不知道如何找资源,我不止一次强调,官方的才是最好。在HAL库中Projects目录下就有很多例程Examples。
3.我们追求效率,可以HAL库源码
如果你想修改HAL库源码,允许修改少部分。如果要大量修改,还是别折腾了。
4.实际项目需做一定修改
STM32CubeMX仅仅是生成初始化代码和工程,你实际项目中一般都有自己的软件架构。
特别是项目越大,软件架构就需要更加规范。
比如:生成的gpio.c文件名,你需要修改成bsp_gpio.c.
再比如:函数MX_USART2_UART_Init改成MX_DEBUG_UART_Init.
后台回复『STM32』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。