完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
:),作为多年的程序老手了,学习新的东西已经木有太多的耐心了,现在的处理器平台强大到早就过了那个需要对所有单 片机资源精打细算的年代了,新的开发工具也变得非常强大傻瓜化,从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新的数据帧 } } 其他的中断处理可以依此类推,:) |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 22:51 , Processed in 1.299307 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号