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

【学习经验】STM32笔记之八:来跟PC打个招呼,基本串口通讯

[复制链接]
ashantx 发布时间:2015-5-15 22:49
sw笨笨的STM32笔记之八:来跟PC打个招呼,基本串口通讯
1 D; _) @- q( [( n' o# H4 M$ z/ \' }# k8 @$ v$ ]4 C0 W3 ~
a)        目的:在基础实验成功的基础上,对串口的调试方法进行实践。硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中。
; D( E) P" o! G& S5 j: m, ^% K( Z0 x# Wb)        初始化函数定义:+ b) V% I# z; L3 j
void USART_Configuration(void);        //定义串口初始化函数4 [; d" V" j' }1 [
c)        初始化函数调用:
4 O: [' e0 h* |, z4 Uvoid UART_Configuration(void);        //串口初始化函数调用# z- }5 @) L' U2 f" \- t
初始化代码:
9 ]8 L) K3 d( A- Y, |/ t! Fvoid USART_Configuration(void)                        //串口初始化函数8 @" B/ }! x% f# J
{. X  @9 D( v- X' O0 A; W9 @
//串口参数初始化  % [0 @. m* m0 o3 v
  USART_InitTypeDef USART_InitStructure;              //串口设置恢复默认参数; {' `7 g! Y  r/ A
//初始化参数设置8 m7 B% O& ]+ M, b4 ]
  USART_InitStructure.USART_BaudRate = 9600;                                     //波特率9600
8 M$ M- }* K4 w# |2 U/ P   USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //字长8位
: P& ?! [  U8 U6 D! |  USART_InitStructure.USART_StopBits = USART_StopBits_1;                 //1位停止字节
7 R% l# X9 Z' `7 g9 k7 e3 f  USART_InitStructure.USART_Parity = USART_Parity_No;                      //无奇偶校验
, R6 T) U2 Z  `& w$ j  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
# z  ^2 k8 j8 M$ N1 d+ A: a  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能. T. N3 z! @2 w3 F8 E! E
    USART_Init(USART1, &USART_InitStructure);                                         //初始化9 z, F* S9 e" d7 y6 i
  USART_Cmd(USART1, ENABLE);                                                          //启动串口
; _- J, \% v( x0 L}
- a( h' ^, K- x4 t% r/ [5 yRCC中打开相应串口0 J% B' R% G, B5 q
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);( T$ O# Q9 v2 a6 L
GPIO里面设定相应串口管脚模式
* O6 B" k7 j9 v+ _$ |" P! P* W7 d//串口1的管脚初始化  9 Y, _; K# d# H2 |% Z
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                        //管脚9
1 ?! A6 B8 V% ^1 i2 i    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出7 Q2 o6 H8 j9 U% a5 T, _  v6 a+ G
  GPIO_Init(GPIOA, &GPIO_InitStructure);                               //TX初始化$ f4 a1 T$ X( g' H7 y
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                    //管脚10
' w4 C6 i7 v+ t& s( y' v    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
+ s6 Q' @3 G( Y9 X* l& g  GPIO_Init(GPIOA, &GPIO_InitStructure);                             //RX初始化
9 u0 g8 s- s' m; w# Pd)        简单应用:6 z" \6 d; A$ c" c' G  b
发送一位字符
( d& q; l" t/ m) L$ R' {* X. LUSART_SendData(USART1, 数据);                //发送一位数据
$ i/ E( T0 @; ^, b( S$ awhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}                                                                                        //等待发送完毕; G1 |  b6 q8 e& t6 {* ~& g
接收一位字符
/ w4 A( N7 p! y- ^5 Hwhile(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}                                                                                        //等待接收完毕  B  d4 C; y" M: J8 s5 a
变量= (USART_ReceiveData(USART1));        //接受一个字节
  r8 u8 b, W; K$ V8 l: n2 ~$ E发送一个字符串
2 c& K8 b% M5 o+ ?* A# T    先定义字符串:char rx_data[250];
/ f: a/ D8 c2 u- \1 O/ U, q      然后在需要发送的地方添加如下代码
6 S, a4 f9 E) i: v0 Z  int i;                                                                     //定义循环变量
0 |' y* X1 E$ K# m# g/ ^    while(rx_data!='/0')                                           //循环逐字输出,到结束字'/0'8 S' d9 k- s  ?2 |
    {USART_SendData(USART1, rx_data);            //发送字符* @! a5 z9 s) B( }2 ?' u4 c# f) v
     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待字符发送完毕
. ^2 l! m" j" M) ^  {- p     i++;}! g) T( M, ]2 C" X/ b- S
e)        USART注意事项:
3 ^/ F  B) y6 d! J4 D7 _发动和接受都需要配合标志等待。5 p, w' ?- k7 w# {: {4 n' |
只能对一个字节操作,对字符串等大量数据操作需要写函数
+ Z/ T' H5 |# \0 V使用串口所需设置:RCC初始化里面打开RCC_APB2PeriphClockCmd
+ x" |. `3 w+ \, [- b9 E$ ^(RCC_APB2Periph_USARTx);GPIO里面管脚设定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);. }! @" y. D/ _! l# y, Z* c. r
f)        printf函数重定义(不必理解,调试通过以备后用)  Q, l# @+ `* i) Z: t/ m$ C8 B
(1)        需要c标准函数:
: d5 O# J/ }) H#include "stdio.h"* L! }! u! e9 q+ N
(2)        粘贴函数定义代码6 v3 u* H( E) ?' P- F
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  //定义为putchar应用
5 e% {! M; U3 o9 n; C(3)        RCC中打开相应串口
5 ^, d( D0 i2 d% t) g  |9 P4 R9 V& t0 _(4)        GPIO里面设定相应串口管脚模式8 [4 l! j/ B5 H; t
(6)        增加为putchar函数。
* c6 f* d5 u5 [2 z& x. \6 Nint putchar(int c)                                              //putchar函数: S7 w& O) V+ L2 J% B
{
  A2 w4 j/ h" y+ I( R0 M  if (c == '/n'){putchar('/r');}                                //将printf的/n变成/r
8 c9 }3 s' a/ H' I0 Q; S  USART_SendData(USART1, c);                                    //发送字符
) s; i4 ]. F( ^, {9 h! {  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束
2 H5 @0 }  D4 l5 T  ~- ]* d% y6 h  return c;                                                     //返回值+ L3 B5 N1 R/ T0 C2 e" ^
}* w' b2 }! \% q7 o9 @: _9 t
(8)        通过,试验成功。printf使用变量输出:%c字符,%d整数,%f浮点数,%s字符串,/n或/r为换行。注意:只能用于main.c中。( w5 G; b0 w4 K/ o# q
3、        NVIC串口中断的应用
) N8 \# B( f3 J6 u0 Wa)        目的:利用前面调通的硬件基础,和几个函数的代码,进行串口的中断输入练习。因为在实际应用中,不使用中断进行的输入是效率非常低的,这种用法很少见,大部分串口的输入都离不开中断。
! F3 |0 L3 O  e/ t+ lb)        初始化函数定义及函数调用:不用添加和调用初始化函数,在指定调试地址的时候已经调用过,在那个NVIC_Configuration里面添加相应开中断代码就行了。! m: d2 @& z3 h! u
c)        过程:/ e& ?, L4 F  [' R- z3 |
i.        在串口初始化中USART_Cmd之前加入中断设置:
% A7 q6 u* b) O! kUSART_ITConfig(USART1, USART_IT_TXE, ENABLE);//TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个。7 J: t. J: e8 F# b+ m
ii.        RCC、GPIO里面打开串口相应的基本时钟、管脚设置
3 |' B1 D2 R$ \/ k: ~7 Yiii.        NVIC里面加入串口中断打开代码:0 U$ t5 |2 b4 z4 j
NVIC_InitTypeDef NVIC_InitStructure;//中断默认参数
$ c+ @1 C# C! c9 r1 X( q. U2 iNVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;//通道设置为串口1中断. s  F. y% K* _+ D8 l5 F' p  h
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   //中断占先等级0. y8 n4 b, h( l5 J2 N. @6 B
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;              //中断响应优先级0" o/ i. U1 W/ f' y) k+ _
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //打开中断8 Y7 f) b, E; g6 h; Y4 X
NVIC_Init(&NVIC_InitStructure);                                                //初始化, c) I) B0 q2 n) ^# m
iv.        在stm32f10x_it.c文件中找到void USART1_IRQHandler函数,在其中添入执行代码。一般最少三个步骤:先使用if语句判断是发生那个中断,然后清除中断标志位,最后给字符串赋值,或做其他事情。* Z- r" T5 W4 Y+ C) B) `
void USART1_IRQHandler(void)                              //串口1中断. L5 K) L: J' Q8 p1 N4 w
{
5 ]/ F$ ]0 p) ^3 g' X1 pchar RX_dat;                                                          //定义字符变量
3 y5 G9 U- w8 h  o2 E, H% B& u' U5 Y& M
  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //判断发生接收中断1 H- }1 @$ Y1 [+ G# O% ^; A; w
  {USART_ClearITPendingBit(USART1,  USART_IT_RXNE);          //清除中断标志
" F- h# \' q+ f
5 Z8 k  X0 k* D  `3 ]% s, M- O5 b   GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)0x01);             //开始传输
; P& O: j% m; o, X   RX_dat=USART_ReceiveData(USART1) & 0x7F;                       //接收数据,整理除去前两位
& R5 V1 J. R: x. i   USART_SendData(USART1, RX_dat);                                       //发送数据
6 N; \6 N: |2 T/ V+ W   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}//等待发送结束
; P4 ^$ m3 O) b  g$ i3 s: z. M  }
4 P8 {$ p, }, ~  k; I}
9 @, z7 d4 X  R7 r& h3 H6 b% {7 J+ ?d)        中断注意事项:
! z% p8 I; I$ Y  ~8 J1 t' R, {可以随时在程序中使用USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来关闭中断响应。( O# K& U5 _& M3 E3 Q+ w7 G
NVIC_InitTypeDef NVIC_InitStructure定义一定要加在NVIC初始化模块的第一句。
6 V  _0 M& H! ~( [: }" _, J全局变量与函数的定义:在任意.c文件中定义的变量或函数,在其它.c文件中使用extern+定义代码再次定义就可以直接调用了。$ ]8 O7 w  `8 e/ F

4 k' D) j) l" L5 d! [$ N. e
赞 收藏 评论8 发布时间:2015-5-15 22:49

举报

8个回答
lkl0305 回答时间:2015-5-15 23:34:26
多谢分享,有没有最新的库教程啊
mark0668 回答时间:2015-5-16 00:05:41
谢谢分享
Lovely_STM32 回答时间:2015-5-16 07:39:39
谢谢分享!
巧子儿 回答时间:2015-5-16 08:32:45
这个需要学习
巧子儿 回答时间:2015-5-16 08:41:38
写的很详细,学习了
为什么是EEFOCUS小白 回答时间:2015-5-16 08:50:37
谢谢分享
leo121_3006061 回答时间:2015-5-16 13:42:30
谢谢分享
魅影迷踪 回答时间:2015-5-20 08:55:53
串口是最基本外设

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版