STM32的can总线实验心得要点
stm32实训报告经验总结

stm32实训报告经验总结STM32实训报告经验总结一、引言在这次STM32实训中,我深入了解了微控制器的基本原理和操作,学会了使用Keil MDK-ARM软件进行编程,掌握了STM32的GPIO、串口、定时器等基本外设的使用。
通过实际操作,我对于嵌入式系统设计和开发有了更深刻的理解。
二、实训过程1. 基础知识学习:首先,我通过阅读教材和网上资料,学习了微控制器的基本概念、STM32的体系结构和外设特性。
我了解到,STM32是一款功能强大的32位ARM Cortex-M核微控制器,具有丰富的外设接口和强大的处理能力。
2. 开发环境搭建:我按照教程安装了Keil MDK-ARM软件,配置了开发环境。
Keil软件提供了完整的开发工具链,包括代码编辑、编译链接、调试和仿真等功能。
3. 硬件平台搭建:我使用STM32开发板搭建了硬件平台。
我熟悉了开发板的电路原理图和引脚配置,了解了各个外设接口的使用方法。
4. 编程实践:在理解了基本概念和操作方法后,我开始进行编程实践。
我编写了GPIO输入输出、串口通信、定时器中断等程序,通过实际操作掌握了STM32的基本外设使用。
5. 调试与优化:在编程过程中,我遇到了许多问题,通过查阅资料和反复调试,最终解决了问题。
我还对程序进行了优化,提高了程序的效率和稳定性。
三、实训收获通过这次实训,我掌握了STM32微控制器的开发流程和基本外设的使用方法。
我学会了使用Keil MDK-ARM软件进行编程和调试,了解了嵌入式系统设计和开发的实际操作过程。
同时,我在实践中遇到了许多问题,通过解决问题,我提高了解决问题的能力。
四、展望未来这次实训让我对嵌入式系统设计和开发有了更深刻的理解。
在未来的学习和工作中,我将继续深入学习嵌入式系统的相关知识,掌握更多的技能和方法。
同时,我将尝试将所学知识应用到实际项目中,提高自己的实践能力和工程经验。
STM32学习笔记---CAN实验

STM32学习笔记---CAN实验继做了DAC实验后,继续进行第15个实验-CAN实验,本实验Can总线的环回测试,LED2亮----说明100k/S 的轮询方式收发正常。
LED3亮----说明500k/S 的中断方式收发正常。
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;__IO uint32_t CANFLAG = 0;volatile TestStatus TestRx;TestStatus CAN_Polling(void);TestStatus CAN_Interrupt(void);//can设置初始化void CAN_Config(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); }TestStatus CAN_Polling(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage;CanRxMsg RxMessage;uint32_t i = 0;uint8_t TransmitMailbox = 0;CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);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;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=5;CAN_Init(CAN1, &CAN_InitStructure);CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_I dMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32 bit;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);TxMessage.StdId=0x11;TxMessage.RTR=CAN_RTR_DATA;TxMessage.IDE=CAN_ID_STD;TxMessage.DLC=2;TxMessage.Data[0]=0xCA;TxMessage.Data[1]=0xFE;TransmitMailbox=CAN_Transmit(CAN1, &TxMessage);i = 0;while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)){i++;}i = 0;while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF)){i++;}RxMessage.StdId=0x00;RxMessage.IDE=CAN_ID_STD;RxMessage.DLC=0;RxMessage.Data[0]=0x00;RxMessage.Data[1]=0x00;CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);if (RxMessage.StdId!=0x11){return FAILED;}if (RxMessage.IDE!=CAN_ID_STD){return FAILED;}if (RxMessage.DLC!=2){return FAILED;}if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) {return FAILED;}return PASSED;}TestStatus CAN_Interrupt(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;CanTxMsg TxMessage;uint32_t i = 0;CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);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;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;CAN_InitStructure.CAN_Prescaler=1;CAN_Init(CAN1, &CAN_InitStructure);CAN_FilterInitStructure.CAN_FilterNumber=1;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_I dMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32 bit;CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIF O0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);TxMessage.StdId=0x00;TxMessage.ExtId=0x1234;TxMessage.IDE=CAN_ID_EXT;TxMessage.RTR=CAN_RTR_DATA;TxMessage.DLC=2;TxMessage.Data[0]=0xDE;TxMessage.Data[1]=0xCA;CAN_Transmit(CAN1, &TxMessage);CANFLAG = 0xFF;i=0;while((CANFLAG == 0xFF) && (i < 0xFFF)){i++;}if (i == 0xFFF){CANFLAG=0;}CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE); return (TestStatus)CANFLAG;}//测试CANvoid TEST_CAN(void){TestRx = CAN_Polling();if (TestRx == FAILED){GPIO_SetBits(GPIOB, GPIO_Pin_5);}else{GPIO_SetBits(GPIOD, GPIO_Pin_6);}TestRx = CAN_Interrupt();if (TestRx == FAILED){GPIO_SetBits(GPIOB, GPIO_Pin_5);}else{GPIO_SetBits(GPIOD, GPIO_Pin_3);}**************NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);************************void USB_LP_CAN1_RX0_IRQHandler(void){CanRxMsg RxMessage;RxMessage.StdId=0x00;RxMessage.ExtId=0x00;RxMessage.IDE=0;RxMessage.DLC=0;RxMessage.FMI=0;RxMessage.Data[0]=0x00;RxMessage.Data[1]=0x00;CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT)&& (RxMessage.DLC==2) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA)) {CANFLAG = 1;}else{CANFLAG = 0;}}以下为液晶显示结果。
can总线波形检测实验心得

