你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F1的CAN通信之概述

[复制链接]
攻城狮Melo 发布时间:2023-10-23 15:12
一、专栏简介
本专栏介绍如何利用库函数进行STM32单片机开发,主要针对的单片机型号为STM32F103ZET6。总结来说,“速成”体现在以下方面
• 在讲述基础知识后会有相应的实例或者模板程序
• 学习完后会有小项目练习
• 专栏基础知识部分内容精简,对于“速成”选手更加友好


其次专栏还有以下内容
• 简单介绍编程规范和程序架构
• 专栏不断更新一些外设的使用方法并提供例程


二、前期准备
前期准备主要有物品以及相关软件的准备。首先是物品,单片机选用的是普中科技的一款核心板,主控芯片为STM32F102ZET6,是下面的样子
微信图片_20231023151024.jpg

STM32F103ZET6



图片上是带有LCD屏幕排母的,有一种是不带的,因为本人开发时经常使用LCD,所以买了带排母的,在某宝和聚诚科技购买的,不带彩屏169RMB。学习过程中除了单片机以外还需要购买调试器,ST-LINK,用来下载程序和调试。USB转TTL(可以直接搜索TTL),用来做串口通信时使用,也可以用来下载程序,但是不可以调试。对于前期学习来讲,这些物品就足够啦。


除了物品之外还需要提前准备一些软件和驱动。比如Keil5,CH340(串口驱动),ST-LINK的驱动,这些都是需要安装的。其他的类似于下载软件,串口调试助手都是不需要安装的,本人用的是普中科技提供的一些常用辅助开发软件,小伙伴们可以自己动手找一下,没有找到的话私信留一下邮箱,注明需要常用辅助开发软件,后续会邮件发送。


三、编程规范以及程序架构简介
1. 编程规范
对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点


• 变量定义 变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下


  1. // 以ADC模块为例,需要定义一个存储AD值的变量,举例说明变量命名方式

  2. // 局部变量
  3. u32 adValue = 0;

  4. // 全局变量
  5. u32 gAdcAdValue = 0;   // 加一个g表示是全局变量

  6. // 全局静态变量
  7. static u32 gsAdcAdValue = 0;   // 加一个s表示静态变量

  8. // 指针变量
  9. u32 *gpAdcAdValue = (u32*)0x2000800;   // 加一个p表示为指针变量
复制代码


• 注释 函数注释举例如下
  1. /*
  2. *==============================================================================
  3. *函数名称:
  4. *函数功能:
  5. *输入参数:
  6. *返回值:无
  7. *==============================================================================
  8. */
复制代码


对于程序语句注释,如果过长可以在程序上方加注释,如果不是很长可以在程序语句后面空三格输入注释。


• 函数命名 函数命名要体现函数所属的层级以及函数的功能,关于层级会在代码架构的部分详细说明,这里只说一下函数命名方式。
  1. // 这里以ADC模块的读取AD值函数为例,说明函数命名方式
  2. void Med_Adc_ReadAdValue (void)
  3. {
  4.     // 函数内容
  5. }
复制代码


这里med指示该函数位于功能层,属于ADC模块,作用是读取AD值。


• if,while等语句的使用 使用if或者while等语句时,需要在括号前面加一个空格,如下
  1. if (gAdcAdValue == 0)
  2. {
  3.     // 程序语句
  4. }
复制代码


• 四则运算 四则运算符号前后需要加空格,包括等于号等符号。如下
  1. c = a * b;
复制代码


2. 程序架构
该程序架构是本人在工作期间学习的,个人感觉还是有助于提高开发效率,方便后续维护的。主要思想是将一个模块的程序分成三部分,每一部分是一个新建的文件夹,下面都是其他模块相同层级的文件。


• Drv 驱动层 该层主要是写一些模块的初始化程序,例如GPIO的初始化,ADC的初始化等。
• Med 功能层 该层主要是完成一些功能性的操作,比如读取AD值,点亮LED等。Med层的函数可以包含Drv层的函数。
• App 业务层 该层主要是完成一些业务,比如在点亮LED的基础上实现流水灯,比如显示电压值等。


四、STM32F103ZET6简介
STM32F103ZET6是由意法半导体(ST)生产的一款单片机,32指32位。STM32也可以成为32位微处理器。STM32F103ZET6的主时钟频率为72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中断,ADC,TMR,UART,DMA等。


