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

STM32F411【Nucleo】第六课--串口通信(基于keil5.13)  

[复制链接]
颩色四葉愺 发布时间:2015-2-4 20:33
本帖最后由 颩色四葉愺 于 2015-2-4 20:35 编辑
* l* X9 \+ K2 z
! [, ?. N1 u% j5 B9 ^7 kSTM32F411一共有三个串口,分别是串口一,串口二和串口六。这个串口折腾了好多好多天,说多了都是泪,我一开始就上串口二,没想到串口二是个坑!!!!!使劲调都调不通,最后还是放弃先,之后试了试串口一和串口六,一试就通!   ( K  O# F+ z8 g/ g; s; n+ H9 k
& q# O+ @- x" |5 @* s  k
别跟我说是不是硬件问题,或者说是不是串口二的时钟没开之类的!都不是!!!!!我调通串口一和串口六之后,试了试用stn32的专用库来试试,我擦想死的心都有,一下就成了!!!别烦我先,我一个人想静静,别问静静是谁!     为什么标准库不行!!!!请广大网友解决这个问题能发发善心告诉我,这里我奉上我调通的三个串口源码。(串口一和串口六我都写好接收中断了,串口二仅仅写好了发送的没写接收的)6 ~4 q2 s1 H" t: b1 y5 g' I; h
(1)建立工程,新建工程的步骤就不说了!请参考我之前的帖子:
; A6 F& L6 \5 p/ ~  T0 {# rSTM32F411【Nucleo】第一课--新建工程(基于keil 5.13): W! |1 z% @2 A3 g
(2)新建bsp_usart.c和bsp_usart.h
; L1 l  G/ i* I4 G0 r5 Sbsp_usart.c4 A7 ]$ i  j5 y3 N- f' _, K
  1. #include "bsp_usart.h"& \& o; T7 U4 {
  2. void NVIC_USART1_Config(void)
    $ i! f4 r3 \& x& a
  3. {
    ; T* W& V9 f' |
  4.         NVIC_InitTypeDef NVIC_InitStructure;
    ( r; E. W; j0 e. }# z3 p8 C
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);$ L2 ^' V+ M3 y; ]6 j% d
  6.         
    3 |5 y- g6 |- j5 k: ?
  7.         NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;$ }$ n3 c/ W) ?$ W/ V
  8.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
    % s% k/ y9 h! m2 j2 P& _
  9.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;# S6 o2 |+ I+ N2 ~
  10.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    ) Y5 [% M! r) ?! {9 G5 q$ x, g5 x' ], R
  11.         NVIC_Init(&NVIC_InitStructure);
    8 y6 c; s; `6 G. Q
  12. }2 @; o8 P" M8 O+ J
  13. ' |: B- e' Y) T; G
  14. void USART1_Config(void)
    + t4 Y+ d6 ]7 M4 n/ [
  15. {
    # `9 b. [* b! n; F
  16.         GPIO_InitTypeDef GPIO_InitStructure;
    $ k. [) M$ N2 O# L
  17.         USART_InitTypeDef USART_InitStructure;; f# A0 W: K! a
  18.         ' k. N2 Q3 d9 \$ q
  19.         
    9 G, E( K4 Z; C+ z( E, W" G2 ]0 E
  20.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);. B7 e# I/ `" Z) S7 |* @9 b) s
  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);9 B( Q% ~$ \* w8 a
  22.         //串口1对应引脚复用映射
      M, n; J' m. k, I0 r# s# c9 [
  23.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
    4 Q; W2 Z$ h2 E2 X0 r
  24.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    5 B8 j+ ?, Z, s' w8 j
  25.         
    / b$ t+ a, z# z3 a4 A% B
  26.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;% u  i0 [& C' i/ j6 R. }% q2 q8 _
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;& ~2 \: P: I$ N& j( l7 V
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;' f, y( a8 r4 W1 D5 n, }) m& o
  29.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    6 u& {5 X5 ~6 i+ _7 a' ^
  30.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    . O, g3 P- `6 p- G6 u
  31.         GPIO_Init(GPIOA, &GPIO_InitStructure);            
    ! S6 W3 P( A' q7 ~& S8 w
  32.                         
    & d# w9 b# c# |; Z
  33.         NVIC_USART1_Config();
    & }  P2 I3 J7 W0 V
  34. & `7 ?" k+ U6 W  t0 ?4 b0 M2 H
  35.         USART_InitStructure.USART_BaudRate=115200;
    3 T8 C) S' \; X$ F2 J- }8 O$ O
  36.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    5 Y- S. w! P8 a7 |9 D7 T! D/ Z
  37.         USART_InitStructure.USART_StopBits=USART_StopBits_1;
    : y0 i, E8 G4 ^  D
  38.         USART_InitStructure.USART_Parity=USART_Parity_No;" ^2 P! i1 X/ f) X  `0 _: C
  39.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    ' K1 G" f0 N! P% t5 [% T: u. a  @2 S
  40.         USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;% l) V5 y( z2 D% a1 [- A2 f: x: U. [
  41.         
    2 [6 `% m6 b2 y# u0 N/ o3 Z% V
  42.         USART_Init(USART1,&USART_InitStructure);
    ) W1 c" w* t5 w+ I) l% T
  43.         - F- z1 n4 m( f& w
  44.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);5 ^' c( T. \) v3 F2 L9 C2 ^3 J, c5 f
  45.         
    7 a, c8 H! o* ?( U& X1 w
  46.         USART_Cmd(USART1,ENABLE);        % ~9 k8 d' M2 ~: L" V7 [/ L
  47. }
    - P5 L" J: a* _# X9 ]# H) _9 z
  48. /// 重定向c库函数printf到USART1
    * v2 {* q3 n6 K8 b. w
  49. int fputc(int ch, FILE *f)
    ; s. ?' h( |% x8 |
  50. {, G9 b0 Y: I! U& F
  51.                 /* 发送一个字节数据到USART1 */5 N* w9 Z4 c7 ?( Y
  52.                 USART_SendData(USART1, (uint8_t) ch);
    + q+ t4 j6 A5 S9 O$ h/ k
  53.                
    . |5 Z' z# f2 X+ o$ u
  54.                 /* 等待发送完毕 */
    & w& T: Q* p* H7 d% S
  55.                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);                : M7 b3 O$ B3 u
  56.         $ l1 b& E5 Q6 ~* z+ _
  57.                 return (ch);" }7 _) }* x$ Q: @: y
  58. }
    , d; C$ `4 A6 H8 r: E" R( R% B
  59. 8 d  k4 B8 P4 w" p6 M; E
  60. /// 重定向c库函数scanf到USART1
    , l& M9 D4 @& |/ j( T
  61. int fgetc(FILE *f)3 d1 Y2 }8 c9 S4 C! [7 [
  62. {
    ) H2 r" P6 w' o0 F+ i3 C% F
  63.                 /* 等待串口1输入数据 */
    ( p; ]  c) S  D# M& o4 d
  64.                 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    * V. n# v1 I$ x. s4 F* }

  65.   F0 \+ L6 r! q- ~6 }0 Q/ c
  66.                 return (int)USART_ReceiveData(USART1);
    - O/ `6 X" ]1 i; Y- i. V) k
  67. }1 P* `9 M2 @  W' j3 u
  68. /*********************************************END OF FILE**********************/
复制代码
: g7 j% G9 |) f& n
bsp_usart.h. I7 Q7 W, [+ j9 T8 U
  1. #ifndef _BSP_USART_H_
    8 o* N& l% x- E2 I
  2. #define _BSP_USART_H_
    0 p; f6 u# `5 v0 C
  3. / F1 l% V2 x% g
  4. #include "stm32f4xx.h"
    2 `- U, _7 e( ^9 Y7 Q/ T. C, a
  5. #include <stdio.h>
    8 Q. @7 J1 V! d1 m0 {
  6. void USART1_Config(void);
      W, a% h" |6 G% U! ~
  7. #endif
复制代码
1 r9 k1 O* C$ J8 ?3 H
(3)修改stm32f4xx_it.c
9 n7 |& e; Q* c, L( c) J
  1. void USART1_IRQHandler(void)3 b9 s9 A- ~) x3 f/ w# b5 o) A
  2. {& }$ r" C: {! i% X1 o
  3.         char c;
    , V0 C  k8 B  _! v. k
  4.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    9 [0 s( A9 p$ [( |  Z. L
  5.         {
    ( }* G, ]% o. ~4 i7 f
  6.                 c=USART_ReceiveData(USART1);6 O0 P2 f* g  e+ d1 `% F
  7.                 USART_SendData(USART1,c);
    : l, I' [$ t4 p9 z
  8.         }2 x) W' k) i: p' |% P8 ]9 y
  9. }
复制代码

" Y2 X+ J( N# y2 k) W- h6 P( ~0 K编译下载后利用USB转串口下载器进行通信(大家可以利用市面上的开发板的串口部分),打开串口助手后,给板子复位后- d$ w, u9 I8 g( L2 i# s# ~
QQ截图20150204201823.png
+ @: e1 I* x. p; B2 }3 j% M8 y' z! R- y
% |! e% D# p( b( T' l% w
9 r, T: W! o8 O# {
温馨提示,如果你要用串口二则板子的A2 和A3外引接口是没有跟MCU链接的   不过ST-link中的RX ,TX就是连上MCU的串口二的  我们也可以往这连!
' d. r* b2 W3 S$ V7 s2 X QQ截图20150204203031.png
  i8 N" d5 r6 D3 G- F QQ截图20150204203138.png
" M7 g9 z) O1 X 串口1.zip (8.55 MB, 下载次数: 2229)

评分

参与人数 2 ST金币 +4 收起 理由
舍与得 -1
努力的人 + 5 赞一个!

查看全部评分

赞 1 收藏 8 评论60 发布时间:2015-2-4 20:33

举报

60个回答
湛无双 回答时间:2015-2-5 10:13:49
颩色四葉愺 发表于 2015-2-4 22:14
2 |+ d7 X2 [$ {/ Y, k标准库写的  还是HAL库   我用HAL库写的也没问题啊   用标准库写的就出问题了 ...
9 a/ @6 V7 ^" J! |9 {
你看吧 这个是我已经用串口二成功的了USART2的例程 硬件保持刚回来的样子 不用修改任何地方即可 附件后缀改7Z后解压
  W5 @1 P+ |4 F- p! G9 A

Nucleo411UART2.zip

下载

251 KB, 下载次数: 577

湛无双 回答时间:2015-6-12 10:07:08
本帖最后由 湛无双 于 2015-6-12 10:08 编辑
$ q4 \( d$ d4 W8 e2 k' \
Yarcl 发表于 2015-6-10 22:25
! K0 \! r# y6 V7 s* E9 w3 a2 S请问下,这个板子能不能直接用下程序的串口来输出数据呀?需要外接USB转串口的转换器么?谢谢!! ...

! S- M$ |" ^; X- Q如果是下载程序的串口 那么就可能你是说的用串口一了,答案是可以的,这样你就的外接一个USB转串口的东西了,其中串口一对应的引脚是PA9(TX),PA10(RX)。如果你的意思是使用那个板子上的下载器所虚拟出来的串口,那么就不能这么做了,下载器上所使用的串口是串口二,串口二对应的接口为PA2(TX),PA3(RX)。) d$ Y% H  f6 y2 w- @' [
然后我这里有一个工程,你可以直接选择下载进去,串口使用起来很方便的,就好像C语言里面的printf一样,举例:printf("Hello STM32 Nucleo!"); 就通过串口二向电脑输出了Hello STM32 Nucleo!

Nucleo411Model_后缀改7z.zip

下载

251 KB, 下载次数: 148

wolfgang 回答时间:2016-4-14 17:46:30
STM32F411一共有三个串口,分别是串口一,串口二和串口六。这个串口折腾了好多好多天,说多了都是泪,我一开始就上串口二,没想到串口二是个坑。/ x0 x. `( r) ~+ p

' Y  [! U; u& F; Q8 H串口二也不完全是坑,可以用的,我用串口2很久了。
- {4 @' J6 a7 S# \: ^6 s1 a2 V; |' |5 T看看你的ST-LINK什么版本,建议升级到最新的ST-LINK V2-1  在电脑里有一个虚拟串口,或者用TTL转USB串口连接也能实现的。
" _; p& i/ h9 w3 h6 t7 y5 {3 s3 f
wu1169668869 回答时间:2015-2-4 21:10:09
针对板子特性写的!!!
& n5 `2 c. V; s& L  W1 q支持一下
湛无双 回答时间:2015-2-4 21:29:10
我的用串口二就可以成功呀!!! 可能是楼主配置什么有问题吧!
颩色四葉愺 回答时间:2015-2-4 22:14:18
湛无双 发表于 2015-2-4 21:29! }3 m1 T2 O1 \  @( p- l
我的用串口二就可以成功呀!!! 可能是楼主配置什么有问题吧!

( m1 h0 \6 P, Z标准库写的  还是HAL库   我用HAL库写的也没问题啊   用标准库写的就出问题了
lkl0305 回答时间:2015-2-4 22:50:03
多谢分享
lovemcu123 回答时间:2015-2-4 23:00:41
图文并茂,赞一个,总结的很不错!
颩色四葉愺 回答时间:2015-2-5 13:55:31
湛无双 发表于 2015-2-5 10:133 d6 Z2 r4 E4 k% v3 k
你看吧 这个是我已经用串口二成功的了USART2的例程 硬件保持刚回来的样子 不用修改任何地方即可 附件后缀 ...
* V4 B' t* o7 N
好像找到原因了。我再研究研究   谢谢你了
湛无双 回答时间:2015-2-5 21:43:58
颩色四葉愺 发表于 2015-2-5 13:55
% {3 e; W( u- I' }; D( n1 z好像找到原因了。我再研究研究   谢谢你了

0 W1 q2 ?4 P! G% X# K没事 能用就行了 嘿嘿 相互学习。。。
星辰一方 回答时间:2015-2-6 21:30:25
还没学到USART,感谢分享!
damiaa 回答时间:2015-2-6 22:39:50
好,不错。找到问题就好。
mlxy123xy 回答时间:2015-2-6 23:39:30
哪有F411。。。羡慕中。。。。
大浪10010 回答时间:2015-6-2 12:41:34
硬件需要改动吗,问什么printf不能执行,,,
大浪10010 回答时间:2015-6-2 12:41:49
硬件需要改动吗,问什么printf不能执行,,,  ,,
颩色四葉愺 回答时间:2015-6-9 17:41:18
大浪10010 发表于 2015-6-2 12:41+ y/ |; e/ S2 U! t6 V
硬件需要改动吗,问什么printf不能执行,,,  ,,
4 }6 Y; K/ d, i( }" y
是软件上printf不能执行,还是软件编译烧写了但是串口没接收到数据?  如果你用到串口二那样硬件上要改动一下,如果是软件上printf不能执行,那可能你没有勾选使用USB MicroLIB这个选项
12345下一页

所属标签

相似技术帖

官网相关资源

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