can总线波形检测实验心得最近,我参加了一次CAN总线波形检测实验,实验的主要目的是了解CAN总线的基本原理和波形特征,并通过实验掌握如何检测CAN总线的波形。
在实验中,我学到了很多有关CAN总线的知识和技能,下面是我的一些心得体会。
首先,我深刻理解了CAN总线是一种高速、可靠的数据传输协议,它可以在多个设备之间进行数据通信。
CAN总线架构中包括控制器(CAN Controller)、收发器(CAN Transceiver)和节点(CAN Node)等组成部分。
控制器是主要的数据处理单元,用于控制数据的收发和处理;收发器负责将控制器的数字信号转换为模拟信号,以及将模拟信号转换为数字信号;节点则是CAN总线上的一个设备,每个节点都有一个唯一的标识符,用于识别发送和接收的数据。
其次,我学会了如何检测CAN总线的波形。
在实验中,我们使用了示波器(Oscilloscope)来检测CAN总线的波形。
示波器是一种用于显示电信号波形的仪器,它可以显示CAN总线上的数字信号波形,并帮助我们分析和判断波形是否正常。
在检测波形时,我们需要注意以下几个方面:1. CAN总线上的波形应该是一个方波,即上升沿和下降沿应该垂直,且幅值应该保持稳定;2. CAN总线上的波形的周期应该保持一致,如果出现周期不一致的情况,可能需要检查CAN总线上的设备是否正常;3. CAN总线上的波形的幅值应该在规定范围内,如果幅值过高或过低,可能会影响数据传输的质量。
最后,我认为这次实验对我来说非常有意义。
通过这次实验,我不仅学习了CAN总线的基本原理和波形特征,还了解了如何使用示波器检测CAN总线的波形。
这对我以后的学习和工作都有很大的帮助。
我相信,在将来的工作中,我会继续努力,不断提高自己的技能和知识水平。
can总线实验报告

can总线实验报告
《CAN总线实验报告》
一、实验目的
本实验旨在通过对CAN总线的实验研究,掌握CAN总线的基本原理、工作方式和应用领域,提高学生对CAN总线技术的理解和应用能力。
二、实验内容
1. CAN总线基本原理的学习和理解
2. CAN总线的工作方式和通信协议的研究
3. CAN总线在汽车电子控制系统中的应用实例分析
4. CAN总线通信协议的实验验证
三、实验步骤
1. 通过文献资料和教材学习CAN总线的基本原理和工作方式
2. 使用CAN总线开发板进行实验,验证CAN总线的通信协议
3. 分析汽车电子控制系统中CAN总线的应用实例
4. 结合实际案例,对CAN总线通信协议进行实验验证
四、实验结果
通过本次实验,我们深入了解了CAN总线的基本原理和工作方式,掌握了CAN总线通信协议的实验验证方法,并对CAN总线在汽车电子控制系统中的应用有了更深入的了解。
实验结果表明,CAN总线作为一种高可靠性、高性能的通信协议,在汽车电子控制系统中具有广泛的应用前景。
五、实验结论
通过本次实验,我们对CAN总线的基本原理、工作方式和应用领域有了更深入
的了解,提高了对CAN总线技术的理解和应用能力。
同时,我们也认识到了CAN总线在汽车电子控制系统中的重要作用,为今后的学习和研究打下了坚实的基础。
综上所述,本次实验取得了良好的实验效果,为我们进一步深入研究CAN总线技术奠定了坚实的基础。
希望通过今后的学习和实践,能够更好地应用CAN总线技术,为汽车电子控制系统的发展做出更大的贡献。
STM32 CAN模块笔记

