历史上的今天
返回首页

历史上的今天

今天是: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();

 

 

  }

 

}



其中滤波器需要配置,不然无法中断。

推荐阅读

史海拾趣

BNS Solutions公司的发展小趣事

随着电子行业的不断发展,新技术和新应用层出不穷。BNS Solutions公司紧跟时代步伐,不断加大研发投入,推动技术创新。公司团队不断探索新技术、新材料的应用,开发出了一系列具有创新性和前瞻性的电子产品。这些产品不仅提高了行业的整体技术水平,还引领了行业变革的潮流。通过持续创新,BNS Solutions公司在电子行业中保持了领先地位,成为了行业的佼佼者。

ENERGIZER公司的发展小趣事

近年来,随着智能设备的普及,消费者对电池的需求也日益增长。为了满足这一需求,ENERGIZER不断加大研发投入,推出了一系列高性能的电池产品。其中,高能量锂电池的研发成功,为智能设备的发展提供了强有力的支持。这款电池具有高能量密度、长寿命等优点,广泛应用于智能手机、平板电脑等高端电子设备中。同时,ENERGIZER还不断优化生产工艺,降低成本,为消费者提供更优质、更实惠的电池产品。

这些故事展示了ENERGIZER公司在电子行业发展中的创新力和市场洞察力,也体现了该公司对环保和消费者需求的关注与响应。作为全球领先的电池制造商,ENERGIZER始终保持着技术创新的步伐,为全球电子行业的发展做出了重要贡献。

Adaptive Networks Inc公司的发展小趣事

近年来,随着智能设备的普及,消费者对电池的需求也日益增长。为了满足这一需求,ENERGIZER不断加大研发投入,推出了一系列高性能的电池产品。其中,高能量锂电池的研发成功,为智能设备的发展提供了强有力的支持。这款电池具有高能量密度、长寿命等优点,广泛应用于智能手机、平板电脑等高端电子设备中。同时,ENERGIZER还不断优化生产工艺,降低成本,为消费者提供更优质、更实惠的电池产品。

这些故事展示了ENERGIZER公司在电子行业发展中的创新力和市场洞察力,也体现了该公司对环保和消费者需求的关注与响应。作为全球领先的电池制造商,ENERGIZER始终保持着技术创新的步伐,为全球电子行业的发展做出了重要贡献。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

进入新世纪,随着科技的快速发展,电子产品更新换代速度日益加快。ANSHAN公司深知技术创新的重要性,不断加大研发投入,积极引进先进技术和设备。在一次重要的技术攻关中,公司研发团队成功突破了一项关键技术难题,推出了一款性能卓越、价格实惠的新型电子产品,受到了市场的热烈欢迎。这一技术突破不仅提升了公司的核心竞争力,也为公司的后续发展奠定了坚实基础。

ARCOL公司的发展小趣事

随着电子技术的飞速发展,ARCOL公司意识到只有不断创新才能在激烈的市场竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进先进的生产设备和技术,不断推出创新性的产品。通过不断优化生产工艺和提升产品质量,ARCOL的产品在市场上逐渐占据了领先地位。

Antex公司的发展小趣事

随着业务的不断扩展,Antex在1980年决定将工厂从东京都大田区羽田迁至茨城县高萩市。这一搬迁不仅为公司提供了更广阔的发展空间,也标志着Antex开始向着全球化布局迈进。此后,公司积极寻求国际合作,与全球各地的供应商和客户建立了紧密的合作关系。

问答坊 | AI 解惑

《电子工程师手册-常用资料》

《电子工程师手册-常用资料》…

查看全部问答>

【2009年10月16日】深圳市英威腾电气股份有限公司招聘

公司简介 深圳市英威腾电气股份有限公司(以下简称公司)是深圳市政府重点扶持的“高新技术企业”和“软件企业”,是集研发、制造、销售于一体的专业变频器产品(服务)供应商。 公司始创于2002年4月,经过三个发展阶段:第一阶段,2002年—2004 ...…

查看全部问答>

OPEN_DEVICE问题

hDev = CreateFile(NDISUIO_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);         if(hDev == INVALID_HANDLE_VALUE) {                 CString s; &nbs ...…

查看全部问答>

为什么 单片机收到小灵通或10086这类的 短信死机

单片机选用的 MSP430,利用SIM300模块实现短信控制功能,手机收发短信一切功能正常,但奇怪的 是单片机收到小灵通或10086这类的短信就会死机,因为里面设计的就是手机与手机发短信,但 死机确实是 个大隐患,下面是 我 的 串口中断函数 while((IF ...…

查看全部问答>

能够实现路由或者交换功能的芯片

请问:    有没有能够实现路由或者交换功能的芯片?     能够用带网络模块的单片机实现吗? 谢谢!…

查看全部问答>

MATLAB算法定点仿真

现有一个语音处理MATLAB算法,需要进行定点仿真,寻深圳市做过MATLAB算法转换成c++定点算法的人员,注意是软件转换,不是手工转换,人民币交易,电话13380336486。…

查看全部问答>

windosXP安装系统的问题

我以前把系统做到了D盘上,现在想把系统做到C盘上但是C盘的容量不到一个G,但我又不想格式化硬盘,请问怎么才能把系统做到D盘上.(详细)…

查看全部问答>

要做一个基于单片机的公交车自动报站系统

要做一个基于单片机的自动报站系统  谁有这方面的资料啊  给点啊  硬件设计 和软件设计的都行…

查看全部问答>

队列收不到消息

高手,您好。请教一下,ucos2中一个任务中使用一个队列。在中断服务程序中向该队列发送消息,开始运行时是正常的,任务可以会收到消息。运行几个小时后就收不到消息了,就一直等待消息,停在OSQPend(Rd_i2c_Q,200,&_err)。中断服务程序还是正常运 ...…

查看全部问答>

请教:转速测试用的磁钢怎么确定规格与磁通?

您好!        请教:转速测试用的磁钢怎么确定规格与磁通大小?                  另请问哪里有这种磁钢卖呀?…

查看全部问答>