本帖最后由 颩色四葉愺 于 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
- #include "bsp_usart.h"
6 x/ a+ {0 M, F7 o - void NVIC_USART1_Config(void)! H$ j/ U6 v9 y n% f2 k9 Z* P
- {: y' l. o) g: d9 r! g# m# S3 K& O
- NVIC_InitTypeDef NVIC_InitStructure;
% h1 \3 r9 B; `9 w) v3 _ - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);- e, q/ j; V$ a/ B" J6 k ]
-
+ e6 N- r& q6 N3 b/ q7 T2 M - NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
) ?! }( ^+ [; H/ ~ - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00;
) p: o# B' Y7 T4 c2 @8 n- g - NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;1 W- C5 y2 G! n0 V
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;* A1 k/ ?) y, z1 }. X
- NVIC_Init(&NVIC_InitStructure);
" i/ u2 t2 E3 \$ k6 ^' ^ - }/ a, q- Z6 S1 u, R+ A
1 p; j9 H# h% w6 T2 N. K: F- void USART1_Config(void)0 A& m$ x. H4 g) s; e0 k
- {
/ U8 V5 }) G M4 v+ L: | - GPIO_InitTypeDef GPIO_InitStructure;6 Z3 s) w' r$ w
- USART_InitTypeDef USART_InitStructure;
4 j1 q9 Y* u. q( }; c - ' H) o) e* E. I3 }& Q& J
- ; c) S8 |: y9 e$ u
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);5 G5 Q% j( D4 [" j
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);* H$ i) x7 c5 `3 e! ] `# o7 R. c
- //串口1对应引脚复用映射
" ~- O# C+ t# U: P- U5 y - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); $ }- \. d" V2 q6 ]4 ~1 K" J
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
4 `% u7 g* u9 K6 S - ' a9 o; e1 @0 t0 r3 E# w8 L
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
, y% v6 n% \& B - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;8 @4 L2 A! w/ Q3 J. L
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 c: X; A# d7 L7 T( b f' [
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;( p4 `7 c; I2 N3 W
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/ R' D+ o- V6 w* z, Y8 K - GPIO_Init(GPIOA, &GPIO_InitStructure);
5 c9 T$ w& ]+ v - / i3 Z' s$ ]; H% ?. s2 w7 _
- NVIC_USART1_Config();
, z8 ?2 E j: o9 P8 e- u4 l3 O9 m
3 y- u9 t. Q R! O. K) j% L+ ^- USART_InitStructure.USART_BaudRate=115200;" ]0 R& Q: r5 @0 A4 U4 h. J. r# W
- USART_InitStructure.USART_WordLength=USART_WordLength_8b;
* _7 x2 q% d1 O `% x5 G - USART_InitStructure.USART_StopBits=USART_StopBits_1;; c. q5 \3 {" s
- USART_InitStructure.USART_Parity=USART_Parity_No;. N8 Z* B; ?7 S" M& O( D
- USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
. M) [3 g: V- z0 Z6 s - USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;8 g( c3 p2 \3 ~2 M. q3 L- {
-
) `- y4 Q y$ D; l% A J6 g+ j% y+ G - USART_Init(USART1,&USART_InitStructure);
$ D7 W% q9 [, f* n - 2 `. `! m2 `1 z. s3 N) Q9 I
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
2 w4 q9 c6 I/ Z* g8 i - 9 d9 u0 N4 L( j9 k8 L( P
- USART_Cmd(USART1,ENABLE); * p9 V( d& h. A2 p% ?
- }2 K$ \) O1 H% y9 h5 @
- /// 重定向c库函数printf到USART18 s; `2 H% P- j R; ~3 A6 o
- int fputc(int ch, FILE *f)
. s& ?, `$ V: k6 o5 f9 ^5 p - {9 y5 O0 J7 L4 v( G
- /* 发送一个字节数据到USART1 */' }7 ^) O! o0 l- I- M
- USART_SendData(USART1, (uint8_t) ch);
5 r( h0 k, J0 G, u# N9 H3 L, I -
- g4 k/ \ C! i* G - /* 等待发送完毕 */ o; l# G4 E+ b- t
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
, t$ ^! p, w8 k: u" T, W+ r. [+ D w - 6 V& u) u! k0 J
- return (ch);
# G1 I' d- R6 E - }
4 d6 Z5 U4 A$ N9 i E9 X
; [! b8 x0 g9 {% p' f X- /// 重定向c库函数scanf到USART1
5 ]9 H" v7 p: r0 ]2 c( ^/ O6 S' T - int fgetc(FILE *f)
; K7 r, e- I, t - {
& r4 ]5 j, Z) L - /* 等待串口1输入数据 */
2 {! j: |! r2 v, l+ _" V- T2 s - while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);3 o% Y% b! j v& g
7 H' p" P, n% {8 }( |" G- return (int)USART_ReceiveData(USART1);( @$ e, N9 a0 ]: I
- }
) }- P: M" w+ j4 ]* H" w0 p - /*********************************************END OF FILE**********************/
复制代码
! Z3 r5 d' L( D0 }3 j' jbsp_usart.h
8 {2 r. e; _3 }: D8 a- #ifndef _BSP_USART_H_2 \3 x, L# I9 }5 v& m h- a
- #define _BSP_USART_H_
( T* I) }8 b# P' @) F - 4 |$ V, [6 C6 w% `
- #include "stm32f4xx.h"
" S" P3 [5 H6 a6 K8 a: s - #include <stdio.h>8 K, J5 u: @- K4 @" h& D1 L
- void USART1_Config(void);2 I4 G; G S/ h% e" @! l! p& G
- #endif
复制代码
4 o3 n7 d/ ^$ s) e4 p(3)修改stm32f4xx_it.c: D m4 x7 A+ k$ H! A* Z
- void USART1_IRQHandler(void)' l8 `+ @' g9 ?, l; c' \# S
- {! l' v7 G4 m! I2 m+ V, x; q, o Y" [
- char c;
" s% p7 ?$ S8 u0 s: ?6 N - if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
j5 R3 B5 H5 @( R/ m/ @* u# o - { l$ Y4 v- t4 N/ H) x
- c=USART_ReceiveData(USART1);
1 A% {( |6 ~' g9 h) _ - USART_SendData(USART1,c);# A5 i U% s' K6 H+ z0 L; F% q
- }
7 {7 J- q* f* t) |8 z, X$ x - }
复制代码
) q2 I$ O0 L5 Z: I" [( l编译下载后利用USB转串口下载器进行通信(大家可以利用市面上的开发板的串口部分),打开串口助手后,给板子复位后
# c* w0 ]0 i) s2 t: h
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
% b% d& V) R4 Y# m5 c0 p* ~
, @! V! ^9 J( @; M
串å£1.zip
(8.55 MB, 下载次数: 2229)
|
你看吧 这个是我已经用串口二成功的了USART2的例程 硬件保持刚回来的样子 不用修改任何地方即可 附件后缀改7Z后解压
Nucleo411UART2.zip
2015-2-5 10:12 上传
点击文件名下载附件
251 KB, 下载次数: 577
如果是下载程序的串口 那么就可能你是说的用串口一了,答案是可以的,这样你就的外接一个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
2015-6-12 10:08 上传
点击文件名下载附件
251 KB, 下载次数: 148
串口二也不完全是坑,可以用的,我用串口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
支持一下
标准库写的 还是HAL库 我用HAL库写的也没问题啊 用标准库写的就出问题了
好像找到原因了。我再研究研究
没事 能用就行了 嘿嘿 相互学习。。。
是软件上printf不能执行,还是软件编译烧写了但是串口没接收到数据? 如果你用到串口二那样硬件上要改动一下,如果是软件上printf不能执行,那可能你没有勾选使用USB MicroLIB这个选项