uart.h
1 #ifndef __UART4_H__
2 #define __UART4_H__
3 #include"stm32mp1xx_gpio.h"
4 #include"stm32mp1xx_rcc.h"
5 #include"stm32mp1xx_uart.h"
6 void uart4_init();
7 void led_init();
8 void putchar(char c);
9 char getchar();
10 void puts(char *s);
11 void gets(char *s);
12 int mystrcmp(char *dest,char *
13 #endif
uart4.c
1 #include "uart4.h"
2 //led灯的初始化函数
3 void led_init()
4 {
5 // 设置GPIOE/GPIOF时钟使能
6 RCC->MP_AHB4ENSETR |= (0x3 << 4);
7 // 设置PE10/PE8/PF10为输出模式
8 GPIOE->MODER &= (~(0x3 << 20));
9 GPIOE->MODER |= (0x1 << 20);
10 GPIOE->MODER &= (~(0x3 << 16));
11 GPIOE->MODER |= (0x1 << 16);
12 GPIOF->MODER &= (~(0x3 << 20));
13 GPIOF->MODER |= (0x1 << 20);
14 // 设置PE10/PE8/PF10为推挽输出
15 GPIOE->OTYPER &= (~(0x1 << 10));
16 GPIOE->OTYPER &= (~(0X1 << 8));
17 GPIOF->OTYPER &= (~(0x1 << 10));
18 // 设置PE10/PE8/PF10输出速度为低速
19 GPIOE->OSPEEDR &= (~(0x3 << 20));
20 GPIOE->OSPEEDR &= (~(0X3 << 16));
21 GPIOF->OSPEEDR &= (~(0x3 << 20));
22 // 设置PE10/PE8/PF10无上拉下拉
23 GPIOE->PUPDR &= (~(0x3 << 20));
24 GPIOE->PUPDR &= (~(0X3 << 16));
25 GPIOF->PUPDR &= (~(0X3 << 20));
26 }
27 //uart4的初始化函数
28 void uart4_init()
29 {
30 //使能UART5,GPIOG/GPIOB的外设闹钟
31 RCC->MP_APB1ENSETR |= (0x1<<16);
32 RCC->MP_AHB4ENSETR |= (0x1<<1);
33 RCC->MP_AHB4ENSETR |= (0x1<<6);
34 //设置PG11为复用功能
35 GPIOG->MODER |= (0x3<<22);
36 GPIOG->MODER &= (~(0x1<<22));
37 //设置PG11为UART_TX为复用功能
38 GPIOG->AFRH &= (0x0<<12);
39 GPIOG->AFRH |= (0x6<<12);
//设置PB2为复用功能
41 GPIOB->MODER &= (~(0x3<<4));
42 GPIOB->MODER |= (0x2<<4);
43 //设置PB2为UART_RX为复用功能
44 GPIOB->AFRL &= (~(0xf<<8));
45 GPIOB->AFRL |= (0x8<<8);
46 //设置禁用串口,UE=0
47 USART4->CR1 &= (~(0x1));
48 //设置8bit数据位
49 USART4->CR1 &= (~(0x1<<12));
50 USART4->CR1 &= (~(0x1<<28));
51 //设置串口16倍过采样
52 USART4->CR1 &= (~(0x1<<15));
53 //设禁用奇偶校验位
54 USART4->CR1 &= (~(0x1<<10));
55 //设置1bit停止位
56 USART4->CR2 &= (~(0x3<<12));
57 //设置波特率115200
58 USART4->BRR = 0x22b;
59 //设置时钟不分频
60 USART4->PRESC &= (~(0xf));
61 //设置使能发送器
62 USART4->CR1 |= (0x1<<3);
63 //设置使能接收器
64 USART4->CR1 |= (0x1<<2);
65 //设置使能串口
66 USART4->CR1 |= (0x1);
67 }
68 //封装单个字符串发送函数
69 void putchar(char c)
70 {
71 //判断发送数据寄存器是否为空
72 while(!(USART4->ISR & (0x1<<7)));
73 //寄存器为空时将数据保存到TDR中
74 USART4->TDR = c;
75 //阻塞等待数据发送结束,函数结束
76 while(!(USART4->ISR & (0x1<<6)));
77 }
78 //封装单个字符串接收函数
79 char getchar()
80 {
81 //阻塞等待数据读取结束
82 while(!(USART4->ISR & (0x1<<5)));
83 return USART4->RDR;
84 }
85 //发送一个字符串
86 void puts(char *s)
87 {
88 while(*s)
89 {
90 putchar(*s);
91 s++;
92 }
93 //发送完字符串让光标显示在下一行的最开头
94 putchar('\n');
95 putchar('\r');
96 }
97 //接收字符串
98 void gets(char *s)
99 {
100 while(1)
101 {
102 *s=getchar();
103 putchar(*s);
104 if(*s == '\r')
105 {
106 break;
107 }
108 s++;
109 }
110 *s = '\0';
111 putchar('\n');
112 }
113 //自定义字符串比较函数
114 int mystrcmp(char *dest,char *src)
115 {
116 while(*dest && *src)
117 {
118 if(*dest!=*src)
119 return *dest-*src;
120 dest++;
121 src++;
122 }
123 if(*dest==*src)
124
125 return 0;
126 }
main.c
1 #include "uart4.h"
2
3 int main()
4 {
5 led_init();
6 uart4_init();
7 char *des = "0";
8
9 char a = 'c';
10 //char buf[32];
11 while(1)
12 {
13 //gets(buf);
14 //puts(buf);
15 putchar(a);
16 getchar();
17
18 gets(des);
19 puts(des);
20 }
21
22 return 0;
23 }