教程:如何用STM32-CubeMX-实现CAN通讯

首先要安装cubemx跟keil5两个编程软件,然后打开cubemx软件,新建一个工程项目:
输入cpu型号:
在右下角双击cpu具体型号:
稍等片刻会打开如下对话框:
首先要配置系统的调试方式:我们选择sw方式,
然后配置晶振源,这里选择的是外部晶振,8m,
使能看门狗,
使能can,
使能tim2时钟源,采用内部时钟,
配置完成后可以看到单片机管脚已经做了配置。
切换到clock configuration选项卡,配置时钟周期,这里配置为8m
切换到configuration选项卡,进入can配置选项配置波特率如下为500kbps。
配置接收中断。
配置定时器如下为1ms定时器。
配置定时器中断
配置完成后点击保存,然后点击如下按钮,生成代码
填写工程名称,路径,编程软件等等
选择生成代码的方式
等待……
之后点击打开项目。代码生成部分完成。
添加一些特殊配置和逻辑代码,添加can的配置信息函数。
void can_config(void){ hcan.ptxmsg = &txmessage; hcan.prxmsg = &rxmessage; /*##-1- configure can1 transmission massage #####################################*/ hcan.ptxmsg->stdid = 0x123; hcan.ptxmsg->rtr = can_rtr_data; hcan.ptxmsg->ide = can_id_std; hcan.ptxmsg->dlc = 8; /*##-2- configure the can1 filter ###########################################*/ sfilterconfig.filternumber = 0; sfilterconfig.filtermode = can_filtermode_idmask; sfilterconfig.filterscale = can_filterscale_16bit; sfilterconfig.filteridhigh = 0; sfilterconfig.filteridlow = 0; sfilterconfig.filtermaskidhigh = 0; sfilterconfig.filtermaskidlow = 0; sfilterconfig.filterfifoassignment = can_fifo0; sfilterconfig.filteractivation = enable; sfilterconfig.banknumber = 14; hal_can_configfilter(&hcan, &sfilterconfig);}
在main函数中while(1)之前调用一下即可,添加定时器启动函数:
hal_tim_base_start_it(&htim2);
can接收中断启动函数:
hal_can_receive_it(&hcan, can_fifo0);/* user code begin 2 */ can_config(); //can配置信息hal_tim_base_start_it(&htim2); //定时器启动hal_can_receive_it(&hcan, can_fifo0);//使能can接收中断 /* user code end 2 */
打开stm32f1xx_it.c文件,找到如下函数,添加接收中断启动函数:
hal_can_receive_it(&hcan, can_fifo0);
注意:接收中断启动函数使能一次只进一次中断,所以中断退出前要再次使能。
void usb_lp_can1_rx0_irqhandler(void){ /* user code begin usb_lp_can1_rx0_irqn 0 */ /* user code end usb_lp_can1_rx0_irqn 0 */ hal_can_irqhandler(&hcan); /* user code begin usb_lp_can1_rx0_irqn 1 */ hal_can_receive_it(&hcan, can_fifo0);//ê¹äücan½óêõ /* user code end usb_lp_can1_rx0_irqn 1 */}
添加can接收服务函数:
hal_can_rxcpltcallback
说明:该函数在stm32f1xx_hal_can.c文件中已经有定义,它的定义方式如下:
__weak void hal_can_txcpltcallback(can_handletypedef* hcan)
函数前面的__weak关键字意思是如果有同样的定义,先执行没有__weak关键字的函数,所以当我们定义了hal_can_rxcpltcallback函数后,编译器会先编译我们定义的函数,而忽略系统定义的该函数。当我们没有定义该函数时,系统会编译带有__weak关键字的函数。
void hal_can_rxcpltcallback(can_handletypedef* hcan){ unsigned short int speed; switch(hcan->prxmsg->stdid) {//根据id处理数据 case 0x123:// /*在此添加数据处理逻辑*/ break; default: break; }}
添加can发送函数:
/* user code begin while */ while (1) { hal_iwdg_refresh(&hiwdg); //喂狗函数 if(can_trans_timer == 0) {//每100ms发送一次数据 can_trans_timer = 100; hcan.ptxmsg->stdid = 0x123; 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'; hal_can_transmit(&hcan, 200);//发送一帧数据 } } /* user code end while */
在定时器函数中添加定时器代码:
void tim2_irqhandler(void){ /* user code begin tim2_irqn 0 */ if(can_trans_timer > 0) can_trans_timer--; /* user code end tim2_irqn 0 */ hal_tim_irqhandler(&htim2); /* user code begin tim2_irqn 1 */ /* user code end tim2_irqn 1 */}
说明:在往工程中添加代码时要注意,不要任意往里面添加代码,要在注释着user code begin的地方添加代码,这样在重新生成代码时才不至于将已经写好的代码覆盖掉,如下
/* user code begin includes */

原文标题:stm32-cubemx-实现can通讯
文章出处:【微信公众号:stm32嵌入式开发】欢迎添加关注!文章转载请注明出处。

买新笔记本电脑需要注意的几个方面?小白必看攻略
基于构建加密资产交易应用生态的区块链项目Loctite Assets介绍
向绿而行!涂鸦智能亮相香港秋电展,以IoT技术引领低碳生活趋势
模拟集成电路设计的九个层次
各式触摸屏大比拼
教程:如何用STM32-CubeMX-实现CAN通讯
压电传声器的工作原理
pcb布局和组装如何带来电动汽车充电站的新趋势
Vicor全新DC-DC电源转换模块,增加电动自行车续航
分享一个MOS管驱动电路
联通4G信号差,这样操作让信号增强数倍!
首度公开!杭州电机设计研讨会议程先知晓
超高频rfid技术可让管道巡检追溯变得更加智能化
led灯关掉开关后还微亮怎么解决 LED灯常见的失效原因
区块链技术将会影响哪些行业
蓝牙耳机的选购指南:介绍五款非常不错的蓝牙耳机
如何预测加密资产基金的收益
MTK天玑1000 5G SoC芯片力登上安兔兔跑分榜上的榜首
行业 | 一辆自动驾驶车搭载IC半导体成本有多少?
高通瞄准5G射频前端芯片