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

【经验分享】基于STM32的串口通信与温度测量实验

[复制链接]
STMCU小助手 发布时间:2022-5-12 19:16
实验目标; U" j4 F4 v' K3 L( H9 q
通过 ADC 采集内部温度传感器通道电压,然后得出 MCU 内部温度。
+ \8 i- J+ V5 I$ q使用串口调试助手实现 Nucleo board 与 PC 机间的虚拟串口数据传输" u4 ~* {+ h( G- w/ T
通过串口调试助手显示所测得的MCU内部温度  t% i& v; R. l! X# \; s4 Y
实验设备及软件
+ p! J# f5 o( g9 b( ~3 O& U* `1 z# D
硬件:ST Nucleo Board开发板,Mini USB数据线
* X2 N& x) E$ O% T; C3 M7 V! _& Y. @$ O: I
软件:实验通过软件STM32CubeMX进行引脚配置,并生成代码,代码使用的是HAL库,可在集成编译环境Keil中进行代码修改与添加。3 T; C* J1 O& w$ R2 C
/ j2 }( L7 z$ E5 f; U/ T
文档:开发板的原理图、STM32F4xx参考手册和 HAL 驱动说明书3 j5 J  o, p& A% w

6 d# U, R# N  ]# v* W& B* l实验原理0 m1 z, i. X  P) K+ }" {2 y. X3 u
串口通信: 在串行通信中,字符一位一位地传输,并且传输一个字符时,总是以“起始位” 开始,以“停止位” 结束。在进行传输之前,双方使用同一个波特率(每秒钟传输的数据位数)设置。常用的两种基本串行通信方式包括同步通信和异步通信。通常使用的是异步通信.异步通信规定传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成。* g- V6 j) ^8 N- F) J
ST Nucleo Board开发板具有通用同步异步收发器(USART),使用异步通信需两个引脚Rx、Tx,分别进行数据接收与输出。其具有HAL 库轮询,中断, DMA 三种编程模型,在本实验中采用中断模型。
% F' z! r# s1 h4 C& K+ ^- F
8 v' @) n' U' N: jADC 采集 MCU 内部温度:ST Nucleo Board开发板具有12位ADC数模转换器与温度传感器。温度传感器内部连接到ADC输入通道(ADC1_IN16),通用ADC将传感器输出的电压值转换为数字值即可得到器件的环境温度。根据STM32F4xx芯片参考手册可得温度计算公式:* v; e, B6 g# l6 \5 g
温度(℃)= [(VSENSE – V25)/Avg_Slope)] + 25' i- M$ n5 w" r* j7 y5 V

/ L5 t0 b) Q: b6 a! E4 |% d* J其中VSENSE 为传感器输出电压值,V25为25℃时的VSENSE 的值,Avg_Slope为温度与VSENSE曲线的平均斜率。根据数据手册的电气特性(如下图所示)可得V25=0.76V=760mV, Avg_Slope = 2.5Mv/℃。& [1 `( J; S4 z4 Y* p7 A
& \9 s  Q6 t, v, f0 j% k  s
N)(I7Y10VY(`~CG3QUH]WM3.png
1 y3 i! m% }) ]2 a. I+ I
6 y; q5 f% C3 z(图1. 温度传感器特性)
$ Z, q8 O, R# A6 `  Q7 w2 K) T1 ^  l6 \

1 {+ Y4 Z! F' h8 l' U+ U实验内容及步骤% f- S% D9 L% o% _  v
1. 用 STM32CubeMX 创建工程,并配置对应引脚生成Keil工程。

* O( @5 v' j) ?. r  C9 \& x  1)配置引脚
' x+ u& A/ I; q+ K$ ?
* l3 j8 g2 `8 t0 `+ D查看Nucleo Board 电路图,如下图红框所示,找到对应虚拟串口所对应的 UART引脚为PA2,PA3,并进行配置(RX 接收、 TX 发送)。 串口模式选择 Asynchronous 异步通信方式。ADC1外设选择温度传感器通道。5 C8 L7 n3 r, J6 z* F& |

# Z  O. @4 F! p9 k- m) H+ { 4(E~%Q2QTG37SAG@0Z~_N10.png $ q7 @+ v9 p% S$ I" U' K

' f8 }% e1 Z9 E0 ](图2. Nucleo Board 局部电路图)  m: Z9 F( U) r2 N! y( Z6 E' [
) ~6 U4 G0 X% l+ Y' z. ^5 G6 {: D: Z
J{M~2F87}8LF[HF(U(P1E}F.png
) i  s1 |& ]$ l2 `  H- `1 q
, x8 N6 V  D# u1 b8 E8 u  f( ~" s(图3. STM32CubeMX 工程引脚配置图(其中除PA2,PA3的其它引脚为其它实验功能需求))
! K: A1 j  ]' U# C3 T1 g! f3 E
6 J! Z$ |8 x, Z! Y1 N3 n9 \4 t9 h+ |
2) 配置引脚参数1 ?1 \0 M/ Y+ ~2 b: k! f

& C5 D8 C4 Z# x9 Z. DADC1选择默认配置,USART设置波特率为 115200 Bits/s。传输数据长度为 8 Bit。奇偶检验无,停止位1.其他参数默认。并在NVIC设置中选择中断使能。! o9 K3 w9 T. G& h4 v

