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

基于STM32F1的CAN通信之概述

[复制链接]
攻城狮Melo 发布时间:2023-10-23 15:12
一、专栏简介
# o# W+ G* A: G6 A- M5 A本专栏介绍如何利用库函数进行STM32单片机开发,主要针对的单片机型号为STM32F103ZET6。总结来说,“速成”体现在以下方面) \0 i  e' h) Q% C9 S3 ~9 [$ x
• 在讲述基础知识后会有相应的实例或者模板程序  y- X6 m+ g5 c( ~, z* d- l
• 学习完后会有小项目练习% O; G0 e, W& T; C
• 专栏基础知识部分内容精简,对于“速成”选手更加友好2 ?& |9 K+ G! q2 U, A) Q& E

+ E) a; J, @+ g3 {" J

2 G) T9 ~$ l* a其次专栏还有以下内容
/ \1 X3 t0 y4 ]) g2 c• 简单介绍编程规范和程序架构$ _5 `% y# M( K$ r% I2 W
• 专栏不断更新一些外设的使用方法并提供例程6 M/ W( I3 w( {. w$ f

2 Q1 M+ t  F$ k+ R8 N/ l" s: k

$ U/ X' U3 d" J二、前期准备3 \: P' @3 I) P1 r5 Y
前期准备主要有物品以及相关软件的准备。首先是物品,单片机选用的是普中科技的一款核心板,主控芯片为STM32F102ZET6,是下面的样子6 p8 a3 X/ f, H# ?  t
微信图片_20231023151024.jpg
3 ?6 h0 D; I/ u. @7 i
STM32F103ZET6

2 F' Q* j* Q$ @# Q/ g( B* }+ m0 U+ u
4 ^4 ~6 R; E4 R' x; b
图片上是带有LCD屏幕排母的,有一种是不带的,因为本人开发时经常使用LCD,所以买了带排母的,在某宝和聚诚科技购买的,不带彩屏169RMB。学习过程中除了单片机以外还需要购买调试器,ST-LINK,用来下载程序和调试。USB转TTL(可以直接搜索TTL),用来做串口通信时使用,也可以用来下载程序,但是不可以调试。对于前期学习来讲,这些物品就足够啦。% L7 k% U: E0 w& a8 l

8 a' F; g# ^" U1 S9 i; n
8 }$ h# a8 `3 H) Q! u
除了物品之外还需要提前准备一些软件和驱动。比如Keil5,CH340(串口驱动),ST-LINK的驱动,这些都是需要安装的。其他的类似于下载软件,串口调试助手都是不需要安装的,本人用的是普中科技提供的一些常用辅助开发软件,小伙伴们可以自己动手找一下,没有找到的话私信留一下邮箱,注明需要常用辅助开发软件,后续会邮件发送。# K0 i' K  V& s

