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

基于STM32F1的CAN通信之概述

[复制链接]
攻城狮Melo 发布时间:2023-10-23 15:12
一、专栏简介
" I- I  u) l& }6 ]) n% w$ W6 z本专栏介绍如何利用库函数进行STM32单片机开发,主要针对的单片机型号为STM32F103ZET6。总结来说,“速成”体现在以下方面  D/ W1 U3 [) Q" `& B. |6 e
• 在讲述基础知识后会有相应的实例或者模板程序
9 D$ [  i+ N" L+ |• 学习完后会有小项目练习
" h" E3 L9 R7 B+ Y2 O" s6 l  m4 f$ I6 @• 专栏基础知识部分内容精简,对于“速成”选手更加友好1 L  F" x7 r6 Y; L  l# G

) ?. p, g  B5 e) ]( b2 c
0 M7 J. l1 O* x; i* a8 H5 T; [
其次专栏还有以下内容
* `* Z; E' s- t• 简单介绍编程规范和程序架构
3 ?+ u9 c' N7 C# V6 D• 专栏不断更新一些外设的使用方法并提供例程
8 u. G( `, k# Q/ v3 \8 w& f, J9 Z% p% E

2 P1 N, K# f& w3 c# o, d5 u二、前期准备5 G- f7 B! Q6 m- C4 w" f8 n
前期准备主要有物品以及相关软件的准备。首先是物品,单片机选用的是普中科技的一款核心板,主控芯片为STM32F102ZET6,是下面的样子1 Q; O* Z0 d4 x* O, X
微信图片_20231023151024.jpg
  y# d% Z* W8 W+ _
STM32F103ZET6
+ d0 D' |  q% ?+ N
  j; l  P2 @4 W7 Q, ~" M' k

* i" D8 Q" v2 I* R* \图片上是带有LCD屏幕排母的,有一种是不带的,因为本人开发时经常使用LCD,所以买了带排母的,在某宝和聚诚科技购买的,不带彩屏169RMB。学习过程中除了单片机以外还需要购买调试器,ST-LINK,用来下载程序和调试。USB转TTL(可以直接搜索TTL),用来做串口通信时使用,也可以用来下载程序,但是不可以调试。对于前期学习来讲,这些物品就足够啦。
. j9 t" c+ @% v: w/ N; K5 S/ j$ H2 y% |6 @; K" j3 D. T

- o- E: d- j$ M7 {+ z除了物品之外还需要提前准备一些软件和驱动。比如Keil5,CH340(串口驱动),ST-LINK的驱动,这些都是需要安装的。其他的类似于下载软件,串口调试助手都是不需要安装的,本人用的是普中科技提供的一些常用辅助开发软件,小伙伴们可以自己动手找一下,没有找到的话私信留一下邮箱,注明需要常用辅助开发软件,后续会邮件发送。
* v4 s; A9 u( O/ {) I5 {1 |8 n, t
5 X% m# D1 |4 k; q( _- }
5 Y0 }6 y. R5 o7 o8 ]
三、编程规范以及程序架构简介
- _, m4 b+ I5 l) }5 |# S8 H1. 编程规范
! Z6 v: a! b2 j! }9 g( @对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点
3 H0 Z& F1 l& K: f7 i4 p3 n$ p8 w  e6 `
: L9 N' x5 G* l" Q
• 变量定义 变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下
" D, E' u1 a7 M# x7 n2 T8 Q& \$ O

/ m" N" r6 B5 d/ [& V) q8 F
  1. // 以ADC模块为例,需要定义一个存储AD值的变量,举例说明变量命名方式
    ! V% E9 l  C9 T4 }& j0 F  b
  2. 8 _1 N3 ?* `. \" i9 M
  3. // 局部变量
    0 w+ y9 V* N# V- X8 }
  4. u32 adValue = 0;
    7 s/ E0 |! h, P

  5. ) Z  a- {) X' {6 m% }$ m  @9 ^$ S, t+ H5 j
  6. // 全局变量
    ' s" [4 q5 v& f5 S* n
  7. u32 gAdcAdValue = 0;   // 加一个g表示是全局变量
    7 V. u4 s/ s7 u
  8. ' H3 I$ w) q0 E, N  {
  9. // 全局静态变量1 A. i0 M$ M/ P5 W5 v
  10. static u32 gsAdcAdValue = 0;   // 加一个s表示静态变量" u! G% P! ?, z2 `: c8 p5 q
  11. $ a% \0 a: ?0 ^4 o; U! a& X
  12. // 指针变量: j: D- r3 A. g/ D+ `. [  j
  13. u32 *gpAdcAdValue = (u32*)0x2000800;   // 加一个p表示为指针变量
