历史上的今天
今天是:2025年03月25日(星期二)
2019年03月25日 | 基于CubeMX HAL库CAN的配置
2019-03-25 来源: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<
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();
}
}
其中滤波器需要配置,不然无法中断。
史海拾趣
|
公司简介 深圳市英威腾电气股份有限公司(以下简称公司)是深圳市政府重点扶持的“高新技术企业”和“软件企业”,是集研发、制造、销售于一体的专业变频器产品(服务)供应商。 公司始创于2002年4月,经过三个发展阶段:第一阶段,2002年—2004 ...… 查看全部问答> |
|
hDev = CreateFile(NDISUIO_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if(hDev == INVALID_HANDLE_VALUE) { CString s; &nbs ...… 查看全部问答> |
|
单片机选用的 MSP430,利用SIM300模块实现短信控制功能,手机收发短信一切功能正常,但奇怪的 是单片机收到小灵通或10086这类的短信就会死机,因为里面设计的就是手机与手机发短信,但 死机确实是 个大隐患,下面是 我 的 串口中断函数 while((IF ...… 查看全部问答> |
|
现有一个语音处理MATLAB算法,需要进行定点仿真,寻深圳市做过MATLAB算法转换成c++定点算法的人员,注意是软件转换,不是手工转换,人民币交易,电话13380336486。… 查看全部问答> |




