煙臺(tái) 網(wǎng)站建設(shè)seo高級(jí)
首先配置CUBEMX
1.打開CUBEMX
設(shè)置時(shí)鐘,由于我沒(méi)有外部時(shí)鐘,所以我選擇內(nèi)部時(shí)鐘,選擇8倍頻,1分頻,APB1時(shí)鐘頻率為32MKHZ,也就是說(shuō)每秒能夠執(zhí)行 3200 萬(wàn)個(gè)時(shí)鐘周期,1M是每秒執(zhí)行100萬(wàn)個(gè)時(shí)鐘周期。
2.CAN收發(fā)測(cè)試(回環(huán)測(cè)試)
選擇回環(huán)測(cè)試的原因是我現(xiàn)在沒(méi)有接收設(shè)備,所以選擇回環(huán)模式
3.激活接收中斷
4.輸出代碼
CAN代碼:
我用過(guò)燈進(jìn)行表示接收到可信息。
int main(void)
{HAL_Init();MX_GPIO_Init();MX_CAN_Init();// 使能CAN接收中斷HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING); CAN_Config();HAL_CAN_Start(&hcan);//使能can總線,必須有沒(méi)有不行while (1){CAN_SendMessage(0x0182,TxData,8);//測(cè)試canopenif(canopen_Rx_Data_Glag == 1) {HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET); }HAL_Delay(1000);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);HAL_Delay(1000);}
}
void CAN_Config(void)
{ CAN_FilterTypeDef sFilterConfig;/*配置CAN過(guò)濾器*/sFilterConfig.FilterBank = 0; //過(guò)濾器0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterIdHigh = 0x000 ; //32位IDsFilterConfig.FilterIdLow = 0x0000;sFilterConfig.FilterMaskIdHigh = 0x0000; //32位MASKsFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//過(guò)濾器0關(guān)聯(lián)到FIFO0sFilterConfig.FilterActivation = ENABLE; //激活濾波器0sFilterConfig.SlaveStartFilterBank = 14;if(HAL_CAN_ConfigFilter(&hcan,&sFilterConfig) != HAL_OK)//初始化過(guò)濾器{Error_Handler();}if(HAL_CAN_Start(&hcan) != HAL_OK)//打開can{Error_Handler();}if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//開啟接受郵郵箱0掛起中斷{Error_Handler();}}// 發(fā)送 CAN 消息函數(shù)
void CAN_SendMessage(uint32_t id, uint8_t *data, uint8_t len) {CAN_TxHeaderTypeDef TxHeader; // 定義 CAN 發(fā)送頭uint32_t TxMailbox; // 郵箱標(biāo)識(shí)TxHeader.DLC = len; // 數(shù)據(jù)長(zhǎng)度,最大 8 字節(jié)TxHeader.StdId = id; // 標(biāo)準(zhǔn)標(biāo)識(shí)符TxHeader.IDE = CAN_ID_STD; // 使用標(biāo)準(zhǔn) IDTxHeader.RTR = CAN_RTR_DATA; // 數(shù)據(jù)幀TxHeader.TransmitGlobalTime = DISABLE; // 關(guān)閉全局時(shí)間戳// 發(fā)送 CAN 消息,使用 HAL 庫(kù)提供的函數(shù)if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, data, &TxMailbox) != HAL_OK) {// 如果發(fā)送失敗,調(diào)用錯(cuò)誤處理函數(shù)Error_Handler();}
}
//if(HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rxHeader, rxData) == HAL_OK);
//{//}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{CAN_RxHeaderTypeDef rxHeader;uint8_t rxData[8]; // 接收數(shù)據(jù)緩沖區(qū)if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rxHeader, rxData) == HAL_OK){
// if (rxHeader.StdId == 0x80) // SYNC 消息的標(biāo)準(zhǔn) ID
// {
// canopen_Rx_Data_Glag = 1;
// }canopen_Rx_Data_Glag = 1;HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);}}
.H
#ifndef __CANOPEN_H_
#define __CANOPEN_H_
#include "can.h"
#include "main.h"
extern uint8_t canopen_Rx_Data_Glag;
void CAN_Config(void);
void CAN_SendMessage(uint32_t id, uint8_t *data, uint8_t len) ;uint16_t CRC16_Calculate(uint8_t *data, uint32_t length);#endif