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

【经验分享】STM32 USART 串口简单使用

[复制链接]
STMCU小助手 发布时间:2022-1-31 15:00
使用查询方式的USART:
设置时钟:
RCC_APB2Periph_AFIO  功能复用IO时钟: e# z( A: U' }! N2 \
RCC_APB2Periph_GPIOA  GPIOA时钟
RCC_APB2Periph_USART1 USART1时钟
你可以用 * V4 H9 [( c9 i9 p, }% J! U
//使能串口1,PA,AFIO总线  RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);
或直接
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB2外设时钟开启
注意USART2的你开启为 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
设置GPIO:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;+ [5 g& ~+ i* z/ i
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! H/ e* H# D) {, F! }3 |
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出-TX
: v% F# v) V- N/ n9 y$ p8 AGPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;5 z# [4 w' ~% _; X, M
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX! R! f7 ]( n4 X
GPIO_Init(GPIOA, &GPIO_InitStructure);
设置USART:
这里我用的是3.0的库相对于2.0的库来说多了一步,先说2.0
USART_InitTypeDef USART_InitStructure;
USART_StructInit(&USART_InitStructure); //装填默认值
USART_Init(USART1, &USART_InitStructure); //根据USART_InitStruct中指定的参数初始化外设USARTx寄存器0 s: |+ x" e4 G/ A( T, s, {7 n
USART_Cmd(USART1, ENABLE); //启用
就好了~!
而3.0的库需要
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;
USART_StructInit(&USART_InitStructure);5 w' d1 T* C9 a# C& I- ^. [9 E
USART_ClockStructInit (&USART_ClockInitStructure);( q) a- U  x; ~+ A
USART_ClockInit(USART1, &USART_ClockInitStructure);
( C9 ?: @' K, g5 A7 W$ sUSART_Init(USART1, &USART_InitStructure);
' o/ q9 `* }' G2 w; {- nUSART_Cmd(USART1, ENABLE);
//只是多分出了1个 USART_ClockInitStructure 我也不知为啥要这样??为了同步异步模式?USART_InitStruct中指定的参数内容为:(2.0的)
typedef struct
# U( j6 b  A: U3 p6 I{
6 x. `4 ^, g' o  k4 e, iu32 USART_BaudRate; //USART传输的波特率
+ ?. z  T: e% zu16 USART_WordLength; //一个帧中传输或者接收到的数据位数通常是8& Y% u; H9 p8 G% _& x& t
u16 USART_StopBits; //停止位, |  T5 V2 r+ X" V4 ~( X/ m
u16 USART_Parity; //奇偶校验
9 Q1 {/ |3 y/ Z% h( w& C' Bu16 USART_HardwareFlowControl; //硬件流控制模式使能还是失能
; a7 F+ m; J# n; Zu16 USART_Mode; //指定了使能或者失能发送和接收模式
+ r* @* n  W7 }u16 USART_Clock; //提示了USART时钟使能还是失能6 N4 h8 ?4 H. c5 y8 j
u16 USART_CPOL; //指定了下SLCK引脚上时钟输出的极性
! i* @: c$ r" z; {! Qu16 USART_CPHA; //指定了下SLCK引脚上时钟输出的相位
6 `/ i/ O3 p5 g. ?7 N+ d0 [9 qu16 USART_LastBit;
//来控制是否在同步模式下,在SCLK引脚上输出最后发送的那个数据字通常用USART_LastBit_Disable$ q6 W. D, F) V2 ~7 W/ s
} USART_InitTypeDef;
我靠~!太细了~!我只知道(9600,8,n,1)这就够了 其他的统统默认~!
USART_StructInit(&USART_InitStructure);
6 l* y$ C+ M$ L7 j! @' R' gUSART_ClockStructInit (&USART_ClockInitStructure); //2.0不用这句,这样就设好了好了~!自动为您装填了默认参数。默认的参数如下(3.0的库):
void USART_StructInit(USART_InitTypeDef* USART_InitStruct)- A  b" M( D! j4 |
{
* y  I9 M) ?( n: C2 t4 jUSART_InitStruct->USART_BaudRate = 9600;
# Q$ w) W9 a6 _USART_InitStruct->USART_WordLength = USART_WordLength_8b;5 u0 ~; ~+ A/ R# H* a+ l
USART_InitStruct->USART_StopBits = USART_StopBits_1;. `8 f; E9 E1 r0 w5 {8 X- R
USART_InitStruct->USART_Parity = USART_Parity_No ;
- ~% S$ F7 C; G% v5 mUSART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;+ D* {  c2 a( w/ u! V% I; ]* F
USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None; 4 ]! T- ^7 q# m2 E$ _# Q
}
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct)3 r# t- v9 O9 H4 }3 p1 N
{
! ?5 H% {' }; Q0 D9 ?5 kUSART_ClockInitStruct->USART_Clock = USART_Clock_Disable;6 a7 y  R5 Q8 S" K8 S
USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;
  Q! @! v" i8 \+ t- ^: C$ qUSART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;
; O1 L8 D7 G( H6 f' H, ]2 UUSART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;0 h! T  C! P" r
}
/************************************************************************************************/
当然了你也可以自己设参数,比如这样。
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
; v2 H, m7 O" W& rUSART_ClockInitTypeDef USART_ClockInitStructure;
USART_InitStructure.USART_BaudRate = 9600;
% _; S: S6 t+ qUSART_InitStructure.USART_WordLength = USART_WordLength_8b;
2 o0 w, l2 s( l. n  aUSART_InitStructure.USART_StopBits = USART_StopBits_1;
. S7 [, m5 J2 z: E* uUSART_InitStructure.USART_Parity = USART_Parity_No;
7 \. a0 b; h( DUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;$ {( h( w3 _7 y
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;8 t9 N* K  c* g3 M
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
& _% |3 O- ^+ J& P* o4 p& IUSART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
' f% |/ B( a$ Y3 H( rUSART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
3 ^* \" ?6 x/ O' EUSART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
USART_ClockInit(USART1, &USART_ClockInitStructure);
. Y$ E% o+ t: S- J6 kUSART_Init(USART1, &USART_InitStructure);
USART_Init(USART1, &USART_InitStructure);
USART_ClockInit(USART1, &USART_ClockInitStructure);
% R$ s( t% c* V+ R1 r0 X1 I: rUSART_Cmd(USART1, ENABLE);
} ////USART_ClockInitStructure.USART_CPHA= USART_CPHA_2Edge;除了这句以外其他的都和默认的参数一样,二者有啥区别我至今也不太清楚但就一般的应用来说两个都可以正常工作。
收发的方法:
1.发送
void USART1_Puts(char * str)
  J! d# a" A/ K& `$ i{$ V1 z# q" l- d9 f
while(*str)' s/ l$ w- j2 X
{
& s5 V$ x4 C* }& w/ `: v, _USART_SendData(USART1, *str++);
+ y+ S  `+ K$ X3 X. z. ewhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);& @0 ~  s, R' b5 ]; L
}2 n9 b! Z& _7 Y% b7 G+ i
}
USART1_Puts("hello-java~!\r\n"); //这样就发送了hello-java~!
跟C语言的printf不太一样在于\n 并没有另起一行要用个\r这样在终端上好看。
2.接收
u8 uart1_get_data; //存放接受的内容
while(1)
{
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)% f. ]4 L/ X3 l0 B; d' u' Z) |
{
* m9 m9 e2 v& m: T" c3 xuart1_get_data = USART_ReceiveData(USART1);' [, \4 D5 N" {% H& k; K; v
USART1_Puts("\r\n获取到串口1数据:");
" G  x; j% C/ t  JUSART1_Putc(uart1_get_data);  L4 a3 s+ z" E% r  \' z9 o
USART1_Puts("\r\n"); 8 f& b0 I; d5 |& L8 n+ B
}
}
查询法的可以看出要不断扫描不是很好,下面介绍中断法。
首先配置时钟:这里我拿USART2说事:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //USART2和USART3都在在APB1上而USART1是在APB2上的
设置GPIO:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO |ENABLE);
// A2 做T2X( g& y% m" D: ?' H9 W
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
8 z! t7 u8 ~7 }. _7 [6 FGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. I! w' H! \0 Z  I; O% Z
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
7 A  |; G& W$ W2 w; V# g  fGPIO_Init(GPIOA, &GPIO_InitStructure);
// A3 做R2X7 h; j! q9 U+ w: p0 ]" U
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
1 V/ T% Y2 k# A# ?: W* d( ~GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- _1 R6 ~; u& d5 K; kGPIO_Init(GPIOA, &GPIO_InitStructure);
配置SUART2:
USART_InitTypeDef USART_InitStructure;
% F1 ?4 Y/ Z6 z! @  W9 SUSART_ClockInitTypeDef USART_ClockInitStructure;
USART_StructInit(&USART_InitStructure);2 m  ]/ S! @( r  \) z1 i3 p) j
USART_ClockStructInit (&USART_ClockInitStructure);5 @! M2 o+ @5 u
USART_ClockInit(USART2, &USART_ClockInitStructure);8 V+ g9 J9 M! {3 f; W, e4 H3 h
USART_Init(USART2, &USART_InitStructure);
1 @  }9 y. q$ I( o9 r9 v0 OUSART_Cmd(USART2, ENABLE);

' A" |/ c0 G$ g0 z7 b# w: F3 k
赞 收藏 评论0 发布时间:2022-1-31 15:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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