STM32F4xx CAN HAL

STM32F4xx CAN HAL模块驱动

   stm32f4xx_hal_can.c、stm32f4xx_hal_can.h是CAN HAL模块驱动的代码实现文件,本文从结构体、接口函数、中断回调函数这三个方面介绍CAN HAL模块驱动。

1. 结构体

1.1 CAN_TypeDef

  结构体CAN_TypeDef定义了bxCAN所有相关寄存器,结构体CAN_HandleTypeDef的成员Instance是CAN_TypeDef类型的指针。接口函数是通过Instance访问bxCAN寄存器,因此我们需要把bxCAN寄存器的基地址赋值给Instance。

typedef struct
{
  __IO uint32_t              MCR;                 /*!< CAN master control register,         Address offset: 0x00          */
  __IO uint32_t              MSR;                 /*!< CAN master status register,          Address offset: 0x04          */
  __IO uint32_t              TSR;                 /*!< CAN transmit status register,        Address offset: 0x08          */
  __IO uint32_t              RF0R;                /*!< CAN receive FIFO 0 register,         Address offset: 0x0C          */
  __IO uint32_t              RF1R;                /*!< CAN receive FIFO 1 register,         Address offset: 0x10          */
  __IO uint32_t              IER;                 /*!< CAN interrupt enable register,       Address offset: 0x14          */
  __IO uint32_t              ESR;                 /*!< CAN error status register,           Address offset: 0x18          */
  __IO uint32_t              BTR;                 /*!< CAN bit timing register,             Address offset: 0x1C          */
  uint32_t                   RESERVED0[88];       /*!< Reserved, 0x020 - 0x17F                                            */
  CAN_TxMailBox_TypeDef      sTxMailBox[3];       /*!< CAN Tx MailBox,                      Address offset: 0x180 - 0x1AC */
  CAN_FIFOMailBox_TypeDef    sFIFOMailBox[2];     /*!< CAN FIFO MailBox,                    Address offset: 0x1B0 - 0x1CC */
  uint32_t                   RESERVED1[12];       /*!< Reserved, 0x1D0 - 0x1FF                                            */
  __IO uint32_t              FMR;                 /*!< CAN filter master register,          Address offset: 0x200         */
  __IO uint32_t              FM1R;                /*!< CAN filter mode register,            Address offset: 0x204         */
  uint32_t                   RESERVED2;           /*!< Reserved, 0x208                                                    */
  __IO uint32_t              FS1R;                /*!< CAN filter scale register,           Address offset: 0x20C         */
  uint32_t                   RESERVED3;           /*!< Reserved, 0x210                                                    */
  __IO uint32_t              FFA1R;               /*!< CAN filter FIFO assignment register, Address offset: 0x214         */
  uint32_t                   RESERVED4;           /*!< Reserved, 0x218                                                    */
  __IO uint32_t              FA1R;                /*!< CAN filter activation register,      Address offset: 0x21C         */
  uint32_t                   RESERVED5[8];        /*!< Reserved, 0x220-0x23F                                              */ 
  CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register,                 Address offset: 0x240-0x31C   */
} CAN_TypeDef;
1.2 CAN_InitTypeDef

  结构体CAN_InitTypeDef定义了初始化bxCAN时所需的参数,结构体CAN_HandleTypeDef的成员Init是CAN_InitTypeDef类型的变量。
  我们需要给Init的各成员赋值,为bxCAN初始化提供所需的参数。成员Prescaler、SyncJumpWidth、TimeSeg1、TimeSeg2用于配置CAN通信的位时序和位速率(波特率),关于位时序和位速率可参考《CAN总线协议》第8小节以及《STM32F4xx bxCAN》第5小节。tq = Prescaler x tPCLK,TimeSeg1 、TimeSeg2 、SyncJumpWidth分别表示BS1段、BS2段以及SJW各占多少个tq
  FunctionalState是枚举类型,枚举值为Enable和Disable。TimeTriggeredMode为Enable时使能“时间触发通信模式”,关于“时间触发通信模式”可参考《STM32F4xx bxCAN》第2.1小节。
  bxCAN处于总线关闭状态时,有两种方式退出总线关闭状态:(1)在CAN_RX上检测到128次连续11个位的1时,自动退出总线关闭状态;(2)需先将bxCAN切换至初始化模式,然后再退出初始化模式,之后在CAN_RX上检测到128次连续11个位的1时,退出总线关闭状态。AutoBusOff值为Enable时使用方式(1),值为Disable时使用方式(2)。
  bxCAN处于睡眠模式时,有两种方式恢复到正常模式:(1)在CAN_RX引脚上检测到帧起始(SOF)时,由硬件将CAN_MCR寄存器SLEEP位清零,自动恢复至正常模式(2)由软件将CAN_MCR寄存器的SLEEP位清零,退出睡眠模式。AutoWakeUp值为Enable时使用方式(1),值为Disable时使用方式(2)。
  AutoRetransmission值为Enable时,如果消息发送不成功,会被重新发送,直到发送成功,值为Disalble时,无论发送结果如何,消息均只发送一次。
   TransmitFifoPriority值为Enable时,当多个发送邮箱同时处于“挂起”状态,发送顺序按先进先出(FIFO)规则,即先进入“挂起”状态的邮箱会被优先安排发送;值为Disable时,邮箱中消息的标识符ID越小,该邮箱的优先级越高,具有最高优先级的邮箱会被优先安排发送。

