这两天在玩STM32L0,但是串口怎么调试都有问题。数据位选择8B,显示如下:
. O7 Y) X( Q" n: o; m) j) N; j
9 [# a+ J2 ^9 y( @& \ T" G- j, @
/ c6 l# Y0 Z& A
9 t! F% o; ^* O# r$ o- t/ j数据位选择7B时:( o, @: I* t5 {1 M
/ U/ X0 S, ~. p% } ?# E( Q2 n7 ]+ m8 q% z- g {4 Y& {- J* t" R
* \5 E5 G" N: K7 t( ~5 A3 x# ?
而我的输出应该是:printf("123456\n");printf("testing\n");
5 {7 ]& ~0 r. M" E) `6 ~# D下面时我的程序:6 O" W u; a( h- {# t- I
" l' E' x5 j: m, ~ k. }% M% r' a$ u
- //时钟初始化
! M" P4 q- U: A$ S# l2 R {5 a - void SystemClockConfig( void )% j- {% ^ Y* P' B5 A, H& T3 S
- {# }) ~& E" O$ f: B7 N
- RCC_OscInitTypeDef RCC_OscInitStruct;2 F! r7 l* l! K5 m$ ?/ ]
- RCC_ClkInitTypeDef RCC_ClkInitStruct;
4 W# k2 U2 d% O - RCC_PeriphCLKInitTypeDef PeriphClkInit;1 c( z$ Z" n; z: ^8 V( R
-
! {# g8 x8 k9 T3 C/ u -
8 E1 n5 W. i" {( Y3 R% U/ e4 A - __HAL_RCC_SYSCFG_CLK_ENABLE( );
% s4 |' T# i, r0 Z6 K - __HAL_RCC_PWR_CLK_ENABLE( );) i! @9 m T% D
/ _5 ~4 Y+ h* W+ l# S- __HAL_PWR_VOLTAGESCALING_CONFIG( PWR_REGULATOR_VOLTAGE_SCALE1 );
# i/ n+ i+ ^6 J' c1 S - // __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
+ C' z1 q6 w/ b; V -
' M: T% V& ]- t2 H - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE;//内部高速时钟8M 和 外部低速32.768K
6 [! @. B& J" {# b - RCC_OscInitStruct.HSIState = RCC_HSI_ON;9 R+ j" ~! I/ q
- RCC_OscInitStruct.LSEState = RCC_LSE_ON;
1 ]5 E# F, P2 X* C - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;( F: f! h7 ~2 q& G% _4 U
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;# x6 b1 C Y( i/ I: d
- RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
1 h+ U5 z) @ A+ d - RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;8 |, ?# u5 h, d2 \# d
- if( HAL_RCC_OscConfig( &RCC_OscInitStruct ) != HAL_OK )
! V; x. i: @9 b: x" ^& g( C$ A - {
; C5 U% }* t; Y1 Z% o8 u! D - assert_param( FAIL );
. y- H( L2 E; J - }
) E6 v, y, C8 V7 Q b& n+ k - / J) J/ G$ D- }
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
. t. \ i8 s- D. {3 I; c2 ? k5 p - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;& |5 _" d5 o+ D& [1 H# y3 k
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;" a8 y6 K9 T& _: f
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
, J; f% k, X& U( t, m* C2 x+ X3 r. c - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
5 c" n S$ R# t% R0 Q - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;" b# I; p+ x2 V! P" H" d
- if( HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_1 ) != HAL_OK )/ s7 G# m# [% V7 E% Z0 t+ C
- {, b$ Q' J% }( R5 T* H
- assert_param( FAIL );4 L2 y' g! a2 {7 S
- }) H8 M8 f r" r; k! f7 t
, G/ t% t1 p* f; D* I- PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC;
/ c/ Z# Z5 B0 _4 s6 C' Q - PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;9 I+ l0 j2 [( y+ \+ _
- PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;& l$ R _0 E1 i6 Y( @ \
- PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
0 M: |0 E0 | x6 t - if( HAL_RCCEx_PeriphCLKConfig( &PeriphClkInit ) != HAL_OK )/ D4 }; V* F) J% q8 n
- {
$ J% N$ t, J8 \' J7 M+ h! E F - assert_param( FAIL );# N4 \+ H! H( e# k9 m. f
- }6 N* G4 k3 A6 P6 }* d# O4 m/ a' y
- 5 f7 d& _0 O6 ?7 Y. h! M
- HAL_SYSTICK_Config( HAL_RCC_GetHCLKFreq( ) / 1000 ); d& U2 S4 v; @- j- [
- 6 J( J: i1 ?, J) U. e% |2 J: C4 }
- HAL_SYSTICK_CLKSourceConfig( SYSTICK_CLKSOURCE_HCLK );. ^2 Z- N3 A0 a0 |8 O
- 3 z' S2 L+ f5 Q
- // SysTick_IRQn interrupt configuration
% m4 t; T0 l0 J - HAL_NVIC_SetPriority( SysTick_IRQn, 0, 0 );
2 Q; e% }& L8 l; h - }
复制代码 8 `, t/ r" @; `7 }* H6 z5 A- D. e
UART.C- d; e/ h* ~/ r- u% Y' r
- /******************************************************************************
! u8 k E5 o! p - * Copyright 2017-2030 DaPu Co.
: _) J. n+ H; h* q) L0 ^3 {7 g - * FileName: uart_new.c ) ^) p% m) _! ^; V- a% p
- * Desc:* T( ]; }2 R; Z
- * ; a7 r2 p( A, p8 y- U
- * , P2 K8 }- u/ M# d; }
- * Author: CGH
5 e! b7 g" T) N, Q - * Date: 2017/10/12
, B( E: X0 \2 ^" ]9 Q - * Notes: # D, q$ s- R2 E2 ~+ _1 q5 l7 A
- * 3 G+ N5 K0 ^+ ^2 g1 R2 w; \, b! q. H
- * -----------------------------------------------------------------
5 }1 L6 H- q; Q! J- Y - * Histroy: v1.0 2017/10/12, CGH create this file: v {' Y' [7 Y: \# B- H
- *
8 U; f6 f5 |2 ]; o - ******************************************************************************/
6 Q @# J* P6 Q. N& g& j, e: d - /*------------------------------- Includes ----------------------------------*/" D. p4 s" A7 s! |$ P
- #include "board.h"
+ _- A2 c0 d# a+ s. s7 `9 t% m - #include "uart_new.h"4 U0 P8 [, `$ |. |. k9 |
- #include "gpio.h"6 Z( i$ o% V( z. H4 M) n5 G
- #include "delay.h"
% A+ f( j( I% N- f% W - /*------------------- Global Definitions and Declarations -------------------*/! K9 e! y0 s# s+ K" T \3 T- u! b
- /*------------------------ Constant / Macro Definitions ---------------------*/
f6 _" ?! @- u5 t F* G - /*------------------------- Type Declarations -------------------------------*/
" M& s, O: D1 H7 v5 n4 X( f* L - /*------------------------- Function Prototype ------------------------------*/
0 q: L7 ^7 A; ]1 B5 m - /*------------------------- Variable Declarations ---------------------------*/6 F$ `1 k4 @% s. r7 F) z7 t
- UART_HandleTypeDef husart_debug;
9 E3 f9 u o' l& t- \) m+ f - uint8_t RxDatabuf;# D8 B" T. S; B. l
- /*------------------------- Function Implement ------------------------------*/3 U1 C0 f" h: U2 g
- /**& k6 h$ Q7 ^ J# b% ]# Z
- * 函数功能: 串口硬件初始化配置) M [! L; L; Q# X
- * 输入参数: huart:串口句柄类型指针9 ]9 O2 e6 J, _/ A1 y
- * 返 回 值: 无: N- @. z) i3 d. S; ]
- * 说 明: 该函数被HAL库内部调用
. N y+ ?* H6 o" F P* ? - */
: [9 R. @, F% m0 F, ~4 Q - void HAL_UART_MspInit(UART_HandleTypeDef* huart)2 f: R ^! S V) ^1 a8 b9 e
- {
0 V$ [; E9 f; x: y' s2 R - ! Y2 [; o `% B5 z- ^7 g- R
- GPIO_InitTypeDef GPIO_InitStruct;
& }1 M! L/ y+ w6 B - Gpio_t TX,RX;
4 B. U. \6 r+ p; C" P# g# X
4 ~1 u1 q( v- E: J% p5 p# b$ L2 U- if(huart->Instance==DEBUG_USARTx)
% `8 s* [1 G& o- i$ m* A - {
+ E2 N7 E8 x u8 S6 _ - /* 串口外设时钟使能 */
; o8 B0 w7 Z2 U r) Q3 M - DEBUG_USART_RCC_CLK_ENABLE();
- P6 Q) P( N* j5 E1 I - 0 }% P$ J5 s0 b! x) O# y3 @* Q
- DEBUG_USARTx_GPIO_ClK_ENABLE();
- Z3 @' O$ \: y5 |3 J$ { - 3 f& G. A8 _) S7 Z, t4 X/ t5 O
- /* 串口外设功能GPIO配置 */
5 [1 t# m1 A) ?- K% | X: O u, i - //GpioInit( &TX, UART_TX, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF4_USART1 );+ n" P* U& m5 e1 }
- //GpioInit( &RX, UART_RX, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF4_USART1 ); 3 u. \: v1 B* K. z
- 9 O* _4 |, W( E3 s) n
- GPIO_InitStruct.Pin = DEBUG_USARTx_Tx_GPIO_PIN;
! q; X4 p" B7 J2 L/ \ - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;/ y2 j, W% J+ F# O: Z$ f# t
- GPIO_InitStruct.Pull = GPIO_AF4_USART1;
7 J7 O1 c+ V0 C" _: h - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+ E1 I8 ]! T3 x& c5 Z5 C+ w) ? - GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
6 A+ J. y$ U+ d9 Q% Z - HAL_GPIO_Init(DEBUG_USARTx_Tx_GPIO, &GPIO_InitStruct);, y) [- s) \9 G$ a7 K
1 v! v: g! Y- |# z- GPIO_InitStruct.Pin = DEBUG_USARTx_Rx_GPIO_PIN;2 j6 e& O! j. U! T! M
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;* v6 S/ T" P' Q6 u/ [5 c# i) }
- //GPIO_InitStruct.Pull = GPIO_NOPULL;
) F4 X7 r% o4 A \1 V - GPIO_InitStruct.Alternate = GPIO_AF4_USART1;: r+ G* j* z) }1 H+ B1 `- Z
- HAL_GPIO_Init(DEBUG_USARTx_Rx_GPIO, &GPIO_InitStruct);7 I6 U# k6 @6 d' F: m9 @
, C$ u: U) _2 W7 v- GpioWrite(&Led2,1);5 c) q- y4 ~& H: R0 x) I( y j
- Delay(3);
1 c* t. M- B5 s - }
. w7 [$ g4 P& E, C - }7 o& M% U+ n8 @5 }# s
- 4 V& S( z9 |. Y
- /**
p# L4 z% V3 P# m! y$ @! g9 x - * 函数功能: 串口硬件反初始化配置
n! H8 x' n- u. y# z - * 输入参数: huart:串口句柄类型指针
) X5 L: s; K/ O* o' k+ U S7 {( V E - * 返 回 值: 无
1 y4 y% q" _/ r0 j# l - * 说 明: 该函数被HAL库内部调用* ~: @8 Q$ N; [7 w. O0 ^
- */
4 _# u7 t4 G+ o4 K7 L - void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)5 N& A. ]! E5 R0 A- D+ u! C
- {, ]. v( O5 X$ c7 P* A2 v, `3 |. N5 n
- if(huart->Instance==DEBUG_USARTx)- ?+ `& F# i" j
- {
7 U, V6 N& Q/ \3 b: ^ - /* 串口外设时钟禁用 */% {! V7 o+ z. v4 L7 Q$ [
- DEBUG_USART_RCC_CLK_DISABLE();
" }$ h5 Q$ m$ | ~* b
3 N' ?/ m h8 O! t& J9 [- /* 串口外设功能GPIO配置 */; \! S3 ]4 r- v! l' r
- HAL_GPIO_DeInit(DEBUG_USARTx_Tx_GPIO, DEBUG_USARTx_Tx_GPIO_PIN);: R l$ m! W+ M% [7 H# z: P& Q
- HAL_GPIO_DeInit(DEBUG_USARTx_Rx_GPIO, DEBUG_USARTx_Rx_GPIO_PIN); _7 h% B2 m. F8 }6 s5 Y
( |- X+ C3 m/ y0 [: G- /* 串口中断禁用 */
! k' J" o& z8 ~- f! F- M5 b - HAL_NVIC_DisableIRQ(DEBUG_USART_IRQn);
! u# w- A4 M/ H2 B8 }; R - }3 L2 i( K' T# ?/ u& @9 N
- }
! A! K: S1 s+ | U0 G" {
- L! N& F" `+ h& J7 G- /**; V8 }4 Z3 |2 s, `' N6 [" f
- * 函数功能: 串口参数配置.% y" {) o* d' I& N
- * 输入参数: 无
, c ?% ~: T$ N) H - * 返 回 值: 无
7 ?0 l+ c% v- z, h+ y& `* d- j0 _ - * 说 明:无2 i5 b# H3 f! _3 R2 B& l- X3 a
- */: w$ s9 ~" h0 x/ O3 U0 l; G
- void MX_DEBUG_USART_Init(void)3 m, \6 W( [0 ]* n2 d0 G
- {
2 t9 r- z4 b, U( O" g3 E - int ret = -1;
9 [; B* k5 A+ i) l# V - ; ~7 R* v% C3 j5 v, N+ R
- __HAL_RCC_USART1_FORCE_RESET( );. b: S/ r- B9 l: Z& [3 |
- __HAL_RCC_USART1_RELEASE_RESET( );
* z. Y, [- i. d, V5 Z& q+ b - __HAL_RCC_USART1_CLK_ENABLE( );, v8 {+ | m" r
- /* 使能串口功能引脚GPIO时钟 */
) A# T y. B) U1 W* j - DEBUG_USARTx_GPIO_ClK_ENABLE();) I* d3 B% ?$ u
- 4 n$ w! B) [# P
- husart_debug.Instance = DEBUG_USARTx;( j s4 R% Y. }' M0 N& ~
- husart_debug.Init.BaudRate = DEBUG_USARTx_BAUDRATE;
) r+ U ?, V0 a5 \" `8 t - husart_debug.Init.WordLength = UART_WORDLENGTH_8B;9 E6 u& m5 O: v* q* Y! s+ i6 B
- husart_debug.Init.StopBits = UART_STOPBITS_1;6 i5 c! [! v8 _! m- s! j6 t
- husart_debug.Init.Parity = UART_PARITY_NONE;
0 V# [) ]( T. u8 c) y& Z - husart_debug.Init.Mode = UART_MODE_TX_RX;
/ I- t. [9 v, ^4 x, x - husart_debug.Init.HwFlowCtl = UART_HWCONTROL_NONE;- `' a# D! ~3 Y1 B6 D
- husart_debug.Init.OverSampling = UART_OVERSAMPLING_16;" r7 c5 h& m+ c& L, g: [9 u
- ret = HAL_UART_Init(&husart_debug);
. l/ C0 a4 @* U$ Q% a - if(ret != HAL_OK)0 B4 ?3 O9 J5 Y" y
- {
! a( N/ I( `. M8 t$ S - GpioWrite(&Led2,0);
) b A3 ^3 M4 | ], H9 }, U. O) s. l - }8 g3 }; o1 ^& ]4 \7 H; b% x* O9 a( ~
- else
T; S( g0 {- s - {
9 }9 B e- n$ z# B( E - GpioWrite(&Led3,1);* p2 f1 k) Z" y4 X, |$ k
- }) e9 k8 N3 j! q3 l" f
- /* 串口中断起用 */1 {) y0 h. Z y" r' }( w5 O
- 8 C. h8 e5 H o0 ~' e$ @% \% q, N
- HAL_NVIC_SetPriority( USART1_IRQn, 1, 0 );8 |3 w% M, T7 G$ ?! z2 D
- HAL_NVIC_EnableIRQ( USART1_IRQn );
' q2 V. }& E3 t7 c4 _1 c5 h - 7 p; v' a* ^ k7 m/ M& q H
- /* Enable the UART Data Register not empty Interrupt */& }: J: q7 J& \7 J: i+ C9 z% m5 B
- HAL_UART_Receive_IT( &husart_debug, &RxDatabuf, 1 );; j, F* [2 t. S, m
- }
复制代码
* J; {8 F% J( \. d2 ?" x9 h' EUART.H# ^/ O. e7 U1 t% s0 v0 B
- /******************************************************************************& k1 x& m, m( W- Q, \. U4 K3 T) I
- * Copyright 2017-2030 DaPu Co.' v2 B& ]" t- B# \" W
- * FileName: uart_new.h
6 H+ t1 W3 c: d J$ R; Q0 A - * Desc:
9 [, R3 t, h* a. @, j7 ~6 L - * ) e, q) {0 i! w9 L, v2 G( X
- * 5 e# S: K. e3 K2 s4 N! w/ H
- * Author: CGH0 ?2 }6 x# V6 J( y' t) w' T4 q
- * Date: 2017/10/12: V- z5 j9 i! R( N
- * Notes:
: f0 m, G6 A, J1 H( @ - * 6 q& L9 L0 n4 z" m8 f+ i; h
- * -----------------------------------------------------------------
% u# f6 U# o) k' F - * Histroy: v1.0 2017/10/12, CGH create this file! a1 @- M2 V" t# {
- *
' `% E- ]1 h3 n - ******************************************************************************/
- Y6 N/ W: j+ l S7 I/ l, p U - #ifndef UART_NEW_H" |5 r7 z* q, m6 A2 `7 P3 J1 f
- #define UART_NEW_H
! W7 ?7 X% u/ ?1 H - /*------------------------------- Includes ----------------------------------*/0 ^7 b& P5 V& Z% x& W4 w
- #include "stm32l0xx_hal.h"9 `, ~! A0 ^# x8 G0 ^/ ?, J3 [8 f& u
- #include <stdio.h>3 Q) H: I! H( ~+ w
- 1 g4 |7 P. i! [+ `; o4 Y+ L$ D
- /*----------------------------- Global Defines ------------------------------*/
- A, h' k. V9 X8 h$ k/ t - #define DEBUG_USARTx USART1# u X/ o6 Q2 W: I& ^
- #define DEBUG_USARTx_BAUDRATE 9600( ]! K6 q, A: ~# R
- #define DEBUG_USART_RCC_CLK_ENABLE() __HAL_RCC_USART1_FORCE_RESET();\\
- k: f1 A# E) B - __HAL_RCC_USART1_RELEASE_RESET();\\
& }& b3 K9 o7 M! c) p2 u3 {, ` - __HAL_RCC_USART1_CLK_ENABLE()5 x/ y$ }- b% G- S, i0 f' p0 e. K
- #define DEBUG_USART_RCC_CLK_DISABLE() __HAL_RCC_USART1_CLK_DISABLE()
' h' i/ M, V6 O) `6 d: r - $ r. D- o- f- z7 {. k9 l- S! S
- #define DEBUG_USARTx_GPIO_ClK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
; b% n1 `9 H2 w - #define DEBUG_USARTx_Tx_GPIO_PIN GPIO_PIN_9" _2 M' }8 j* v) J5 J% z5 Y4 ^6 L/ X$ T
- #define DEBUG_USARTx_Tx_GPIO GPIOA1 Q! @$ j& N$ H# f+ V1 c) y/ I
- #define DEBUG_USARTx_Rx_GPIO_PIN GPIO_PIN_10
& Y1 Q4 j8 o6 p; J - #define DEBUG_USARTx_Rx_GPIO GPIOA
/ a% @# P& p: t7 O - 6 r0 S8 u6 ]$ {# w" m `
- #define DEBUG_USART_IRQn USART1_IRQn' ~% j1 {4 y) e5 d4 ?- A
& m4 Z/ F" m* e- /*----------------------------- Global Typedefs -----------------------------*/
! h; V3 M& R: T7 {* J- n8 e$ K - /*----------------------------- External Variables --------------------------*/
6 S1 E# P# J8 _" S2 o( G2 N' P - extern UART_HandleTypeDef husart_debug;
1 K! T- G {3 _) }, X# j
3 `$ v* P( ?5 F [- /*------------------------ Global Function Prototypes -----------------------*/0 e, ~8 y* S! q0 H0 i
- extern void MX_DEBUG_USART_Init(void);) n, ?! p8 @+ U" P
& r) \9 `1 D: L y1 B- ]( @. @( H% P5 E Y5 I
- #endif
9 {8 q) C& r: M- i# u
复制代码
% c8 S0 F4 r' |& |$ y; [5 r
* I- I# [% C9 _* l4 {7 G" t |