历史上的今天
返回首页

历史上的今天

今天是:2025年06月23日(星期一)

正在发生

2021年06月23日 | STM32F2系列驱动开发——CAN总线

2021-06-23 来源:eefocus

一、概述


由于项目需要在机车6A系统上运行,故在产品开发时需要用到STM32 bxCAN外设,总体来说STM32的CAN总线应用起来不是很复杂,仔细看资料很容易上手,并且有官方参考例程。


二、底层配置详解


2.1 GPIO初始化


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);


GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_CAN1);


GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_CAN1);


GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8 | GPIO_Pin_9;


GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;


GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;


GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;


GPIO_Init(GPIOB, &GPIO_InitStructure);



2.2 CAN单元初始化


RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);




CAN_InitStructure.CAN_TTCM = DISABLE;//禁止时间触发通信模式


CAN_InitStructure.CAN_ABOM = DISABLE;//禁止自动离线


CAN_InitStructure.CAN_AWUM = DISABLE;//禁止自动唤醒模式


CAN_InitStructure.CAN_NART = DISABLE;//禁止自动重传


CAN_InitStructure.CAN_RFLM = DISABLE;//接收FIFO锁定



CAN_InitStructure.CAN_TXFP = DISABLE;


CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;


CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;



2.3 CAN通信波特率设置



CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;


CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;


CAN_InitStructure.CAN_Prescaler = 2;


CAN_Init(CAN1, &CAN_InitStructure);



2.4 CAN通信滤波器设置



CAN_FilterInitStructure.CAN_FilterNumber = 0;


CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;


CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;


CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;


CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;


CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;


CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;


CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;


CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;


CAN_FilterInit(&CAN_FilterInitStructure);


NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;


NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;


NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;


NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


NVIC_Init(&NVIC_InitStructure);



2.5 使能FIFO0信息挂起中断


CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);


三、CAN模块接收中断函数


描述:每次接收8个字节,可以为标准帧或扩展帧。


CanRxMsg RxMessage;



void CAN1_RX0_IRQHandler(void)


{


uint8_t i;


CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);




for(i=0;i


{


CAN_RxBuffer[i] = RxMessage.Data[i];


}


}



四、CAN发送函数


描述:1、每次发送8个字节。


2、变量tmpID为用户设置的扩展帧ID号。


CanTxMsg TxMessage;



void CAN_TransmitZDJCMessage(uint32_t tmpID)


{


uint8_t TransmitMailbox = 0;


TxMessage.StdId = tmpID>>18;


TxMessage.ExtId = tmpID&0x0003FFFF;


TxMessage.RTR = CAN_RTR_DATA;


TxMessage.IDE = CAN_ID_EXT;


TxMessage.DLC = 8;


TxMessage.Data[0]=1;


TxMessage.Data[1]=2


TxMessage.Data[2]=3;


TxMessage.Data[3]=4;


TxMessage.Data[4]=5;


TxMessage.Data[5]=6;


TxMessage.Data[6]=7;


TxMessage.Data[7]=8;


TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);


while(CAN_TransmitStatus(CAN1,TransmitMailbox)!=1);


}



五、总结


本博文给出的CAN通信实例是经过修改后的程序,并非本人在项目中所使用的,当然项目中使用的程序比本博文写出的代码要复杂的多,并且做了通信超时措施。但本人可以保证本博文给出的历程是完全可以正常通信的,读者朋友可以根据自己的需求进行修改,如有问题可以留言。


推荐阅读

史海拾趣

Anachip公司的发展小趣事

随着电子行业的竞争日益激烈,Anachip公司意识到单凭自己的力量难以应对市场的快速变化。于是,公司开始积极寻求与其他企业的合作。通过与多家知名电子企业建立战略合作关系,Anachip成功将自己的芯片技术应用于更多领域,进一步扩大了市场份额。同时,这种合作模式也促进了整个电子行业的共同发展。

Dean Technology公司的发展小趣事

近年来,随着电子行业的快速发展和市场竞争的加剧,Dean Technology公司也面临着前所未有的挑战。为了应对这些挑战,公司积极调整战略方向,加强内部管理和团队建设。同时,他们还密切关注行业趋势和市场需求的变化,及时调整产品结构和市场策略。这些努力使得Dean Technology在应对行业变革和挑战时更加从容和自信。

请注意,以上故事是基于对Dean Technology公司一般情况的了解而编写的,可能不完全符合公司的实际发展历程。如需更详细的信息,请查阅相关资料或联系公司官方渠道。