STM32 CAN模块笔记
1、CAN总线必须加一个终端电阻。
2、CAN_init()函数有如下功能:一、从睡眠模式退出--等待--查询是否退出,退出。
二、进入初始化模式--等待--查询是否进入,进入。
三、配置各寄存器。
四、从初始化模式退出--等待--查询是否退出,退出。
五、进入正常模式--等待--查询是否进入,进入。
退出CAN_init.
3、根据CAN通信协议,发送错误计数器TEC 和接收错误计数器REC,在发送和接收错误后会增加,在发送和接收正确后会减少至0.
4、在初始化寄存器时,需注意自动离线恢复和自动传送使能这两个功能。
5、设置自动传送功能时要注意歧义,失能(表示发送失败后继续发送),使能(表示只发送一次,不管发送结果如何)。
6、试验CAN通信,必须两个节点,如果只有一个节点,根据CAN协议,ACK没回应,发送端会显示发送失败,如果是两个节点,接收端在收到正确数据后会自动让ACK为显性,告诉发送端发送成功。
7、在发送固件库函数里,程序会自动找空邮箱,0-1-2轮询查找,如果没有空邮箱了,程序会返回“4”,表示已无空邮箱使用。
8、。
STM32的can总线实验心得

STM32的can总线实验心得(一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介首先通读手册中关于CAN的文档,必须精读。
STM32F10xxx 参考手册Rev7V3.pdf/bbs/redirect.php?tid=255&goto=lastpost#lastpos t需要精读的部分为 RCC 和 CAN 两个章节。
为什么需要精读 RCC 呢?因为我们将学习 CAN 的波特率的设置,将要使用到RCC 部分的设置,因此推荐大家先复习下这部分中的几个时钟。
关于 STM32 的 can 总线简单介绍bxCAN 是基本扩展 CAN (Basic Extended CAN) 的缩写,它支持 CAN 协议 2.0A 和 2.0B 。
它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。
它也支持报文发送的优先级要求(优先级特性可软件配置)。
对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。
主要特点· 支持 CAN 协议 2.0A 和 2.0B 主动模式· 波特率最高可达 1 兆位 / 秒· 支持时间触发通信功能发送· 3 个发送邮箱· 发送报文的优先级特性可软件配置· 记录发送 SOF 时刻的时间戳接收· 3 级深度的2个接收 FIFO· 14 个位宽可变的过滤器组-由整个 CAN 共享· 标识符列表· FIFO 溢出处理方式可配置· 记录接收 SOF 时刻的时间戳可支持时间触发通信模式· 禁止自动重传模式· 16 位自由运行定时器· 定时器分辨率可配置· 可在最后 2 个数据字节发送时间戳管理· 中断可屏蔽· 邮箱占用单独 1 块地址空间,便于提高软件效率(二) STM32 CAN 模块工作模式STM32 的 can 的工作模式分为:/* CAN operating mode */#define CAN_Mode_Normal ((u8)0x00) /* normal mode */#define CAN_Mode_LoopBack ((u8)0x01) /* loopback mode */#define CAN_Mode_Silent ((u8)0x02) /* silent mode */#define CAN_Mode_Silent_LoopBack ((u8)0x03) /* loopback combined with silent mode */在此章我们的 Mini-STM32 教程中我们将使用到CAN_Mode_LoopBack和CAN_Mode_Normal两种模式。
STM32_CAN_Bus调试心得

睡眠模式(低功耗)
*软件通过对CAN_MCR 寄存器的SLEEP位置 1,来请求进入这一模式。在该 模式下,bxCAN 的时钟停止了,但软件仍然可以访问邮箱寄存器。 *当bxCAN 处于睡眠模式,软件想通过对CAN_MCR 寄存器的INRQ位置 1, 来进入初始化式, 那么软件必须同时对SLEEP位清 0才行 *有2种方式可以唤醒(退出睡眠模式)bxCAN :通过软件对SLEEP位清0,
第 4 页 共 11 页
GZHU
Electronic Association
或硬件检测 CAN 总线的活动。 工作流程 那么究竟can是怎样发送报文的呢? 发送报文的流程为: 应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据; 然后对CAN_TIxR 寄存器的 TXRQ位置 1,来请求发送。TXRQ位置 1后,邮箱 就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权 限。 TXRQ位置 1后, 邮箱马上进入挂号状态, 并等待成为最高优先级的邮箱, 参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送 状态。 一旦 CAN总线进入空闲状态, 预定发送邮箱中的报文就马上被发送 (进 入发送状态)。一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件 相应地对CAN_TSR 寄存器的RQCP和 TXOK位置1,来表明一次成功发送。 如果发送失败,由于仲裁引起的就对CAN_TSR 寄存器的ALST位置1,由于 发送错误引起的 就对 TERR位置 1。 原来发送的优先级可以由标识符和发送请求次序决定: 由标识符决定 当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根 据CAN 协议,标 识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号 小的报文先被发 送。 由发送请求次序决定 通过对CAN_MCR 寄存器的TXFP位置 1,可以把发送邮箱配置为发送 FIFO 。 在该模式下,发送的优先级由发送请求次序决定。 该模式对分段发送很有用。 时间触发通信模式 在该模式下,CAN 硬件的内部定时器被激活,并且被用于产生时间戳,分别 存储在 CAN_RDTxR/CAN_TDTxR 寄存器中。内部定时器在接收和发送的帧起始位 的采样点位置被采样,并生成时间戳(标有时间的数据)。 接着又是怎样接收报文的呢? 接收管理 接收到的报文,被存储在 3级邮箱深度的FIFO 中。 FIFO 完全由硬件来管理, 从而节省了 CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取 FIFO 输出邮箱,来读取 FIFO中最先收到的报文。 有效报文 根据 CAN协议,当报文被正确接收(直到 EOF域的最后 1位都没有错误), 且通过了标识符 过滤,那么该报文被认为是有效报文。
stm32心得

stm32心得STM32是一款广泛应用于嵌入式系统开发的微控制器系列,由意法半导体(STMicroelectronics)公司推出。
作为一名嵌入式系统开发者,我在使用STM32的过程中积累了一些心得体会。
STM32具有强大的性能和丰富的外设资源,能够满足各种不同应用场景的需求。
其处理器核心采用ARM Cortex-M系列,性能强劲且低功耗,能够高效地运行复杂的算法和任务。
此外,STM32系列芯片还配备了丰富的外设,如通用串行总线(USART)、通用串行接口(SPI)、通用并行接口(GPIO)等,方便开发者进行各种外设的连接和控制。
这些外设的丰富性使得STM32在各种应用领域都有着广泛的应用。
STM32具有灵活的软件开发环境,便于开发者进行程序编写和调试。
ST公司提供了一套完整的开发工具链,包括集成开发环境(IDE)、编译器、调试器等,使得开发者可以方便地进行代码编写、编译和调试。
同时,ST公司还提供了丰富的软件库和示例代码,开发者可以借助这些资源快速上手,降低开发难度和时间成本。
STM32系列具有良好的可扩展性和兼容性。
ST公司推出了多个型号和系列的STM32芯片,覆盖了不同性能和功能需求的应用场景。
开发者可以根据具体需求选择适合的芯片型号,从而灵活地进行系统设计。
此外,STM32系列还具有良好的软件和硬件兼容性,开发者可以方便地迁移和复用代码,提高开发效率和代码质量。
在实际的项目开发中,我深刻体会到了STM32的优势和便利性。
例如,我曾经开发过一个智能家居系统,利用STM32控制各种家电设备的开关和状态监测。
借助STM32丰富的外设资源,我可以轻松地实现各种设备的连接和控制,而且性能稳定可靠。
同时,STM32的软件开发环境也大大提高了我的开发效率,我可以快速编写和调试代码,快速迭代和优化系统功能。
总结起来,STM32是一款强大而灵活的微控制器系列,具有丰富的外设资源、灵活的软件开发环境和良好的可扩展性和兼容性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32的can总线实验心得(一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介首先通读手册中关于CAN的文档,必须精读。
STM32F10xxx 参考手册Rev7V3.pdf/bbs/redirect.php?tid=255&goto=lastpost#lastpos t需要精读的部分为 RCC 和 CAN 两个章节。
为什么需要精读 RCC 呢?因为我们将学习 CAN 的波特率的设置,将要使用到RCC 部分的设置,因此推荐大家先复习下这部分中的几个时钟。
关于 STM32 的 can 总线简单介绍bxCAN 是基本扩展 CAN (Basic Extended CAN) 的缩写,它支持 CAN 协议 2.0A 和 2.0B 。
它的设计目标是,以最小的 CPU 负荷来高效处理大量收到的报文。
它也支持报文发送的优先级要求(优先级特性可软件配置)。
对于安全紧要的应用,bxCAN 提供所有支持时间触发通信模式所需的硬件功能。
主要特点· 支持 CAN 协议 2.0A 和 2.0B 主动模式· 波特率最高可达 1 兆位 / 秒· 支持时间触发通信功能发送· 3 个发送邮箱· 发送报文的优先级特性可软件配置· 记录发送 SOF 时刻的时间戳接收· 3 级深度的2个接收 FIFO· 14 个位宽可变的过滤器组-由整个 CAN 共享· 标识符列表· FIFO 溢出处理方式可配置· 记录接收 SOF 时刻的时间戳可支持时间触发通信模式· 禁止自动重传模式· 16 位自由运行定时器· 定时器分辨率可配置· 可在最后 2 个数据字节发送时间戳管理· 中断可屏蔽· 邮箱占用单独 1 块地址空间,便于提高软件效率(二) STM32 CAN 模块工作模式STM32 的 can 的工作模式分为:/* CAN operating mode */#define CAN_Mode_Normal ((u8)0x00) /* normal mode */#define CAN_Mode_LoopBack ((u8)0x01) /* loopback mode */#define CAN_Mode_Silent ((u8)0x02) /* silent mode */#define CAN_Mode_Silent_LoopBack ((u8)0x03) /* loopback combined with silent mode */在此章我们的 Mini-STM32 教程中我们将使用到CAN_Mode_LoopBack和CAN_Mode_Normal两种模式。
我们第一步做的就是使用运行在 CAN_Mode_LoopBack 下进行自测试。
在参考手册中 CAN_Mode_LoopBack (环回模式) 的定义如下:环回模式可用于自测试。
为了避免外部的影响,在环回模式下 CAN 内核忽略确认错误 (在数据 / 远程帧的确认位时刻,不检测是否有显性位) 。
在环回模式下,bxCAN 在内部把 Tx 输出回馈到 Rx 输入上,而完全忽略 CANRX 引脚的实际状态。
发送的报文可以在 CANTX 引脚上检测到。
因此这种模式也特别适合大家做好硬件后自测程序。
下载(37.38 KB)2009-8-16 11:46(三) CAN 接口端口映射STM32 中的 CAN 物理引脚脚位可以设置成三种:默认模式,重定义地址1模式,重定义地址2模式。
下载(28.94 KB)2009-8-16 11:51在我们的 Mini-STM32 上面没有接出 CAN 的接口芯片, 所以我们可以利用RealView MDK的 CAN 软件模拟模块来做实验.-------------------------------------------------------------------------默认模式/* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);------------------------------------------------------------------------重定义地址1模式/* Configure CAN pin: RX *///GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure CAN pin: TX *///GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Init(GPIOB, &GPIO_InitStructure);/* Configure CAN Remap 重影射 *///GPIO_PinRemapConfig(GPIO_Remap1_CAN, ENABLE);-------------------------------------------------------------------------重定义地址2模式/* Configure CAN pin: RX *///GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Init(GPIOD, &GPIO_InitStructure);/* Configure CAN pin: TX *///GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Init(GPIOD, &GPIO_InitStructure);/* Configure CAN Remap 重影射 *///GPIO_PinRemapConfig(GPIO_Remap2_CAN, ENABLE);-------------------------------------------------------------------------设置完 CAN 的引脚之后还需要打开 CAN 的时钟:/* CAN Periph clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);(四) CAN 波特率设置4、我们需要搞明白CAN波特率的设置,这个章节也是使用CAN的最重要的部分之一,因为这实际应用中我们需要根据我们实际的场合来选择 CAN 的波特率。
一般情况下面1M bps 的速率下可以最高可靠传输 40 米以内的距离。
在 50K 以下的波特率中一般可以可靠传输数公里远。
对于波特率的设置需要详细学习参考手册对应部分的解释。
我们在调试软件的时候可以使用示波器来测试 CANTX 引脚上的波形的波特率,这样可以得到事半功倍的效果,大大的缩短调试学习的时间。
// ***************************************************************// BaudRate = 1 / NominalBitTime// NominalBitTime = 1tq + tBS1 + tBS2// tq = (BRP[9:0] + 1) x tPCLK// tPCLK = CAN's clock = APB1's clock// ****************************************************************也就是BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)这里注意的是采用点的位置,也就时BS1,BS2的设置问题,这里我也找了一些资料,抄录下来给大家,是 CANopen 协议中推荐的设置。
1Mbps 速率下,采用点的位置在6tq位置处,BS1=5, BS2=2500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同。
因此我们需要重视的有软件中的这么几个部分:// 设置 AHB 时钟(HCLK)// RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟RCC_HCLKConfig(RCC_SYSCLK_Div8);// 设置低速 AHB 时钟(PCLK1)// RCC_HCLK_Div2 APB1 时钟 = HCLK / 2RCC_PCLK1Config(RCC_HCLK_Div2);// PLLCLK = 8MHz * 8 = 64 MHz// 设置 PLL 时钟源及倍频系数RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_8);CAN 波特率设置中需要的就是PCLK1 的时钟。