复制代码

. F. f. g& y3 S& g. M2 j. I, ]2 C' E# \- I# G# P
• 注释 函数注释举例如下
5 D$ \, T6 K2 Y& V8 S$ l9 u
  1. /*
    # A+ P2 N# A( ]) {- k4 d( a
  2. *==============================================================================' i  o' K1 @% y. P6 d
  3. *函数名称:' s$ X2 k% j. h  U& q4 x! x! q; Z) N; d
  4. *函数功能:
    ) s- }5 C* r4 b  n6 b" P
  5. *输入参数:
    ( ^9 j" A6 p) X5 ]" X
  6. *返回值:无
    4 Y6 ~% A2 [0 k( v; p; P
  7. *==============================================================================+ ?0 h* Y2 h  ?  I! x& u4 b- e- x1 M
  8. */
复制代码

3 A! a; i4 }1 P* X+ I& U7 ?( K5 ^& o. p6 T. l1 o( Y( q$ P$ ^# ]5 C! ?
对于程序语句注释,如果过长可以在程序上方加注释,如果不是很长可以在程序语句后面空三格输入注释。' O# \3 {: G$ |4 H9 C

- W- B4 Q* X$ O. v* U
& V$ L2 `3 A. y8 @
• 函数命名 函数命名要体现函数所属的层级以及函数的功能,关于层级会在代码架构的部分详细说明,这里只说一下函数命名方式。
* y! L) a' [2 o, p
  1. // 这里以ADC模块的读取AD值函数为例,说明函数命名方式7 k! O5 s) G+ {9 `9 J
  2. void Med_Adc_ReadAdValue (void). q. ^( O( S0 @5 y
  3. {2 Y4 D% t3 D4 H* v
  4.     // 函数内容: K8 C: j7 Y' f$ |! u  U
  5. }
复制代码

0 U+ I6 m7 g  l+ X
9 R4 a, B% G8 i( t2 q这里med指示该函数位于功能层,属于ADC模块,作用是读取AD值。8 r: {* H/ m  ^, F6 n- j

  H6 R4 ]7 t7 h1 k7 q

* j; `6 [5 t; n; B  `• if,while等语句的使用 使用if或者while等语句时,需要在括号前面加一个空格,如下
; Q* q2 ~$ \8 O; J4 ~6 e; ]1 F
  1. if (gAdcAdValue == 0)
    - T" B+ P( N# p  v, @
  2. {
    . d4 m0 {+ q- t9 R& I9 Y1 Z) B
  3.     // 程序语句
    / O, T' H1 G8 e, E3 v7 g
  4. }
复制代码
1 R) m' F, A+ v/ I- F) K/ N+ t( r
4 V- _$ F3 W$ W  D' o
• 四则运算 四则运算符号前后需要加空格,包括等于号等符号。如下( s" p, @: t( b. d5 E
  1. c = a * b;
复制代码

8 K& |; M& D- R) _& _2 u7 [2 E# _* S# e
2. 程序架构/ x& V8 ~* u6 q2 Z0 X6 o
该程序架构是本人在工作期间学习的,个人感觉还是有助于提高开发效率,方便后续维护的。主要思想是将一个模块的程序分成三部分,每一部分是一个新建的文件夹,下面都是其他模块相同层级的文件。
* ?& E9 C& w  x( |4 [+ M
- \5 I5 ~; U0 @$ G1 a
6 I3 h+ [& n8 {" }' u
• Drv 驱动层 该层主要是写一些模块的初始化程序,例如GPIO的初始化,ADC的初始化等。
) o8 j9 C) f4 L5 F) |• Med 功能层 该层主要是完成一些功能性的操作,比如读取AD值,点亮LED等。Med层的函数可以包含Drv层的函数。7 ]2 U9 ~# K+ F+ `9 L
• App 业务层 该层主要是完成一些业务,比如在点亮LED的基础上实现流水灯,比如显示电压值等。6 y' }3 H4 `9 [' l3 o1 j

* q( T+ N# s* l" s# L
) @1 O4 l0 M6 J# I4 f( @, E
四、STM32F103ZET6简介5 o! K3 [7 m$ S/ J+ j' h
STM32F103ZET6是由意法半导体(ST)生产的一款单片机,32指32位。STM32也可以成为32位微处理器。STM32F103ZET6的主时钟频率为72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中断,ADC,TMR,UART,DMA等。5 u$ K5 P  ?9 j- _6 m1 K

, e9 X& M; e" M& f* |  L
1 _8 v4 X9 c: w" ?
五、程序模板
- i8 n1 `2 y8 P. _) H在使用Keil5编程时,针对一个外设需要新建对应的.c和.h文件。这里以LED模块为例,简单介绍一下本人的常用模板- N" Y" p* ^, @4 U. n6 H
, n2 x# z, }+ q3 J1 a6 p! C

; M5 c3 l9 z# m' `.c文件( _: `. _! O6 `9 L2 F7 i! l! e
  1. #include "LED.h"   // LED头文件
复制代码

: b, T. a4 h* I! V- C) r5 R7 A  J2 K* j) p' B' W/ y" e; P* Z+ x
需要注意的是一定要空出来一格,否则编译会报警告。
5 d, p- V* _  ^0 O; {) j, Q- }4 A
8 \8 O2 P7 \; Y" o2 d" Y5 H
6 U$ f, l0 C4 ?( N* H( h
微信图片_20231023151019.png
6 P7 W# h6 M% t6 V! N% x1 |
文件最后未空一行的警告
) \2 T% ~7 x( {2 }- d+ U" {
.h文件
4 Y2 G9 b2 G+ z
  1. #ifndef _LED_H1 f, c9 m# R7 e4 p! r9 k8 y2 Z8 c5 e- {
  2. #define _LED_H
      R3 u  C  O/ N+ M, ]

  3. , O5 p2 G6 P/ E! j" D
  4. #include "sys.h"   // STM32库文件
    9 S5 Z! P  F5 F

  5. 8 X9 i5 N+ `) g
  6. #endif
复制代码

2 E# N& t0 K* o; {) h
$ Q' G' U" m5 b+ {) {.h文件最后也要空出一行,否则也会有警告。
# [) @$ K+ v; p$ e( A$ O4 r3 k1 `" f$ O5 G7 _; Q
4 Q) Q! n, o5 ^5 @
新建完之后需要将这两个文件添加到工程中。% D! Z& y6 ^5 _! q
, S) _. \7 \. I
% l( q, |# `5 k3 h5 K" G0 u, l
对于.c文件,右键工程文件夹,选择“Manage Project Items”打开。7 |! H( z, ?4 U- ?( P; e, u. b

: P2 t# \  o2 G# B! T

2 n5 y+ {, F9 `  l1 Y. `点击“Add Files”将新建的.c文件加入到对应的文件夹下。
( H" `: ?: i% _7 ~. ~5 A( ~) x* m- d5 D0 J( S9 Q& a' |

7 Z0 M7 e; g' C% c4 m9 S3 Q
微信图片_20231023151016.png
' |1 G% v+ R/ A2 ~/ p: d. m% s
添加.c文件

0 L! W& k8 j' n1 B: l) q
# y$ m5 J" A1 \6 k3 ^4 i$ |6 u& ^
6 Y, W/ w. c, Z1 \" D- S5 D' c
对于.h文件,点击魔术棒,选择“C/C++”,点击三个小点选择对应文件夹即可。
  j  {+ G' h; J; O# s4 \" P: d4 d0 }3 t) ^4 L) U
6 v& {& [4 i$ I+ g! `  ^9 s
微信图片_20231023151013.png

! b5 \5 p0 X: }0 ]; A5 G
添加.h文件

8 g: q" v4 H3 h0 g( A) h. M7 x5 E% A, V, h) x: M

- n0 X/ K+ a4 ~/ p1 \+ K六、ST-Link调试
6 X7 q/ @' H6 p5 [在开发过程中学会使用Debug调试,能够帮助我们更快地定位问题。这里简单介绍一下利用ST-Link和普中核心板Debug调试方法。9 v5 e$ ?) K/ _4 W

; _9 Q8 K, M9 U& Q' v
; p5 W2 W, i/ [. n
6.1 硬件连接/ e0 x8 B# d4 W- j
首先将ST-Link与核心板连接起来,ST-Link的引脚如下8 N2 w0 r$ g; H7 E6 n* U7 H

7 |5 K4 S$ n: [/ w' f+ P* B# t

3 \% O  O; K! [3 X. ?* ^* n
微信图片_20231023151010.png
9 |7 r$ u3 m  p" \6 M
ST-Link引脚
2 b5 w, @; m" `7 t  T1 _' w

0 V) o) x! l6 O* t. `
6 t. F, q) ]' f7 g9 `9 P
核心板上并没有给ST-Link预留单独的接口,而是跟JTAG一起。
' Y6 h8 @1 D, e9 l
* W" ^+ B- Z0 B8 _
) w8 N) y) B0 w  A
其原理图和硬件图如下& l2 I/ m9 A/ h
8 R/ K# ^: A0 _
5 q9 x/ Y. y. z) `" T
微信图片_20231023151007.png

6 {; M( ?2 S* Q) u) p: Z: f
7 a* m* H" Z" fJTAG原理图
) b  }9 c! ~- W- F8 \. @/ D. A3 S
微信图片_20231023152058.png
( ]9 x8 ?0 U8 p: O% W- N" p3 e4 \9 F
JTAG硬件图
& \- ~, K1 ]7 T7 U- R1 N

* E5 c. [2 V3 Y3 ]3 s; _

/ {. `. I) J1 [% i2 A( }由原理图可知,ST-Link的“SWCLK”连接核心板的“JTCK”,“SWDIO”连接核心板的“JTMS”,“RST”接“RESET”。& `8 ?- n1 `1 `2 A& D

% N. F8 v$ S. }7 z! O

. R: w$ K) c# M/ C6 fVCC不要接,接好ST-Link后再单独给核心板供电。9 V/ L/ R# ~$ W, B
# e0 r# z( G* X; y
3 v4 O$ }! I- ], [; O6 W' U) e" L
6.2 Keil配置
% b4 O/ G* m7 f6 e  s硬件连接好后开始配置Keil5,关于ST-Link驱动的安装这里就不再做介绍了。5 U5 ]5 p- h9 R4 G

, }  a0 i( h% ^1 G1 R

- D: c6 e7 J9 ^8 y" N; l% Y! `• 首先确定ST-Link驱动是否正常. k5 p& N1 `9 Z( K5 s; F/ z
! X' f3 [8 q" _  T. M, _

% c: |3 E) Q2 N( d" o
微信图片_20231023151004.png
  i: ?  |8 f8 Z
确认ST-Link驱动是否安装正常
7 _' N0 S4 R; C

% P6 q5 c2 S/ ~% m

9 J/ z# }" B- M2 R0 H, Z  }- ^• 配置Debug 点击魔术棒,选择Debug,下图处选择“ST-Link Debugger”。7 r! ^3 P! F2 B0 \
& z# s7 I" e1 x2 K  w
* \3 k! ?- e0 B) T5 b6 f+ Z9 K
微信图片_20231023151001.png

  G, H( U; R9 m7 ]; ]. Y
Debug配置
% c5 L% C/ u3 g9 \" b6 L* q
; {7 K8 \) c- M2 {! T+ p& [
* S" k, S- d1 |  _
然后再点击“Settings”,在“SWIO”右侧不显示“no target connected”就说明ST-Link连接正常。点击“Flash Download”6 ^- O) y- V' i
! c- H+ E, C( W0 K. K% V" a* p2 {
: `& K! ]1 L$ s; W
微信图片_20231023150958.png

3 X; D6 N- x1 p9 K! e
Flash Download

/ A2 O6 S! F" G
+ D: ^5 B+ _/ K5 K+ ~

9 m. i; C3 g8 Y: N按照图示配置,“Programming Algorithm”只要选择符合芯片型号的即可,需要注意的是,只能保留一个。$ e8 j8 e# ?9 T. D

1 y1 U$ \  W) }! i% V$ |) l

  P, r* e! S7 ~9 x; P6 }
