STM32的can总线实验心得
- 格式:doc
- 大小:371.50 KB
- 文档页数:14
STM32上CAN_OPEN总线移植本文的由来:公司开发的几个产品上都要用到CAN_OPEN总线。
它们适应于DS406标准。
现在公司从来没有人做过有关这方面的事情,而本人也未接触过,但是对下列协议比较了解且已用到产品上:1 以太网及TCP/IP栈。
2 USB2.0 3.03. SSI4. modbus/TCP modbus/RTU所以想用一段时间把这个产品加上can_open总线。
开发过程及调研:为了进行这个开发,购买了下列书籍:现场总线CANOPEN设计与应用,是CiA主席写的。
项目驱动--canopen现场总线基础教程这个是周立功等编的。
这两本书,我基本上大部分是在机场等待时阅读完的,正好哪段时间出去比较多。
另外在网上下载了下列代码:Atmel公司网站上有关canopen参考资料源代码。
Microchip公司网站上的有关芯片资料和源代码C iA网站上的DS301和DS406部分ELGO公司产品样本(他们的产品支持CANOPEN)另外在百度文库中搜索了一些有关的资料,其中最有用的是虹科的CANOPEN协议介绍。
本人非常感谢虹科的这篇文档,因为它使我少花了很多时间去看哪些冗长的标准。
后来发现CANOPN最基础的部分基本上这篇文档都讲到了,而且它的篇幅是如此之短能容纳我最需要的部分,正是因为这么多的网友的无私奉献,我才能把这个协议栈写出来,所以我非常愿意将本文给大家分享。
因为本人文笔有限,不当之处还请谅解。
开发难度:目前国内真正将这个CANOPEN整明白的人还不是很多,少数几个可能在某些公司,有价值的东西基本上也没有发表,这对于推广这个总线很不利,比如我们有好些网友希望将CANOPEN用到STM32的M3单片机上,就碰到了很大的难度。
CANOPEN还是比较复杂的,但是如果我们只开发传感器部分就比较简单了。
传感器部分不一定支持所有的这些命令和协议,有时只需最低的就可以。
比如测量电压的传感器,它只有一个测量量,它就比较简单了。
stm实训报告的心得体会一、实训内容简介本次STM实训是由某大型科技公司主办,主要内容是围绕单片机应用开发展开,包括STM32单片机应用基础知识、STM32开发环境搭建、STM32工具使用以及STM32应用开发等。
实训期间,我们学生们进行了许多实际操作,例如LED点亮、按键控制、数码管显示、串口通讯等,并且我们还经历了一次小型的项目开发。
二、实训体会1. 培养了自己的动手能力对于我们这些计算机专业的学生来说,平时的大部分任务都是在电脑上完成的。
在这次实训中,我们首先感悟到了动手能力的重要。
很多操作都需要实际调试,如果仅仅凭借理论掌握知识点,那么很难真正掌握STM32单片机应用开发的技能。
2. 学会了自我解决问题的能力很多时候,我们在进行实际操作时,会遇到各种各样的问题,例如程序无法编译通过、程序运行出现异常等。
这些问题又不一定能在课本上找到答案。
因此,在解决这些问题时,我们必须学会独立思考、自我解决问题。
这样不仅让我们的STM32开发技能更加熟练,在以后的学习和工作中也能更好地解决问题。
3. 感受团队协作的重要性在项目开发中,我们需要合理地规划、分配每位小组成员的工作。
这样才能达到最终的项目目标。
因此,我们学会了团队协作,学会了如何在小组内分工合作、相互配合,从而使整个项目进展更为顺利。
三、总结在STM实训中,我们不仅仅是学习了STM32应用开发的知识,更重要的是培养了自己的动手能力、自我解决问题的能力以及团队协作能力。
这些能力对我们以后的学习和工作都有着重要的帮助作用。
因此,在学习中,我们不仅仅要注重理论的学习,更要注重实践的训练,这样才能使我们真正掌握知识,更好地应用于实际生活中。
与本程序代码相关部分的原理图及PCB,基于STM32F103VET6,已在项目中应用。 开头篇:STM32的CAN波特率计算 STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用。 bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少。 我们先看看下图,看看APB1总线时钟:
APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图: 有了上边的这个图,基本就清楚了: 总线时钟MHz (3+TS1+TS2)*(BRP+1) ====================================================================== 下面是我的计算: CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; 注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; CAN_InitStructure.CAN_Prescaler = 4;//2 nominal bit time(3+5+1)tq=9tq 关于分频系数,查看 system_stm32f10x.c下面的static void SetSysClockTo72(void) 函数: /* HCLK = SYSCLK */ /* PCLK2 = HCLK */ /* PCLK1 = HCLK/2 */ 所以can时钟 72MHZ/2/4=9 Mhz,tq=1/36Mhz 波特率为 1/nominal bit time= 9/9=1MHZ ===================================================================== void CAN_Configuration(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN register init */ CAN_DeInit(); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ 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_Normal; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_9tq; CAN_InitStructure.CAN_BS2=CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler=200; CAN_Init(&CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit; 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); } 注意//#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ 波特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10Kbps 正文篇:程序代码
STM32之CAN---TTCAN模式浅析1 前言传统CAN 采用事件触发消息传输机制,CSMA/ CD+ AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 载波侦听、多路访问、冲突检测、优先级仲裁) 介质访问控制机制, 即多个消息同时发送时, 按照消息标识符的优先级顺序, 低优先级消息自动退出, 高优先级消息继续发送。
这种介质访问方式提高了网络的利用率和高优先级消息的实时性, 但在重负载CAN 中, 低优先级消息经常由于总线冲突而被迫退出发送, 导致低优先级消息传输时延长, 且传输时延不可预测, 因此, CAN 不适合实时性和可靠性要求特别高或有安全性要求的场合, 如汽车电子钟的X-by-w ir e( 线控技术) 。
为此国外有专家自2000 年起研究时间触发机制的CAN --TT CAN。
2004 年国际标准化组织将TT CAN 制定为ISO 11898-4国际标准。
2 什么是TTCAN?TT CA N 是CAN 的高层协议, 其数据链路层需要帧起始时刻信息。
T TCAN 在CAN 的物理层和数据链路层基础上, 通过调度表实现网路上节点的分时同步通信。
网路上各节点取得同步后, 消息只能根据调度表在规定的时间隙传输, 避免了消息传输的冲突、仲裁,消息传输时延短, 且可预知。
具体介绍请参考ISO11898-4。
3 STM32中的TTCAN实现3.1 开启TTCAN模式STM32是通过主控制寄存器(CAN_MCR)的TTCM位来控制TTCAN模式的使能开关的。
CAN_MCR寄存器如下所示:地址偏移量: 0x00复位值: 0x0001 0002如上,只需要将CAN_MCR寄存器的TTCM位置1则开启了TTCAN模式。
此时STM32的CAN模式以TTCAN模式进行通信。
STM32CAN发送接收的简单测试can接⼝相对是⼀种常⽤的串⾏接⼝,但是不像spi、i2c、uart等接⼝都有主从的关系,can可以任何⼀个节点主动发送数据,并且假如出现总线冲突会有硬件来处理。
can和rs485⼜有些类似,都是把ttl信号转换成了差分信号。
所以在stm32 使⽤can的时候会有⼀个can收发器。
STM32 CAN 发送的简单测试从电路上看起来也很简单,stm32也是通过can tx、rx两根线和收发器相连。
所以假如我们要测试can的发送,是不是只接can tx脚就可以了?我最开始也以为这样就可以,但是深究can的总线冲突检测原理就会发现这样⾏不通的。
因为can 在发送数据的时候也会同时接收发送的数据,通过把接收的数据和内部发送寄存器的数据做对⽐,是不是⼀致就知道总线有没有冲突。
所以在正常情况(这⾥意味着⾮正常情况下也可以)下can rx不接就到这发送出去的数据⽆法收到从⽽硬件⾃动判断为发送失败。
所以要保证发送数据成功,can tx脚和can rx脚要都接上,并且确保can收发器供电正常。
硬件上就这些主要注意点,接下来就主要是软件的配置了。
⼀般stm32 配置can有以下⼏⼤步骤:can的初始化(cubemx直接可以⽣成代码)can的启动can滤波器的设置(⽤来接收的,发送的时候可以不⽤配置它)can执⾏发送数据请求我们只测试can的发送,所以就只⽤关系1、2、4步骤就可以了。
第⼀步,配置stm32cubemxSTM32 CAN 发送的简单测试如上图所⽰,最关键主要配置如下三个参数,分频数我这⾥配置48,下⾯的time Quantum值就会⾃动计算出来。
因为can时钟是48mhz经过48分频后,⼀个单位时间就是1us=1000ns。
因为我想要100k波特率,然后填写下⾯的Time segment1(简称 Tbs1 )和Time segment2 (简称 Tbs2) 为5和4。
那么具体波特率该怎么计算还是要看看官⽅⼿册的描述:STM32 CAN 发送的简单测试根据如上描述,能决定波特率的也就是三个参数:分频值、Tbs1、Tbs2。
计算机工程应用技术本栏目责任编辑:梁书基于STM32的CAN 总线上下位机通信实验设计刘泰廷,李新建(河北大学,河北保定071000)摘要:随着技术的成熟和设备的完善,CAN 总线在数据的实时传输和自动控制中展现出良好的灵活性与可靠性。
笔者以STM32为主控芯片搭建硬件电路,利用软件对其进行初始化设置,上位机与电路的连接使用USB —CAN 转换器,并采用Visual C++的MFC 编写的CAN 调试界面实现数据的实时收发,使上下位机完成通信。
本实验对于CAN 总线的使用有一定的指导作用。
关键词:STM32;CAN 总线;MFC ;通信中图分类号:TP311文献标识码:A文章编号:1009-3044(2017)05-0199-02CAN 简称为控制器局域网络(Controller Area Network ),它是由研发和生产汽车电子产品著称的德国BOSCH 公司开发的,是国际上应用最广泛的现场总线之一,并最终成为国际标准(ISO11519)。
近年来,由于它的高可靠性和良好的错误检测能力受到人们的关注,CAN 总线协议逐渐成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,被广泛应用于汽车控制系统和环境温度恶劣、电磁辐射强的工业环境。
1实验系统结构组成利用CAN 总线可以将传统分布式控制系统的功能分散到不同的现场节点中,本实验只选用一个节点作为下位机的收发模块。
实验的系统框图如图1所示,系统主要分为三个部分:上位机(PC 机)、CAN 转换器、下位机(CAN 收发模块电路)。
一般调试员的PC 机(多为笔记本电脑)接入CAN 总线往往没有串行接口,为此我们采用USB—CAN 协议的转换器接入CAN 总线,实现数据之间的转发。
下位机是以STM32F103RCT6单片机作为主控芯片的CAN 收发电路,主要完成数据采集和处理的任务,并实现与CAN 总线的数据互传。
上位机利用MFC 编写的控制界面,对CAN 总线上收到的数据进行显示,同时也可以完成向CAN 总线发送数据的指令。
• 45•本文以低成本、高性能的硬件设计实现了一种生产线环境监测系统。
主要采用STM32F103VE 系列单片机作为控制器,CAN 收发器集成到STM32F103芯片上,网关节点和终端节点通过CAN 通信帧交换信息。
网关节点把采集到的传感器数据通过物联网网关上传至云平台,从而实现了对生产线环境的监测。
随着“中国制造2025”“工业4.0”的提出,制造业和工业迅速发展,生产车间也急速增加。
那么生产环境的安全就关系到生产的方方面面,基于这一前提,本文设计了一种基于STM32的CAN 总线生产线环境监测系统,从而为生产车间的环境安全保驾护航。
生产线环境监测系统主要用来监测车间温湿度、火焰等实时数据,通过本系统可以把温湿度、火焰传感器采集到的数据通过CAN 总线、485总线和物联网网关上传到PC 机上的云平台,管理人员可以在后台监测采集到的数据。
1 生产线环境监测系统总体结构本系统有下位机传感器采集终端节点、下位机网关节点和上位机云平台三大部分组成。
下位机传感器采集终端节点的作用是采集传感器数据;下位机网关节点的作用是搜集终端节点采集到的数据,并通过物联网网关把数据上传至上位机;上位机云平台主要的作用是显示终端节点采集到的传感器数据。
本设计所用到的通信网络用到的分别是CAN 总线、RS485总线,所以整个系统涉及到两部分网络,分别是:终端节点、网关节点组成的CAN 通信网和网关节点、物联网网关组成的RS485网络。
本系统用到了PC 机一台(作为上位机)、网关一个、集成CAN 的微控制器(STM32嵌入式开发板)3个、温湿度传感器1个、火焰传感器1个等硬件设备。
具体的生产线环境监测系统拓扑结构如图1所示。
图1 生产线环境检测系统拓扑图2 硬件设计2.1 最小系统电路综合考虑系统性能和成本要求,主控制器MCU 采用ARM 芯片STM32F103VET6。
该芯片是ST 公司推出的32位ARM 构架微处理器,采用Cortex-M4内核,其中包含2个RS485控制器外设、2个CAN 控制器外设、3个USART 同异步串行通信接口、2个UART 异步串行通信接口,可应用于高度集成与低功耗的嵌入式场合。
STM32学习心得笔记时钟篇在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。
另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。
RTC的时钟源通过RTCSEL[1:0]来选择。
STM32中有一个全速功能的USB 模块,其串行接口引擎需要一个频率为48MHz的时钟源。
该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL 必须使能,并且时钟频率配置为48MHz或72MHz。
另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。
系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。
系统时钟可选择为PLL 输出、HSI或者HSE。
系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。
其中AHB分频器输出的时钟送给5大模块使用:①、送给AHB 总线、内核、内存和DMA使用的HCLK时钟。
②、通过8分频后送给Cortex的系统定时器时钟。
③、直接送给Cortex的空闲运行时钟FCLK。
④、送给APB1分频器。
APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。
can总线波形检测实验心得本次实验是关于CAN总线波形检测的,通过实验的学习,我不仅掌握了CAN总线波形检测的理论知识,更重要的是在实践中加深了对CAN总线应用的认识。
CAN总线是一种多主机、高速、可靠、实时性强的数据通信总线,在现代汽车、工业控制等领域得到广泛应用。
选用CAN总线有很多好处,即可减少线缆数量,降低维护成本,增加可靠性,提高数据传输速度,提高系统实时性。
在本次实验中,我学习了使用示波器和通信分析仪来分析CAN总线波形。
首先,我们需要在CAN总线上定义并发送数据帧,然后使用示波器捕捉CAN总线上的信号,并通过观察CAN总线上的波形,分析数据传输的情况。
在实践中,我观察到了如下几个重点:一、观察CAN总线上的波形,要重点分辨CAN总线上的SOH和SOL 分别对应CAN总线上的高电平和低电平,从而判断数据帧是否正确地发送到总线上。
二、分析CAN总线波形时,要注意每个CAN信号线上电位的变化,尤其是在出现错误时,要通过观察特定的错误标识码,分析错误原因,及时进行排查和修复。
例如,出现了错误的电压水平,说明CAN总线出现了故障。
三、当数据帧未能正确地发送到CAN总线上时,要通过示波器分析波形,及时发现问题,并进行排查。
例如,可以根据诊断数据或制造商的建议,查看是否存在不当安装或信号强度较弱等问题,以及检查是否存在总线长度过长、噪声污染、松动的连接以及总线终端等问题,并及时进行修复和调整。
综上所述,本次实验不仅仅是对我们掌握CAN总线波形检测知识的考验,更是对我们掌握CAN总线应用知识的指导。
我们需要在实践中不断总结和积累经验,不断提高自己的技能和水平,以便更好的应用CAN总线技术,为实际工程应用提供更好的支持。
STM32使用心得简介STM32是意法半导体〔STMicroelectronics〕推出的一种系列32位单片机产品。
它的高性能、低功耗和丰富的外设使得它成为许多嵌入式系统的首选。
本文将分享一些我在使用STM32时的体验和心得。
开发环境搭建首先,我们需要搭建适合STM32的开发环境。
推荐使用Keil MDK 〔Microcontroller Development Kit〕作为开发工具。
Keil MDK提供了一套完整的工具链,包括编译器、调试器等,方便开发者进行软件开发和调试。
此外,还需要下载与目标MCU对应的STM32库文件,以便进行开发。
熟悉STM32的外设和功能在开始开发之前,我们需要了解目标MCU的外设和功能。
STM32系列控制器具有丰富的外设,如通用定时器、串行通信接口、模数转换器等。
熟悉这些外设的功能和使用方法对于实现所需功能非常重要。
可以通过查阅所使用的MCU的数据手册和参考手册来获得有关这些外设的详细信息。
灵巧运用中断效劳中断效劳是STM32中的一项重要特性。
在处理实时任务和响应外部事件时,使用中断可以提高系统的效率和性能。
当使用中断时,需要了解中断优先级、中断触发方式等相关概念。
正确的中断配置和使用可以确保系统的稳定性和可靠性。
良好的软件架构设计在开发过程中,良好的软件架构设计可以提高代码的可维护性和可扩展性。
推荐使用模块化的设计方法,将代码划分为多个功能模块,每个模块负责一个具体的功能。
使用面向对象的方法可以更好地封装和复用代码。
此外,合理的任务调度和时间管理也是一个良好的架构设计的重要方面。
调试技巧和工具的使用调试是软件开发过程中不可或缺的一局部。
在STM32开发中,有许多调试技巧和工具可以帮助我们快速定位和解决问题。
例如,使用串口调试输出、使用调试工具进行实时变量查看等。
熟练掌握这些调试技巧和工具可以大大提高开发效率。
注意功耗管理STM32单片机具有低功耗的优势,在很多应用场景下可以省电。
STM32的can总线实验心得 (一) 工业现场总线 CAN 的基本介绍以及 STM32 的 CAN 模块简介 首先通读手册中关于CAN的文档,必须精读。 STM32F10xxx 参考手册Rev7V3.pdf http://www.mystm32.com/bbs/redirect.php?tid=255&goto=lastpost#lastpost
需要精读的部分为 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=2 500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3 250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2 125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同。 因此我们需要重视的有软件中的这么几个部分: // 设置 AHB 时钟(HCLK) // RCC_SYSCLK_Div1 AHB 时钟 = 系统时钟