STM32CUBEMX系列——CAN通訊的配置
- CUBEMX配置說明
- CAN相關函式說明
- 過濾器的配置
- 回呼函式的改寫
- 發送函式的改寫
CUBEMX配置說明
首先打開STM32CubeMX選擇你開發的芯片型號,這里我選擇的是F103R6Tx的芯片,然后第一步選擇SYS里面的debug模式,如果用HAL庫不進行SWD或JTAG配置,單片機只能進行下載一次程式,要進行第二次或更多次程式下載,需要按復位鍵(如果你的單片機有復位按鍵的話),或者用鑷子夾住復位線路上的電容使其短路,點擊Keil下載,再松開鑷子,

然后RCC時鐘源選擇外部高速時鐘,自接外部晶振

然后配置時鐘樹
配置CAN相關引數,波特率設定為500K,時鐘頻率為36M,
波特率計算公式:36M/9/(5+2+1)=500K.
模式選擇正常通訊

CAN相關函式說明
HAL_CAN_Start //開啟CAN通訊
HAL_CAN_Stop //關閉CAN通訊
HAL_CAN_RequestSleep //嘗試進入休眠模式
HAL_CAN_WakeUp //從休眠模式中喚醒
HAL_CAN_IsSleepActive //檢查是否成功進入休眠模式
HAL_CAN_AddTxMessage //向 Tx 郵箱中增加一個訊息,并且激活對應的傳輸請求
HAL_CAN_AbortTxRequest //請求中斷傳輸
HAL_CAN_IsTxMessagePending //檢查是否有傳輸請求在指定的 Tx 郵箱上等待
HAL_CAN_GetRxMessage //從Rx FIFO 收取一個 CAN 幀
過濾器的配置
#define PASS_ID ((uint32_t)0x1234)
void CAN_Filter_Init(CAN_HandleTypeDef* canHandle)
{
CAN_FilterTypeDef sFilterConfig;
sFilterConfig.FilterActivation = ENABLE;//打開過濾器
sFilterConfig.FilterBank = 0;//過濾器0 這里可設0-13
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//采用掩碼模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//采用32位掩碼模式
sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;//采用FIFO0
sFilterConfig.FilterIdHigh = ((PASS_ID<<3|CAN_ID_EXT|CAN_RTR_DATA)&0xffff0000)>>16; //設定過濾器ID高16位
sFilterConfig.FilterIdLow = ((PASS_ID<<3|CAN_ID_EXT|CAN_RTR_DATA)&0xffff);//設定過濾器ID低16位
sFilterConfig.FilterMaskIdHigh = 0xffff;//設定過濾器掩碼高16位
sFilterConfig.FilterMaskIdLow = 0x0000;//設定過濾器掩碼低16位
if(HAL_CAN_ConfigFilter(canHandle,&sFilterConfig) != HAL_OK)//初始化過濾器
{
Error_Handler();
}
if(HAL_CAN_Start(canHandle) != HAL_OK)//打開can
{
Error_Handler();
}
if(HAL_CAN_ActivateNotification(canHandle,CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)//開啟接收中斷
{
Error_Handler();
}
}
回呼函式的改寫
CAN_TxHeaderTypeDef TXHeader;
CAN_RxHeaderTypeDef RXHeader;
uint8_t TXmessage[8] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
uint8_t RXmessage[8];
uint32_t pTxMailbox = 0;
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
if(hcan->Instance==CAN1)
{
HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&RXHeader,RXmessage);//獲取資料
//HAL_CAN_ActivateNotification(hcan,CAN_IT_RX_FIFO0_MSG_PENDING);//再次開啟接收中斷
}
}
發送函式的改寫
CAN_TxHeaderTypeDef TXHeader;
CAN_RxHeaderTypeDef RXHeader;
uint8_t TXmessage[8];
uint8_t RXmessage[8];
uint32_t pTxMailbox = 0;
void CAN_senddata(CAN_HandleTypeDef *hcan)
{
TXHeader.StdId=0x123;
TXHeader.ExtId=0X123;
TXHeader.DLC=8;
TXHeader.IDE=CAN_ID_STD;
TXHeader.RTR=CAN_RTR_DATA;
TXHeader.TransmitGlobalTime = DISABLE;
HAL_CAN_AddTxMessage(&hcan,&TXHeader,TXmessage,&pTxMailbox);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253969.html
標籤:其他
上一篇:STM32學習筆記(二十)
