【HAL】stm32F103+TJA1050+USBCAN CAN数据收发
MCU型號:stm32F103RCT6
軟件包:
首先是STM32CubeMX配置:
①RCC
②CAN配置
波特率計算方法:
BaudRate=APB1CLK/分頻系數(shù)/(1+BS1+BS2).
此處:36M/12/(1+3+2)=500k.
CAN工作模式:Normal
打開CAN接收中斷:
③打開串口,利用串口調(diào)試
中斷優(yōu)先級根據(jù)需要設(shè)置
最后為勾選“為每個外設(shè)生成初始化文件”
生成代碼
①在can.c文件中添加過濾器配置函數(shù)(接收用)
設(shè)置為接收所有報文數(shù)據(jù)(即暫時不過濾)
添加完之后在can.h中聲明一下此函數(shù)。
②在main.c中添加串口重定義,用于打印信息。
int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);return ch; }在main.c中添加發(fā)送函數(shù),并且要聲明它。
/*********************************************** 函數(shù)功能:can發(fā)送數(shù)據(jù) 入口參數(shù):ide: 0:標(biāo)準(zhǔn)幀1:擴展幀id: 幀IDlen: 數(shù)據(jù)長度data: 數(shù)據(jù) 返回值:0:成功。1:失敗 ************************************************/ uint8_t Can_TxMessage(uint8_t ide,uint32_t id,uint8_t len,uint8_t *data) {uint32_t TxMailbox;CAN_TxHeaderTypeDef CAN_TxHeader;HAL_StatusTypeDef HAL_RetVal; uint16_t i=0;if(ide == 0){CAN_TxHeader.IDE = CAN_ID_STD; //標(biāo)準(zhǔn)幀CAN_TxHeader.StdId = id;}else {CAN_TxHeader.IDE = CAN_ID_EXT; //擴展幀CAN_TxHeader.ExtId = id;}CAN_TxHeader.DLC = len;CAN_TxHeader.RTR = CAN_RTR_DATA;//數(shù)據(jù)幀,CAN_RTR_REMOTE遙控幀CAN_TxHeader.TransmitGlobalTime = DISABLE;while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan) == 0){i++;if(i>0xfffe)return 1;}HAL_Delay(500);HAL_RetVal = HAL_CAN_AddTxMessage(&hcan,&CAN_TxHeader,data,&TxMailbox);if(HAL_RetVal != HAL_OK)return 1;return 0; }接收回調(diào)函數(shù):
/******************************************* 函數(shù)功能:接受中斷回調(diào)函數(shù) 返回值:無 ********************************************/ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {CAN_RxHeaderTypeDef CAN_RxHeader;HAL_StatusTypeDef HAL_Retval;uint8_t Rx_Data[8];uint8_t Data_Len=0;uint32_t ID=0;uint8_t i;HAL_Retval = HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&CAN_RxHeader,Rx_Data);if(HAL_Retval == HAL_OK){Data_Len = CAN_RxHeader.DLC;if(CAN_RxHeader.IDE)ID = CAN_RxHeader.ExtId;elseID = CAN_RxHeader.StdId;printf("id:%x\r\n",ID);printf("Data_Len:%d\r\n",Data_Len);for(i=0;i<8;i++)printf("Rx_Data[%d]=%x\r\n",i,Rx_Data[i]); } }下面是main函數(shù)
int main(void) {/* USER CODE BEGIN 1 */uint8_t data[8]={1,2,3,4,5,6,7,8};//定義發(fā)送數(shù)組/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_CAN_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */CAN1_Config(); //調(diào)用過濾器函數(shù)/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */Can_TxMessage(0,0x222,8,data);//發(fā)送想要發(fā)送的報文數(shù)據(jù)//0:標(biāo)準(zhǔn)幀 0x222:幀ID 數(shù)據(jù)長度DLC:8 data:數(shù)據(jù)存放的數(shù)組HAL_Delay(1000); //發(fā)送要有延時}/* USER CODE END 3 */ }調(diào)試結(jié)果
使用開發(fā)板+CAN收發(fā)器TJA1050+ZLG的UCBCAN-II分析儀
借助上位機軟件CANTest和串口助手
可以看到:MCU發(fā)送出來的數(shù)據(jù)如下,由USBCAN接收到并顯示
然后USBCAN發(fā)送數(shù)據(jù),MCU接收到之后由串口打印顯示出來,如下:
注意:TJA1050為5V供電,要和開發(fā)板共地。
這里是我的參考文章
非常感謝
我的工程鏈接,僅供參考
https://download.csdn.net/download/qq_21246169/12651238
總結(jié)
以上是生活随笔為你收集整理的【HAL】stm32F103+TJA1050+USBCAN CAN数据收发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极路由B70平台失联后如何免插件离线开启
- 下一篇: 期刊论文查重后修改技巧有那些?