首页 > 编程知识 正文

STM32F303RBT6,stm32cubeIDE中文手册

时间:2023-05-06 16:29:43 阅读:172563 作者:1205

1、概要STM32F302的核心是Cortex-M4。

bxCAN是基本扩展CAN(basicextendedcan )的缩写,支持can协议2.0A和2.0B。 其设计目标是在最小的CPU负荷下有效处理大量接收的消息。 它还支持发送消息的优先级要求(优先级特性可通过软件配置)。 对于安全至关重要的APP应用,bxCAN提供了支持时间触发通信模式所需的所有硬件功能。

2、准备2.1、软件1、HAL库版本: STM32Cube FW_F3 V1.11.2

2.2、开发工具1、STM32CubeMX 6.2.0

2、Keil uVision5 V5.34.0.0

2.3、代码测试时间2021年7月25日

2.4、参考文档STM32F302参考手册: RM0365

STM32F3 HAL库用户手册: UM1786

3、CubeMX工程布置3.1、参数布置该布置中波特率布置如下图所示。 其中Tpclk为分频后的时钟,其中bxCAN为周边时钟APB1,分频后为36MHz。

这里,TS1的配置是2,TS2的配置是3。 波特率是1MHz。 请参考以下图片理解这里的配置。

3.2、中断配置

3.3、中断优先级配置

4、代码配置4.1、配置识别器过滤

硬件过滤节省了CPU开销,每个滤波器组x由两个32位寄存器: CAN_FxR0和CAN_FxR1。

主要配置寄存器是CAN_FM1R、CAN_FS1R、CAN_FA1R。 请参阅下图。 在此配置一个32位过滤器-标识符掩码模式

看图,过滤器的后3位是IDE、RTR、0这3个,在扩展框架中,因为ID的位数是29位,所以我们定义的ID的后29位是有效位,前3位通过移位操作除去。

跳到CAN通信滤波器配置函数就知道了,

参数FilterIdHigh、FilterIdLow对应寄存器CAN_FxR1、

参数FilterMaskIdHigh、支持FilterMaskIdLow的寄存器CAN_FxR2。

通过与下表进行比较,可以了解配置方法。

4.2、初始化过滤器配置

根据以上说明,将相应的ID向左移动三个数量级,并根据ID区域将IDE放置在1 (扩展帧格式)中。 代码如下图所示

我记得初始化过滤器的结构体。 这里没有剪切代码截图。 CAN_FilterTypeDef My_CanFilter0,My_CanFilter1,My_CanFilter2,My_CanFilter3;

过滤多个ID时,可以增加对过滤器。 STM32F302CBT6共有13个过滤器。 对应的参数是过滤器银行(0- 12 )

代码:

my _ can filter0. filter activation=enable; My_CanFilter0.FilterBank=0; my _ can filter0. filterfifoassignment=can _ filter FIFO 0; my _ can filter0. filter scale=can _ filter scale _ 32 bit; my _ can filter0. filter mode=can _ filter mode _ id mask; my _ can filter0. filteridhigh=((can _ IMU _ ID3 ) 16 )0xffff; my _ can filter0. filteridlow=(can _ IMU _ ID3 )0xffff )|CAN_ID_EXT; my _ can filter0. filtermaskidhigh=((device mask3) 16 )0xffff; my_canfilter0.filtermaskidlow=() devicemask3)0xffff )|CAN_ID_EXT; if(Hal_can_configfilter(Hcan,My_CanFilter0)!=Hal_ok(error_Handler ); } my _ can filter1. filter activation=enable; My_CanFilter1.FilterBank=1; my _ can filter1. filterfifoassignment=can _ filter FIFO 0; My_C

anFilter1.FilterScale = CAN_FILTERSCALE_32BIT;My_CanFilter1.FilterMode = CAN_FILTERMODE_IDMASK; My_CanFilter1.FilterIdHigh = ((CAN_ROLL_ID<<3)>>16)&0xffff;My_CanFilter1.FilterIdLow = ((CAN_ROLL_ID<<3)&0xffff)|CAN_ID_EXT;My_CanFilter1.FilterMaskIdHigh = ((DeviceMask<<3)>>16)&0xffff;My_CanFilter1.FilterMaskIdLow = ((DeviceMask<<3)&0xffff)|CAN_ID_EXT; if(HAL_CAN_ConfigFilter(&hcan,&My_CanFilter1) != HAL_OK){Error_Handler();}My_CanFilter2.FilterActivation = ENABLE;My_CanFilter2.FilterBank = 2;My_CanFilter2.FilterFIFOAssignment = CAN_FilterFIFO0;My_CanFilter2.FilterScale = CAN_FILTERSCALE_32BIT;My_CanFilter2.FilterMode = CAN_FILTERMODE_IDMASK; My_CanFilter2.FilterIdHigh = ((CAN_PITCH_ID<<3)>>16)&0xffff;My_CanFilter2.FilterIdLow = ((CAN_PITCH_ID<<3)&0xffff)|CAN_ID_EXT;My_CanFilter2.FilterMaskIdHigh = ((DeviceMask<<3)>>16)&0xffff;My_CanFilter2.FilterMaskIdLow = ((DeviceMask<<3)&0xffff)|CAN_ID_EXT;if(HAL_CAN_ConfigFilter(&hcan,&My_CanFilter2) != HAL_OK){Error_Handler();}My_CanFilter3.FilterActivation = ENABLE;My_CanFilter3.FilterBank = 3;My_CanFilter3.FilterFIFOAssignment = CAN_FilterFIFO0;My_CanFilter3.FilterScale = CAN_FILTERSCALE_32BIT;My_CanFilter3.FilterMode = CAN_FILTERMODE_IDMASK; My_CanFilter3.FilterIdHigh = ((CAN_YAW_ID<<3)>>16)&0xffff;My_CanFilter3.FilterIdLow = ((CAN_YAW_ID<<3)&0xffff)|CAN_ID_EXT;My_CanFilter3.FilterMaskIdHigh = ((DeviceMask<<3)>>16)&0xffff;My_CanFilter3.FilterMaskIdLow = ((DeviceMask<<3)&0xffff)|CAN_ID_EXT;if(HAL_CAN_ConfigFilter(&hcan,&My_CanFilter3) != HAL_OK){Error_Handler();}

4.3、添加中断使能及CAN的启动

在 HAL 库中 CAN 有两种 API 来使能或关闭相应的中断,我测试的是两者的效果相同。

大家可以测试一下留言讨论一下

API:

HAL_CAN_ActivateNotification 开启相应的中断

HAL_CAN_DeactivateNotification 禁用相应的中断

__HAL_CAN_ENABLE_IT 开启相应的中断

__HAL_CAN_DISABLE_IT 禁用相应的中断

代码:

//if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_TX_MAILBOX_EMPTY|CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//{//Error_Handler();//}__HAL_CAN_ENABLE_IT(&hcan,CAN_IT_TX_MAILBOX_EMPTY|CAN_IT_RX_FIFO0_MSG_PENDING);if(HAL_CAN_Start(&hcan) != HAL_OK){Error_Handler();} /* USER CODE END CAN_Init 2 */} 4.4、中断函数的配置

在以上配置中我们使能的中断是发送邮箱空中断&接收FIFO0挂起中断

在中断处理文件中 stm32f3xx_it.c 的相应中断函数 USB_HP_CAN_TX_IRQHandlerUSB_LP_CAN_RX0_IRQHandler 找到CAN的中断处理 HAL_CAN_IRQHandler

在 HAL_CAN_IRQHandler 中找到配置使能的中断处理代码(我们只使用了接收挂起中断),找到对应的处理,使用回调函数

HAL_CAN_RxFifo0MsgPendingCallback 进行相应中断的处理

 中断回调处理代码:

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan){if(hcan->Instance == CAN){HAL_CAN_GetRxMessage(hcan,CAN_FilterFIFO0,&My_RxHeader,Rx_DataBuff);}if(My_RxHeader.IDE == CAN_ID_STD){if(My_RxHeader.StdId == 0x00500000){}}if(My_RxHeader.IDE == CAN_ID_EXT){if(My_RxHeader.ExtId == 0x00500000){led(1);}if(My_RxHeader.ExtId == 0x00510000){led(2);}if(My_RxHeader.ExtId == 0x00520000){led(3);}if(My_RxHeader.ExtId == 0x00530000){led(4);}}}

4.4、主函数的配置

添加测试代码

 

 代码:

while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("CAN通信测试 帧ID = %x rn",CAN_YAW_ID); CAN_SendData(&hcan,0x00510000,Rx_DataBuff,8); } /* USER CODE END 3 */

5、测试

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。