科山芯创(COSINE)公司的发展小趣事

面对未来,科山芯创有着清晰的规划和展望。他们将继续加大研发投入,不断推出更多高性能、高品质的芯片产品;同时,他们还将积极拓展国际市场,提升品牌影响力;此外,科山芯创还将加强与产业链上下游企业的合作,共同推动电子行业的创新与发展。

以上五个故事概述了科山芯创在电子行业中的发展历程和成就。作为一家专注于高性能、高品质射频及模拟集成电路芯片研发与设计的创新型企业,科山芯创以其强大的技术实力和优质的服务赢得了市场的认可和尊重。

Excelsys公司的发展小趣事

随着全球对环保意识的日益增强,Excelsys公司积极响应绿色环保的号召,将环保理念融入到产品设计和生产过程中。公司采用环保材料、优化生产工艺、提高能源利用效率等措施,减少了对环境的影响。同时,公司还积极参与环保公益活动,为行业的绿色发展贡献力量。

ENPIRION公司的发展小趣事

在电源管理领域,ENPIRION公司不断面临各种技术挑战。例如,如何满足企业级、工业级、通信等市场对产品的高可靠性要求?如何提供最优的电源转换率以降低成本和散热?为了应对这些挑战,ENPIRION公司不断投入研发力量,推出了一系列创新的电源管理解决方案。这些解决方案不仅满足了市场的需求,还进一步巩固了ENPIRION公司在电源管理领域的领先地位。

Gigabit Logic Inc公司的发展小趣事
通过控制脉冲信号的频率或占空比,可以实现更精细的调速范围。

问答坊 | AI 解惑

外中断串口发送数据问题

大家好!我是单片机的初学者,现在遇到一个问题无法解决,希望能得到大家的帮忙,谢谢! 如题: 1、我做了一个边沿触发方式的外部中断0,当按键按下不放时按要求串口发送数据. 2、在P2.3口做了个独立式按键S1,当按下时向串口发送相关字符,松开按键时 ...…

查看全部问答>

[推荐][开发工具] Windows CE / ARM 系统开发利器 - Xarm

                                                   Windows C ...…

查看全部问答>

打算在wince 5.0上运行s3c2410的4.2版本的BSP包,大家觉得应该怎么做

有一套板子,以及相应的程序,在wince 4.2的系统上运行的好好的,现在老板让在5.0上运行,大家给点建议。 我在网上搜了一下,有专家说有两种方式:一是修改4.2的BSP包,使之能在5.0上运行;二是修改5.0系统自带的BSP 包,使之能配合S3C2410的CPU运 ...…

查看全部问答>

真诚的求助高手们!!!!!!

我想让电池电量显示在桌面上,就和手机屏幕上显示的电池电量一样. 我知道用下面这个API函数,但是他返加的是BOOL, SYSTEM_POWER_STATUS_EX sysPowStatus; GetSystemPowerStatusEx(&sysPowStatus,true) 怎么才能做到让他显示在对话框上 ...…

查看全部问答>

请教STM32互联型USART1、CAN1

请教: STM32互联型USART1的默认复用引脚为PA8、PA9、PA10、PA11、PA12。当使用USART1功能时,若只用到TX(PA9)、RX(PA10)两脚,那么其余三脚只能浪费么?此时能否同时令PA11、PA12作为CAN1的功能脚使用呢? 谢谢各位高手指教!…

查看全部问答>

TIMERA0

请教大家一个问题,我想用timer_a 的ccr0做一个定时中断,还想timer_a 的ccr1做一个1赫兹的脉冲方波,可就是不行,求教大家 #include "stdint.h" #include <msp430x42x0.h> unsigned int wDelay = 0; // Timer_A3 Interrup ...…

查看全部问答>

模拟类芯片大家现在都选哪家的啊?

本帖最后由 dontium 于 2015-1-23 13:32 编辑 模拟类芯片大家现在都选哪家的啊?性价比 …

查看全部问答>

求助,P0口的输出和程序所写完全不同是为什么

没有对P0进行任何操作就变成了0xFDprotues中P0没有按我设定的变成0xC0 变成了0x03想问下 这是为什么   求助啊 这是交通灯的程序 有主干道和乡村通道两条代码在附件里 …

查看全部问答>

Q:编译出错

,不明白这是什么原因。工程所在文件夹:…

查看全部问答>

LaunchPad仿真的原理求助?

从照片看LaunchPad的Emulation部分好像还有一个430?怎么实现仿真的?请教大牛仿真的具体原理是什么?多谢…

查看全部问答>