#include "uart4.h"
int main()
{
led1_init();
fan_init();
uart4_config();
char a;
char buf[32];
while(1)
{
// a=getchar();
// putchar(a+1);
gets(buf);
if(strcmp(buf,"led1_on")==0)
{
led1_ctl(1);
}
if(strcmp(buf,"led1_off")==0)
{
led1_ctl(0);
}
if(strcmp(buf,"fan_on")==0)
{
fan_ctl(1);
}
if(strcmp(buf,"fan_off")==0)
{
fan_ctl(0);
}
puts(buf);
}
return 0;
}
#ifndef __UART4_H__
#define __UART4_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
//初始化UART4函数
void uart4_config();
//发送函数
void putchar(char c);
//接收函数
char getchar();
//接收字符串
void gets(char* s);
void puts(char* s);
void led1_init();
void led1_ctl(int flag);
void fan_init();
void fan_ctl(int flag);
void delay_ma(int ms);
int strcmp(char* src,char* dest);
#endif
#include "uart4.h"
void uart4_config()
{
//使能UART4、GPIOG、GPIOB外设时钟
RCC->MP_APB1ENSETR |= (0x1<<16);
RCC->MP_AHB4ENSETR |= (0x1<<1);
RCC->MP_AHB4ENSETR |= (0x1<<6);
//设置PB2为复用功能
GPIOB->MODER &= (~(0x3<<4));
GPIOB->MODER |= (0x2<<4);
//设置PB2为UART_RX复用功能
GPIOB->AFRL &= (~(0xF<<8));
GPIOB->AFRL |= (0x8<<8);
//设置PG11为复用功能
GPIOG->MODER &= (~(0x3<<22));
GPIOG->MODER |= (0x2<<22);
//设置PG2为UART_RX复用功能
GPIOG->AFRH &= (~(0xf<<12));
GPIOG->AFRH |= (0x6<<12);
//禁用串口
USART4->CR1 &= (~0x1);
//设置8位数据位
USART4->CR1 &= (~(0x1<<12));
USART4->CR1 &= (~(0x1<<28));
//设置无奇偶校验位
USART4->CR1 &= (~(0x1<<10));
//设置1位停止位
USART4->CR2 &= (~(0x3<<12));//CR2寄存器
//设置波特率位115200
USART4->BRR = (0x22b);
//设置频率不分频
// USART4->PRESC &=(0x0000);
USART4->PRESC &=(~0xF);
//设置16倍过采样倍数
USART4->CR1 &= (~0x1<<15);
//使能发送器
USART4->CR1 &= (~0x1<<3);
USART4->CR1 |= (0x1<<3);
//使能接收器
USART4->CR1 &= (~0x1<<2);
USART4->CR1 |= (0x1<<2);
//使能串口
USART4->CR1 |= (0x1);
}
void putchar(char c)
{
//判断发送数据寄存器是否为空
while (!(USART4->ISR&(0x1<<7)));
USART4->TDR = c;
//阻塞等待数据发送完毕
while (!(USART4->ISR&(0x1<<6)));
}
char getchar()
{
while (!(USART4->ISR&(0x1<<5)));
//判断接收寄存器是否有数据,如果没有则阻塞等待,如果有直接读取
return USART4->RDR;
//阻塞等待数据发送完毕
// while (!USART4->ISR&(0x1<<6));
//将读取的数据返货
}
void puts(char* s)
{
while(*s)
{
putchar(*s);
s++;
}
putchar('\n');
putchar('\r');
}
void gets(char *s)
{
while(1)
{
*s=getchar();
putchar(*s);
if(*s=='\r')
{
break;
}
s++;
}
*s='\0';
putchar('\n');
}
int strcmp(char* src,char* dest)
{
int i=0;
int j=0;
while(src[i]==dest[i])
{
if(src[i]=='\0')
{
break;
}
i++;
}
int n = src[i]-dest[i];
if(n>0)
{
return 1;
}
else if(n<0)
{
return -1;
}
else if(0==n)
{
return 0;
}
}
void led1_init()
{
// 设置PE10输出模式
GPIOE->MODER &= (~(0x3 << 20));
GPIOE->MODER |= (0x1 << 20);
// 设置PE10为推挽输出
GPIOE->OTYPER &= (~(0x1 << 10));
// 设置PE10低速输出
GPIOE->OSPEEDR &= (~(0x3 << 20));
// 设置PE10无上拉电阻
GPIOE->PUPDR &= (~(0x3 << 20));
}
//风扇
void fan_init()
{
// 设置PE10输出模式
GPIOE->MODER &= (~(0x3<<18));
GPIOE->MODER |= (0x1<<18);
//设置PE10推挽输出
GPIOE->OTYPER &= (~(0x1<<9));
//设置PE10低速输出
GPIOE->OSPEEDR &= (~(0x3<<18));
//设置PE10无上拉下拉电阻
GPIOE->PUPDR &= (~(0x3<<18));
}
void led1_ctl(int flag)
{
if (flag == 1)
{
GPIOE->ODR |= (0x1 << 10);
}
else if (flag == 0)
{
GPIOE->ODR &= ((~0x1 << 10));
}
}
void fan_ctl(int flag)
{
if (flag == 1)
{
GPIOE->ODR |= (0x1 << 9);
}
else if (flag == 0)
{
GPIOE->ODR &= ((~0x1 << 9));
}
}
void delay_ma(int ms)
{
int i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<2000;j++);
}
}