历史上的今天
返回首页

历史上的今天

今天是:2025年03月25日(星期二)

正在发生

2019年03月25日 | STM32CubeMX stm32F4 CAN 使用步骤

2019-03-25 来源:eefocus

STM32CubeMX版本:



固件库版本:



第一步分:CubeMX软件配置。


0、工程配置以及芯片选择这里就不再赘述了。


1、打开CAN外设。



2、配置芯片时钟树。这里我使用了芯片内部HSI RC。



3、CAN配置。



3.1配置波特率为1Mb/s。计算方法:42M/2/(14+6+1)==1M



3.2、使能接收中断。



到这里配置已经完成了,这里我们只配置了部分选项,其余大部分都是采用的默认配置。点击工具栏中齿轮图标,生成代码。


第二部分:代码修改。


1、打开工程,打开can.c文件,在/* USER CODE BEGIN 0 */   和 /* USER CODE END 0 */ 之间添加以下内容。


#include "main.h"

#define F407VET6_BOARD_CAN_ID      0x001

#define SENSOR_BOARD_CAN_ID      0x002

#define ANOTHER_SENSOR_BOARD_CAN_ID    0x003

#define THIRD_SENSOR_BOARD_CAN_ID    0x004

 

//2个3级深度的FIFO

#define   CAN1FIFO   CAN_RX_FIFO0            

#define   CAN2FIFO   CAN_RX_FIFO1  // 

CAN_TxHeaderTypeDef     TxMeg;

CAN_RxHeaderTypeDef     RxMeg;

 

void CAN_User_Init(CAN_HandleTypeDef* hcan )   //用户初始化函数

{

 CAN_FilterTypeDef  sFilterConfig;

 HAL_StatusTypeDef  HAL_Status;


  TxMeg.IDE=CAN_ID_STD;//CAN_ID_EXT;

  TxMeg.RTR=CAN_RTR_DATA;


sFilterConfig.FilterBank = 0;                       //过滤器0

sFilterConfig.FilterMode =  CAN_FILTERMODE_IDLIST;  //设为列表模式    

sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;    


sFilterConfig.FilterIdHigh = F407VET6_BOARD_CAN_ID<<5;   //基本ID放入到STID中  

sFilterConfig.FilterIdLow  = SENSOR_BOARD_CAN_ID <<5;    


sFilterConfig.FilterMaskIdHigh =ANOTHER_SENSOR_BOARD_CAN_ID<<5;

sFilterConfig.FilterMaskIdLow  =THIRD_SENSOR_BOARD_CAN_ID <<5; 

sFilterConfig.FilterFIFOAssignment = CAN1FIFO;    //接收到的报文放入到FIFO0中 

 

sFilterConfig.FilterActivation = ENABLE;  //激活过滤器

sFilterConfig.SlaveStartFilterBank  = 0; 

 

HAL_Status=HAL_CAN_ConfigFilter(hcan, &sFilterConfig);

 HAL_Status=HAL_CAN_Start(&hcan1);  //开启CAN

 if(HAL_Status!=HAL_OK){

printf("开启CAN失败\r\n");

 }

 HAL_Status=HAL_CAN_ActivateNotification(&hcan1,   CAN_IT_RX_FIFO0_MSG_PENDING);

 if(HAL_Status!=HAL_OK){

printf("开启挂起中段允许失败\r\n");

  }

}

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)  //接收回调函数

