头文件:
1 #ifndef __UART4_H__
2 #define __UART4_H__
3
4 #include "../common/include/stm32mp1xx_rcc.h"
5 #include "../common/include/stm32mp1xx_gpio.h"
6 #include "../common/include/stm32mp1xx_uart.h"
7
8 //UART4串口初始化
9 void hal_uart_init(void);
10
11 //发送一个字符
12 void hal_put(const char str);
13
14 //发送一个字符串
15 void hal_put_string(const char* string);
16
17 //接收一个字符
18 char get_char(void);
19
20 //接收一个字符串
21 char* get_string(void);
22
23 #endif
源文件:
1 #include "uart4.h"
2
3 //UART4串口初始化
4 void hal_uart_init(void)
5 {
6 /********** RCC 相关寄存器初始化***********/
7 RCC->MP_AHB4ENSETR |= (0x1<<1); //使能GPIOB组控制器
8 RCC->MP_AHB4ENSETR |= (0x1<<6); //使能GPIOG组控制器
9 RCC->MP_APB1ENSETR |= (0x1<<16); //使能UART4组控制器
10
11 /********** GPIO 相关寄存器初始化***********/
12 GPIOB->MODER &= (~(0x3<<4)); //设置PB2引脚为复用功能
13 GPIOB->MODER |= (0x2<<4);
14 GPIOG->MODER &= (~(0x3<<22)); //设置PG11引脚为复用功能
15 GPIOG->MODER |= (0x2<<22);
16
17 GPIOB->AFRL &= (~(0xf<<8)); //设置PB2引脚复用功能为 URAT4_RX
18 GPIOB->AFRL |= (0x1<<11);
19 GPIOG->AFRH &= (~(0xf<<12)); //设置PG11引脚复用功能为 URAT4_TX
20 GPIOG->AFRH |= (0x6<<12);
21
22 /********** UART4 相关寄存器初始化***********/
23 //1.USART_CR1:设置数据位宽度,以及对应的控制器使能(UART控制器使能,发送寄存器使能,接收寄存器使能)
24 USART4->CR1 &= (~(0x1<<28));
25 USART4->CR1 &= (~(0x1<<12));
26 USART4->CR1 &= (~(0x1<<15));
27 USART4->CR1 &= (~(0x1<<10));
28 USART4->CR1 |= (0x1<<3);
29 USART4->CR1 |= (0x1<<2);
30 USART4->CR1 |= 0x1;
31
32 //2.USART_CR2:设置串口停止位
33 USART4->CR2 &= (~(0x3<<12));
34
35 //3.USART_BRR:设置串口波特率
36 USART4->BRR = 0x22b;
37
38 //7.USART_PRESC:设置串口分频器
39 USART4->PRESC &= (~0xf);
40
41 }
42
43 //发送一个字符
44 void hal_put(const char str)
45 {
46 //判断发送数据寄存器是否有数据
47 while(!(USART4->ISR & (0x1<<7))); //位7为1时,可以发送数据,跳出循环
48
49 // USART4->TDR &= (~(0xff));
50 USART4->TDR = str;
51
52 //判断发送数据寄存器是否发送完成
53 while(!(USART4->ISR & (0x1<<6)));//位6为1时,发送数据完成,跳出循环
54 }
55
56 //发送一个字符串
57 void hal_put_string(const char* string)
58 {
59 //判断字符串结束标志
60 while('\0' != *string)
61 {
62 hal_put(*string);
63 string++;
64 }
65 }
66
67 //接收一个字符
68 char get_char(void)
69 {
70 //判断接收数据寄存器是否接收到数据
71 while(!(USART4->ISR & (0x1<<5))); //位5为1时,可以读取数据,跳出循环
72 return (char)USART4->RDR;
73 }
74
75 char buf[128] = "";
76 //接收一个字符串
77 char* get_string(void)
78 {
79 //键盘的回车键按下,对应的字符'\r'
80 int i;
81 for(i=0; i<(sizeof(buf)-1); i++)
82 {
83 buf[i] = get_char();
84 hal_put(buf[i]);
85
86 if('\r' == buf[i])
87 {
88 break;
89 }
90 }
91 buf[i] = '\0';
92 hal_put('\n');
93
94 return buf;
95
96 }
97
主函数测试:
1 #include "uart4.h"
2
3 extern void printf(const char *fmt, ...);
4 void delay_ms(int ms)
5 {
6 int i,j;
7 for(i = 0; i < ms;i++)
8 for (j = 0; j < 1800; j++);
9 }
10
11
12 int main()
13 {
14 hal_uart_init();
15 printf("ARM,YES!!!\n");
16 while(1)
17 {
18 //hal_put(get_char()+1);
19 hal_put_string(get_string());
20 }
21 return 0;
22 }
实验现象: