STM32H750VB CAN口使用快速上手笔记

:),作为多年的程序老手了,学习新的东西已经木有太多的耐心了,现在的处理器平台强大到早就过了那个需要对所有单 片机资源精打细算的年代了,新的开发工具也变得非常强大傻瓜化,从F103到H750平台硬件资源的更新,让使用也亦一些不习惯,本文为F103系列老手快速上手H750笔记之CAN口篇:)
正题:)H750VB的CAN口为新的FDCAN,最看重的是支持10MBIT/S的速率,这个是很舒服,大大的提高的通信能力,测试了一下,1MB的速率下,传输一个8字节的标准ID数据帧为120uS的时间,用FDCAN使用2MB的速率,传输时间就到了73uS左右,(这里因为仲裁帧还是用的1MB速率),用在一些高频率小数据传输场合极度合适:),下面说怎么用:)
还是用CUBEMX来先进行配置:)先是时钟,CPU480MHZ,CAN选择PLL1Q=40MHZ,下图:)在这里插入图片描述
在这里插入图片描述
引脚配置,如图:)
在这里插入图片描述
基本功能配置
在这里插入图片描述
其他的不做太多说明,这里对波特率说明一下:)
仲裁段can波特率= fdcan_ker_ck/Nominal Prescaler/(Nominal Sync Jump Width+Nominal Time Seg1 +Nominal Time Seg1 )
仲裁段波特率=40/1/(1+31+8)=1Mbit/S
数据段can波特率= fdcan_ker_ck/Nominal Prescaler/(Nominal Sync Jump Width+Nominal Time Seg1 +Nominal Time Seg1 )
数据段波特率=40/1/(1+14+5)=2Mbit/S
这几个数据的组合,我一般Sync Jump Width设定为1,Nominal Time Seg1 >Nominal Time Seg2*3:),因为Nominal Time Seg1包含了Propagation_segment段。
实际测试通信效果非常好:)
然后是中断设置,我的应用是发送不中断,接收产生中断并处理数据,如下图:)
在这里插入图片描述
点击产生代码,然后到MDK里面:)
在这里插入图片描述
主程序 的初始化程序会产生这样一个初始化,但这个初始化只是初始化的硬件部分和IO,中断这些都不在这里初始化,需要自行增加:)
//下面这些中断需要自己打开
在这里插入图片描述

__HAL_FDCAN_ENABLE_IT(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE);//打开FIFO0新信息中断
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);//打开FDCAN1_IT0_IRQn中断,
// HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn);
/* Configure Rx filter */
//初始化接收的ID码过滤器
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
sFilterConfig.FilterID1 = 0x0;
sFilterConfig.FilterID2 = 0x0; // For acceptance, MessageID and FilterID1 must match exactly
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);

//配置CAN口FIFO0深度为0,这里因为接收的信息比较少
/* Configure Rx FIFO 0 watermark to 2 /
HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 2);
/
Activate Rx FIFO 0 watermark notification */
//启动激活接收FIFO0,因为只用到接收FIFO0
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
HAL_FDCAN_Start(&hfdcan1);//启动CAN1口
这里就完成启动CAN1口了,可以发送,可以接收CAN数据了:)
先定义两个变量,发送和接收的描述变量
FDCAN_RxHeaderTypeDef FDCAN1_RxHeader;
FDCAN_TxHeaderTypeDef FDCAN1_TxHeader;

下面是发送函数,这里一定要注意字节数只能用定义的宏来做,不然不对,和以前不一样,:)
在这里插入图片描述
void CAN_wrMsg1 (CanTxMsg *msg) {//发送CAN数据帧
FDCAN1_TxHeader.Identifier=msg->StdId; //32位ID
FDCAN1_TxHeader.IdType=FDCAN_STANDARD_ID;//标准帧FDCAN_STANDARD_ID
FDCAN1_TxHeader.TxFrameType=FDCAN_DATA_FRAME ;//数据帧
FDCAN1_TxHeader.DataLength=FDCAN_DLC_BYTES_8;//数据长度=8字节
FDCAN1_TxHeader.ErrorStateIndicator=FDCAN_ESI_ACTIVE;
FDCAN1_TxHeader.BitRateSwitch=FDCAN_BRS_ON;//打开CAN速率切换 FDCAN_BRS_OFF;//关闭速率切换
FDCAN1_TxHeader.FDFormat=FDCAN_FD_CAN;//FDCAN模式 FDCAN_CLASSIC_CAN;//传统的CAN模式
FDCAN1_TxHeader.TxEventFifoControl=FDCAN_NO_TX_EVENTS; //无发送事件
FDCAN1_TxHeader.MessageMarker=0;
TX_Statues=HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1,&FDCAN1_TxHeader,msg->Data);//发送
//HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1,&FDCAN1_TxHeader,msg->data,1);//发送
}
接收函数:)CAN_ID,帧格式等除了数据都在 FDCAN1_RxHeader变量里,数据在msg_data指向的数据缓存中:)
在这里插入图片描述
void CAN_rdMsg (CAN_msg *msg) {
//提取FIFO0中接收到的数据
HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_FIFO0,&FDCAN1_RxHeader,msg->data);
// HAL_FDCAN_GetRxMessage(&hfdcan1,FDCAN_RX_BUFFER0,&FDCAN1_RxHeader,msg->data);
}
这就是CAN操作的其本变量和函数了,老手有这些基本能快速上手,常规数据传输基本就这些,其他的如J1939等不在此讨论了:)另外还亦中断处理:)
void FDCAN1_IT0_IRQHandler(void){

 if (__HAL_FDCAN_GET_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE) != 0U){//是新数据接收中断
  /* Clear the Rx Buffer New Message flag */
  __HAL_FDCAN_CLEAR_FLAG(&hfdcan1, FDCAN_FLAG_RX_FIFO0_NEW_MESSAGE);//清除中断标志
    CAN_rdMsg (&CAN_RxMsg);                       // 读取CAN新的数据帧
 }

}
其他的中断处理可以依此类推,:)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值