1、在键盘输入字符串,在串口工具显示字符串
(1)main.c
#include "uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
int i,j;
for(i = 0; i < ms;i++)
for (j = 0; j < 1800; j++);
}
char buff[50]={0};
int main()
{
hal_uart4_init();
//put_char('A');
//put_string("uart4test*****************");
//put_string("12345678");
put_string("uart4 test*****************\r");
/*
while(1)
{
put_char(get_char()+1); //only A-Z a-z 0-9
}
*/
while (1)
{
get_string();
put_string(buff);
}
return 0;
}
(2)src/uart4.c
#include "uart4.h"
//初始化 uart
extern char buff[50];
void hal_uart4_init()
{
/******RCC章节**************/
RCC->MP_AHB4ENSETR |= (0x1<<1 | 0x1<<6);
RCC->MP_APB1ENSETR |= (0x1<<16);
/********使能GPIOB组控制器***********/
//PB2----> UART4_RX
GPIOB->MODER &= (~(0b11<<4));
GPIOB->MODER |= (0b10<<4);
GPIOB->AFRL &= (~(0b1111<<8));
GPIOB->AFRL |= (0b1000<<8);
//使能GPIOG组控制器---->UART4_TX
GPIOG->MODER &= (~(0b11<<22));
GPIOG->MODER |= (0b10<<22);
GPIOG->AFRH &= (~(0b1111<<12));
GPIOG->AFRH |= (0b0110<<12);
/********使能UART4组控制器***********/
//M bit init(M1 M0) , sampling 16(OVER8), no even odd parity(PCE)
USART4->CR1 &= (~(0x1<<28 | 0x1<<12 | 0x1<<15 | 0x1<<10));
//TE RE UE
USART4->CR1 |= (0x1<<3 | 0x1<<2 | 0x1<<0);
//1 stop bit
USART4->CR2 &= (~(0b11<<12));
//BRR= 64MHz/115200 = 0x22B
USART4->BRR = 0x22B;
//no prescaling
USART4->PRESC &= 0b0000;
}
//发送一个字符
void put_char(const char str)
{
//判断发送数据寄存器是否为空==>UART_ISR[7] is 1,if it's 1,then the next byte could be sent
//读0:发送数据寄存器为满,需要等待
//读1:发送数据寄存器为空,发送下一个字节
while(!(USART4->ISR & (0x1<<7)));
USART4->TDR = str;
//判断发送数据是否完成 0 not finshed 1 finshed
while (!(USART4->ISR & (0x1<<6)));
if ('\r'==str)
{
put_char('\n');
}
}
//发送一个字符串
void put_string(const char* string)
{
//判断是否为\0
const char *p = string;
while (*p!='\0')
{
put_char(*p);
p++;
}
}
//接收一个字符
char get_char()
{
char ret;
//1.判断RXNE是否为1,数据接收,0 数据不接收
while (!(USART4->ISR & (0x1<<5)));
//调用put_char
ret = USART4->RDR;
return ret;
}
//接收一个字符串
char* get_string()
{
//for循环
//loop: 接收一个字符,然后显示出来
//判断键盘回车是否按下\r
int i;
for(i = 0; i < sizeof(buff)-1;i++)
{
// receive a char
buff[i] = get_char();
// display the char
put_char(buff[i]);
if ('\r'==buff[i])
{
break;
}
}
return buff;
}
(3)include/uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
//初始化 uart
void hal_uart4_init();
//发送一个字符
void put_char(const char str);
//发送一个字符串
void put_string(const char* string);
//接收一个字符
char get_char();
//接收一个字符串
char* get_string();
#endif
实验结果图