芯片基本外设配置4 Q4 z1 |: b2 C U5 Y0 L
在SYS里面开启Serial Wire调试接口 M4 S4 ~6 e) c3 A" V) D. l# a5 |
在RCC里面使能HSE (Crystal/Ceramic Resonator)
* m0 T+ i Y" e! j; E2 D配置时钟树 i4 \- Z1 d$ ?# U$ Z) [* k
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
1 ?$ f5 G. h( J. [/ S
( t# f: }$ h5 p, M+ i" t7 c: ?8 O9 d$ l
/ m9 c0 U+ U# J Z6 M. {
配置USART1外设" D2 d6 \: @- V! ]6 ?0 q: S+ ^9 [
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)2 S: P3 a- B1 d4 X/ p
+ {4 F/ i$ Q2 T" a2 i
在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
8 i( M5 E% N+ r
( | Z! _6 p0 x; F4 B+ X0 gBaud Rate(波特率):115200,常用有4800,9600。
# z$ k- G7 A5 f6 ?. b* u# T
- o, V; [& J( Z" t! C, u8 MWord Length(数据位):8,可选7、8、9
' {' T2 A9 q: j5 d3 l+ J
0 \% K+ O, @( b) mParity(校验位):None,可选None、Even、Odd
. c0 ^0 ?& b' j' `, ` B$ y4 i) M/ Y' H/ T8 W' s
Stop Bits(停止位):1,常用有1、2、0.5、1.5+ I3 j# \: p0 ?
0 t5 K4 n0 n$ q8 J. a1 e
其他参数默认值。: e0 H: I3 i9 y
2 b$ m8 x5 m! f2 X
$ M1 o9 I$ I2 u8 d( {5 n
5 M. |: M# F( t/ b& g: }3 t 生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。& u3 v9 y; F& Y! h+ v$ O( Y8 Q
; z; ^5 o" |- ^: l+ m, K( w- H. s使用串口的三种方法(直接调用hal库、printf、中断方式)
1 e g# j9 b' [; o3 d- [0 ?: l第一种方法(直接调用HAL库)
3 C5 F/ m/ h) O, ?7 ~1 \/ l3 `! d7 T 在int main()主函数中写入如下代码1 z" i; s4 c4 z" Z( u6 `
/ o: A: |+ T, I) J
- uint8_t temp_buf[1]="c"; //定义一个数组,这个数组长度可以自定义
2 ?2 ^6 P u( s - while (1)
' \ v8 ~6 w R: W4 h - {
- i- ~$ E- W$ E! F - /* USER CODE END WHILE */
, P5 h0 `- z O1 q - /* USER CODE BEGIN 3 */
& G( s) C- `9 \ - HAL_Delay(1000);) \, c: Z3 E8 s' O
- HAL_UART_Transmit(&huart1,temp_buf,1,10); //使用usart1串口每一秒发送字符c6 g* v; ?# v' y8 P$ V# y2 v( Y
- }
复制代码- uint8_t temp_buf=109; //定义整数,5 h0 N1 R8 W/ z8 S+ Q& P3 ?, w
- while (1)
) ]) a& i6 W7 A1 c# E* E - {
: D) p. F0 I* T+ x - /* USER CODE END WHILE */
( N/ Y7 {( C8 A/ W0 J6 W8 L4 y/ D. n - /* USER CODE BEGIN 3 */- Q3 u6 O/ i% M! F5 n
- HAL_Delay(1000);
5 E4 w$ T! m$ K6 R2 b! |: y - HAL_UART_Transmit(&huart1,&temp_buf,1,10); //使用usart1串口每一秒发送字符m
3 U; R: t) H9 K$ S q! ^% g - }
复制代码- HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout<span style="background-color: rgb(255, 255, 255);">)</span>
复制代码 / K( W5 K% \7 \8 J( D* }
UART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
6 H# p3 j1 N) X/ ?
1 _5 ~, z8 J8 Fuint8_t *pData:就是要发送的数据6 g2 G& {" g z2 {% {
4 n% h. i9 L; h) h4 o: Fuint16_t Size:单位为字节,至少要比发送数据长度要大。* | v+ N( L& H, I; A, k
# j$ f7 H# h& y3 vuint32_t Timeout:超时时间
& V; I9 K8 @8 q( C
/ u c% P# {- X9 u+ I/ S第二种方法(printf), p! t; k; n6 H5 I. L
在main.c文件中添加头文件" D1 @6 g% D0 A* G
3 _; V5 W4 Z) l, h; R
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数) d+ P6 X A. j0 E/ d% C! L4 f8 {) [
- /* USER CODE BEGIN 0 */9 _- p6 g5 V8 L+ L
- #ifdef __GNUC__
& _! F6 j3 Z. M O( z9 S - /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf2 M$ `9 }# X) U- a* M
- set to 'Yes') calls __io_putchar() */9 q) @ O7 n8 W" L& Z- m) |/ b: u$ n
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch), g$ G; ?) A5 p8 ^5 l% a2 L
- #else
5 ]: g4 d8 U. W - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)' r/ i" I) H1 m- n
- #endif /* __GNUC__ */- ~. a0 y' E9 ~) N8 f7 E( V4 z
- /**
4 i/ j9 R$ i# q/ V7 x - * @brief Retargets the C library printf function to the USART.8 n+ x. f. E0 E* l
- * @param None
) @: H. `4 a' L+ D - * @retval None8 ~1 E, p" i% @
- */
: h# [4 d. k' |: x+ m* b - PUTCHAR_PROTOTYPE
: ?1 e8 l ^3 _# a: w( W) G - {
/ z+ @! j, }" `$ v; A4 x3 [ - /* Place your implementation of fputc here */
% Q8 y+ Q, _: r& ~9 n" d - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */' H; s7 F3 r" W) N0 k( H
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
$ }! j6 y4 W( b* y - & [( a1 M7 p$ u/ E( y" Z
- return ch;
4 ^9 ^9 h8 b1 w% m6 A+ L - }
5 u* e$ q0 T* r o! z3 h - /* USER CODE END 0 */
复制代码
/ w; g1 M/ z# W; Q. F; ?在int main主函数while循环中加入代码 $ ?7 s. t" B* }
- while (1)) z! {0 C! C- L) ?+ g
- {
" p1 N& P# T& f) _ B& w - /* USER CODE END WHILE */! F6 Y' x$ u1 u% f7 s; e
- /* USER CODE BEGIN 3 */8 |3 ~& H/ w* H- d8 X
- HAL_Delay(1000); //延时一秒钟输出字符b
: B1 m! s' b8 t/ y( e) ~ - printf("b\r\n"); ! X3 A- s7 d u. b6 }3 z. U
- }
3 o9 b1 S. ^4 |( @8 ?* t' M( y3 m - /* USER CODE END 3 */
复制代码
: E4 z6 a0 q. B1 v9 k q: t2 P第三种方法(使用中断)
/ x6 F3 v" a, U: U在CubeMX中,设置USART1全局中断使能,然后重新生成代码。4 F! i; a# S2 c8 a7 r, a
2 J; l1 ]# R- I, w6 ]' F( _# I. \7 J7 c8 E7 {6 i! ?& l
! S2 D/ S" _( v% S/ D, P
在main.c文件中定义变量
# R0 J$ Z/ f+ B. }, W8 G# P& N- uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n"; //发送缓存; k! D: S8 Z! Q- p8 o7 n* {5 x' b! Z+ k
- uint8_t RX_Buff[2]; //接收缓存
复制代码 % Z) b# r4 T; I: b% j1 w: z
在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
( V2 c3 ], g) D! Z; F- HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff)); //用于第一的串口输出信息
复制代码 0 W0 g& k- M5 V; }) A
在while(1)循环中,加入接收中断函数/ V G9 R- F' |' A& e F# v
- /*4 f$ ]# |4 i. n+ i; n8 y
- *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来' j9 \2 _/ m) N) i% t
- */: m4 e" p. v5 q! W
- HAL_UART_Receive_IT(&huart1,RX_Buff,2);
复制代码 R0 T- P6 E0 N
再int main函数后面写上中断回调函数
`3 F0 P! w5 q, V- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)/ K# T+ v C* D
- {
; d( ]2 H0 e( X3 T* j7 f* |4 X | - UNUSED(huart);! T& q/ f+ }4 b! l2 m
- HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100); ( c/ L Y* T4 P E
- }
复制代码 * e- _3 u& }: K9 I( O# C$ d8 X
编译,下载到开发板即可
) i6 V( n% r- ~& r* S: A% b: D8 r0 d( U- ~* r1 a) }
! I+ |. o7 G; |' x
" L# I7 L1 H3 ^7 P4 E2 z |
每日学习小技巧,提升看得见
谢谢分享,学习一下