|
STM32的串口应用总结 5 P6 U" I; ?4 G" _/ R4 [首先总结一下串口232,422,4853 ~$ Z) B2 B5 S3 t , M6 N# d3 J ^* _" x% V) g% ^% G9 | 串口232:可双向传输,全双工,最大速率20Kbps,负逻辑电平,-15V~-3V逻辑“1”, 3V~ 15V逻辑“0”。 * E& r! |& f# n6 o; ~. r( w. H$ V 串口422:可双向传输,4线全双工,2线单工。4 e+ e; M# t$ s8 u* g 8 _2 W6 S7 q K 串口485:可双向传输,4线全双工,2线单工,最大速率10Mb/s,差分信号,发送端: 2V~ 6V逻辑“1”,-2V~-6V逻辑“0”,接收端: 200mV逻辑“1”,-200mV逻辑“0”。 % ]. a J: |* e9 P * s* y3 C0 Z3 n/ S L. e 对于串口的实现有以两个方案:! e/ D( r7 ~/ T $ }* T' j7 d! ?9 I 3 s) l/ _* x6 O 方案一,和原子的《例说STM32》一样,首先接收,然后处理,没有消息验证处理,这样就会出现消息覆盖,消息出错后死机,无法明确区分命令,无法及时应答握手信号。方案二,借鉴uC/OSII的消息队列,进入中断服务函数之后,关闭中断,接收数据,如果没有数据接收,等待一段时间(时间和波特率有关)后开中断,出中断,然后在对接收到的数据进行处理,下面看代码: [6 M9 M+ r j; C1 h 消息队列及其初始化函数:, t8 i8 Z5 q8 I+ B" L5 M' Z u) Z
" i0 P/ u5 i2 R- H. o7 K; f ## STM32的IO口基本操作 ##
先来看下GPIO_InitTypeDef这个结构体,源代码如下: c$ G9 X \" A4 d6 n' Z U
GPIO_Pin在stm32f10x_gpio.h中有宏定义3 p9 q c5 V% K' t
GPIO_Speed是一个枚举类型的结构体,在stm32f10x_gpio.h中有宏定义:
) ~# }% F3 N! v9 V2 x7 w% _ 高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。 B% x. F. X& `8 j( B8 s& c# R \ 当然如果你要输出较高频率的信号,但却选用了较低频率的驱动模块,你很可能会得到失真的输出信号。 t% j; i2 _% L4 L2 ^3 f3 Z / U, X7 W, K7 Z* q/ x : L6 N' j/ E; r7 D) w) j0 E/ _% v 关键是,GPIO的引脚速度跟应用匹配。 3 h( F; y0 W7 N4 q. E. R+ K$ t 9 _* K# I: O6 F9 M. z% \ 比如对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。 2 ]9 n+ j& \* @$ y6 I. k" \ ) C0 r8 U1 a6 A# W2 o 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。 $ P2 V$ B" x% o GPIO_Mode也是一个枚举类型的结构体:
0 z% U" T4 m$ z* S. t7 u 3 L/ g. c. @8 [4 D7 y3 e 在使用端口前必须要开启外设时钟,在开启外设时钟前我们首先要配置好系统时钟,系统时钟的设置主要在库函数SystemInit()中完成,在启动文件startup_stm32f10x_md.s中有如下一段代码:
SetSysClock(void)函数,
m" H1 r6 L* K' r1 L, f- [ 开启或者关闭外设时钟主要由以下函数设置
|
无刷直流电机控制应用+基于STM8S系列单片机---电子书
MCSDK FOC应用详解
STM32F10xxx 正交编码器接口应用笔记 及源代码
基于STM32定时器ETR信号的应用示例
《无刷直流电机控制应用 基于STM8S系列单片机》
STM32定时器触发SPI逐字收发之应用示例
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
【STM32图书分享之九】—《STM32F 32位ARM微控制器应用设计与实践》
STM32 USB的程序,包含固件、驱动和测试用的应用程序
微信公众号
手机版