芯片基本外设配置1 ^ j/ B: p' x, Q* V' |8 s+ i
在SYS里面开启Serial Wire调试接口$ q {0 R/ ^/ c% B
在RCC里面使能HSE (Crystal/Ceramic Resonator)
( y4 S" U# e- z6 r+ J, |$ h' |1 d: g配置时钟树6 N+ m L6 j% t
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。- V! B! z S7 E" R; U
, \" W- B c! ?% s
- P9 ^+ h9 p: b. L! i0 v
) [( `) _; F& q! P# L7 X
配置USART1外设1 _8 H9 F5 f; _5 u' W4 G. w
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)
4 {( {6 r- n& u M
! {! S* J3 T6 b7 \" U" A) c在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
; r& R: A! Q' C" z9 T7 W+ Z0 v' {( k, ]# A( y
Baud Rate(波特率):115200,常用有4800,9600。5 ]% O1 a% I* U$ ~ Q% r
% l9 N9 h" c- l( u, p% D u
Word Length(数据位):8,可选7、8、9' S% X/ I- m, Z0 t
; ]: F- G* I5 gParity(校验位):None,可选None、Even、Odd; P. d& A) Q( h9 w w& {; o4 |2 D
+ Q4 a- m8 c. EStop Bits(停止位):1,常用有1、2、0.5、1.5# _3 P) S }# Z/ u3 S. j- r5 g
# b( o" n/ T9 M @( a& \
其他参数默认值。
8 ~! ~ T' S9 o4 D5 e8 x( e$ R
; E' K0 ^/ N; t* d, z& i4 y9 z6 t- _; A/ B( z- M
2 M! g- j4 q$ U' C/ o0 I+ T0 v
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。
1 n3 `3 m# I" ^% E) f* T2 S& s$ \, e; N% n9 M* ~/ Y
使用串口的三种方法(直接调用hal库、printf、中断方式)1 z9 L; J8 U$ M* K" b' \0 k
第一种方法(直接调用HAL库)$ W" m& p o- B P6 S0 O* }+ ]
在int main()主函数中写入如下代码
9 Q- \4 I& N( H# c; b, Y; h
2 Q9 e r0 y2 p& v- uint8_t temp_buf[1]="c"; //定义一个数组,这个数组长度可以自定义7 P$ \. }" {- X& W2 u- g
- while (1)
4 F/ R" |8 s Q) ^ - {
$ b# X8 i/ ^2 \ - /* USER CODE END WHILE */. n3 d* D! u1 u" g+ _) g% F
- /* USER CODE BEGIN 3 */
% z) b) M: a! m - HAL_Delay(1000);# ?! Y: Q+ x# Q6 N$ m+ A: o
- HAL_UART_Transmit(&huart1,temp_buf,1,10); //使用usart1串口每一秒发送字符c
: Y% I9 t6 U# F: j4 ^3 C - }
复制代码- uint8_t temp_buf=109; //定义整数,
; C3 F: y# |; P2 c - while (1) N N1 B- g% Z
- {8 @) L7 P3 h0 Q8 K: S
- /* USER CODE END WHILE */9 V0 |' {- M k, l1 F
- /* USER CODE BEGIN 3 */( C- N: T/ [! z$ _1 F+ b5 _9 j
- HAL_Delay(1000);5 D+ A& q' o; p1 J
- HAL_UART_Transmit(&huart1,&temp_buf,1,10); //使用usart1串口每一秒发送字符m
8 `) ?% N% h5 V- v! A r2 D - }
复制代码- 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>
复制代码
) J# T- r" x; _$ uUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。
) u! ]5 J& X) U6 |$ x$ I: b% H3 p6 g) c: x. W7 j* L- J, e6 b4 T
uint8_t *pData:就是要发送的数据
. g$ t) r: V# U( k7 \9 U' ?
. \# i4 ?/ a5 K. n. ruint16_t Size:单位为字节,至少要比发送数据长度要大。
) n7 j+ d# I8 x, z. f7 S- v$ l$ Q+ x$ {) u9 O
uint32_t Timeout:超时时间
& z# b6 I) I6 C4 s9 z# g l+ H5 d; }1 o# \4 ]# \; o
第二种方法(printf)
6 k& m# L& Z1 `8 ~7 R# w: {在main.c文件中添加头文件
. ~4 n% M$ F* H% A1 X" y7 G T4 K$ n2 q, g' `! D! D/ G
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数4 K) I3 j# C, w- Z( x& K4 p
- /* USER CODE BEGIN 0 */
" M: q" {4 |3 v# P - #ifdef __GNUC__
" T$ U6 Z4 D* c - /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf. |- D) u+ I6 f* C
- set to 'Yes') calls __io_putchar() */# ~/ i7 g, B$ d8 c! }1 C ~: A
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)5 B! q0 k% F9 T( v
- #else
+ A- N7 G+ y- J/ I" K. K5 f - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
3 B, }; ~8 p- F - #endif /* __GNUC__ */
9 Z6 @( y, g2 v; [ - /**) ?# N: z g' I" |) P# P) ~. @
- * @brief Retargets the C library printf function to the USART.
: q3 Q# l. B; N7 s - * @param None
5 ]; o: `2 l; R2 I: H1 U - * @retval None
7 `$ T* d) C8 X# f+ p; m: E! S - */( V5 d: i9 r9 N4 g* T0 G
- PUTCHAR_PROTOTYPE3 V1 M, b& ]+ D% {. e# ]8 y# _7 _
- {
# X8 _6 o! K6 i7 y% o$ `) L# c+ | - /* Place your implementation of fputc here */
6 H# [' ]% b7 |2 K+ M. n- L6 n - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */* O- r; Z: C8 O! w6 t" }: u
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! u% Q7 M, Z/ d0 L
& c4 x7 s; i4 }# A- return ch;
; \; Z0 _# r" a* E% z5 B$ Z6 k - }) L. J9 R3 a* r# r, D
- /* USER CODE END 0 */
复制代码
% M/ [: G/ z& D在int main主函数while循环中加入代码 . |* U- y8 L" A) }" F) o. x& S1 g
- while (1): O! M3 z }3 x R
- {; p, h2 \" i1 m, w
- /* USER CODE END WHILE */
2 F% O2 }' |2 e) K - /* USER CODE BEGIN 3 */
5 B1 w0 c' o4 O3 ?! X - HAL_Delay(1000); //延时一秒钟输出字符b' C7 V2 M, u. ^
- printf("b\r\n"); # ~5 N) w: x, }/ ^4 D1 C
- }; Z* _" \7 [2 o# {
- /* USER CODE END 3 */
复制代码
3 s0 w. v) v6 e! ?8 [1 g第三种方法(使用中断)
) W2 w9 O. ~1 U- X, u) }1 r在CubeMX中,设置USART1全局中断使能,然后重新生成代码。
. z* }0 z! T8 M- A4 q/ j
8 E6 G( y, f3 T/ y& O; L5 L( B8 ~9 P# A* o( o$ [% U/ X' h- l3 T
! G" y' F- j0 {% ?* x. E3 ~) J, g在main.c文件中定义变量 z0 {. Q# u$ h; E" p8 ~& a
- uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n"; //发送缓存& {2 x! B) ]: T& l" J
- uint8_t RX_Buff[2]; //接收缓存
复制代码 * V/ E$ ^& _; i" y, q' C/ m% c0 @' l/ V
在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
, U/ b: U( G1 H9 v& x- H1 q* x- HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff)); //用于第一的串口输出信息
复制代码 0 x- Z6 k0 T! V& x
在while(1)循环中,加入接收中断函数
7 t6 w, |6 f7 P" W2 E d- /*/ M- d; z2 r |) S9 s
- *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来, q$ l! `* v- b2 q3 l/ n0 k6 P) g
- */0 Z5 O# |# I. R4 {7 B. y
- HAL_UART_Receive_IT(&huart1,RX_Buff,2);
复制代码
3 E# d- |# t. f) _再int main函数后面写上中断回调函数 O* `3 L& {' }3 K% K
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
1 Z! X# A2 K% `3 o C1 ^+ u8 | - {, ]6 r' W" J/ u( _( A# l# z' v
- UNUSED(huart);" \1 R9 y9 t; b6 _% q
- HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100); 4 `. h" u# m3 l6 _9 Q! R
- }
复制代码 4 j. W* a4 u' C
编译,下载到开发板即可
6 Z y$ b; Y. x. ~
; r- I/ w- y K) p, ~' |- _: [9 K
$ n# f% S: k, G% O
|
每日学习小技巧,提升看得见
谢谢分享,学习一下