0 t; l+ V5 |" c5 ^0 q# S+ w& M; o2 o O9RI[{@WL@1QS8KOYFAG}BG.png
* K/ L2 w! I( H7 ^: ?; x  h% v3 `; q, v6 t
(图3. USART参数设置)* O3 y& b; g) V6 f5 Y$ G! ?9 o# r

, A- O% h2 c! h6 w, R
0 m) X  T( r+ j1 ?3)生成项目代码4 h; W4 N6 W. g

2 ~7 y  M/ {6 J: K: t5 d8 V1 Q
- q$ o, E2 o# e7 o2 b/ M2 C/ |2. 用Keil打开生成的项目代码,增加处理逻辑代码
. O4 W* b4 `7 w# n! j     1) 首先定义发送接收数组与ADC采集的电压值AD_Value与温度变量Temp0 D! f9 M& ]) e) ^* K
9 z! u' ]) U' u! @9 V
  1. uint16_t AD_Value = 0;
    0 j/ q8 G1 ^8 F- o* b3 g/ @/ U9 B# O
  2. float Temp = 0;
复制代码

" x0 x  U8 ?; \4 \! J, w7 ?, h     2) 在主函数的while循环中打开串口接收,判断接收到的数据为11时,进行温度测量并发送测得的温度。
2 k/ l/ _6 w) T6 s; I
# I: r- k! }2 k- Q" c' t5 J& U 20190217195949991.png
2 v/ n  ^! y" ?( d
1 H& ]) `  J$ c( l/ \7 ~  3 ) 其中printf函数为重新定义标准库函数实现串口输出的。方法是将fputc 里面的输出指向串口(重定向),即需要自己添加一个 int fputc(int ch, FILE *f)函数。具体做法为:在 main()函数前面添加如下代码,4 y- p* t3 l  k

' h/ q3 g7 h9 P
  1. #ifdef __GNUC__
    $ H5 |# x' h( w, c; r, P+ Y. A

  2. $ C/ s9 {0 f) J; t) n
  3. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    1 f9 l( T$ @+ D9 P2 C3 B' n
  4. 0 c( @1 |. d' ~$ m; F* f
  5. #else
    5 x% T) j& Y$ C6 f3 V
  6. * H$ o# Y% @, e" |: t, L0 M# N0 u, T
  7. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    : ?& B3 h, l' Z6 R9 H" _

  8. 0 {$ r& i( U$ e2 ^, w1 G& f
  9. #endif /* __GNUC__ */
复制代码
$ ~: Z2 a% [9 \8 R
代码中添加了#ifdef 宏定义进行条件编译,如果使用 GUN C 编译,则 PUTCHAR_PROTOTYPE 定义为:int __io_putchar(int ch)函数,否则定义为 int fputc(int ch, FILE *f)函数。再定义 printf()函数
  1. PUTCHAR_PROTOTYPE7 r) w! J& m4 @1 B0 b+ z9 E1 z
  2. - e; [, b8 H& Z6 D0 J4 i/ g
  3. {6 k' L7 _" _4 i6 ~9 d: D
  4. 1 e% A0 s4 p# e, p
  5. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    5 h4 d9 }3 V& F9 O2 d

  6. # {+ F/ I. ~2 _1 y
  7. return ch;
      x6 a1 X2 [# P

  8. ; b( o, o/ B( F
  9. }
复制代码

/ b# k# B9 t; K* j' g  _# U3. 编译程序,用USB线连接开发板到电脑,将程序下载到板子上8 x; U# d- N/ ?3 [3 w+ _

' x, B/ t8 s- F, E
9 D1 `: h0 ~" n实验效果
  T1 I0 {* O  E+ V# l+ [$ z5 H! Z# J& X) e% S
ZIMWQXC%$MLT7W(E)KNAN]7.png * C5 z4 X1 V' m! X

8 A, z9 Y$ A' l) D9 e  z, G(图4. 实验效果图)) A3 \3 J) ~! x
. {; ~# u+ i5 O" a: z! h+ z
        在电脑上打开串口助手,选择对应串口号,设置波特率为115200,按下复位键,。通过窗口助手发送11,则串口助手回复测得的当前MCU温度,如上图所示。# v0 b' ?6 O9 Q, o% K2 \
6 z$ l/ T; U; E, Q% B, T0 U
实验感受! I: T5 R% E$ e
        通过该实验,熟悉了STM32的开发流程,也了解到使用单片机做实验的基本思路是一致的。即首先要阅读数据手册,了解其具有的功能特性与不同功能模式的相关寄存器配置;然后根据具体型号芯片的电路图进行引脚配置。/ m; Z* X5 h6 f" z: ]5 i% b9 R" ?& A. u) R
0 I2 N; h8 j; k. B; x8 V7 Q5 r9 \6 P- M
        使用STM32CubeMX软件开发为实验提供了很多便利,即配置引脚、参数等都可以在这个软件完成而不需自己用代码写,提高了开发效率,不过对其生成的代码也要看懂,一方面可以学习代码编写,一方面如果对其中的某一配置有需要修改的可以直接在编译器中对代码进行修改,节省时间。6 j: O  P' w2 m( H% ~

4 T% `9 j6 L+ G+ O9 w3 N, N% s        当使用到某一个功能的时候,需要对该功能对应的HAL库函数进行阅读和学习,因为库函数提供了大量的封装好的功能函数,可以很方便地实现实验所需功能,而不需要自己去对寄存器进行读写操作。但是有时候对一些没有封装的底层宏定义函数也可多了解,这样可以
* u+ x$ ]3 B& [$ Q. R8 z9 R0 j
1 W; S5 f, \5 ~! G4 l, H7 _& z& H# G5 L' M8 i0 [5 H% R0 X7 j
收藏 评论0 发布时间:2022-5-12 19:16

举报

0个回答

所属标签

相似分享

官网相关资源

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