本帖最后由 TLLED 于 2019-2-16 11:14 编辑 # v$ C1 [+ ?2 H, M2 A
4 B% d" P9 C$ }8 e9 s$ }* a) H 使用STM8L050芯片串口输出数据,使用半双工模式。* c. K$ E ]7 D
* G/ J7 _. W: ~7 K+ B 一、引脚配置
$ T6 P( y* T* `: G& ?0 d* Z" F$ V! G, `( N" L; m
' i: f6 ]- d9 Z9 v; Y) c
使用STM8CubeMX来配置串口引脚。
3 F- d) @7 ?7 V& d: z' B7 ?
; P5 [1 X$ Y) H1 v
# S, f9 x% B: G7 N! x4 m/ L
3 O$ Y7 [1 O5 G5 d+ H# k
* w9 p( W. P+ E8 S1 ]
二、硬件部分$ r; x, b0 [* _9 b2 s
: F: B0 o% `6 m! u/ {) \# P5 f' u4 S# ~4 n
使用USB-TTL模块连接PA0引脚和地引脚。6 ]! r3 W/ |& j
0 u! u8 l0 h1 B% `5 Z& O6 p
6 N* U$ W- E0 S1 C& j! ?6 H 三、程序部分$ H* j$ J1 I# i# H. V+ d
]& x+ [* [9 r! _2 {$ j% b
3.1、串口部分程序
2 g* ^" H% v4 V( S 7 i* c) }: o' p3 N9 f8 f
- <font size="3">- R0 }) E" d* j2 x7 D' K/ G9 b
- //uart.c6 y# t$ s+ v/ t6 J% C J7 X
- #include "stm8l15x.h"
/ T: E! g& v5 n" x( r; N3 m, v/ | - #include "stm8l15x_usart.h"5 m! s1 ?; z# p. r8 N
- 6 ~1 ?7 j. `6 ]; [2 I- o% A( l
- //串口半双工通信) d. t" G' C7 s/ u
- void uart_init_halfduplex(void)
8 ~$ L, n$ z$ r - {- Z D) b6 `5 J# S/ V, r$ `
- //设置串口端口
' \0 v1 I- j6 {/ e! C9 P - GPIO_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Fast);
: d1 Y( K- R# J3 ^ - 4 u4 r V! h# Z' N. ?
- CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);( f- ~& O1 G! |' {
- SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortA,ENABLE);
0 F# N( g, \, r0 O$ [( u! i( g0 D - //配置串口
1 J- u, r6 W4 z+ V6 T$ r - USART_DeInit(USART1);
3 e+ b. O8 P I& j3 P) ]( ^ - ) l L/ Z. k1 q- v) c6 V
- USART_Init(USART1, (uint32_t)115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));; W t* I" V$ o) E! w
- / Q3 [3 E; N. }; B
- //使能半双工模式# ~" ~) \+ x) C5 C
- USART_HalfDuplexCmd(USART1,ENABLE);* f6 f3 q2 T* a; Z- l
-
/ w' G' s0 D1 o% @- W# a% @( `; ? - USART_Cmd(USART1, ENABLE);5 P- a0 f8 ?. e' s2 X6 T1 ]3 S
- ! @) h$ J, B8 a7 z5 s9 h, @9 M, O
- }" v2 l; }. f8 Y! C
7 N4 g. \9 D$ p
2 l/ m, z& _; q) k1 a- void Uart_SendDat( uint8_t dat)
5 d0 e4 @1 o" b+ w - {
# u* F, K8 c: J6 U! m - USART_SendData8(USART1, dat);
) B" e* M1 M1 a3 t8 T - while(USART_GetFlagStatus( USART1, USART_FLAG_TC) == RESET);
0 P& [$ t; Z1 v' r, K6 ~7 a - }2 x" k0 o( m) F6 ?* O) Q
- # O4 M. A* ^) ?9 G2 K/ Q
- void UART_SendString ( uint8_t *s) # s) g+ t0 i7 B& o, S0 S
- {. s7 f/ H' t! `
- while (*s != 0)
1 a! x/ g$ T5 [! s5 [ - {. _! Q7 I7 S) o0 J' ]
- Uart_SendDat(*s++);7 m- N; E% Z0 o+ [
- }/ y l9 i/ o) M
- }" `8 J( B. A6 L' S+ L/ k1 e
- : G7 d5 G6 | f
- ! H, r' W1 G+ z8 L7 g9 u! W
- //uart.h
4 v3 f ?% Z5 L - #ifndef __UART_H7 Q8 ^" i+ z8 c0 y) k
- #define __UART_H
2 e* {: k7 {7 O- j2 W) t
# a0 R+ A& k; w- void uart_init_halfduplex(void);3 D4 Y/ d Q4 ], x
- void Uart_SendDat(uint8_t dat);
4 H# P' S8 ~7 R3 ?7 D9 t - void UART_SendString ( uint8_t *s);
, S8 g0 { }8 B- {, y, F
# F8 J9 Q! R, h- #endif 4 c6 w" c! _, H5 T- S1 U
- 0 \& @$ f6 { M+ _
- </font>
复制代码
, }$ G' ]4 Z, t. y* O 3.2、主程序
& T1 o: t0 H: `3 r' {& j - <font size="3">void main(void), N4 k7 w# p4 s9 L0 x& k; M' w
- {* [3 e5 B3 X& f/ I0 K
1 |5 \. `7 X U, Q8 A7 ]- CLK_Config(); //时钟初始化
$ K; e ^' [/ q$ f2 Z6 d1 z - & h0 r: ]. r. i6 H
- Delay(0x2fffff); //延时5S " M* s3 @- ]: P, A- P
-
% a- ^" N0 z; y$ f& x$ K5 w: v# { - led_init(); //led初始化
! X; T3 d0 }: ^& t/ _; W - //swim_init();; V6 o8 T# o4 I( \2 }
- uart_init_halfduplex();& x @& b" R% m, x! O
- 2 y) c( ?9 S- n: i" M
- while (1)* a/ q4 N) d& K; }6 B6 I
- { t1 v Y: m( k8 p( i2 H4 ?0 _
- led_tog(); //LED取反
, W u1 j: `* o+ x7 A - //swim_tog(); //SWIM引脚取反
, z8 c P. N. f+ ? - UART_SendString ( "www.stmcu.org.cn\r\n"); o, _. V5 P# ^$ S# a
- UART_SendString ( "stm8l050 串口测试\r\n");
# |5 y; y* g: {" k" o4 T$ V9 E -
1 I) x |) S" u! G - Delay(0xffff);
. j1 e: p! h4 `8 e) { - }
4 S" x0 H$ t. o$ n H( X0 p - }</font>
复制代码
- k' t+ A% B7 _- E* Y, \
. s; J9 ?8 V5 _8 q+ R; ?7 v 四、程序执行结果
5 V" y- O3 }; `7 _7 d6 E5 y
0 E* \, ~3 G1 i& L2 P+ o6 i
, w* z d$ u% `, X- {1 L+ S% h 8 _' A$ V; a6 B6 j: R
% c: k+ [9 _' r% t, ~/ j* n4 t
9 ^- l0 A' V& n2 d
' ]/ {2 f" z; C K* n
|
是啊,8个引脚,IO口最多就6个