日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stm32 can bus 总结

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stm32 can bus 总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.初始化CAN參數

/* CAN init function */
void MX_CAN_Init(void)
{
? CAN_FilterConfTypeDef filter;
? hcan.Instance = CAN1;
? hcan.Init.Prescaler = 3;
//? hcan.Init.Mode = CAN_MODE_NORMAL;
? hcan.Init.Mode = CAN_MODE_LOOPBACK;
? hcan.Init.SJW = CAN_SJW_1TQ;
? hcan.Init.BS1 = CAN_BS1_12TQ;
? hcan.Init.BS2 = CAN_BS2_2TQ;
? hcan.Init.TTCM = DISABLE;
? hcan.Init.ABOM = DISABLE;
? hcan.Init.AWUM = DISABLE;
? hcan.Init.NART = DISABLE;
? hcan.Init.RFLM = DISABLE;
? hcan.Init.TXFP = ENABLE;

? //在cube生成的基礎上添加以下三項,用于保存收發的內容
? hcan.pTxMsg = &CAN_TX_MSG;? //用于保存要發送的內容
? hcan.pRxMsg = &CAN_RX0_MSG;? //對應fifo0接收
? hcan.pRx1Msg = &CAN_RX1_MSG; //對應fifo1接收
? if (HAL_CAN_Init(&hcan) != HAL_OK)??
? {
??? _Error_Handler(__FILE__, __LINE__);
? }

? filter.FilterNumber=1;
? filter.FilterMode=CAN_FILTERMODE_IDMASK;
? filter.FilterScale=CAN_FILTERSCALE_32BIT;
? filter.FilterIdHigh=0x0000;
? filter.FilterIdLow=0x0000;
? filter.FilterMaskIdHigh=0x0000;
? filter.FilterMaskIdLow=0x0000;
? filter.FilterFIFOAssignment=CAN_FIFO0;
? filter.FilterActivation=ENABLE;
?
? if(? HAL_CAN_ConfigFilter(&hcan,&filter) != HAL_OK) //剛開始因為沒有加過濾配置,導致數據一直收不到,所以接收中斷進不去。
? {
????? Error_Handler();
? }
?? ?
? if(HAL_CAN_Receive_IT(&hcan,CAN_FIFO0) != HAL_OK) // 打開接收中斷(注意cube自動生成的中斷處理會再次清除中斷使能,所以只能接受一次,想要反復接收每次接收萬要重新打開)
? {
????? Error_Handler();
? }
}

?

2.初始化IO


void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

? GPIO_InitTypeDef GPIO_InitStruct;
? if(canHandle->Instance==CAN1)
? {
? /* USER CODE BEGIN CAN1_MspInit 0 */

? /* USER CODE END CAN1_MspInit 0 */
??? /* CAN1 clock enable */
??? __HAL_RCC_CAN1_CLK_ENABLE();
?
??? /**CAN GPIO Configuration?? ?
??? PB8???? ------> CAN_RX
??? PB9???? ------> CAN_TX
??? */
??? GPIO_InitStruct.Pin = CAN_RX_Pin;
??? GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
??? GPIO_InitStruct.Pull = GPIO_NOPULL;
??? HAL_GPIO_Init(CAN_RX_GPIO_Port, &GPIO_InitStruct);

??? GPIO_InitStruct.Pin = CAN_TX_Pin;
??? GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
??? GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
??? HAL_GPIO_Init(CAN_TX_GPIO_Port, &GPIO_InitStruct);

??? __HAL_AFIO_REMAP_CAN1_2(); //參考手冊,PB8,PB9要重映射IO

??? /* CAN1 interrupt Init */
??? HAL_NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, 0, 0);
??? HAL_NVIC_EnableIRQ(USB_HP_CAN1_TX_IRQn);
??? HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
??? HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
//??? HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 0, 0);??????? //結合上面初始化,這里FIFO1的中斷用不上
//??? HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
//??? HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 0, 0);
//??? HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn);
? /* USER CODE BEGIN CAN1_MspInit 1 */

? /* USER CODE END CAN1_MspInit 1 */
? }
}

3.發送

   ? hcan.pTxMsg->StdId=0x00;?? ?
?? ??? ??? ?hcan.pTxMsg->ExtId=0x0000;
?? ??? ??? ?hcan.pTxMsg->IDE=CAN_ID_EXT;
?? ??? ??? ?hcan.pTxMsg->RTR=CAN_RTR_DATA;
?? ??? ??? ?hcan.pTxMsg->DLC=2;
?? ??? ??? ?hcan.pTxMsg->Data[0]=0x12;
?? ??? ??? ?hcan.pTxMsg->Data[1]=0x89;
?? ??? ??? ?hal_status = HAL_CAN_Transmit_IT(&hcan); //用這個不會卡死
?? ??? ??? ?if(hal_status != HAL_OK)
?? ??? ??? ?{
?? ??? ??? ??? ?Error_Handler();
?? ??? ??? ?}

4.關于SCE中斷,不是很了解,后面再更新吧。

?

5.重點摘要,用于幫助制定通訊協議。要關注過濾寄存器,屏蔽寄存器。

在當今的CAN應用中, CAN網絡的節點在不斷增加,并且多個CAN常常通過網關連接起來,因
此整個CAN網中的報文數量(每個節點都需要處理)急劇增加。除了應用層報文外,網絡管理和診
斷報文也被引入。
● 需要一個增強的過濾機制來處理各種類型的報文(注:過濾機制就是為了應對報文數量太多的痛點)


此外,應用層任務需要更多CPU時間,因此報文接收所需的實時響應程度需要減輕。
● 接收FIFO的方案允許CPU花很長時間處理應用層任務而不會丟失報文 (注:FIFO是為了緩解CPU接收報文所需的實時響應的程度)

屏蔽位模式
在屏蔽位模式下,標識符寄存器和屏蔽寄存器一起,指定報文標識符的任何一位,應該按照
“必須匹配”或“不用關心”處理。


標識符列表模式
在標識符列表模式下,屏蔽寄存器也被當作標識符寄存器用。因此,不是采用一個標識符加一
個屏蔽位的方式,而是使用2個標識符寄存器。接收報文標識符的每一位都必須跟過濾器標識符
相同。

?

應用程序選擇1空置的發送郵箱;設置標識符,數據長度和待發送數據;
然后對CAN_TIxR寄存器的TXRQ位置’1’,來請求發送。 TXRQ位置’1’后,郵箱就不再是空郵
箱,軟件對郵箱寄存器就不再有寫的權限。 TXRQ位置1后,郵箱馬上
進入掛號狀態,并等待成為最高優先級的郵箱 。一旦郵箱成為最高優先級的
郵箱,其狀態就變為預定發送狀態。一旦CAN總線進入空閑狀態,預定發送郵箱中的報文就馬
上被發送(進入發送狀態)。一旦郵箱中的報文被成功發送后,它馬上變為空置郵箱 。

當有超過1個發送郵箱在掛號時,發送順序由郵箱中報文的標識符決定。如果標識符的值相等,那么郵箱號小的報文先被發送。

在接收一個報文時,其標識符首先與配置在標識符列表模式下的過濾器相比較;如果匹配上,報文就被存放到相關聯的FIFO中,并且所匹配的過濾
器的序號被存入過濾器匹配序號中。如同例子中所顯示,報文標識符跟#4標識符匹配,因此報文內容和FMI4被存入FIFO
如果沒有匹配,報文標識符接著與配置在屏蔽位模式下的過濾器進行比較。
如果報文標識符沒有跟過濾器中的任何標識符相匹配,那么硬件就丟棄該報文,且不會對軟件
有任何打擾

?

轉載于:https://www.cnblogs.com/zhanghonglang/p/8919181.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的stm32 can bus 总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。