include
#ifndef __MYUART_H__
#define __MYUART_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
char arr[50] ;
char brr[50] ;
//管脚串口的初始化
void uart4_init();
//发送一个字符
void myputchar (char c);
//接受一个字符
char mygetchar();
//接受一个字符串
void gets();
//发送一个字符串
void puts(char *p);
//PE10 LED1 PE8 LED3 初始化
void PE10_PE8_init();
//PF10 LED2 初始化
void PF10_init();
//PE10 LED1 开
void LED1_on();
//PE8 LED3 开
void LED3_on();
//PF10 LED2 开
void LED2_on();
//PE10 LED1 关
void LED1_off();
//PE10 LED3 关
void LED3_off();
//PF10 LED2 关
void LED2_off();
#endif
test.c
#include "myuart.h"
//串3口的初始化
void uart4_init()
{
//gpiob/gpioe 使能
RCC->MP_AHB4ENSETR |=(0x1<<1);
RCC->MP_AHB4ENSETR |=(0x1<<6);
//uart4使能
RCC->MP_AHB4ENSETR |=(0X1<<16);
//PB 2初始化
GPIOB->MODER &= (~(0X3<<4));
GPIOB->MODER |= (0X2<<4);
//设置UART4RX
GPIOB->AFRL &= (~(0XF<<8));
GPIOB->AFRL |= (0x8<<8);
//PG 11初始化
GPIOG->MODER &= (~(0x3<<22));
GPIOG->MODER |= (0X2<<22);
GPIOG->AFRH &= (~(0XF<<12));
GPIOG->AFRH |= (0X6<<12);
//串口初始化
//1.设置串口禁用
USART4->CR1 &= (~0X1);
//2.设置数据位
USART4->CR1 &=(~(0X1<<12));
USART4->CR1 &=(~(0X1 <<28));
//3.设置有无就校验
USART4->CR1 &= (~(0X1<<10));
//4.设置16倍采样率
USART4->CR1 &= ( ~ (0X1<<15));
//5.设置停止位
USART4->CR2 &= ( ~ (0X3 << 12));
//6.设置分频
USART4->PRESC &= ( ~ 0XF);
//7.设置波特率
USART4->BRR = 0X228;
//8.收使能
USART4->CR1 |= (0X1 << 2);
//9.发使能
USART4->CR1 |= (0X1 << 3);
//10.串口使能
USART4->CR1 |= 0X1 ;
}
//PE10 LED1 PE8 LED3 初始化
void PE10_PE8_init()
{
//使能
RCC->MP_AHB4ENSETR |= (0x1<<4);
//输出
GPIOE->MODER &= (~(0x3<<20));
GPIOE->MODER |= (0x1<<20);
GPIOE->MODER &= (~(0x3<<16));
GPIOE->MODER |=(0x1<<16);
//推挽
GPIOE->OTYPER &= (~(0x1<<10));
GPIOE->OTYPER &= (~(0x1<<8));
//低速
GPIOE->OSPEEDR &= (~(0x3<<20));
GPIOE->OSPEEDR &=(~(0x3<<16));
//无上拉无下拉
GPIOE->PUPDR &=(~(0X3<<20));
GPIOE->PUPDR &=(~(0X3<<16));
}
//PF10 LED2 初始化
void PF10_init()
{
//使能
RCC->MP_AHB4ENSETR |= (0x1<<5);
//输出
GPIOF->MODER &= (~(0x3<<20));
GPIOF->MODER |= (0x1<<20);
//推挽
GPIOF->OTYPER &= (~(0x1<<10));
//低速
GPIOF->OSPEEDR &= (~(0x3<<20));
//无上拉无下拉
GPIOF->PUPDR &=(~(0X3<<20));
}
//PE10 LED1 开
void LED1_on()
{
GPIOE->ODR |= (0x1<<10);
}
//PE8 LED3 开
void LED3_on()
{
GPIOE->ODR |= (0x1<<8);
}
//PF10 LED2 开
void LED2_on()
{
GPIOF->ODR |= (0x1<<10);
}
//PE10 LED1 关
void LED1_off()
{
GPIOE->ODR &= (~(0x1<<10));
}
//PE10 LED3 关
void LED3_off()
{
GPIOE->ODR &= (~(0x1<<8));
}
//PF10 LED2 关
void LED2_off()
{
GPIOF->ODR &= (~(0x1<<10));
}
//发送一个字符
void myputchar (char c)
{
while( ! (USART4 -> ISR & ( 0X1 << 7 )));
USART4->TDR = c;
while( ! (USART4 -> ISR & ( 0x1 << 6 )));
}
//接受一个字符
char mygetchar()
{
char c;
while( ! ( USART4->ISR & (0X1 << 5 )));
c=USART4->RDR;
return c;
}
//接受一个字符串
void gets()
{
int i;
for ( i=0; i<50; i++ )
{
arr[i]=mygetchar();
if( arr[i] == '\r')
break ;
myputchar(arr[i]);
}
arr[i] = '\0';
myputchar('\n');
myputchar('\r');
}
//发送一个字符串
void puts(char *p)
{
while(*p)
{
myputchar(*p);
p++;
}
myputchar('\n');
myputchar('\r');
}
main.c
#include "myuart.h"
//封装延时函数
void delay(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++);
}
}
int main()
{
char a;
//串口的初始化
uart4_init();
PE10_PE8_init();
PF10_init();
LED1_on();
LED2_on();
LED3_on();
while(1)
{
//从串口读取一个字符
a=mygetchar();
if(a=='1')
{
LED1_off();
LED2_off();
LED3_off();
}
else if(a=='2')
{
LED1_on();
}
else if(a=='3')
{
LED2_on();
}
else if(a=='4')
{
LED3_on();
}
else if(a=='5')
{
LED1_off();
}
else if(a=='6')
{
LED2_off();
}
else if(a=='7')
{
LED3_off();
}
//将读取的字符+1发送回去
myputchar(a+1);
// gets();
// puts(arr);
}
return 0;
}