头文件:
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_RX18 GPIOB->AFRL |= (0x1<<11);19 GPIOG->AFRH &= (~(0xf<<12)); //设置PG11引脚复用功能为 URAT4_TX20 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 }
实验现象: