历史上的今天
今天是:2025年06月17日(星期二)
2019年06月17日 | STM32F042 基于CubeMX HAL库CAN的配置
2019-06-17 来源:eefocus
首先说说使用时候的两个坑。
(1)要使能Swap PA9/10 –>PA11/12,这个时候PA11和PA12引脚才能出现。

(2)我第一步用的是回环模式。
大致是这样的。
While
{
SendCanMessage();
}
Can_interrupt
{
HAL_CAN_Receive_IT(hcan,CAN_FIFO0);
}
却发现只能中断一次不能返回了。
原因,配置好CAN后状态为HAL_CAN_STATE_READY。
设置为接收,状态为HAL_CAN_STATE_BUSY_RX0。
接收到数据一般会在继续设置为接收。这样一直可以接收。
发送时状态为:HAL_CAN_STATE_BUSY_TX。发送结束变为HAL_CAN_STATE_READY。
那么我们想想,回环模式下的状态。
HAL_CAN_STATE_READY。à设置为接收状态为HAL_CAN_STATE_BUSY_RX0
发送数据 此次被中断,那么完成接收操作时候状态变成了(HAL_CAN_STATE_BUSY_TX)
中断跳回来,发送完成状态变为HAL_CAN_STATE_READY。

再次发数据的时候问题来了,这个时候已经不是接收状态了!
也就是说中断里面收到数据再重新设置为接受状态这个操作被忽略了
配置图:
(1)配置IO

(2)配置时钟

(3)配置CAN 500K




程序:
#include "main.h"
#include "stm32f0xx_hal.h"
CAN_HandleTypeDef hcan;
CAN_FilterConfTypeDef sFilterConfig;
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_CAN_Init(void);
void Configure_Filter(void)
{
sFilterConfig.FilterNumber = 0; //过滤器组0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //工作在标识符屏蔽位模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;//滤波器位宽为单个32位
sFilterConfig.FilterIdHigh =(((unsigned int)0x1314<<3)&0xFFFF0000)>>16; //要过滤的ID高位
sFilterConfig.FilterIdLow = (((unsigned int)0x1314<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//要过滤的ID低位
sFilterConfig.FilterMaskIdHigh = 0xffff;
sFilterConfig.FilterMaskIdLow = 0xffff;
sFilterConfig.FilterFIFOAssignment =CAN_FILTER_FIFO0;//过滤器被关联到FIFO0;
sFilterConfig.FilterActivation = ENABLE;//使能过滤器
//sFilterConfig.BankNumber = 14;
HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);
}
void SendData(void)
{
/* USER CODE BEGIN 2 */
hcan.pTxMsg = &TxMessage;
hcan.pRxMsg = &RxMessage;
hcan.pTxMsg->StdId = 0;//0x1314;
hcan.pTxMsg->ExtId= 0x1314;
hcan.pTxMsg->RTR = CAN_RTR_DATA;
hcan.pTxMsg->IDE = CAN_ID_EXT;
hcan.pTxMsg->DLC = 8;
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';
if(HAL_CAN_Transmit(&hcan, 100) != HAL_OK)
{
}
}
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
HAL_CAN_Receive_IT(hcan,CAN_FIFO0);//开启中断接收
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_CAN_Init();
Configure_Filter();
HAL_CAN_Receive_IT(&hcan,CAN_FIFO0);
SendData();
while (1)
{
HAL_Delay(1000);
HAL_CAN_Receive_IT(&hcan,CAN_FIFO0);//这个重新设置为接收,算是仅仅供测试使用,为bug;
SendData();
}
}
其中滤波器需要配置,不然无法中断。
史海拾趣
|
测试测量的第一个主题活动,入门篇,测试测试工具大搜索。也欢迎大家说说自己的使用心得。 测试测量必备工具一:万用表 测试测量必备工具二:示波器 测试测量必备工具三:信号发生器 测试测量必备工具四:频谱仪… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 一、引言 无线网络,顾名思义是利用无线电波而非线缆来实现与计算机设备位置无关的网络数据传输系统,是现代数据通信系统发展的一个重要方向。随着计算机网络技术、无线技术以及智能传感器技 ...… 查看全部问答> |
|
在mcu中,我想在一个c文件中用同样的宏,却在每个函数中实现不同的功能。。 各位高手,,有没有什么办法实现呀。。 例:#define setSDA P1|=(1… 查看全部问答> |
|
知名外资通讯企业招聘软件开发工程师,协议工程师,算法分析和实现工程师及算法分析系统仿真工程师!!! 无线产品软件开发工程师 职责描述: 负责无线产品软件模块的设计、编码、调试、单元测试等工作,参与相关质量活动,确保设计及实现工作按时保质完成。 职位要求: 1. 本科以上学历,计算机软件、通信、电子、数学、物理及相关专业,有扎实的 ...… 查看全部问答> |
|
用什么代码能开启pda的无线功能? wince高手们,小弟现在用的是华硕的626的一款pda,操作系统是windows mobile6.0,支持无线Wi-Fi; 小弟现有一个问题,我在程序中用什么函数能够自动启用无线功能?… 查看全部问答> |
|
榕盛文化公司(rssdbook.)致力于图书的选题策划、编辑加工和出版,由具有大型出版社工作背景、从事图书出版10余年的资深编辑组建。公司以“弘扬优秀文化、传播卓越品质”为出版理念,成立以来已有数十本图书在全国出版,其中畅销书多达30本,有10 ...… 查看全部问答> |