typedef struct
{
  uint32_t Prescaler;          
  uint32_t Mode;             
  uint32_t SyncJumpWidth;            
  uint32_t TimeSeg1;                   
  uint32_t TimeSeg2;                   
  FunctionalState TimeTriggeredMode;   
  FunctionalState AutoBusOff;          
  FunctionalState AutoWakeUp;          
  FunctionalState AutoRetransmission;  
  FunctionalState ReceiveFifoLocked; 
  FunctionalState TransmitFifoPriority;
} CAN_InitTypeDef;
1.3 CAN_HandleTypeDef

  我们在编写CAN通信程序时,需要定义一个结构体CAN_HandleTypeDef类型的变量,并对其成员Instance、Init进行赋值。调用相关接口函数时,将该变量的地址作为第一个参数传入。

typedef struct __CAN_HandleTypeDef
{
  CAN_TypeDef                 *Instance;                 
  CAN_InitTypeDef             Init;                      
  __IO HAL_CAN_StateTypeDef   State;                     
  __IO uint32_t               ErrorCode;                                                                 
} CAN_HandleTypeDef;
1.4 CAN_RxHeaderTypeDef

  结构体CAN_RxHeaderTypeDef定义了消息(接收)的头部信息。StdID、ExtID、IDE、RTR、DLC是CAN数据报文中的字段,StdID、ExtID分别是标准标识符和扩展标识符,IDE指示报文的标识符是标准标识符还是扩展标识符,RTR指示报文属于数据帧还是遥控帧,DLC指示报文的数据段的长度,以字节为单位。Timestamp、FilterMatchIndex分别是消息的接收时间戳以及筛选器匹配索引,关于消息的接收时间戳以及筛选器匹配索引请参考《STM32F4xx bxCAN》第3.2小节。

typedef struct
{
  uint32_t StdId;    
  uint32_t ExtId;   
  uint32_t IDE;                        
  uint32_t RTR;
  uint32_t DLC;     
  uint32_t Timestamp; 
  uint32_t FilterMatchIndex; 
} CAN_RxHeaderTypeDef;
1.5 CAN_TxHeaderTypeDef

  结构体CAN_TxHeaderTypeDef定义了消息(发送)的头部信息。StdID、ExtID、IDE、RTR、DLC是CAN报文中的字段。
  如果TransmitGlobalTime值为Enable,并且使能了时间触发通信模式,则发送时间戳会作为数据报文的一部分一起被发送,关于时间触发通信模式以及发送时间戳请参考《stm32F4xx bxCAN》2.1小节。

