2023年12月25日:串口发出控制命令

文章详细描述了如何在STM32MP1xx平台上配置UART4串口通信,包括GPIO管脚设置、波特率调整以及LED1、LED2、LED3的控制。还展示了main.c中使用这些功能接收和发送字符串,以及控制LED的状态。
摘要由CSDN通过智能技术生成

代码

uart4.c

#include "uart4.h"

void uart4_config()
{
    //*****************************************
    //使能GPIOB|GPIOG|UART4外设时钟
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    RCC->MP_AHB4ENSETR |=(0x1<<1);
    RCC->MP_APB1ENSETR |=(0x1<<16);
    RCC->MP_AHB4ENSETR |=(0x3<<4);
    
    //*****************************************
    //设置PB2|PG11用于UART4的管脚复用
    //PG11
    GPIOG->MODER &=(~(0x3<<22));//先清零
    GPIOG->MODER |=(0x2<<22);//再赋值
    GPIOG->AFRH &=(~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);

    //PB2
      GPIOB->MODER &=(~(0x3<<4));
    GPIOB->MODER |=(0x2<<4);
    GPIOB->AFRL &=(~(0xf<<8));
    GPIOB->AFRL |= (0x8<<8);
    //*****************************************
    //设置串口禁用
    USART4->CR1 &=(~0x1);

    //*****************************************
    //设置数据位宽为8位
    USART4->CR1 &=(~(0x1<<28));
    USART4->CR1 &=(~(0x1<<12));

    //*****************************************
    //设置无奇偶校验位
    USART4->CR1 &=(~(0x1<<10));

    //*****************************************
    //设置16倍过采样
    USART4->CR1 &=(~(0x1<<15));

    //*****************************************
    //设置1位的停止位
    USART4->CR2 &=(~(0x1<<12));

    //*****************************************
    //设置波特率为115200
    USART4->BRR =0x22B;

    //*****************************************
    //使能发送器
    USART4->CR1 |=(0x1<<3);

    //*****************************************
    //使能接收器
    USART4->CR1 |=(0x1<<2);

    //*****************************************
    //使能串口
    USART4->CR1 |=0x1;

    //*****************************************
    //LED1的操作
   
    GPIOE->MODER &=(~(0x3<<20));//设置PE10输出
    GPIOE->MODER |=(0x1<<20);

    GPIOE->OTYPER &=(~(0x1<<10));//设置PE10为推挽输出
    GPIOE->OSPEEDR &=(~(0x3<<20));//设置低速输出
    GPIOE->PUPDR &=(~(0x3<<20));//设置无上拉下拉

    //*****************************************
    //LED2的操作
    GPIOF->MODER &=(~(0x3<<20));//设置PF10输出
    GPIOF->MODER |=(0x1<<20);

    GPIOF->OTYPER &=(~(0x1<<10));//设置PF10为推挽输出
    GPIOF->OSPEEDR &=(~(0x3<<20));//设置低速输出
    GPIOF->PUPDR &=(~(0x3<<20));//设置无上拉下拉

    //*****************************************
    //LED3的操作
    GPIOE->MODER &=(~(0x3<<16));//设置PE10输出
    GPIOE->MODER |=(0x1<<16);

    GPIOE->OTYPER &=(~(0x1<<8));//设置PE10为推挽输出
    GPIOE->OSPEEDR &=(~(0x3<<16));//设置低速输出
    GPIOE->PUPDR &=(~(0x3<<16));//设置无上拉下拉

}

//发送一个单字符
void putchar(char a)
{
    //先判发送器是否为空,不为空阻塞等待
    while(!(USART4->ISR &(0x1<<7)));

    //向发送寄存器写入数据
    USART4->TDR=a;

    //等待发送完成
    while(!(USART4->ISR &(0x1<<6)));


}
//接收一个单字符
char getchar()
{
    char a;
    //判断接收器是否有准备好的数据
    while(!(USART4->ISR &(0x1<<5)));
    //读取数据
    a=USART4->RDR;

    //返回
    return a;

}

//发送一个字符串
void puts(char *s)
{
    while(*s)
    {
        putchar(*s);
        s++;
    }
    putchar('\r');
    putchar('\n');
}
//接受一个字符串
void gets(char *s)
{
    while(1)
    {
        *s=getchar();
        putchar(*s);//键盘输入的内容在串口上回显
        if(*s=='\r')
            break;
        s++;
    }
    *s='\0';
    putchar('\n');
}
//字符串比较
int strcmp(char *src,char *dst)
{
    while(*src!='\0' && *dst!='\0')
    {
        if(*src!=*dst)
        {
            return *src - *dst;
        }
        src++;
        dst++;
    }
    return 0;
}

main.c

//#include "gpio.h"

#include "uart4.h"

int main()

{

//	char a;

	char src[128];

	uart4_config();



	while(1)

	{

/*		

		//接受一个字符数据

		a=getchar();

		//发送接收到的字符+1

		putchar(a);

		putchar('\r');//回车,切换到下一行

		putchar('\n');//换行

*/		

		gets(src);

		puts(src);

		if(strcmp(src,"led1_on")==0)

		{

			GPIOE->ODR |=(0x1<<10);



		}

		else if(strcmp(src,"led1_off")==0)

		{

			GPIOE->ODR &=(~(0x1<<10));

		}

		else if(strcmp(src,"led2_on")==0)

		{

			GPIOF->ODR |=(0x1<<10);



		}

		else if(strcmp(src,"led2_off")==0)

		{

			GPIOF->ODR &=(~(0x1<<10));

		}

		else if(strcmp(src,"led3_on")==0)

		{

			GPIOE->ODR |=(0x1<<8);



		}

		else if(strcmp(src,"led3_off")==0)

		{

			GPIOE->ODR &=(~(0x1<<8));

		}



	}



	return 0;

}

uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"

void uart4_config();
void putchar(char a);
char getchar();
void gets(char *s);
void puts(char *s);
int strcmp(char *src,char *dst);

#endif

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值