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

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

[复制链接]
颩色四葉愺 发布时间:2015-2-4 20:33
本帖最后由 颩色四葉愺 于 2015-2-4 20:35 编辑 $ N, U) S5 w- F2 X! W
. a9 t8 ^- i4 q& l7 I; x1 }
STM32F411一共有三个串口,分别是串口一,串口二和串口六。这个串口折腾了好多好多天,说多了都是泪,我一开始就上串口二,没想到串口二是个坑!!!!!使劲调都调不通,最后还是放弃先,之后试了试串口一和串口六,一试就通!   
# o$ K3 V9 A: Z' n! G/ G6 f: w+ ^& i- P, D) K, \0 s
别跟我说是不是硬件问题,或者说是不是串口二的时钟没开之类的!都不是!!!!!我调通串口一和串口六之后,试了试用stn32的专用库来试试,我擦想死的心都有,一下就成了!!!别烦我先,我一个人想静静,别问静静是谁!     为什么标准库不行!!!!请广大网友解决这个问题能发发善心告诉我,这里我奉上我调通的三个串口源码。(串口一和串口六我都写好接收中断了,串口二仅仅写好了发送的没写接收的)
* o; ~5 T5 K6 ?) \0 R(1)建立工程,新建工程的步骤就不说了!请参考我之前的帖子:" I7 v. [# u2 y! X: T
STM32F411【Nucleo】第一课--新建工程(基于keil 5.13)( ]- X1 W. e2 d
(2)新建bsp_usart.c和bsp_usart.h* J! m" k$ g, a/ Q# h8 Z1 W
bsp_usart.c/ c' X, w0 J! E5 \8 s
  1. #include "bsp_usart.h"
    6 x/ a+ {0 M, F7 o
  2. void NVIC_USART1_Config(void)! H$ j/ U6 v9 y  n% f2 k9 Z* P
  3. {: y' l. o) g: d9 r! g# m# S3 K& O
  4.         NVIC_InitTypeDef NVIC_InitStructure;
    % h1 \3 r9 B; `9 w) v3 _
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);- e, q/ j; V$ a/ B" J6 k  ]
  6.         
    + e6 N- r& q6 N3 b/ q7 T2 M
  7.         NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
    ) ?! }( ^+ [; H/ ~
  8.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
    ) p: o# B' Y7 T4 c2 @8 n- g
  9.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;1 W- C5 y2 G! n0 V
  10.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;* A1 k/ ?) y, z1 }. X
  11.         NVIC_Init(&NVIC_InitStructure);
    " i/ u2 t2 E3 \$ k6 ^' ^
  12. }/ a, q- Z6 S1 u, R+ A

  13. 1 p; j9 H# h% w6 T2 N. K: F
  14. void USART1_Config(void)0 A& m$ x. H4 g) s; e0 k
  15. {
    / U8 V5 }) G  M4 v+ L: |
  16.         GPIO_InitTypeDef GPIO_InitStructure;6 Z3 s) w' r$ w
  17.         USART_InitTypeDef USART_InitStructure;
    4 j1 q9 Y* u. q( }; c
  18.         ' H) o) e* E. I3 }& Q& J
  19.         ; c) S8 |: y9 e$ u
  20.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);5 G5 Q% j( D4 [" j
  21.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);* H$ i) x7 c5 `3 e! ]  `# o7 R. c
  22.         //串口1对应引脚复用映射
    " ~- O# C+ t# U: P- U5 y
  23.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); $ }- \. d" V2 q6 ]4 ~1 K" J
  24.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    4 `% u7 g* u9 K6 S
  25.         ' a9 o; e1 @0 t0 r3 E# w8 L
  26.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
    , y% v6 n% \& B
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;8 @4 L2 A! w/ Q3 J. L
  28.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 c: X; A# d7 L7 T( b  f' [
  29.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;( p4 `7 c; I2 N3 W
  30.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    / R' D+ o- V6 w* z, Y8 K
  31.         GPIO_Init(GPIOA, &GPIO_InitStructure);            
    5 c9 T$ w& ]+ v
  32.                         / i3 Z' s$ ]; H% ?. s2 w7 _
  33.         NVIC_USART1_Config();
    , z8 ?2 E  j: o9 P8 e- u4 l3 O9 m

  34. 3 y- u9 t. Q  R! O. K) j% L+ ^
  35.         USART_InitStructure.USART_BaudRate=115200;" ]0 R& Q: r5 @0 A4 U4 h. J. r# W
  36.         USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    * _7 x2 q% d1 O  `% x5 G
  37.         USART_InitStructure.USART_StopBits=USART_StopBits_1;; c. q5 \3 {" s
  38.         USART_InitStructure.USART_Parity=USART_Parity_No;. N8 Z* B; ?7 S" M& O( D
  39.         USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    . M) [3 g: V- z0 Z6 s
  40.         USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;8 g( c3 p2 \3 ~2 M. q3 L- {
  41.         
    ) `- y4 Q  y$ D; l% A  J6 g+ j% y+ G
  42.         USART_Init(USART1,&USART_InitStructure);
    $ D7 W% q9 [, f* n
  43.         2 `. `! m2 `1 z. s3 N) Q9 I
  44.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    2 w4 q9 c6 I/ Z* g8 i
  45.         9 d9 u0 N4 L( j9 k8 L( P
  46.         USART_Cmd(USART1,ENABLE);        * p9 V( d& h. A2 p% ?
  47. }2 K$ \) O1 H% y9 h5 @
  48. /// 重定向c库函数printf到USART18 s; `2 H% P- j  R; ~3 A6 o
  49. int fputc(int ch, FILE *f)
    . s& ?, `$ V: k6 o5 f9 ^5 p
  50. {9 y5 O0 J7 L4 v( G
  51.                 /* 发送一个字节数据到USART1 */' }7 ^) O! o0 l- I- M
  52.                 USART_SendData(USART1, (uint8_t) ch);
    5 r( h0 k, J0 G, u# N9 H3 L, I
  53.                
    - g4 k/ \  C! i* G
  54.                 /* 等待发送完毕 */  o; l# G4 E+ b- t
  55.                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
    , t$ ^! p, w8 k: u" T, W+ r. [+ D  w
  56.         6 V& u) u! k0 J
  57.                 return (ch);
    # G1 I' d- R6 E
  58. }
    4 d6 Z5 U4 A$ N9 i  E9 X

  59. ; [! b8 x0 g9 {% p' f  X
  60. /// 重定向c库函数scanf到USART1
    5 ]9 H" v7 p: r0 ]2 c( ^/ O6 S' T
  61. int fgetc(FILE *f)
    ; K7 r, e- I, t
  62. {
    & r4 ]5 j, Z) L
  63.                 /* 等待串口1输入数据 */
    2 {! j: |! r2 v, l+ _" V- T2 s
  64.                 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);3 o% Y% b! j  v& g

  65. 7 H' p" P, n% {8 }( |" G
  66.                 return (int)USART_ReceiveData(USART1);( @$ e, N9 a0 ]: I
  67. }
    ) }- P: M" w+ j4 ]* H" w0 p
  68. /*********************************************END OF FILE**********************/
复制代码

! Z3 r5 d' L( D0 }3 j' jbsp_usart.h
8 {2 r. e; _3 }: D8 a
  1. #ifndef _BSP_USART_H_2 \3 x, L# I9 }5 v& m  h- a
  2. #define _BSP_USART_H_
    ( T* I) }8 b# P' @) F
  3. 4 |$ V, [6 C6 w% `
  4. #include "stm32f4xx.h"
    " S" P3 [5 H6 a6 K8 a: s
  5. #include <stdio.h>8 K, J5 u: @- K4 @" h& D1 L
  6. void USART1_Config(void);2 I4 G; G  S/ h% e" @! l! p& G
  7. #endif
复制代码

4 o3 n7 d/ ^$ s) e4 p(3)修改stm32f4xx_it.c: D  m4 x7 A+ k$ H! A* Z
  1. void USART1_IRQHandler(void)' l8 `+ @' g9 ?, l; c' \# S
  2. {! l' v7 G4 m! I2 m+ V, x; q, o  Y" [
  3.         char c;
    " s% p7 ?$ S8 u0 s: ?6 N
  4.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
      j5 R3 B5 H5 @( R/ m/ @* u# o
  5.         {  l$ Y4 v- t4 N/ H) x
  6.                 c=USART_ReceiveData(USART1);
    1 A% {( |6 ~' g9 h) _
  7.                 USART_SendData(USART1,c);# A5 i  U% s' K6 H+ z0 L; F% q
  8.         }
    7 {7 J- q* f* t) |8 z, X$ x
  9. }
复制代码

) q2 I$ O0 L5 Z: I" [( l编译下载后利用USB转串口下载器进行通信(大家可以利用市面上的开发板的串口部分),打开串口助手后,给板子复位后
# c* w0 ]0 i) s2 t: h QQ截图20150204201823.png
  r' K5 s0 e1 B6 \: s3 L4 K) j* d3 ^, ]) ?  D5 U" I

8 s0 n9 a9 Q3 f, h温馨提示,如果你要用串口二则板子的A2 和A3外引接口是没有跟MCU链接的   不过ST-link中的RX ,TX就是连上MCU的串口二的  我们也可以往这连!
( @. e# h) v! F QQ截图20150204203031.png
% b% d& V) R4 Y# m5 c0 p* ~ QQ截图20150204203138.png , @! V! ^9 J( @; M
串口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 Q. V+ s0 u$ F/ X标准库写的  还是HAL库   我用HAL库写的也没问题啊   用标准库写的就出问题了 ...

! t) w, w( j7 J# s你看吧 这个是我已经用串口二成功的了USART2的例程 硬件保持刚回来的样子 不用修改任何地方即可 附件后缀改7Z后解压
  T7 [8 Y7 A* h6 O7 A  W# p: P

Nucleo411UART2.zip

下载

251 KB, 下载次数: 577

湛无双 回答时间:2015-6-12 10:07:08
本帖最后由 湛无双 于 2015-6-12 10:08 编辑 1 w3 v7 w9 o- J$ R
Yarcl 发表于 2015-6-10 22:25
8 b, J& J' z% C( c# {4 _请问下,这个板子能不能直接用下程序的串口来输出数据呀?需要外接USB转串口的转换器么?谢谢!! ...
7 v7 z. ?/ _7 @! [/ s" r
如果是下载程序的串口 那么就可能你是说的用串口一了,答案是可以的,这样你就的外接一个USB转串口的东西了,其中串口一对应的引脚是PA9(TX),PA10(RX)。如果你的意思是使用那个板子上的下载器所虚拟出来的串口,那么就不能这么做了,下载器上所使用的串口是串口二,串口二对应的接口为PA2(TX),PA3(RX)。; J- _2 w7 y! G& p
然后我这里有一个工程,你可以直接选择下载进去,串口使用起来很方便的,就好像C语言里面的printf一样,举例:printf("Hello STM32 Nucleo!"); 就通过串口二向电脑输出了Hello STM32 Nucleo!

Nucleo411Model_后缀改7z.zip

下载

251 KB, 下载次数: 148

wolfgang 回答时间:2016-4-14 17:46:30
STM32F411一共有三个串口,分别是串口一,串口二和串口六。这个串口折腾了好多好多天,说多了都是泪,我一开始就上串口二,没想到串口二是个坑。
9 k- g$ W* x  ~. D* s" }* k/ \5 U) G. K
% H. P" m% O/ ~( I0 Z( h) @串口二也不完全是坑,可以用的,我用串口2很久了。+ t* h* O: z6 H) a9 \3 g
看看你的ST-LINK什么版本,建议升级到最新的ST-LINK V2-1  在电脑里有一个虚拟串口,或者用TTL转USB串口连接也能实现的。3 ~  G$ \2 h2 H" g/ e8 V
wu1169668869 回答时间:2015-2-4 21:10:09
针对板子特性写的!!!
4 W- ~  Y; p) a5 A/ p! F  [  A! C! }支持一下
湛无双 回答时间:2015-2-4 21:29:10
我的用串口二就可以成功呀!!! 可能是楼主配置什么有问题吧!
颩色四葉愺 回答时间:2015-2-4 22:14:18
湛无双 发表于 2015-2-4 21:29. e0 J4 s, O5 L: Z
我的用串口二就可以成功呀!!! 可能是楼主配置什么有问题吧!

9 F# m& x# ~* |标准库写的  还是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:13
) E- V+ L$ b; p5 u$ X. O/ \" Q你看吧 这个是我已经用串口二成功的了USART2的例程 硬件保持刚回来的样子 不用修改任何地方即可 附件后缀 ...

  |& ?# D; k& B" \( `! `( r9 P好像找到原因了。我再研究研究   谢谢你了
湛无双 回答时间:2015-2-5 21:43:58
颩色四葉愺 发表于 2015-2-5 13:55: L2 n* B6 n% W+ n" S' B! l5 L
好像找到原因了。我再研究研究   谢谢你了
3 I) Q5 F- D" u+ T7 d# W
没事 能用就行了 嘿嘿 相互学习。。。
星辰一方 回答时间: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:418 z5 o. f) A& O$ q, _
硬件需要改动吗,问什么printf不能执行,,,  ,,

. z. l; L* {# d$ l/ g3 w是软件上printf不能执行,还是软件编译烧写了但是串口没接收到数据?  如果你用到串口二那样硬件上要改动一下,如果是软件上printf不能执行,那可能你没有勾选使用USB MicroLIB这个选项
12345下一页

所属标签

相似技术帖

官网相关资源

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