{

uint8_t  Data[8];

HAL_StatusTypeDef HAL_RetVal;

if(hcan ==&hcan1){

  HAL_RetVal=HAL_CAN_GetRxMessage(&hcan1,  CAN1FIFO, &RxMeg,  Data);

  if ( HAL_OK==HAL_RetVal)

  {                             

      //在这里接收数据

   }

}

//发送数据函数

uint8_t CANx_SendNormalData(CAN_HandleTypeDef* hcan,uint16_t ID,uint8_t *pData,uint16_t Len)

{

HAL_StatusTypeDef HAL_RetVal;

        uint16_t SendTimes,SendCNT=0;

uint8_t  FreeTxNum=0;

TxMeg.StdId=ID;

if(!hcan || ! pData ||!Len)  return 1;

SendTimes=Len/8+(Len%8?1:0);

FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(&hcan1);

TxMeg.DLC=8;

while(SendTimes--){

if(0==SendTimes){

if(Len%8)

TxMeg.DLC=Len%8;

}

while(0==FreeTxNum){

FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(&hcan1);

}

HAL_Delay(1);   //没有延时很有可能会发送失败

HAL_RetVal=HAL_CAN_AddTxMessage(&hcan1,&TxMeg,pData+SendCNT,(uint32_t*)CAN_TX_MAILBOX0); 

if(HAL_RetVal!=HAL_OK)

{

return 2;

}

SendCNT+=8;

}


  return 0;

}



2、在main.c中添加can.h头文件,然后在  /* USER CODE BEGIN 2 */  和 /* USER CODE END 2 */ 之间调用用户初始化CAN函数。


CAN_User_Init( &hcan1 );


OK,CAN收发的基本就可以了。


推荐阅读

史海拾趣

AIRPAX公司的发展小趣事

进入21世纪,AIRPAX开始积极拓展全球市场。通过与各国企业的合作与交流,AIRPAX的产品逐渐进入欧洲、亚洲等地区,服务于更多国家的客户。同时,AIRPAX还积极寻求与其他行业领先企业的战略合作,共同推动电气保护技术的发展。这些合作不仅提升了AIRPAX的品牌影响力,也为其带来了更多的商业机会。

ELEKTRO-PLAST NASIELSK公司的发展小趣事

近年来,随着数字化技术的快速发展和应用普及,电子行业也迎来了数字化转型的浪潮。ELEKTRO-PLAST NASIELSK公司紧跟时代步伐,积极推进数字化转型工作。公司引入先进的数字化设备和系统提升生产效率和质量水平;同时加强信息化建设,实现数据共享和协同办公;此外还通过电子商务平台拓展销售渠道和服务范围。数字化转型不仅提升了公司的竞争力还为客户提供了更加便捷高效的服务体验。

GHI Electronics公司的发展小趣事

GHI Electronics深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,致力于开发具有自主知识产权的产品。其中,ARM微控制器、显示模块、空气质量传感器、模块化系统以及微处理器等主打产品系列,凭借其卓越的性能和稳定的品质,在消费电子、便携设备、通讯/网络等领域获得了广泛应用。这些技术创新不仅巩固了GHI Electronics在市场上的领先地位,也为其未来的发展奠定了坚实的基础。

Fenghua (HK) Electronics Ltd公司的发展小趣事

人才是企业发展的重要保障。Fenghua (HK) Electronics Ltd高度重视人才队伍建设,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入公司。公司提供了完善的培训体系和晋升机会,激发了员工的积极性和创造力。同时,公司注重营造良好的企业文化氛围,让员工在工作中感受到归属感和成就感。

Esc Electronics Corp公司的发展小趣事

随着全球化进程的加速,Esc开始寻求国际合作和业务拓展的机会。公司与国际知名企业建立了战略合作关系,共同研发新产品、开拓市场。同时,Esc还积极拓展海外市场,通过设立海外分公司、参加国际展会等方式,加强与国际市场的联系和合作。这些努力不仅为Esc带来了更多的业务机会,也提升了公司的国际影响力。

Digi International公司的发展小趣事

Digi International成立于1985年,最初是一家位于明尼苏达州的公司。随着业务的不断发展,公司于1989年进行了首次公开募股,并随后重组为特拉华州的公司。Digi International在纳斯达克全球精选市场上交易,股票代码为DGII。这一转型不仅为公司带来了更多的资金支持,也为其后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

关于视频系统处理器选择的建议

关于视频系统处理器选择的建议基于ARM核心的Freescale的i.MX系列芯片是视频应用的佼佼者。 比如i.MX27和i.MX31 i.MX27嵌入式开发板是高清视频输入输出的首选,i.mx27芯片提供了更高的灵活性和更强大的多媒体处理能力,成为IP视频和语音(V2IP)、移 ...…

查看全部问答>

自制超级流水灯演示板

单片机的用途非常广阔,各种智能控制的产品中都少不了它的身影,前景看好,因此引起了一阵阵学习单片机的热潮。   相信很多初学单片机的朋友都是从做流水灯开始的,因为流水灯的电路较为简单。看着按照自己的设想做成的流水灯变幻着不同的花样, ...…

查看全部问答>

谁能详细讲讲 uboot smdk2410.h 里面配置信息的含义?

谢谢! 我是初学者,不明白里面都在配置些什么,不明白哪些是最重要的。…

查看全部问答>

proteus支持哪些微处理器

我是个新手,不拍拍砖,重在学习,微芯的支持吗?…

查看全部问答>

如何使程序某个功能运行时不响应其它操作

小弟要实现如下功能: 当我点击打印操作时,程序弹出一个对话框,显示正在打印,在打印的过程中,必须使程序无法响应用户的其它任何操作。当打印结束时,显示打印成功或打印失败,然后才让程序可以继续响应用户其它操作。 请问这个如何解决哈? …

查看全部问答>

PB调试

各位大虾,小弟有一个问题请教。PB有没有象VC那样的单步调试方法啊。 我现在调试都是把NK编译好,然后下载进去调试,这样做的话效率相对比较的低。 比如我写了一个驱动程序,就必须编译把NK烧进去才能调试,有没有不用烧进去,象VC那样F10功能那 ...…

查看全部问答>

车辆信息的无线采集系统

希望管理员支持,谢谢…

查看全部问答>

STM32F103的ADC采样问题

怎样才能不间断采样呢? 我现在的方法:ADC12采样AB相的电压和电流,ADC3采样C相电压和电流,用TIM1的CC2和CC3作为触发,DMA传输采样数据,半传输完成后计算一次,计算期间进行下一个采样,整传输完成后,重新给DMA采样数据个数。 问题是: ...…

查看全部问答>

2.4G无线电力测温解决方案

2.4G无线电力测温解决方案   随着市场的推进,无线电力测温已经收到电力部门的高度重视.从过去的地方项目上升到省局的集中招标.从应用的角度来看,它并不是一个复杂的应用.但是从实现上来看,它需要公司投入相当大的人力和物力.针对于此,上海麓 ...…

查看全部问答>