typedef struct
{
  uint32_t StdId;   
  uint32_t ExtId;    
  uint32_t IDE;      
  uint32_t RTR;  
  uint32_t DLC; 
  FunctionalState TransmitGlobalTime; 
} CAN_TxHeaderTypeDef;
1.6 CAN_FilterTypeDef

  结构体CAN_FilterTypeDef定义了配置标识符筛选器所需的参数,关于标识符筛选器请参考《STM32F4xx bxCAN》第4小节。
  FilterBank是筛选器组的编号,取值0 ~ 27,每个筛选器组有CAN_FxR1、CAN_FxR2两个寄存器(x = 0…27,对应28个筛选器组)。FilterIdHigh、FilterIdLow分别对应寄存器CAN_FxR1的高16位和低16位,FilterMaskIdHigh、FilterMaskIdHigh分别对应寄存器CAN_FxR2的高16位和低16位。
  FilterMode值为CAN_FILTERMODE_IDMASK时,将该筛选器组配置为标识符掩码模式,值为CAN_FILTERMODE_IDLIST时,将该筛选器组配置为标识符列表模式。
  FilterScale值为CAN_FILTERSCALE_16BIT时,将该筛选器组配置为16位尺度,值为CAN_FILTERSCALE_32BIT时,配置为32位尺度。
  FilterFIFOAssignment值为CAN_FILTER_FIFO0时,将该筛选器组分配给FIFO0,值为CAN_FILTER_FIFO1时,分配给FIFO1。
  FilterActivation值为CAN_FILTER_ENABLE时,激活该筛选器组,值为CAN_FILTER_DISABLE时,不激活该筛选器组。

typedef struct
{
  uint32_t FilterIdHigh;          
  uint32_t FilterIdLow; 
  uint32_t FilterMaskIdHigh;
  uint32_t FilterMaskIdLow;
  uint32_t FilterFIFOAssignment;
  uint32_t FilterBank;
  uint32_t FilterMode;
  uint32_t FilterScale;
  uint32_t FilterActivation; 
  uint32_t SlaveStartFilterBank; 
} CAN_FilterTypeDef;

2. 接口函数

(1)HAL_CAN_Init(CAN_HandleTypeDef *hcan)
  接口函数HAL_CAN_Init用于初始化bxCAN,它将bxCAN切换至初始化模式后,使用初始化参数hcan->Init对bxCAN进行初始化。

(2)HAL_CAN_DeInit(CAN_HandleTypeDef *hcan)
  接口函数HAL_CAN_DeInit用于初始化bxCAN为缺省值,它首先调用函数HAL_CAN_Stop,然后软件复位bxCAN。

(3)HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)
  接口函数HAL_CAN_ConfigFilter用于配置标识符筛选器,配置参数通过指针sFilterConfig传入。

(4)HAL_CAN_Start(CAN_HandleTypeDef *hcan)
  初始化bxCAN后,调用接口函数HAL_CAN_Start将bxCAN切换至正常模式,开始CAN报文的收发。

(5)HAL_CAN_Stop(CAN_HandleTypeDef *hcan)
  可以调用接口函数HAL_CAN_Stop将bxCAN退出正常模式,切换回初始化模式,停止CAN报文的收发。

(6)HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan)
  可以调用接口函数HAL_CAN_RequestSleep将bxCAN退出初始化模式或正常模式,切换至睡眠模式。

(7)HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan)
  可以调用接口函数HAL_CAN_RequestSleep将bxCAN退出睡眠模式,切换至进入睡眠模式之前所处的模式。