6 V, _/ f( @) E* ~3 E1 n+ n
5 V' c! }. m: B) P; R
三、编程规范以及程序架构简介" W' J" i- r+ r, n) X( z4 Q
1. 编程规范2 T1 P- y) z  V6 {
对于新手来讲,编程规范以及代码架构也非常重要,有一个良好的编程规范和代码架构,可以提高开发效率,方便问题排查以及后续的程序维护。这里介绍的编程规范很简单,要求不严格。主要有以下几点
) U+ X& \+ A  b8 U
3 }, @; M9 K$ `& Y8 C

0 k5 N: S3 R, a/ i" H! `" i3 B* @• 变量定义 变量定义时最好是能够体现该变量所属的外设模块,该变量是否为全局变量,静态变量或者指针变量。变量首字母小写,后面的单词首字母大写。举例如下
. R" o8 F0 C' t+ Z0 H" c
" [+ r% Y7 {0 ^* j
: I' \+ w8 r$ s; N
  1. // 以ADC模块为例,需要定义一个存储AD值的变量,举例说明变量命名方式7 z( m) M4 _2 p; o# Z& X
  2. 3 t( g& G0 ?+ ?, L. B
  3. // 局部变量
    ; L8 m+ X0 O5 [& ?' z# q0 \5 r/ ~
  4. u32 adValue = 0;$ `) e4 B3 f7 J, I9 h

  5. 9 I* r3 j& C/ c( f) M
  6. // 全局变量
    7 W; Q" ]2 t- v( }- s9 X8 k" Q% y
  7. u32 gAdcAdValue = 0;   // 加一个g表示是全局变量
    - b" K4 v: W: Z, t
  8. ' V' W" w3 C2 ~9 m
  9. // 全局静态变量
    7 ?/ z% o, S4 M3 G
  10. static u32 gsAdcAdValue = 0;   // 加一个s表示静态变量
    ( l, K  V# n6 O2 l+ C3 E1 o
  11. ' `) n5 ~$ Z0 [# b+ _6 k$ Q
  12. // 指针变量
    ! S- m4 L! ?5 H( m
  13. u32 *gpAdcAdValue = (u32*)0x2000800;   // 加一个p表示为指针变量
复制代码
* h+ r2 O( v) ~2 J* E

8 E; x, k, j3 I5 C, m7 i- \* T5 o% l• 注释 函数注释举例如下  S4 O% E/ @( [1 l0 O  ~
  1. /*+ a3 i+ w- h4 W" [& K
  2. *==============================================================================
    % t: |$ O+ @$ Z) |
  3. *函数名称:' {2 j3 C0 c  [! \& ^
  4. *函数功能:
    0 v2 {/ Q$ o# @! d& f
  5. *输入参数:
    , o4 G1 U) p& M3 {& q
  6. *返回值:无4 w% h' A( E4 x/ D8 t7 S- ~: q
  7. *==============================================================================
    : d' M, w% C' b* X% J
  8. */
复制代码

# n8 Q0 R* Q% ^% P8 g4 V: e% B' g  f; L# Q8 j5 I" D
对于程序语句注释,如果过长可以在程序上方加注释,如果不是很长可以在程序语句后面空三格输入注释。- u" B' X! g8 X$ ^' F. P6 d' z

0 T9 z5 @, e4 }5 z6 a! G

1 m4 `: k* w, _8 r! ~• 函数命名 函数命名要体现函数所属的层级以及函数的功能,关于层级会在代码架构的部分详细说明,这里只说一下函数命名方式。2 E& P9 r( r' V; R! X
  1. // 这里以ADC模块的读取AD值函数为例,说明函数命名方式7 d; l4 z8 ^5 s
  2. void Med_Adc_ReadAdValue (void)0 ^7 w7 i- q5 _: H6 ]2 o
  3. {
    9 v' _/ ]9 S7 W, [
  4.     // 函数内容: o- S* b7 U8 A4 g
  5. }
复制代码
/ d! \# z: t1 m& r
7 t- y* W0 Z* p; G
这里med指示该函数位于功能层,属于ADC模块,作用是读取AD值。( {' z) V, h. D2 M. J
/ I% R; ~& J4 Y* S- e7 _% Y" n
% D* ]( _: g* p- `
• if,while等语句的使用 使用if或者while等语句时,需要在括号前面加一个空格,如下, n. ~1 _7 k( v$ n% U
  1. if (gAdcAdValue == 0)) b+ d7 x9 t8 B; ~2 C- [" N9 d- |
  2. {
    1 ]/ \- E: w, L' O: M
  3.     // 程序语句8 c7 N* O5 N, _& c( n0 I* s( {
  4. }
复制代码

( u# K6 v8 k1 q# p
) E  K4 A( w4 I2 z, A9 \: Z' n6 ^; Z• 四则运算 四则运算符号前后需要加空格,包括等于号等符号。如下1 a2 R. D! ~" P9 J$ c( m
  1. c = a * b;
复制代码
5 _% z, Z, D) B5 c: _5 U

/ ]$ B" g- \' G" A2 ?2. 程序架构
# Y. b. u  }5 l/ s9 Y该程序架构是本人在工作期间学习的,个人感觉还是有助于提高开发效率,方便后续维护的。主要思想是将一个模块的程序分成三部分,每一部分是一个新建的文件夹,下面都是其他模块相同层级的文件。
7 R" |1 E( y4 R$ z  G4 K: K
2 ^. _4 Q3 X$ s' p; L( Y, K0 S
4 Z2 ]* ]. |' S: T' g
• Drv 驱动层 该层主要是写一些模块的初始化程序,例如GPIO的初始化,ADC的初始化等。
5 ?7 n0 o& D! f2 |! e* y7 n  U2 q( @. ?• Med 功能层 该层主要是完成一些功能性的操作,比如读取AD值,点亮LED等。Med层的函数可以包含Drv层的函数。( `3 G1 a  Q: p! u6 J, U4 Y+ n' u+ ~' p
• App 业务层 该层主要是完成一些业务,比如在点亮LED的基础上实现流水灯,比如显示电压值等。
! b( t6 h2 u" e- w* J
  K- O) R8 d! F( }% P, _

& y1 k' \) b/ s9 z( [四、STM32F103ZET6简介
/ ]. ^, D' H8 d" z; B7 pSTM32F103ZET6是由意法半导体(ST)生产的一款单片机,32指32位。STM32也可以成为32位微处理器。STM32F103ZET6的主时钟频率为72MHz,512KB的FLASH,64KB的SRAM。常用到的有GPIO,中断,ADC,TMR,UART,DMA等。
( R) v9 e& g5 R# v1 u; }  ]; u9 e1 @  e: H$ a+ W& Z5 k0 p6 D
4 I7 N4 q% F  n7 R
五、程序模板
  f- p9 H9 L7 f: V1 ^+ B: A0 N在使用Keil5编程时,针对一个外设需要新建对应的.c和.h文件。这里以LED模块为例,简单介绍一下本人的常用模板
, A" D7 w7 w( a* Y. @! n
( A) C8 M" s! P# M* I* m

4 G1 b. e) l/ [  v1 y.c文件4 o# w7 S' N/ m9 r
  1. #include "LED.h"   // LED头文件
复制代码

& |9 G: H, U2 c4 a0 @
& |* }1 f& \" R$ ?2 \9 B  P2 h需要注意的是一定要空出来一格,否则编译会报警告。
; Y) Q+ ^) L/ ~. M. y& s. B9 o- |4 {* N  E& g' Q
3 z7 a8 H! s  j5 }
微信图片_20231023151019.png
% l) [# M# R, {; n* C: K1 ?& C
文件最后未空一行的警告
8 D8 C( N" Z( s# U: d
.h文件- Q8 r( r5 h, W
  1. #ifndef _LED_H& p# x+ O8 H$ u" q, `/ ?5 @0 ~
  2. #define _LED_H3 r0 u, A9 ]6 b" E. I8 u. l1 W  Y

  3. & G8 [. o* S$ [" p: p) ^$ x
  4. #include "sys.h"   // STM32库文件( _4 E* `1 W& M; |; O0 T. _3 ^

  5. 1 P  Q! ]% s" ^: Q8 B
  6. #endif
复制代码

) |$ R$ q9 g) c4 T& l; G  Q! a0 ~% F1 w, A) [
.h文件最后也要空出一行,否则也会有警告。1 k' O$ M1 V0 W- u

. k/ |, Y7 ^# ]
0 l0 }. Z/ |  K8 y2 @: F/ [' e
新建完之后需要将这两个文件添加到工程中。
3 f: B# s% u) y. w- M# a
" p, f% N" {) J6 E& f
+ z5 r5 h) `: G- N3 q
对于.c文件,右键工程文件夹,选择“Manage Project Items”打开。' W* Y) i4 p& u5 _' d

9 y* u; X+ ?6 m/ l
7 \8 o- `* h- Y6 i: D
点击“Add Files”将新建的.c文件加入到对应的文件夹下。; [9 ]& Q8 _$ m' z3 y' B4 S

* H) I7 X% n& E9 q. ^2 P
! M3 `: e4 E5 I) q$ g
微信图片_20231023151016.png

, y$ P6 ]  e+ @3 G# ?
添加.c文件
) ?. P! P5 R, i) I  l8 K
3 e& M+ q0 z8 n4 Y2 X

# f' Y! T4 C& M+ r对于.h文件,点击魔术棒,选择“C/C++”,点击三个小点选择对应文件夹即可。% o* a$ P" q0 T6 C+ B$ C

1 q) a4 x3 r5 G) W) @/ B
5 j* T1 O, {3 ^4 d1 X
微信图片_20231023151013.png

( O2 |' t) k0 n( {; D. Z
添加.h文件
- m/ q9 ^1 e% D- w

* }# ?- F4 A% T, `! m8 {# P
1 e  D; R  ~. ^, v
六、ST-Link调试
! i( |6 g& q3 I% s! @4 f6 u7 h在开发过程中学会使用Debug调试,能够帮助我们更快地定位问题。这里简单介绍一下利用ST-Link和普中核心板Debug调试方法。, {/ G: K  p5 H
3 v& Q" ]0 O- Y) t7 w
: K3 U" Q# g* @0 t; y" p8 ^
6.1 硬件连接& f0 Q9 F( G; l: O" K" h* @: M
首先将ST-Link与核心板连接起来,ST-Link的引脚如下
/ u8 W2 u3 V1 Q1 Z; p+ z" X% ]! ?, U

% b8 D( }3 N' j0 q8 o# x4 S
微信图片_20231023151010.png

, Y7 K2 [  ~6 C- ]" v/ L# n) }! ^
ST-Link引脚
  o6 |% `1 X& k' V: U
6 \8 Q) _" Z# P, U

: s# s! A/ k- b! Y* E核心板上并没有给ST-Link预留单独的接口,而是跟JTAG一起。
3 s1 o, Z/ b% Y; S* c5 B, Z. O
$ S# Z% |% ?/ @. ?8 k
, F. S4 K( P6 V6 k. u% F
其原理图和硬件图如下
6 ]  c  L: |  x+ K: F, l8 K4 s" }7 O$ `  q+ H
$ B; j9 Z) S1 ~# s0 `
微信图片_20231023151007.png

% `, K- P: Q6 H. ?/ ]3 N- F1 t4 V
JTAG原理图. s$ J# w3 u; w& i

3 E9 N% K/ Y6 z6 Y* F
微信图片_20231023152058.png
0 K9 V' t) w& a1 Z9 T5 Y
JTAG硬件图

+ z! ]( q) `, p2 W' y2 m9 H
) k, Z! g; P  z( G4 I) ?# ?0 l

7 m1 a" x) `+ b( r; P1 z由原理图可知,ST-Link的“SWCLK”连接核心板的“JTCK”,“SWDIO”连接核心板的“JTMS”,“RST”接“RESET”。
7 Z% z, B3 R% j! c6 N- q
% N( @5 X% Q/ y; k2 f$ p4 V$ ~

9 x$ d) E3 N9 c% CVCC不要接,接好ST-Link后再单独给核心板供电。, w+ U& h8 H' \5 G. H

% B9 k2 ~1 a1 i

  @3 G/ k1 K+ I$ Y6.2 Keil配置7 @3 A6 G0 }# u* F7 |' s
硬件连接好后开始配置Keil5,关于ST-Link驱动的安装这里就不再做介绍了。
; w- _% |. t* J8 ]1 U' [
2 B1 r' s7 d2 ]3 m% x0 f1 j
+ N( I6 s' H$ Y# V
• 首先确定ST-Link驱动是否正常6 }0 G4 M( b2 t2 ~, K

  G( i+ ~" [3 n! K- t2 o! i
# F0 [- A9 C7 I. p8 e
微信图片_20231023151004.png

0 U4 v. {7 N, A  S% N" @6 B" K) ?: C
确认ST-Link驱动是否安装正常
: j2 B: `9 l! @  V& f# J" I

( I4 p  V: w( s) F

* C  n, }) ~( D, r  M- F# p• 配置Debug 点击魔术棒,选择Debug,下图处选择“ST-Link Debugger”。
! z7 B( h6 a) K' N: g& Z6 @6 [
. m4 Z  p- N. g0 h

, X5 T8 I( N: }3 t) \+ b' ]
微信图片_20231023151001.png

+ C. E, Y; [7 k! a! q
Debug配置

' \6 G/ g; Y5 G+ Y0 c( _
- M( K$ O7 x' f1 H
; w- O& F, E8 x$ G! l- r) B; T
然后再点击“Settings”,在“SWIO”右侧不显示“no target connected”就说明ST-Link连接正常。点击“Flash Download”  J3 F' O. N3 |9 h9 X& D) ?5 [

; i" Z; W. w4 D# W  P$ ~
6 V1 b$ R# y0 n) \& t; H/ E
微信图片_20231023150958.png
9 s% a4 l4 S/ A; A6 Z1 F
Flash Download
  k- P" f  a+ F5 w! D; z( {3 |
- Y! ?$ p$ A7 o3 g- L. q
; ~7 E) p# O: {' ]- z
按照图示配置,“Programming Algorithm”只要选择符合芯片型号的即可,需要注意的是,只能保留一个。9 ^9 _# s9 H* b& u
8 K* U! E1 k* n2 G  T5 q4 b

8 G/ q( P# [# e
微信图片_20231023150955.png

! u/ }" C+ ~* A# ~' D6 E
Flash Download配置

3 k" M6 l1 P' o" F/ ]7 a" V% a. X  ^" s7 g2 {( _/ g2 Q

5 H5 b5 k, G7 b  r2 ~5 S1 N# O按照下图配置“Utilities”。" v+ r2 C4 V# |) l
7 ]$ L  _) C# j+ T

7 V" a2 w( \$ V7 Q. A2 A3 R& s
微信图片_20231023150951.png

& h' l; Y- X2 y! w
配置Utilities
8 i* h; v& _3 [# `+ A: B
. G4 H7 d9 F+ a+ x7 }& w
( `8 z- h4 B& \% r
至此,Keil5关于ST-Link的内容配置完成,如果小伙伴遇到其他问题,可以多去看一些大佬们的博客。% u# t+ G3 y* k8 h

% F  P6 m% i" g
  n9 _* f- J9 w8 e( y
6.3 下载调试" o' ^- _. k6 l! k5 `1 v3 L
配置完上面的内容后就可以使用ST-Link进行下载调试了。下载的话比较简单,编译完成后直接点击下图标注的图标,等到下载完成即可。- {' ~/ h7 T3 ?5 n

7 q- R- S, ]  v* K! J
4 ^* ~0 ?! b+ n5 L
微信图片_20231023150944.png

% M9 I" k- ]5 p9 e
下载程序
$ O  [: l( ~# h1 L' ^: f
7 v* E. e9 k3 ~* h4 V- k
) B; n1 X1 e/ m' i- W
调试时点击下图所示按钮,进入Debug调试。! T6 t& z. ~& S, k+ ]! Y+ J4 \' `
; A2 N$ f. T9 l# C) g5 o
$ U& r/ @8 f* G( ^9 X7 Q
微信图片_20231023150941.png
3 H) g. i, V! w6 r( ~
调试按钮

" s" |2 s! u* t2 y" U" @  t
1 e: J9 B  ]. p! X, r: N) [
0 ?% o  Z3 h* q0 y% u  ~8 t  F
下面简单介绍一下调试窗口中各个按钮的作用,其他更加详细的介绍需要小伙伴自行搜索,这里参考了这篇大佬的文章KEIL5中Debug调试。3 @) B6 U: a' ?8 R' g: g

% c% X( N2 g+ _& m
  z) Q3 T+ C; O7 _4 V
微信图片_20231023150937.png

# w3 g8 e* ^" {) }7 o! u" D9 j( o
调试窗口按钮含义

; E2 j" P+ D: _8 Q, A$ }
; e& T) S: v2 t4 v" p4 k* C