五、程序模板
在使用Keil5编程时,针对一个外设需要新建对应的.c和.h文件。这里以LED模块为例,简单介绍一下本人的常用模板


.c文件
  1. #include "LED.h"   // LED头文件
复制代码


需要注意的是一定要空出来一格,否则编译会报警告。


微信图片_20231023151019.png

文件最后未空一行的警告

.h文件
  1. #ifndef _LED_H
  2. #define _LED_H

  3. #include "sys.h"   // STM32库文件

  4. #endif
复制代码


.h文件最后也要空出一行,否则也会有警告。


新建完之后需要将这两个文件添加到工程中。


对于.c文件,右键工程文件夹,选择“Manage Project Items”打开。


点击“Add Files”将新建的.c文件加入到对应的文件夹下。


微信图片_20231023151016.png

添加.c文件



对于.h文件,点击魔术棒,选择“C/C++”,点击三个小点选择对应文件夹即可。


微信图片_20231023151013.png

添加.h文件



六、ST-Link调试
在开发过程中学会使用Debug调试,能够帮助我们更快地定位问题。这里简单介绍一下利用ST-Link和普中核心板Debug调试方法。


6.1 硬件连接
首先将ST-Link与核心板连接起来,ST-Link的引脚如下


微信图片_20231023151010.png

ST-Link引脚



核心板上并没有给ST-Link预留单独的接口,而是跟JTAG一起。


其原理图和硬件图如下


微信图片_20231023151007.png


JTAG原理图

微信图片_20231023152058.png

JTAG硬件图



由原理图可知,ST-Link的“SWCLK”连接核心板的“JTCK”,“SWDIO”连接核心板的“JTMS”,“RST”接“RESET”。


VCC不要接,接好ST-Link后再单独给核心板供电。


6.2 Keil配置
硬件连接好后开始配置Keil5,关于ST-Link驱动的安装这里就不再做介绍了。


• 首先确定ST-Link驱动是否正常


微信图片_20231023151004.png

确认ST-Link驱动是否安装正常



• 配置Debug 点击魔术棒,选择Debug,下图处选择“ST-Link Debugger”。


微信图片_20231023151001.png

Debug配置



然后再点击“Settings”,在“SWIO”右侧不显示“no target connected”就说明ST-Link连接正常。点击“Flash Download”


微信图片_20231023150958.png

Flash Download



按照图示配置,“Programming Algorithm”只要选择符合芯片型号的即可,需要注意的是,只能保留一个。


微信图片_20231023150955.png

Flash Download配置



按照下图配置“Utilities”。


微信图片_20231023150951.png

配置Utilities



至此,Keil5关于ST-Link的内容配置完成,如果小伙伴遇到其他问题,可以多去看一些大佬们的博客。


6.3 下载调试
配置完上面的内容后就可以使用ST-Link进行下载调试了。下载的话比较简单,编译完成后直接点击下图标注的图标,等到下载完成即可。


微信图片_20231023150944.png

下载程序



调试时点击下图所示按钮,进入Debug调试。


微信图片_20231023150941.png

调试按钮



下面简单介绍一下调试窗口中各个按钮的作用,其他更加详细的介绍需要小伙伴自行搜索,这里参考了这篇大佬的文章KEIL5中Debug调试。


微信图片_20231023150937.png

调试窗口按钮含义



第一部分从左到右
• 复位
• 全速运行
• 停止
• 每点一次运行一行,遇到函数体会进入
• 每点一次运行一行,遇到函数体不进入,直接执行完到下一行
• 快速执行当前函数剩余语句,然后跳出该函数体,准备执行下一条
• 直接运行到光标处


第二部分从左到右
• 设置当前光标处为断点
• 失能当前光标处断点
• 失能全部断点
• 删除全部断点


打断点的方法比较简单,直接在想要打断点的一行左侧点击一下,出现一个红点就表示已经添加了断点。断点的作用是能够让程序运行到断点处停止,有助于我们分析函数运行方式以及变量的变化。


微信图片_20231023150933.png

断点示意图



调试时可以查看某一个变量的值。选中想要查看的变量,右键


微信图片_20231023150929.png

查看变量值



此时就会出现一个窗口,能够查看该变量的值。


微信图片_20231023150924.png

查看变量值

转载自: 二土电子
如有侵权请联系删除

收藏 评论0 发布时间:2023-10-23 15:12

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版