微信图片_20231023150955.png
% h+ x$ c7 H# n  N+ A( F
Flash Download配置

  X1 `! f3 V/ x
0 I, c, u5 ?3 z; I- ^2 W8 p

8 R1 q' A, W8 Z1 D8 F按照下图配置“Utilities”。
, K6 r; y; i: n" X! N9 e8 d9 E2 T$ C& W( j' w) z

* m) T# N% l: ^$ }
微信图片_20231023150951.png

5 W" A! r: p) w, ^* L3 g8 R
配置Utilities
, H% Z! v  y  U- Q. L' A, O

4 r0 [! b. g7 P& H

. Q" Q. a7 H/ i# n2 |; Y至此,Keil5关于ST-Link的内容配置完成,如果小伙伴遇到其他问题,可以多去看一些大佬们的博客。# D+ v; A' ]% j0 Z0 W
  v" }! U# i' [+ L+ p! n. ?

8 E& O$ A7 q% `" b, G6.3 下载调试8 ~1 U- F1 I6 w7 m$ R, Z+ b8 z7 U
配置完上面的内容后就可以使用ST-Link进行下载调试了。下载的话比较简单,编译完成后直接点击下图标注的图标,等到下载完成即可。0 H* X. \3 D6 r2 G+ Y& T

# d$ G" Q7 I; e& H
' H, O% r% H; F- ^$ D
微信图片_20231023150944.png
! A9 A! ~+ S+ K. x: z6 o  k3 q
下载程序
4 d' k" z7 B- j4 ?

