杞县电工培训学校,杞县电工培训班
专注于电工培训、为杞县地区电工的求学者提供专业的电工培训课程和充电平台!
主页 > 电工 >

杞县电工培训学校,杞县电工培训班

  • 课程介绍

  • 参考资料

  • 2021-01-09 01:57
湖南阳光电工培训学校常年面向杞县招生!
【推荐】杞县快速学电工技术,从湖南阳光电工培训学校开始。杞县电工培训学校、杞县电工培训班,首选湖南阳光电工培训学校!电话:0731-85579057,0731-85569651

【温馨提示】湖南阳光电工培训学校地址:湖南省长沙市雨花区车站南路红花坡路176号。目前没有在杞县地区设立分校。热忱欢迎杞县的学员来湖南阳光电工培训学校长沙总校区参加学习!

杞县电工培训学校,杞县电工培训班

详情请进入 湖南阳光电子学校 已关注: 咨询电话:0731-85579057 微信号:yp941688, yp94168

杞县电工培训班,杞县电工培训学校

杞县电工培训学校

杞县电工培训班

杞县电工学校

杞县电工培训班,杞县电工培训学校简介:STM32Cube HAL出来六七年了,还是有很多初学者没有适应,今天就分享一个读者问到的关于中断处理的问题。 很多人都知道STM32CubeMX这套工具的一个目的:减少开发

杞县电工培训学校,杞县电工培训班

杞县电工培训学校,杞县电工培训班

杞县电工培训学校信息内容:,

其它大部分外设(TIM、SPI、CAN...)中断都类似,HAL进行统一处理。
也就是说,HAL已经帮我们把中断处理函数写好了,我们只需要调用相应函数来编写应用程序就行了。HAL_xxx_IRQHandler里面做了哪些处理?我们以STM32F1的HAL_UART_IRQHandler为例:

voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart){uint32_tisrflags=READ_REG(huart->Instance->SR);uint32_tcr1its=READ_REG(huart->Instance->CR1);uint32_tcr3its=READ_REG(huart->Instance->CR3);uint32_terrorflags=0x00U;uint32_tdmarequest=0x00U;/*Ifnoerroroccurs*/errorflags=(isrflags&(uint32_t)(USART_SR_PE|USART_SR_FE|USART_SR_ORE|USART_SR_NE));if(errorflags==RESET){/*UARTinmodeReceiver-------------------------------------------------*/if(((isrflags&USART_SR_RXNE)!=RESET)&&((cr1its&USART_CR1_RXNEIE)!=RESET)){UART_Receive_IT(huart);return;}}/*Ifsomeerrorsoccur*/if((errorflags!=RESET)&&(((cr3its&USART_CR3_EIE)!=RESET)||((cr1its&(USART_CR1_RXNEIE|USART_CR1_PEIE))!=RESET))){/*··删减了部分代码·*/}/*Endifsomeerroroccurs*//*UARTinmodeTransmitter------------------------------------------------*/if(((isrflags&USART_SR_TXE)!=RESET)&&((cr1its&USART_CR1_TXEIE)!=RESET)){UART_Transmit_IT(huart);return;}/*UARTinmodeTransmitterend--------------------------------------------*/if(((isrflags&USART_SR_TC)!=RESET)&&((cr1its&USART_CR1_TCIE)!=RESET)){UART_EndTransmit_IT(huart);return;}}

其实,大家认真看一下代码应该能明白,这些和我们编写的中断处理函数是不是有类似之处?这是无非就是接收中断、发送中断、错误中断等一系列处理。只是这里又进行了再次封装,比如接收中断UART_Receive_IT。当然,这个UART_Receive_IT接收中断实现方式又可能存在不同。像F0、F1...就是直接调用这个接收中断函数来进一步处理。像L0、G0...是通过执行指针函数RxISR来进一步处理。G0的接收中断处理为:huart->RxISR(huart);

voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart){//删除了前面代码/*Ifnoerroroccurs*/errorflags=(isrflags&(uint32_t)(USART_ISR_PE|USART_ISR_FE|USART_ISR_ORE|USART_ISR_NE));if(errorflags==0U){/*UARTinmodeReceiver---------------------------------------------------*/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.

原文标题:STM32CubeHAL库中断处理机制,回调函数实现原理

.

(编辑:杞县电工培训学校)

杞县电工培训学校


杞县电工培训学校

湖南阳光电子学校教学特色

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

杞县电工培训学校

百度收录查询: 杞县电工培训学校

  • 扫码分享
  • 新资讯
  • 热点资讯
电工培训学校 电动车维修学校 摩托车维修学校 手机维修培训学校 水电工培训学校 电脑维修培训学校 电动工具维修培训学校 液晶电视维修培训学校 安防监控培训学校 空调维修培训学校 电焊培训学校 手机维修培训学校 电工培训学校 摩托车维修培训学校 电器维修培训学校 家电维修学校 焊工培训学校 电工培训学校 木工培训学校 瓦工培训学校 摩托车维修学校 电工培训学校 木工培训学校 电器维修学校 电工培训学校