目录
main.c
#include "gpio.h"
#include "led.h"
#include "uart4.h"
int main()
{
//使能PE、PF时钟
*((unsigned int *)0x50000A28) |= (0x3<<4);
led1_init();
led2_init();
led3_init();
uart4_init();
char buf[32];
while (1)
{
/*
a=getchar();
putchar(a+1);
*/
gets(buf);
if (strcmp(buf, "led1_on") == 0)
{
led1_ctl(1);
}
else if(strcmp(buf, "led1_off") == 0){
led1_ctl(0);
}
}
return 0;
}
uart.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void uart4_init();
void putchar(char ch);
char getchar();
void puts(char *src);
void gets(char *src);
int strcmp(char *src,char *dest);
#endif
uart.c
#include "uart4.h"
//uart4串口初始化
void uart4_init(){
//使能uart4、gpiob、gpiog的时钟使能
RCC->MP_APB1ENSETR |= (0x1<<16);
RCC->MP_AHB4ENSETR |= (0x1<<1);
RCC->MP_AHB4ENSETR |= (0x1<<6);
//设置pb2、pg11为复用模式
GPIOB->MODER &= (~(0x3<<4));
GPIOB->MODER |= (0x1<<5);
GPIOG->MODER &= (~(0x3<<22));
GPIOG->MODER |= (0x1<<23);
//设置pb2为uart4 RX、pg11为uart4 TX的复用功能
GPIOB->AFRL &= (~(0xf<<8));
GPIOB->AFRL |= (0x8<<8);
GPIOG->AFRH &= (~(0xf<<12));
GPIOG->AFRH |= (0x6<<12);
//禁止uart4的ue使能位
USART4->CR1 &= (~0x1);
//设置数据针格式
//设置数据长度m1:m0,00
USART4->CR1 &= (~(0x1<<28));
USART4->CR1 &= (~(0x1<<12));
//设置过采样倍数为16倍
USART4->CR1 &= (~(0x1<<15));
//设置为无校验位
USART4->CR1 &= (~(0x1<<10));
//使能发送器和接收器
USART4->CR1 |= (0x3<<2);
//设置停止位为1位
USART4->CR2 &= (~(0x3<<12));
//设置波特率为115200
USART4->BRR=64000000/115200;
//设置为不分频
USART4->PRESC &= (0x0);
//使能串口
USART4->CR1 |= (0x1);
}
//发送一个字符的数据
void putchar(char ch){
//判断发送数据寄存器是否为空,不为空则阻塞
while(!(USART4->ISR & (0x1<<7)));
//往发送数据寄存器写数据
USART4->TDR=ch;
//判断是否发送完成,没有发送完成则阻塞
while(!(USART4->ISR & (0x1<<6)));
}
//接收一个字符的数据
char getchar(){
//判断接收数据寄存器是否有数据可读
while(!(USART4->ISR & (0x1<<5)));
//从数据接收寄存器读取数据
return USART4->RDR;
}
//发送一个字符串
void puts(char *src){
while(*src){
putchar(*src);
src++;
}
//win下\n为光标到下一行
putchar('\n');
//\r是光标回到当前行首
putchar('\r');
}
//接收一个字符串
void gets(char *src){
while(1){
*src=getchar();
putchar(*src);
if(*src=='\r'){
break;
}
src++;
}
*src='\0';
putchar('\n');
}
//判断输入指令
int strcmp(char *src,char *dest){
while((*src++==*dest++)&&(*src!='\0'));
return *src==*dest?0:-1;
}
实验效果
输入led1_on点亮led1
输入led1_off关闭led1