% @" J- F8 g# w0 @7 q8 l1 w" b
! m1 U5 C* A& n; D" w1 U( M9 N
调试时点击下图所示按钮,进入Debug调试。# a: y5 l# n1 P$ H  d

" u" a( x6 |. K+ |* _; c2 I) Q

0 C2 S+ l$ `% k5 Z$ O, \) {
微信图片_20231023150941.png
& ^0 e7 P. c( }8 h1 q5 H
调试按钮
  _4 Z. a7 @9 e/ j5 Q6 E) _6 T

, L- }$ M2 q0 `  U$ M& b

# d* x* s$ q" }2 p; x% o下面简单介绍一下调试窗口中各个按钮的作用,其他更加详细的介绍需要小伙伴自行搜索,这里参考了这篇大佬的文章KEIL5中Debug调试。
/ p7 Y2 a" {1 ~; O% p) y
6 c% s- M# @# u& C7 V
8 R# n5 Q3 H4 H# v1 A
微信图片_20231023150937.png

4 P0 Z9 w7 J% }7 `7 ~$ B4 |
调试窗口按钮含义

3 G' U9 L# \4 E2 w
2 ?) c/ ~* ^+ k, {

- d' u4 t) b) Q  a, _. p: \第一部分从左到右8 Z' d7 _! A4 n, R5 t7 N$ _
• 复位
/ J1 P: _" z! r! `• 全速运行+ a" s& E% p7 y' r, e
• 停止
- ]7 g5 `( H; h3 Q• 每点一次运行一行,遇到函数体会进入1 x: y! v& F6 G# b# ^* S3 i6 V
• 每点一次运行一行,遇到函数体不进入,直接执行完到下一行
) u+ f  D- I* O• 快速执行当前函数剩余语句,然后跳出该函数体,准备执行下一条' G. ~+ C2 y" Q4 t
• 直接运行到光标处2 a3 z8 O: a( H) u
- y0 B4 b, A: C0 P# S& {: X
" \" P! t* l: n2 d  o% x' |; b
第二部分从左到右
0 r( A4 `3 x3 f. p$ T' q• 设置当前光标处为断点' _1 G! k9 J! C4 D0 J. L
• 失能当前光标处断点- y' F- `0 ?* @: d. _" ~
• 失能全部断点7 z" M! a( ^5 N9 g
• 删除全部断点
& B+ s, ^5 L/ Q2 \' Q/ R
& Y7 D0 N9 Q- F2 t

# J( k" q; Q1 c( ^8 B0 l! T打断点的方法比较简单,直接在想要打断点的一行左侧点击一下,出现一个红点就表示已经添加了断点。断点的作用是能够让程序运行到断点处停止,有助于我们分析函数运行方式以及变量的变化。$ M* E  |* B& g% w
- ~- E- m  l# l1 \

: _. O. H! `9 c/ E. {
微信图片_20231023150933.png
( p% P1 B4 n+ |9 c) ~$ `, }
断点示意图
2 V3 @0 Z( M" X, z/ j
5 M  V! a" k5 Z4 k) v+ A$ h. v
# c# n- t/ Q2 @! v8 ~" U1 W& i" C% x
调试时可以查看某一个变量的值。选中想要查看的变量,右键3 A& A, K2 _% f2 f- S$ S- L: N
9 x: Y  j1 ~$ O3 X
9 _: V1 l; J3 P1 c# x3 j& p3 S- e2 i3 h
微信图片_20231023150929.png
- p( g# b' h' b; L* g0 [  D# v
查看变量值

* t: J) e. I" K. H; N, y1 {& {

) @% z; i: `$ i4 r1 S: I& A/ I
3 O: Y, p' U  G6 Z, n
此时就会出现一个窗口,能够查看该变量的值。
, ~; E: P& [: w5 X: E$ z
9 V* F/ d5 Z" r+ H7 }0 P
8 A$ {/ v% A2 o9 ?5 Y* k
微信图片_20231023150924.png

0 C) s/ \! P$ R5 _: Y4 u
查看变量值

1 z: {$ h3 d7 F) h3 w0 P转载自: 二土电子, A# D- N9 p, D) N# M3 c
如有侵权请联系删除
( x  r. ^: j* K# |2 Z. n
: }& y  }; l2 h7 J
收藏 评论0 发布时间:2023-10-23 15:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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