$ l4 v9 p, B0 I. X/ p第一部分从左到右: T0 h) B2 F3 I  _, u
• 复位
4 d1 X. b0 h7 h. s• 全速运行
0 ~7 F, W2 I; q0 \$ s- g• 停止
; w2 g3 ]% w" j7 }4 O5 T5 g• 每点一次运行一行,遇到函数体会进入
% o& R' i% ?) g• 每点一次运行一行,遇到函数体不进入,直接执行完到下一行: x2 Q5 T+ ?0 F3 k4 y& C6 n
• 快速执行当前函数剩余语句,然后跳出该函数体,准备执行下一条
% Q: A2 E, V1 y/ K) f• 直接运行到光标处
$ V& g8 L: H  z# r; @
: \, \# [! x: @+ e

* \- a/ S8 [' e3 a9 c第二部分从左到右
: C5 G) |: K% d& S* D4 N• 设置当前光标处为断点
; }% p8 ]! R5 {• 失能当前光标处断点& C5 K6 M6 E; X! v" t8 Q- e$ Y2 m
• 失能全部断点4 o& e# ?+ D: Q9 e
• 删除全部断点
4 p5 {0 P- |: R2 k/ N4 B0 b: N0 L% H1 W% t  }+ `* J4 u5 G# R, y

( c- F$ I9 Q5 y" W3 u打断点的方法比较简单,直接在想要打断点的一行左侧点击一下,出现一个红点就表示已经添加了断点。断点的作用是能够让程序运行到断点处停止,有助于我们分析函数运行方式以及变量的变化。- Q0 a$ K7 Q9 {4 }9 C& b
, s* T# b$ u9 I: J# F. {) h
  M# N) W2 x7 \  M- e
微信图片_20231023150933.png
$ i  `8 E, w, @1 P/ d
断点示意图
" q& A3 z& V$ L, i% S
, I1 K. R) D: J3 h0 }6 |5 S, a' H

8 K1 L9 @% H' |调试时可以查看某一个变量的值。选中想要查看的变量,右键
& ^; b* s* j" C* T3 g
  |7 g* {6 u3 K! ^4 i* C4 i

5 \& e# r% Y( w8 `. h
微信图片_20231023150929.png
3 G& s/ t3 {  G! O$ z( K
查看变量值
9 h* Q% U* O! s
, t6 z/ V" D, c3 I
# r8 Q* v0 `! i* L
此时就会出现一个窗口,能够查看该变量的值。
% K: H  V9 U$ W5 P& _* o& E3 G$ E3 J) E7 s% L4 B. J* S

" T0 W9 z- Q4 o: I0 H7 r& n- C
微信图片_20231023150924.png

" M6 R- f( r) N& Y; Q+ M5 ^
查看变量值
. i0 a' P: o' A9 C4 C$ v
转载自: 二土电子* S* w6 \. i; o" d1 c
如有侵权请联系删除
; l. [' ]$ {# y0 K0 R+ `, \+ A
4 V' u. N. k2 D- |, C+ U. H6 W
收藏 评论0 发布时间:2023-10-23 15:12

举报

0个回答

所属标签

相似分享

官网相关资源

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