头文件:
- 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 }
-
-
-
-
实验现象:

