首先要安裝cubemx跟Keil5兩個(gè)編程軟件,然后打開cubemx軟件,新建一個(gè)工程項(xiàng)目:
輸入CPU型號(hào):
在右下角雙擊CPU具體型號(hào):
稍等片刻會(huì)打開如下對(duì)話框:
首先要配置系統(tǒng)的調(diào)試方式:我們選擇SW方式,
然后配置晶振源,這里選擇的是外部晶振,8M,
使能看門狗,
使能CAN,
使能TIM2時(shí)鐘源,采用內(nèi)部時(shí)鐘,
配置完成后可以看到單片機(jī)管腳已經(jīng)做了配置。
切換到Clock Configuration選項(xiàng)卡,配置時(shí)鐘周期,這里配置為8M
切換到Configuration選項(xiàng)卡,進(jìn)入CAN配置選項(xiàng)配置波特率如下為500Kbps。
配置接收中斷。
配置定時(shí)器如下為1ms定時(shí)器。
配置定時(shí)器中斷
配置完成后點(diǎn)擊保存,然后點(diǎn)擊如下按鈕,生成代碼
填寫工程名稱,路徑,編程軟件等等
選擇生成代碼的方式
等待……
之后點(diǎn)擊打開項(xiàng)目。代碼生成部分完成。
添加一些特殊配置和邏輯代碼,添加CAN的配置信息函數(shù)。
void Can_Config(void){ hcan.pTxMsg = &TxMessage; hcan.pRxMsg = &RxMessage; /*##-1- Configure CAN1 Transmission Massage #####################################*/ hcan.pTxMsg->StdId = 0x123; hcan.pTxMsg->RTR = CAN_RTR_DATA; hcan.pTxMsg->IDE = CAN_ID_STD; hcan.pTxMsg->DLC = 8; /*##-2- Configure the CAN1 Filter ###########################################*/ sFilterConfig.FilterNumber = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; sFilterConfig.FilterIdHigh = 0; sFilterConfig.FilterIdLow = 0; sFilterConfig.FilterMaskIdHigh = 0; sFilterConfig.FilterMaskIdLow = 0; sFilterConfig.FilterFIFOAssignment = CAN_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.BankNumber = 14; HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);}
在Main函數(shù)中while(1)之前調(diào)用一下即可,添加定時(shí)器啟動(dòng)函數(shù):
HAL_TIM_Base_Start_IT(&htim2);
CAN接收中斷啟動(dòng)函數(shù):
HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);/* USER CODE BEGIN 2 */ Can_Config(); //Can配置信息HAL_TIM_Base_Start_IT(&htim2); //定時(shí)器啟動(dòng)HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//使能Can接收中斷 /* USER CODE END 2 */
打開stm32f1xx_it.c文件,找到如下函數(shù),添加接收中斷啟動(dòng)函數(shù):
HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);
注意:接收中斷啟動(dòng)函數(shù)使能一次只進(jìn)一次中斷,所以中斷退出前要再次使能。
void USB_LP_CAN1_RX0_IRQHandler(void){ /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */ /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */ HAL_CAN_IRQHandler(&hcan); /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */ HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//ê1?üCAN?óê? /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */}
添加CAN接收服務(wù)函數(shù):
HAL_CAN_RxCpltCallback
說明:該函數(shù)在stm32f1xx_hal_can.c文件中已經(jīng)有定義,它的定義方式如下:
__weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)
函數(shù)前面的__weak關(guān)鍵字意思是如果有同樣的定義,先執(zhí)行沒有__weak關(guān)鍵字的函數(shù),所以當(dāng)我們定義了HAL_CAN_RxCpltCallback函數(shù)后,編譯器會(huì)先編譯我們定義的函數(shù),而忽略系統(tǒng)定義的該函數(shù)。當(dāng)我們沒有定義該函數(shù)時(shí),系統(tǒng)會(huì)編譯帶有__weak關(guān)鍵字的函數(shù)。
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan){ unsigned short int speed; switch(hcan->pRxMsg->StdId) {//根據(jù)ID處理數(shù)據(jù) case 0x123:// /*在此添加數(shù)據(jù)處理邏輯*/ break; default: break; }}
添加CAN發(fā)送函數(shù):
/* USER CODE BEGIN WHILE */ while (1) { HAL_IWDG_Refresh(&hiwdg); //喂狗函數(shù) if(Can_Trans_Timer == 0) {//每100ms發(fā)送一次數(shù)據(jù) Can_Trans_Timer = 100; hcan.pTxMsg->StdId = 0x123; hcan.pTxMsg->Data[0] = 'C'; hcan.pTxMsg->Data[1] = 'A'; hcan.pTxMsg->Data[2] = 'N'; hcan.pTxMsg->Data[3] = ' '; hcan.pTxMsg->Data[4] = 'T'; hcan.pTxMsg->Data[5] = 'E'; hcan.pTxMsg->Data[6] = 'S'; hcan.pTxMsg->Data[7] = 'T'; HAL_CAN_Transmit(&hcan, 200);//發(fā)送一幀數(shù)據(jù) } } /* USER CODE END WHILE */
在定時(shí)器函數(shù)中添加定時(shí)器代碼:
void TIM2_IRQHandler(void){ /* USER CODE BEGIN TIM2_IRQn 0 */ if(Can_Trans_Timer > 0) Can_Trans_Timer--; /* USER CODE END TIM2_IRQn 0 */ HAL_TIM_IRQHandler(&htim2); /* USER CODE BEGIN TIM2_IRQn 1 */ /* USER CODE END TIM2_IRQn 1 */}
說明:在往工程中添加代碼時(shí)要注意,不要任意往里面添加代碼,要在注釋著USER CODE BEGIN的地方添加代碼,這樣在重新生成代碼時(shí)才不至于將已經(jīng)寫好的代碼覆蓋掉,如下
/* USER CODE BEGIN Includes */
責(zé)任編輯:xj
原文標(biāo)題:STM32-CubeMX-實(shí)現(xiàn)CAN通訊
文章出處:【微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
原文標(biāo)題:STM32-CubeMX-實(shí)現(xiàn)CAN通訊
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Profinet轉(zhuǎn)CAN網(wǎng)關(guān)模塊對(duì)實(shí)現(xiàn)西門子PLC與CAN變頻器協(xié)同通信的助力研究

STM32F103TBU6 封裝是VFQFPN36 將PD0和PD1配置成CAN不成功是什么原因?
STM32F103TBU6封裝是VFQFPN36,將PD0和PD1配置成CAN不成功是什么原因?

STM32開發(fā)入門進(jìn)階必備!《STM32嵌入式系統(tǒng)開發(fā)—基于STM32CubeMX和HAL庫(kù)》新書發(fā)布!

使用STM32H7的FDCAN通訊,為什么CAN1會(huì)收到CAN2的幀ID,CAN2也會(huì)收到CAN1的?
STM32CubeMX用于STM32配置和初始化C代碼生成
工程師開發(fā)利器:STM32CubeMX 與 eDesignSuite 的協(xié)同開發(fā)

使用stm32cubeMX無法生成mdk工程文件?
STM32CubeMX生成的代碼,是怎樣的HAL架構(gòu)?

STM32CubeMX的菜單介紹

評(píng)論