(8)HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox)
  接口函数HAL_CAN_AddTxMessage用于请求发送一条消息,它首先选择一个空的发送邮箱,并将消息写入邮箱对应的寄存器,然后将该邮箱置为“挂起”状态。处于“挂起”状态的发送邮箱会排队等待硬件安排发送。pHeader是消息的头部信息,包括CAN报文的IDE、RTR、DLC以及标识符ID,数组aData[]是CAN报文的数据段。接口函数通过指针pTxMailbox返回发送该消息所使用的发送邮箱,值可以是CAN_TX_MAILBOX0或CAN_TX_MAILBOX1或CAN_TX_MAILBOX2(bxCAN有三个发送邮箱)。

(9)HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes)
  接口函数HAL_CAN_AbortTxRequest用于中止邮箱消息的发送,TxMailboxes的值可以是CAN_TX_MAILBOX0或CAN_TX_MAILBOX1或CAN_TX_MAILBOX2。

(10)uint32_tHAL_CAN_IsTxMessagePending(CAN_HandleTypeDef*hcan,
uint32_t TxMailboxes)
  接口函数HAL_CAN_IsTxMessagePending用于检查某个发送邮箱是否处于“挂起”状态,参数TxMailboxes的值可以是CAN_TX_MAILBOX0或CAN_TX_MAILBOX1或CAN_TX_MAILBOX2。

(11)uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan)
  接口函数 HAL_CAN_GetTxMailboxesFreeLevel用于获取当前处于“空”状态的发送邮箱的个数。

(12)HAL_CAN_GetRxMessage(CAN_HandleTypeDef*hcan,uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader,uint8_t aData[])
  bxCAN会将接收的有效消息放入FIFO中,接口函数HAL_CAN_GetRxMessage用于从FIFO中取出一条消息,参数RxFifo的值可以是CAN_RX_FIFO0或CAN_RX_FIFO1(bxCAN有两个接收FIFO)。pHeader是消息的头部信息,包括CAN报文的IDE、RTR、DLC以及标识符ID,数组aData[]是CAN报文的数据段。

(13)uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo)
  接口函数HAL_CAN_GetRxFifoFillLevel用于获取FIFO中的消息数,参数RxFifo的值可以是CAN_RX_FIFO0或CAN_RX_FIFO1。

(14)HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)
  接口函数HAL_CAN_ActivateNotification用于使能bxCAN的相关中断。

(15)HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs)
接口函数HAL_CAN_DeactivateNotification用于禁止bxCAN的相关中断。

3. 中断回调函数

  中断触发后,中断向量函数都会统一调用函数HAL_CAN_IRQHandlerCAN_Handle(TypeDef *hcan),然后由函数HAL_CAN_IRQHandler根据中断事件的类型调用相应的回调函数。回调函数为弱函数(__weak),我们可以重写回调函数来实现处理逻辑。

(1)HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
  当邮箱 0中的消息被成功发送后,函数HAL_CAN_TxMailbox0CompleteCallback会被调用。同理,邮箱1、邮箱2中的消息被成功发送后,函数HAL_CAN_TxMailbox1CompleteCallback、HAL_CAN_TxMailbox2CompleteCallback会被调用。

(2)HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
  硬件每向FIFO0存储一条消息,函数HAL_CAN_RxFifo0MsgPendingCallback会被调用。同理,硬件每向FIFO1存储一条消息,函数HAL_CAN_RxFifo1MsgPendingCallback会被调用。

(3)HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan)
  FIFO0中存储三条消息后,函数HAL_CAN_RxFifo0FullCallback会被调用。同理,FIFO1中存储三条消息后,函数HAL_CAN_RxFifo1FullCallback会被调用。

(4)HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan)
  bxCAN进入睡眠模式后,函数 HAL_CAN_SleepCallback会被调用。

(5)HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan)
  BxCAN退出睡眠模式后,函数HAL_CAN_WakeUpFromRxMsgCallback会被调用。

