串口控制灯 2023-12-011

include 

#ifndef __MYUART_H__
#define __MYUART_H__

#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"

char arr[50] ;  
char brr[50] ; 

//管脚串口的初始化
void uart4_init();
//发送一个字符
void myputchar (char c);
//接受一个字符
char mygetchar();
 //接受一个字符串
 void gets();
 //发送一个字符串
void puts(char *p);
//PE10 LED1 PE8 LED3 初始化
void PE10_PE8_init();
//PF10 LED2  初始化
void PF10_init();
//PE10 LED1 开
void LED1_on();
//PE8 LED3 开
void LED3_on();
//PF10 LED2 开
void LED2_on();
//PE10 LED1 关
void LED1_off();
//PE10 LED3 关
void LED3_off();
//PF10 LED2 关
void LED2_off();

#endif

test.c

#include "myuart.h"


//串3口的初始化
void uart4_init()
{
    //gpiob/gpioe 使能

    RCC->MP_AHB4ENSETR |=(0x1<<1);
    RCC->MP_AHB4ENSETR |=(0x1<<6);

    //uart4使能
     RCC->MP_AHB4ENSETR |=(0X1<<16);

    //PB 2初始化
    GPIOB->MODER &= (~(0X3<<4));
    GPIOB->MODER |=  (0X2<<4);

    //设置UART4RX
    GPIOB->AFRL  &= (~(0XF<<8));
    GPIOB->AFRL |= (0x8<<8);

    //PG 11初始化
    GPIOG->MODER &= (~(0x3<<22));
    GPIOG->MODER |= (0X2<<22);
    GPIOG->AFRH &= (~(0XF<<12));
    GPIOG->AFRH |= (0X6<<12);

    //串口初始化
    //1.设置串口禁用

    USART4->CR1 &= (~0X1);
    //2.设置数据位
    USART4->CR1 &=(~(0X1<<12));
    USART4->CR1 &=(~(0X1 <<28));

    //3.设置有无就校验
    USART4->CR1 &= (~(0X1<<10));

     //4.设置16倍采样率
    USART4->CR1 &= ( ~ (0X1<<15));
    //5.设置停止位
    USART4->CR2 &= ( ~ (0X3 << 12));

    //6.设置分频
    USART4->PRESC &=  ( ~ 0XF);

    //7.设置波特率
    USART4->BRR  = 0X228;
    //8.收使能
    USART4->CR1 |= (0X1 << 2);
    //9.发使能

    USART4->CR1 |= (0X1 << 3);

    //10.串口使能

    USART4->CR1 |=  0X1 ;
}

//PE10 LED1 PE8 LED3 初始化
void PE10_PE8_init()
{
    //使能
    RCC->MP_AHB4ENSETR |= (0x1<<4);
    //输出
    GPIOE->MODER &= (~(0x3<<20));
    GPIOE->MODER |= (0x1<<20);
    GPIOE->MODER &= (~(0x3<<16));
    GPIOE->MODER |=(0x1<<16);
    //推挽
    GPIOE->OTYPER &= (~(0x1<<10));
    GPIOE->OTYPER &= (~(0x1<<8));
    //低速
    GPIOE->OSPEEDR &= (~(0x3<<20));
    GPIOE->OSPEEDR &=(~(0x3<<16));
    //无上拉无下拉
    GPIOE->PUPDR  &=(~(0X3<<20));
    GPIOE->PUPDR  &=(~(0X3<<16));
}
//PF10 LED2  初始化
void PF10_init()
{
    //使能
    RCC->MP_AHB4ENSETR |= (0x1<<5);
    //输出
    GPIOF->MODER &= (~(0x3<<20));
    GPIOF->MODER |= (0x1<<20);
    //推挽
    GPIOF->OTYPER &= (~(0x1<<10));
    //低速
    GPIOF->OSPEEDR &= (~(0x3<<20));
    //无上拉无下拉
    GPIOF->PUPDR  &=(~(0X3<<20));
}
//PE10 LED1 开
void LED1_on()
{
        GPIOE->ODR |= (0x1<<10);
}
//PE8 LED3 开
void LED3_on()
{
        GPIOE->ODR |= (0x1<<8);
}
//PF10 LED2 开
void LED2_on()
{
        GPIOF->ODR |= (0x1<<10);
}
//PE10 LED1 关
void LED1_off()
{
        GPIOE->ODR &= (~(0x1<<10));
}
//PE10 LED3 关
void LED3_off()
{
        GPIOE->ODR &= (~(0x1<<8));
}
//PF10 LED2 关
void LED2_off()
{
        GPIOF->ODR &= (~(0x1<<10));
}
//发送一个字符
void myputchar (char c)
{
    while( ! (USART4 -> ISR &  ( 0X1 << 7 )));
    USART4->TDR = c;
    while( ! (USART4 -> ISR & ( 0x1 << 6 )));
}
//接受一个字符
char mygetchar()
{
    char c; 
    while( ! ( USART4->ISR  &  (0X1 << 5 )));
    c=USART4->RDR;
    return c;

}
 


 //接受一个字符串
 void gets()
 {
     int i; 
    for (  i=0; i<50; i++ )
    {
        arr[i]=mygetchar();

        if( arr[i] == '\r')
        break ;
        myputchar(arr[i]);
    } 
    arr[i] = '\0';
    myputchar('\n');
    myputchar('\r');    
 }

//发送一个字符串
void puts(char *p)
{
        while(*p)
        {
            myputchar(*p);
            p++;           
        }
        myputchar('\n');
        myputchar('\r');

}

main.c



#include "myuart.h"

//封装延时函数

void delay(int ms)

{

  int i,j;

  for(i=0;i<ms;i++)

  {

  for(j=0;j<2000;j++);

  }

}

int main()

{

    char a; 

    //串口的初始化

    uart4_init();

    PE10_PE8_init();

    PF10_init();



      LED1_on();

      LED2_on();

      LED3_on();



    while(1)

    { 

     //从串口读取一个字符

                 

        a=mygetchar();

        if(a=='1')

        {

          LED1_off();

          LED2_off();

          LED3_off();

        }

        else if(a=='2')

        {

            LED1_on();

        }

             else if(a=='3')

        {

            LED2_on();

        }

             else if(a=='4')

        {

            LED3_on();

        }

            else if(a=='5')

        {

            LED1_off();

        }

             else if(a=='6')

        {

            LED2_off();

        }

             else if(a=='7')

        {

            LED3_off();

        }



      //将读取的字符+1发送回去

        myputchar(a+1);



      // gets();

      // puts(arr);

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值