ARM第三次

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值