(6)HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
  当bxCAN检查到总线错误时,函数HAL_CAN_WakeUpFromRxMsgCallback会被调用。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对于stm32f4xx芯片开发使用的hal版本库 /** ****************************************************************************** * @file stm32f4xx_hal.h * @author MCD Application Team * @version V1.4.2 * @date 10-November-2015 * @brief This file contains all the functions prototypes for the HAL * module driver. ****************************************************************************** * @attention * * © COPYRIGHT(c) 2015 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */
### 回答1: STM32F4xx系列是一类高性能的32位ARM Cortex-M4微控制器,适用于工业控制、医疗设备、嵌入式系统和汽车电子等领域。为了更好地为开发者提供帮助,ST公司发布了STM32F4xx中文参考手册,以便于初学者快速理解STM32F4xx系列微控制器架构、功能和应用。该参考手册包括丰富的资料和示例代码,可以方便开发者快速入门。 在STM32F4xx中文参考手册中,详细介绍了STM32F4xx微控制器体系结构、内核处理器、模块和外设以及各种通信接口等方面的内容。手册中还包括了如何使用开发工具来构建和调试嵌入式软件、如何使用HAL库来编写驱动程序、如何使用STM32CubeMX来生成代码和驱动程序配置等内容。此外,STM32F4xx中文参考手册还包含了丰富的详细例程,开发者可以通过这些例程进行快速学习和实践。 总之,STM32F4xx中文参考手册是学习和开发STM32F4xx系列微控制器的必备资料,其中包含了丰富的内容和一系列的实例代码,可以方便开发者快速掌握STM32F4xx的体系结构、功能和应用,并快速构建出高性能、高可靠性、低功耗的嵌入式系统和应用。 ### 回答2: STM32F4xx是STMicroelectronics公司生产的一款高性能的ARM Cortex-M系列微控制器,其具有高度集成、低功耗、高速运算、易扩展等优点,被广泛应用于嵌入式系统、工控自动化等领域。 STM32F4xx中文参考手册是学习和使用这款微控制器的必备资料之一,其包含了STM32F4xx系列微控制器的详细技术参数、寄存器配置、中断控制、外设驱动等内容,在应用开发中具有重要意义。 手册中主要涉及STM32F4xx的外设模块,包括ADC(模数转换器)、DAC(数模转换器)、CAN(控制器局域网)、SPI(串行外设接口)、I2C(串行总线接口)等,对这些外设的使用方法进行了详细的讲解和示范。 此外,手册还涉及了STM32F4xx微控制器的时钟管理、电源管理、外设初始化等方面的知识,让读者可以更加深入地了解这款微控制器的内部构造和工作机制。 总体来说,STM32F4xx中文参考手册是STM32F4xx微控制器的重要资料之一,无论是初学者还是资深开发人员都可以在其中找到相应的参考信息,使得应用开发变得更加便捷高效。 ### 回答3: STM32F4xx是一款由意法半导体公司推出的高性能微控制器系列。它具有非常优秀的性能、强大的处理能力以及丰富的外设资源,成为了嵌入式应用领域的主流选择之一。 在STM32F4xx系列微控制器开发过程中,参考手册是非常重要的资料之一。STM32F4xx中文参考手册包含了该系列微控制器各个方面的详细信息,如处理器核、内存、外设、时钟、指令集等。参考手册中提供了非常详尽的外设寄存器结构、工作原理、应用实例等信息,可以帮助开发者更好地掌握STM32F4xx微控制器的开发技术和应用场景。 参考手册还提供了大量的示例代码和操作指引,包括启动代码、底层驱动程序、中间层库以及应用层等,能够让开发者快速上手、快速开发。 总之,STM32F4xx中文参考手册是STM32F4xx微控制器开发过程中必备的工具之一,它不仅提供了丰富的技术和知识资料,同时也提供了丰富的实例代码,使得开发者可以更好的掌握嵌入式系统开发的技巧和方法,为开发高质量的嵌入式系统提供了非常好的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值