这两天在玩STM32L0,但是串口怎么调试都有问题。数据位选择8B,显示如下:4 O; V" z, ?. o3 x0 g' U9 u
3 ^+ `1 ]3 ~/ c6 h/ |6 B/ c$ X7 i' [& \5 E; Y. V
7 m0 e- d4 o; a: P7 [, X5 a数据位选择7B时:
1 @0 d3 \3 O4 E; N6 b
2 U& B( U" M+ W5 J# D3 [1 o
0 w9 R+ u1 F# D( J: [. [/ u' B& M+ y( K# k4 N0 P5 k) D$ f2 J9 `! @
而我的输出应该是:printf("123456\n");printf("testing\n");
- ~4 e! M; N2 k5 B: ^7 i7 Q下面时我的程序:
8 f/ ?7 k6 F: o& H" F' K- \4 H( A* T2 N3 M5 x1 G/ Z* _) k6 ^
- //时钟初始化
7 J# h# w0 ~ h7 a& A! m6 d3 z - void SystemClockConfig( void )' t# A" M, N" d# d% o# M. {
- {
u @+ r0 N g6 V5 }0 j - RCC_OscInitTypeDef RCC_OscInitStruct;1 n3 a' I( |: F8 N, t/ X4 _
- RCC_ClkInitTypeDef RCC_ClkInitStruct;/ K, |' q9 w1 ~5 o7 X5 d' M
- RCC_PeriphCLKInitTypeDef PeriphClkInit;
* a9 C5 }8 f- \) _# h$ z; t - 3 W+ U" ]: {/ k4 M3 {+ n ?: H3 Q5 y
-
+ v4 ]. T2 z- Y0 ^7 h$ ~ - __HAL_RCC_SYSCFG_CLK_ENABLE( );
/ t" v [5 a' R, s& T) | - __HAL_RCC_PWR_CLK_ENABLE( );
. O! _3 @: z/ {+ h; a6 A* o. [. ~ - 7 q; K, \4 `* H
- __HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 );) E" x6 |5 t5 U0 v4 j/ ~2 E8 P
- // __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);* }3 N" }/ h' X5 F4 A+ a% J
- ; j" e; y! g: ~3 i, L: f5 o" _7 a
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE;//内部高速时钟8M 和 外部低速32.768K
; |( R( Q. H! ?1 }5 i) X' Q& h - RCC_OscInitStruct.HSIState = RCC_HSI_ON;
' X% b! }$ A( \1 R5 z6 M. S - RCC_OscInitStruct.LSEState = RCC_LSE_ON;
. _ I T3 @ z8 c$ ^# @ - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
* [" J. ^4 h( O! K8 A. f - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;7 G4 u9 M$ J& M
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;* g* C9 {4 w. d1 j& f
- RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;, E, f; e6 Z6 m5 s: Y
- if( HAL_RCC_OscConfig( &RCC_OscInitStruct ) != HAL_OK ); i2 L3 K* v. C0 ~6 }: r: D6 M# G
- {
$ n; r% C: X# N4 I' [ - assert_param( FAIL );
3 w- A9 F3 O& p) y$ ~ - }
( P( b' b( N6 U. Z4 T
# [) T+ j8 W+ N: A- t6 b5 r- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK' |9 X" N* P9 A2 E) O+ e- d
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
3 ]6 Z8 U$ A; ]: W/ @9 }: g0 w - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
) `$ K( y/ O2 y7 {' S5 j+ I9 T1 O/ q - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
' A2 M/ |* w) _ - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
$ T% Y _# o, x( l1 z+ n! H - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
4 B' b$ I: K7 N2 f3 X - if( HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_1 ) != HAL_OK )
* N- @: z% ~6 Q& q. O - {
( U; H/ e( X7 _/ G+ I* n - assert_param( FAIL );$ U1 W' Z6 o, d& M- Y
- }
: a0 ~& X! ]0 L' p- m0 O/ |% _
( w& j. {$ y; h5 ?( \9 n- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC;+ E/ H; J( @/ q# `. \$ H
- PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;! v |" d N( o6 X
- PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;: v9 p4 N0 _( r! [& I! m
- PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;- p9 E8 b, }: e5 W- f3 L, t7 V& Q
- if( HAL_RCCEx_PeriphCLKConfig( &PeriphClkInit ) != HAL_OK )
3 R% {3 {, k* U8 I/ _ - {
. t l& C2 W5 H9 m: b2 D) k2 z! l9 m - assert_param( FAIL );
9 G9 H2 r5 D- W0 k, a6 [ - }
! c1 C2 E9 w0 Y7 ] b/ C) W - ) g j. \) t, T% k. k
- HAL_SYSTICK_Config( HAL_RCC_GetHCLKFreq( ) / 1000 );
* h# B: T- h& }( q( c - 0 p% u2 X7 e' _7 i
- HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK );! T3 T/ z& K; @. _8 N$ k
- # v. x$ h- J$ I
- // SysTick_IRQn interrupt configuration
: u; ~: ~. o. k- f - HAL_NVIC_SetPriority( SysTick_IRQn, 0, 0 );1 d( n+ z: D! l! x$ [- c
- }
复制代码 / t' F" d" v. p
UART.C
; h. | s& |8 |# i- /******************************************************************************2 W W+ o. o: Y1 j
- * Copyright 2017-2030 DaPu Co.3 |8 M. o. H/ o6 H* c: D
- * FileName: uart_new.c
! x3 j5 I# @' I& { - * Desc:: G0 f3 G; x- X' U! q; F- z
- * 4 R" e, _ H! z- P. c) M
- *
' l: l, |& C, B) Z. G w& m: \' W - * Author: CGH
/ i1 Z0 m$ y0 C- X - * Date: 2017/10/12: [4 X+ y0 s { ]# c/ K5 @
- * Notes: 5 B* U- q1 w/ Y% \- ]/ g0 i$ x
- * / |, L. f& X8 m- D
- * -----------------------------------------------------------------
5 b q% u8 L1 W! l4 [4 H1 M$ } - * Histroy: v1.0 2017/10/12, CGH create this file/ U. M; I! P9 F6 q/ w6 K& A% a7 q
- *
0 f2 k% T3 o x3 E; C9 U, E - ******************************************************************************/
) \7 `& F! }1 @# c- ? - /*------------------------------- Includes ----------------------------------*/" c, ~. [8 a' C$ f; N% a
- #include "board.h"
( F4 P' j: t( Y! D - #include "uart_new.h"& a( i8 r1 [: _ C0 ]
- #include "gpio.h"
& v7 B$ S: p0 c8 x9 Y! p - #include "delay.h"
9 [9 [4 D! d1 q2 R - /*------------------- Global Definitions and Declarations -------------------*/
) B% g/ P4 K; q* v5 G# n, a - /*------------------------ Constant / Macro Definitions ---------------------*/
6 s8 m! Y0 @; M$ T9 s+ b5 Z - /*------------------------- Type Declarations -------------------------------*/5 t' e6 i$ v! c; K+ S
- /*------------------------- Function Prototype ------------------------------*/
7 F8 [ r0 q# `! ~ - /*------------------------- Variable Declarations ---------------------------*/
% j; I% _) ?3 a+ n4 R) `& ] - UART_HandleTypeDef husart_debug;9 ^' c3 i' [) z9 N9 S
- uint8_t RxDatabuf;
) ?- I. b* N2 K6 A6 M' G! X- W6 s - /*------------------------- Function Implement ------------------------------*/5 b, p' h# |, |: O3 s, B4 B
- /**
+ L" `* N& X! ^0 m3 m - * 函数功能: 串口硬件初始化配置
% r, L" C$ r8 _* [ - * 输入参数: huart:串口句柄类型指针5 B: C; G4 f/ F+ x: i! a. d, L2 S/ l* b
- * 返 回 值: 无
8 C' z; u% Q; _3 O% A/ P - * 说 明: 该函数被HAL库内部调用( I$ c# J# @' ]( L8 s K0 ~* A
- */6 W' F o# q4 H: e/ N
- void HAL_UART_MspInit(UART_HandleTypeDef* huart)
3 S, T1 i. W. ]6 [" p - {
7 _+ T+ H/ w$ s% X
. D4 \/ i6 g- r; b2 M- GPIO_InitTypeDef GPIO_InitStruct;
/ t# r) s, x5 [ - Gpio_t TX,RX;
+ x1 O/ O Y+ {; g - / \0 G M1 n) L2 p- {7 G
- if(huart->Instance==DEBUG_USARTx)
9 {- P2 G5 n3 ~- _/ @ - {
n( H! t( K7 S1 a. _9 a+ E- g - /* 串口外设时钟使能 */
, P" E2 H! l4 P5 t: h" |; C - DEBUG_USART_RCC_CLK_ENABLE();( s F7 o+ ^" _6 k
- - m) ?# |3 r. J
- DEBUG_USARTx_GPIO_ClK_ENABLE();
; D9 j) p4 T- V
% k; g# T. F( F1 c# t- /* 串口外设功能GPIO配置 */
& o6 K" D/ y) I6 }" u& @ - //GpioInit( &TX, UART_TX, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF4_USART1 );
- P# x- J$ n# p - //GpioInit( &RX, UART_RX, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF4_USART1 ); / K% g/ ^/ A0 Z
# c& @! f T/ ~: c4 e* G! Q! M) Z- GPIO_InitStruct.Pin = DEBUG_USARTx_Tx_GPIO_PIN;7 F* D& c- F. c5 X
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;& f! M' B/ a7 |
- GPIO_InitStruct.Pull = GPIO_AF4_USART1;
3 W. i8 a( F5 G/ ^1 z7 | - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
# j# ^9 N, k$ @! s$ g3 r - GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
5 Z2 N1 u" N; z* Y, T& O, N - HAL_GPIO_Init(DEBUG_USARTx_Tx_GPIO, &GPIO_InitStruct);
# r6 i+ Z& d4 T - ( q R, S1 {. Y! K" {
- GPIO_InitStruct.Pin = DEBUG_USARTx_Rx_GPIO_PIN;
# T% q: q. d, o7 q- P - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
6 Z% U/ W1 E+ C3 |& m% F* S3 U: P - //GPIO_InitStruct.Pull = GPIO_NOPULL;
) x3 q! x: j8 p - GPIO_InitStruct.Alternate = GPIO_AF4_USART1;" k; m! ]# j0 B+ {1 O: ` `
- HAL_GPIO_Init(DEBUG_USARTx_Rx_GPIO, &GPIO_InitStruct);+ w6 A, u6 z8 _( m, G0 ^6 }4 r
- + Z/ }' [( b8 P% ?
- GpioWrite(&Led2,1); S9 _9 Y4 x5 ~; C+ K
- Delay(3);8 n/ L) z" `0 b8 q% B+ X
- }
- B i: a$ f. S. {$ h# b& o# }: r - }
/ |, { {; u8 x9 ?% n% g/ ?: p - ) H- N0 f1 U- D9 U+ U: B
- /**8 E1 [3 y4 x, r! ?2 V
- * 函数功能: 串口硬件反初始化配置/ y) j# X' \- W2 r; X) L4 b; `# |
- * 输入参数: huart:串口句柄类型指针
* V: B5 |, p8 k2 M" z' m J8 F" d - * 返 回 值: 无8 u. x) O6 i9 y
- * 说 明: 该函数被HAL库内部调用
+ Z& ?# I$ O! I9 s) m* R: V! D0 D - */
$ x# B7 K3 D' L% _1 a0 J) L - void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
' n4 J9 O( p# o% G7 e - {
5 Y$ t9 h/ R) A- H; J7 I* k) _ s+ ? - if(huart->Instance==DEBUG_USARTx)$ v! ~0 s6 {4 F, C4 ^3 }
- {
7 }, I4 I0 I. W$ ~ - /* 串口外设时钟禁用 *// ~2 {5 P, G4 j0 n, I2 M* h" d$ z
- DEBUG_USART_RCC_CLK_DISABLE();( Q$ U' z$ e( H" z# j
- 2 {: b( G6 N5 u0 c
- /* 串口外设功能GPIO配置 */1 N8 g7 r9 O( a: h
- HAL_GPIO_DeInit(DEBUG_USARTx_Tx_GPIO, DEBUG_USARTx_Tx_GPIO_PIN);- f* ]' `2 B3 C* S" Z
- HAL_GPIO_DeInit(DEBUG_USARTx_Rx_GPIO, DEBUG_USARTx_Rx_GPIO_PIN);
4 N, B3 d( f7 Q$ v0 N, S4 [1 f& z. @
6 O' p' Z0 J; T# M& ^9 |- /* 串口中断禁用 */
+ L3 A) d# D2 d; a, K8 e2 C! ~# G - HAL_NVIC_DisableIRQ(DEBUG_USART_IRQn);
7 X* p2 g r6 h0 i; U5 f - }
9 R S# O7 V# _: [ - }8 d2 z+ `: e) A7 q8 g
1 z! t8 w5 A/ @5 s- /**
- k9 X5 I6 [/ K - * 函数功能: 串口参数配置.
& \! O& }& ]+ E, z6 l0 U$ Y - * 输入参数: 无5 U+ L7 e& M7 q/ J6 ^
- * 返 回 值: 无% _1 \/ f' I# t% ]7 @+ Z
- * 说 明:无5 J+ t' A' ~; j& n. ?7 S7 I
- */" N* Q3 x; _9 U6 G
- void MX_DEBUG_USART_Init(void)& P% @1 k, }8 b( _( @( Z. \' v
- {: T& n3 O( y: f m. p: \" ~
- int ret = -1;* k' ^) k" {9 J- {
h! r% D, S4 M/ G, m5 [- __HAL_RCC_USART1_FORCE_RESET( );
# W$ H0 V/ B+ [3 t* ^ - __HAL_RCC_USART1_RELEASE_RESET( );" O" Z# S2 V8 [5 h1 Y6 {, A
- __HAL_RCC_USART1_CLK_ENABLE( );* C/ a5 V5 Y3 {) v
- /* 使能串口功能引脚GPIO时钟 */
: Z) h9 F) o' t- y6 B3 t - DEBUG_USARTx_GPIO_ClK_ENABLE();
) w" f0 s, n! N
: q2 ^& P+ n& @! @. W% Z1 H" T- husart_debug.Instance = DEBUG_USARTx;: X* v0 `# q5 B A
- husart_debug.Init.BaudRate = DEBUG_USARTx_BAUDRATE;7 q7 z- j6 Q1 y4 W3 B# [+ e- N' E5 S
- husart_debug.Init.WordLength = UART_WORDLENGTH_8B;
4 @. U# `( f3 ]/ ?; m3 C; s - husart_debug.Init.StopBits = UART_STOPBITS_1;7 G8 ?1 `$ R7 o3 L) ?8 b) Z5 W
- husart_debug.Init.Parity = UART_PARITY_NONE;
- r- |% S9 F" q - husart_debug.Init.Mode = UART_MODE_TX_RX;/ i) ^% _$ A% Y
- husart_debug.Init.HwFlowCtl = UART_HWCONTROL_NONE;
) a3 [2 X; c) o8 k d% C% a - husart_debug.Init.OverSampling = UART_OVERSAMPLING_16;* x( _4 s5 d6 Z/ k) ~
- ret = HAL_UART_Init(&husart_debug);$ @% \% D/ |9 M+ H; v! @
- if(ret != HAL_OK): ^# ]9 y0 s& V! g$ a; c* _% x4 j
- {
Z1 [+ k2 o% t" r* \5 M3 H2 k - GpioWrite(&Led2,0);8 G( l/ r7 ]8 h9 D- F1 V
- }
; ], J4 u6 R; I& s$ K% ]) f6 } - else7 G7 E+ \' I! H* `( o0 N+ G
- {) d# Z# u5 H1 _ w
- GpioWrite(&Led3,1);
! K+ Z+ j9 T4 t$ U' e1 [: ^. H5 U - }
' q, x% w/ N3 C/ i/ J5 e - /* 串口中断起用 */
& [8 s: }# {; _% L6 c6 s( l
. u& D. {& a! a0 z$ d5 G. a7 X/ t3 m- HAL_NVIC_SetPriority( USART1_IRQn, 1, 0 );
5 [# }+ \* t* a% _+ ~0 @ - HAL_NVIC_EnableIRQ( USART1_IRQn );2 L4 U9 d9 F2 \4 p5 ]4 i0 S+ ]
- 6 P: J) p& n8 Q) w% x
- /* Enable the UART Data Register not empty Interrupt */' Y( D: R, G1 L ~" j
- HAL_UART_Receive_IT( &husart_debug, &RxDatabuf, 1 );0 S3 C2 |9 s1 X4 D. P) w
- }
复制代码 1 e% c8 e! N2 B( r) H
UART.H
7 c! U2 h, z: Z& B4 _/ z- /******************************************************************************
5 ]2 x! ^- E; f9 ^ - * Copyright 2017-2030 DaPu Co.
7 N3 n' d/ v4 q: g% ]- a4 s8 E3 S - * FileName: uart_new.h ) w5 Y! L/ p$ }$ x8 p7 ~, g( F
- * Desc:
1 H+ m7 J) E* ^) g, l+ p/ Y' Y - *
: r5 m& V6 ?. U5 s1 P - * % Y5 i" c$ H0 E8 W v
- * Author: CGH
/ v4 Z6 M1 E5 f# }3 K4 r( g5 l - * Date: 2017/10/12
, f# L: q+ n/ y - * Notes: 6 i+ U0 v( x1 T( R2 V
- * ' H; n' @& s: j
- * -----------------------------------------------------------------
/ y, u- C$ }, T - * Histroy: v1.0 2017/10/12, CGH create this file
% f6 Z! Y# t" m) T; `1 t/ v! X3 j - * : ]! ]0 S6 @6 V* M
- ******************************************************************************/, q0 v% X! F+ {0 y, z! T: {
- #ifndef UART_NEW_H; R& p* L/ V- ]
- #define UART_NEW_H8 [, Y$ I3 t* T
- /*------------------------------- Includes ----------------------------------*/
1 J& Q3 o- R6 x5 H) G, q) T - #include "stm32l0xx_hal.h"% s, }; |/ S: s% N1 q( Y4 G
- #include <stdio.h>7 U/ ?0 Q% [1 g* ^/ j- G* @
4 ^ i7 C5 W& ?6 T; M: k- /*----------------------------- Global Defines ------------------------------*/
w% v. v8 m: O7 j4 U - #define DEBUG_USARTx USART14 } n: { H& \6 s ^
- #define DEBUG_USARTx_BAUDRATE 9600
( w- \; j7 K1 J. T - #define DEBUG_USART_RCC_CLK_ENABLE() __HAL_RCC_USART1_FORCE_RESET();\\+ l: h5 D9 D$ \9 }9 {
- __HAL_RCC_USART1_RELEASE_RESET();\\
5 E) j% n4 n m3 g - __HAL_RCC_USART1_CLK_ENABLE()1 c2 [7 K/ k1 U/ C
- #define DEBUG_USART_RCC_CLK_DISABLE() __HAL_RCC_USART1_CLK_DISABLE()( P* t% o* ?8 \6 Q7 y, ?9 @
- - E; r8 h* ]; e X M
- #define DEBUG_USARTx_GPIO_ClK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
, Q6 }2 J O5 A' u - #define DEBUG_USARTx_Tx_GPIO_PIN GPIO_PIN_9
, N7 i, b9 n6 a9 ^7 j; f - #define DEBUG_USARTx_Tx_GPIO GPIOA
q1 Z+ l |7 T - #define DEBUG_USARTx_Rx_GPIO_PIN GPIO_PIN_102 @7 [4 |4 l: |" w' ~3 h. f
- #define DEBUG_USARTx_Rx_GPIO GPIOA
% [9 D/ b5 Q, m
/ B' K. G, D+ s! ]( I- #define DEBUG_USART_IRQn USART1_IRQn" G* @, [' p) ` M+ H9 q
- 9 G* c# s6 G1 u) x
- /*----------------------------- Global Typedefs -----------------------------*/: b, z& {) w% F# p' I
- /*----------------------------- External Variables --------------------------*/
, }4 z M' A- R - extern UART_HandleTypeDef husart_debug;
" Q2 \4 `% s2 L! \8 Z - - W+ c5 J( I1 ~- ]9 Z; H
- /*------------------------ Global Function Prototypes -----------------------*/
, ?8 q5 _* L1 M9 ^- t, z- E: G - extern void MX_DEBUG_USART_Init(void);0 Q8 {, z4 s& W$ T# q+ s
4 e+ A5 k/ Q* A& E, ?- 4 y Y% e1 E: k6 [
- #endif5 `9 b$ Q+ E, R' }0 e
复制代码
6 y1 [7 }% j# L9 o+ v( f6 b/ |, S9 j
/ {# [8 Y" @2 Y+ u0 B& H |