main.c
#include "delay.h"
#include "uart4.h"
#include "led.h"
#include "beep.h"
#include "motor.h"
#include "fan.h"
#include "mystring.h"
int main()
{
uart4_Init();
LED1_Init();
LED2_Init();
LED3_Init();
BEEP_Init();
Motor_Init();
Fan_Init();
char buff[256];
while (1)
{
uart4_gets(buff);//获取主机输入的控制命令
if (my_strcmp(buff, "LED1_ON") == 0)
{
LED1_ON();
uart4_puts("LED1已打开");
}
else if (my_strcmp(buff, "LED1_OFF") == 0)
{
LED1_OFF();
uart4_puts("LED1已关闭");
}
else if (my_strcmp(buff, "LED2_ON") == 0)
{
LED2_ON();
uart4_puts("LED2已打开");
}
else if (my_strcmp(buff, "LED2_OFF") == 0)
{
LED2_OFF();
uart4_puts("LED2已关闭");
}
else if (my_strcmp(buff,"LED3_ON") == 0)
{
LED3_ON();
uart4_puts("LED3已打开");
}
else if (my_strcmp(buff, "LED3_OFF") == 0)
{
LED3_OFF();
uart4_puts("LED3已关闭");
}
else if (my_strcmp(buff, "BEEP_Open") == 0)
{
BEEP_Open();
uart4_puts("蜂鸣器已打开");
}
else if (my_strcmp(buff, "BEEP_Close") == 0)
{
BEEP_Close();
uart4_puts("蜂鸣器已关闭");
}
else if (my_strcmp(buff, "Motor_Open") == 0)
{
Motor_Open();
uart4_puts("电机已打开");
}
else if (my_strcmp(buff, "Motor_Close") == 0)
{
Motor_Close();
uart4_puts("电机已关闭");
}
else if (my_strcmp(buff, "Fan_Open") == 0)
{
Fan_Open();
uart4_puts("风扇已打开");
}
else if (my_strcmp(buff, "Fan_Close") == 0)
{
Fan_Close();
uart4_puts("风扇已关闭");
}
}
return 0;
}
uart4.c
#include "uart4.h"
void uart4_Init(void)
{
//使能GPIOB、GPIOG和UART4时钟
RCC->MP_AHB4ENSETR |= (0X1<<1);//GPIOB
RCC->MP_AHB4ENSETR |= (0X1<<6);//GPIOG
RCC->MP_APB1ENSETR |= (0X1<<16);//UART4
//将GPIOB_PIN2和GPIOG_PIN11设置成复用功能
GPIOB->MODER &= (~(0X3<<4));
GPIOB->MODER |= (0X2<<4);
GPIOG->MODER &= (~(0X3<<22));
GPIOG->MODER |= (0X2<<22);
//将GPIOB_PIN2设置成UART4_RX复用功能,GPIOG_PIN11设置成UART4_TX复用功能
GPIOB->AFRL &= (~(0XF)<<8);
GPIOB->AFRL |= (0x1<<11);
GPIOG->AFRH &= (~(0xF<<12));
GPIOG->AFRH |= (0X6<<12);
//设置串口的数据帧位数,奇偶校验位,停止位,采样倍数,波特率,时钟是否分频
//禁止UART4
USART4->CR1 &= (~(0X1));
//数据帧为8位
USART4->CR1 &= (~(0X1)<<12);
USART4->CR1 &= (~(0X1)<<28);
//采样倍数为16倍
USART4->CR1 &= (~(0X1)<<15);
//无奇偶检验位
USART4->CR1 &= (~(0X1)<<10);
//停止位为1位
USART4->CR2 &= (~(0X3)<<12);
//时钟不分频
USART4->PRESC &= (~(0XF));
//波特率为115200
// unsigned int USARTDIV=64000000/115200;
// USART4->BRR &= (~(0XFFFF));
// USART4->BRR |= USARTDIV;
USART4->BRR=0x22B;
//使能UART4串口及其收发器
//接收器使能
USART4->CR1 &= (~(0X1<<2));
USART4->CR1 |= (0X1<<2);
//发送器使能
USART4->CR1 &= (~(0X1<<3));
USART4->CR1 |= (0x1<<3);
//UART4使能
USART4->CR1 |= (0x1);
}
void uart4_putchar(char c)//向主机发送字符
{
//判断数据发送寄存器是否为空,不为空则继续等待
while (!(USART4->ISR&(0X1<<7)));
//将数据写入数据发送寄存器
USART4->TDR=c;
//阻塞等待数据发送完毕
while (!(USART4->ISR&(0X1<<6)));
}
char uart4_getchar(void)//得到主机发送的字符
{
//判断数据接收寄存器中是否为空,若为空,则阻塞等待;若有,直接读取
while (!(USART4->ISR&(0X1<<5)));
//将读取的数据返回
return USART4->RDR;
}
void uart4_puts(char* src)//向主机发送字符串
{
while (*src)
{
uart4_putchar(*src);
src++;
}
uart4_putchar('\r');
uart4_putchar('\n');
}
void uart4_gets(char* src)//得到主机发送的字符串
{
while(1)
{
*src=uart4_getchar();
if (*src=='\r')
{
break;
}
uart4_putchar(*src);
src++;
}
*src='\0';
uart4_putchar('\r');
uart4_putchar('\n');
}
uart4.h
#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
void uart4_Init(void);
void uart4_putchar(char c);
char uart4_getchar(void);
void uart4_puts(char* src);
void uart4_gets(char* src);
#endif
led.c
#include "led.h"
// 初始化LED1
void LED1_Init(void)
{
//使能GPIOE时钟
RCC->MP_AHB4ENSETR |= (0X1<<4);
//设置PE10引脚模式为输出
GPIOE->MODER &= (~(0X3<<20));
GPIOE->MODER |= (0X1<<20);
//设置PE10引脚的输出模式为推挽输出
GPIOE->OTYPER &= (~(0X1<<10));
//设置PE10引脚的输出速度为低速
GPIOE->OSPEEDR &= (~(0X3<<20));
//设置PE10引脚无上拉下拉电阻
GPIOE->PUPDR &= (~(0X3<<20));
}
// 初始化LED2
void LED2_Init(void)
{
//使能GPIOF时钟
RCC->MP_AHB4ENSETR |= (0X1<<5);
//设置PF10引脚模式为输出
GPIOF->MODER &= (~(0X3<<20));
GPIOF->MODER |= (0X1<<20);
//设置PF10引脚的输出模式为推挽输出
GPIOF->OTYPER &= (~(0X1<<10));
//设置PF10引脚的输出速度为低速
GPIOF->OSPEEDR &= (~(0X3<<20));
//设置PF10引脚无上拉下拉电阻
GPIOF->PUPDR &= (~(0X3<<20));
}
// 初始化LED3
void LED3_Init(void)
{
//使能GPIOE时钟
RCC->MP_AHB4ENSETR |= (0X1<<4);
//设置PE8引脚模式为输出
GPIOE->MODER &= (~(0X3<<16));
GPIOE->MODER |= (0X1<<16);
//设置PE8引脚的输出模式为推挽输出
GPIOE->OTYPER &= (~(0X1<<8));
//设置PE8引脚的输出速度为低速
GPIOE->OSPEEDR &= (~(0X3<<16));
//设置PE8引脚无上拉下拉电阻
GPIOE->PUPDR &= (~(0X3<<16));
}
// 打开LED1
void LED1_ON(void)
{
GPIOE->ODR |= (0X1<<10);
}
// 关闭LED1
void LED1_OFF(void)
{
GPIOE->ODR &= (~(0X1<<10));
}
// 打开LED2
void LED2_ON(void)
{
GPIOF->ODR |= (0X1<<10);
}
// 关闭LED2
void LED2_OFF(void)
{
GPIOF->ODR &= (~(0X1<<10));
}
// 打开LED3
void LED3_ON(void)
{
GPIOE->ODR |= (0X1<<8);
}
// 关闭LED3
void LED3_OFF(void)
{
GPIOE->ODR &= (~(0X1<<8));
}
led.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
// 初始化LED1
void LED1_Init(void);
// 初始化LED2
void LED2_Init(void);
// 初始化LED3
void LED3_Init(void);
// 打开LED1
void LED1_ON(void);
// 关闭LED1
void LED1_OFF(void);
// 打开LED2
void LED2_ON(void);
// 关闭LED2
void LED2_OFF(void);
// 打开LED3
void LED3_ON(void);
// 关闭LED3
void LED3_OFF(void);
#endif
beep.c
#include "beep.h"
//初始化BEEP
void BEEP_Init(void)
{
//使能GPIOB时钟
RCC->MP_AHB4ENSETR |= (0X1<<1);
//设置PB6引脚模式为输出
GPIOB->MODER &= (~(0X3<<12));
GPIOB->MODER |= (0X1<<12);
//设置PB6引脚的输出模式为推挽输出
GPIOB->OTYPER &= (~(0X1<<6));
//设置PB6引脚的输出速度为低速
GPIOB->OSPEEDR &= (~(0X3<<12));
//设置PB6引脚无上拉下拉电阻
GPIOB->PUPDR &= (~(0X3<<12));
}
//打开BEEP
void BEEP_Open(void)
{
GPIOB->ODR |= (0X1<<6);
}
//关闭BEEP
void BEEP_Close(void)
{
GPIOB->ODR &= (~(0X1<<6));
}
beep.h
#ifndef __BEEP_H__
#define __BEEP_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//初始化BEEP
void BEEP_Init(void);
//打开BEEP
void BEEP_Open(void);
//关闭BEEP
void BEEP_Close(void);
#endif
fan.c
#include "fan.h"
//初始化风扇
void Fan_Init(void)
{
//使能GPIOE时钟
RCC->MP_AHB4ENSETR |= (0X1<<4);
//设置PE9引脚模式为输出
GPIOE->MODER &= (~(0X3<<18));
GPIOE->MODER |= (0X1<<18);
//设置PE9引脚的输出模式为推挽输出
GPIOE->OTYPER &= (~(0X1<<9));
//设置PE9引脚的输出速度为低速
GPIOE->OSPEEDR &= (~(0X3<<18));
//设置PE9引脚无上拉下拉电阻
GPIOE->PUPDR &= (~(0X3<<18));
}
//打开风扇
void Fan_Open(void)
{
GPIOE->ODR |= (0X1<<9);
}
//关闭风扇
void Fan_Close(void)
{
GPIOE->ODR &= (~(0X1<<9));
}
fan.h
#ifndef __FAN_H
#define __FAN_H
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//初始化风扇
void Fan_Init(void);
//打开风扇
void Fan_Open(void);
//关闭风扇
void Fan_Close(void);
#endif
motor.c
#include "motor.h"
//初始化马达
void Motor_Init(void)
{
//使能GPIOF时钟
RCC->MP_AHB4ENSETR |= (0X1<<5);
//设置PF6引脚模式为输出
GPIOF->MODER &= (~(0X3<<12));
GPIOF->MODER |= (0X1<<12);
//设置PF6引脚的输出模式为推挽输出
GPIOF->OTYPER &= (~(0X1<<6));
//设置PF6引脚的输出速度为低速
GPIOF->OSPEEDR &= (~(0X3<<12));
//设置PF6引脚无上拉下拉电阻
GPIOF->PUPDR &= (~(0X3<<12));
}
//打开马达
void Motor_Open(void)
{
GPIOF->ODR |= (0X1<<6);
}
//关闭马达
void Motor_Close(void)
{
GPIOF->ODR &= (~(0X1<<6));
}
motor.h
#ifndef __MOTOR_H__
#define __MOTOR_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
//初始化马达
void Motor_Init(void);
//打开马达
void Motor_Open(void);
//关闭马达
void Motor_Close(void);
#endif
mystring.c
#include "mystring.h"
int my_strcmp(char* str1,char* str2)
{
// while(*str1!='\0'&&*str2!='\0')
// {
// if(*str1!=*str2)
// return -1;
// str1++;
// str2++;
// }
// if(*str1=='\0'&&*str2=='\0')
// return 0;
// else
// return -1;
while (*str1!='\0'&&*str1==*str2)
{
str1++;
str2++;
}
return *str1==*str2?0:-1;
}
mystring.h
#ifndef __MYSTRING_H__
#define __MYSTRING_H__
int my_strcmp(char* str1,char* str2);
#endif