芯片基本外设配置1 ]3 v. K* Z/ x# u
在SYS里面开启Serial Wire调试接口
+ p; O( T. S& l在RCC里面使能HSE (Crystal/Ceramic Resonator)0 d, `' u+ w [; e* x- Y
配置时钟树; A! f9 f0 t1 A# O7 L" ?/ Z& ^5 n! P
选中“HSE”、"PLLCLK",在HCLK(MHz)中输入64,回车,软件会自动配置数值。
3 y9 J7 R( V' z6 P( D \$ D c+ S0 p* h* U5 ]
7 b! N+ Y; T& G
- D5 w" |2 }3 b, r: `( u$ o 配置USART1外设" ~; ?5 ~$ @5 k9 M% c3 Q, |
在connectivity选项卡中,选择"USART1",在mode中选择:Asynchronous(异步通讯)% g9 a& J C! `+ Z& D/ P
! c9 d% `1 O# v4 L' I* `4 h2 m4 Q. b在“Parameter Settings”中设置基本参数,参数可以自定义,但是通讯双方一定要相同
% ?; g9 Q/ A; b; l
+ C+ B" z& M# d: u+ J8 Z* B0 eBaud Rate(波特率):115200,常用有4800,9600。
1 U: |1 O2 m/ t% r( D0 ?7 L
% Z) ]. [" N, G* `Word Length(数据位):8,可选7、8、91 T+ u# H% R. h* v1 @
4 d" L, i3 M$ S: I ]. VParity(校验位):None,可选None、Even、Odd
% ]5 r) v) n# Y' q' M: y" Y! K6 _7 O/ L [4 S0 d+ W
Stop Bits(停止位):1,常用有1、2、0.5、1.5
! D7 n+ R! s# t2 q d
; A0 L) _; H8 G! H" y. y- ?其他参数默认值。
# r4 l2 I$ f& j e+ a% O3 e' F% m, C3 q5 c+ g. c
( T; q2 h+ G/ C# T- l- R! g+ p7 G0 }0 T% M5 }& I& t0 X* e( c
生成代码后,在MDK软件中打开,在debug中设置“Reset and Run”。/ F/ l: d5 \+ `7 \0 ]6 T
; Q) ?6 I1 }: u3 c# P4 O1 H8 H0 t使用串口的三种方法(直接调用hal库、printf、中断方式)
: c, @6 H6 x& F& Y第一种方法(直接调用HAL库): Q1 `" j& F- P
在int main()主函数中写入如下代码4 M, J7 d' T" ~+ c4 y
' x, @, B$ ~1 C' b
- uint8_t temp_buf[1]="c"; //定义一个数组,这个数组长度可以自定义
2 ]& Z: ?2 ?' n% }, N5 \ - while (1)
% a9 B$ A3 C) u d2 v2 m: ~ - {" v5 J, J8 h4 C# w1 h' a( [6 V7 K
- /* USER CODE END WHILE */% K, L' g0 {2 n4 H% w
- /* USER CODE BEGIN 3 */, K! ^4 J5 C) H+ x
- HAL_Delay(1000);8 [+ D& O* r* O; v# K
- HAL_UART_Transmit(&huart1,temp_buf,1,10); //使用usart1串口每一秒发送字符c2 c( F$ ^# w9 R) C3 M
- }
复制代码- uint8_t temp_buf=109; //定义整数,
" Y' ` v# J& U* X - while (1)
- H O B5 M% b; W: q - {, C& b U- J5 \ r$ K9 n) A& s# v# v* j
- /* USER CODE END WHILE */
9 [# q' N0 _+ D2 l$ Y - /* USER CODE BEGIN 3 */
! ^2 p( ~) m8 T2 t# S9 w - HAL_Delay(1000);$ O7 H) c; m: _& p- [
- HAL_UART_Transmit(&huart1,&temp_buf,1,10); //使用usart1串口每一秒发送字符m, p) ^; m+ K; g: W2 v* ]- s; [
- }
复制代码
+ h; @; Y7 |0 C5 [HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)# |# L0 |( D( w- F: j
8 @# S7 a2 l2 {# d6 {; [4 x
, o% O, w! V! w0 F1 n6 bUART_HandleTypeDef *huart:指定串口,usart1就是&huart1。usart2就是改为&huart2。+ h4 F' h: @ c7 f5 S
& O: } G/ E8 Quint8_t *pData:就是要发送的数据
: ?. I/ E6 e% S g( p" _* I! _' g! s. P$ P
uint16_t Size:单位为字节,至少要比发送数据长度要大。
! Q1 l/ F6 D" L7 @, S& }( W, o. }
$ l8 d d1 |; m( U9 [uint32_t Timeout:超时时间
0 B" k+ O+ C7 \( B7 \% k) z1 |/ p; |) W. A4 o8 ]
第二种方法(printf)* H0 T7 @# [3 r* V' ]
在main.c文件中添加头文件% p1 Y( n3 l2 x' |5 |
+ [: e: p3 g7 p' b) k6 v- ?
main.c文件中加入重定向函数 ,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数
7 v7 X G! P8 Q, G- /* USER CODE BEGIN 0 */: }; `1 Z, t8 ?( d
- #ifdef __GNUC__
' n# I( N1 d @! v - /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf& k" _, B! [9 N. v
- set to 'Yes') calls __io_putchar() */
4 e; V" x4 v Y' s8 E0 Y7 g - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)0 U2 M# u- n4 G+ a, ~
- #else
* K2 V# F1 Z4 i6 n) a; O - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)& R& R% g2 z) [, w4 i
- #endif /* __GNUC__ */% _, p. t/ L; l' m- F2 f# }! O
- /**9 |. U, Q- \; @( F. k
- * @brief Retargets the C library printf function to the USART.6 p; [3 `7 o& }* i
- * @param None
5 T) F' g. ?; K( r - * @retval None
) T% a. A( |" f* \ - */9 ` p) \' N% C7 A+ N7 e7 f: H, t0 _
- PUTCHAR_PROTOTYPE
$ i y, }6 ]) b' Y+ O, s - {
* k1 n: r4 K0 ?0 q# [ - /* Place your implementation of fputc here */
4 G2 P/ m+ L0 } - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
5 j/ ?4 O9 N0 g3 _5 L - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);8 v: Y' {2 Y8 Z; W1 ? i
- 9 u8 }- r; G8 ~
- return ch;/ ^; i& A, P) c* |6 X) @
- }2 H" h9 o0 c2 I2 [7 y8 X# R
- /* USER CODE END 0 */
复制代码
% T/ V- n0 P+ c$ z; U在int main主函数while循环中加入代码 , H# u0 J" j4 I, D0 T" K) \5 o& O
- while (1)
, C5 K) x7 n/ `, B3 m" L - {
- n& c+ K7 E. [2 { - /* USER CODE END WHILE */: m$ m P( e& G( X
- /* USER CODE BEGIN 3 */
5 n8 }% I* A$ g# z - HAL_Delay(1000); //延时一秒钟输出字符b& n$ L/ I) F- g5 y
- printf("b\r\n");
3 A+ F/ s- ~ ` - }
% T$ ?" b: t d& Y4 |5 } - /* USER CODE END 3 */
复制代码
" n. d0 l5 a1 i4 \$ r- t& m2 f第三种方法(使用中断)
5 J2 U% |5 L" q4 ^在CubeMX中,设置USART1全局中断使能,然后重新生成代码。0 x4 N/ q) n6 B ~
# N$ m* J- d1 d% s9 w& V1 L f, a
; C0 I( Q2 y& T' {, z% d U" j" J' v
在main.c文件中定义变量# ? G# z1 k0 \) K, |% K
- uint8_t TX_Buff[]="THIS IS A MESSAGE!\r\n"; //发送缓存- n3 a' C4 i% D/ w: ?/ z
- uint8_t RX_Buff[2]; //接收缓存
复制代码
, D4 a0 |+ W$ h. w. L; ]3 i) z# C3 ` 在int main主函数中,MX_USART1_UART_Init();后面写入串口输出函数
f& @$ h% E) ^- HAL_UART_Transmit_IT(&huart1,TX_Buff,sizeof(TX_Buff)); //用于第一的串口输出信息
复制代码 7 \- t& l* v; T% e- I( X
在while(1)循环中,加入接收中断函数4 k$ L, O$ k* S# U* g4 E
- /*
# G, h7 [0 ~) K$ I. Q: v - *2表示缓冲字节,发送的字节数要于缓冲的一致。如果发送长度小于2,则等到2字节后再显示出来) Y- \7 Y9 l' s8 l. j* z. n7 z
- */
. U/ I# U1 z6 \ - HAL_UART_Receive_IT(&huart1,RX_Buff,2);
复制代码
! q f9 t; @- C! T- p% d+ l: H再int main函数后面写上中断回调函数# c) {) [5 u* Z
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
% z7 D! k, G' { @ - {+ b% H! Z- E# n8 F/ O
- UNUSED(huart);2 Y( o; z, I6 k. S: B- D) C
- HAL_UART_Transmit(&huart1,(uint8_t*)RX_Buff,2,100);
9 \4 f% ]9 s6 y9 J! a - }
复制代码 - {3 k3 Q. {+ N! X4 E5 q8 B( W
编译,下载到开发板即可
( A' C- i& U+ s6 @$ T
: ~. {! ] w \+ x; t4 e% K
* m. X( Q4 n, Z! @$ S; P4 I |: B" \; X) B( s$ x: l
————————————————' W: G% F1 c% l. b' p! o
版权声明:SCCELE* G' e v q4 m5 {# p6 }
7 c8 `6 W% F, y' X+ z y
. G" x5 M+ P O- |9 ]* d% l |