12.11号作业

uatr.c

#include "uartt.h"
//串口数据初始化
void uart4_init()
{
  //led灯的设置
  //1.使能外设时钟
  (*((unsigned int*)0X50000A28)) |= (0x3<<4);
  //2.设置PF10 PE10 PE8为输出输出
  (*((unsigned int*)0X50006000)) &= (~(0x3<<20));
  (*((unsigned int*)0X50006000)) |= (0x1<<20);
  (*((unsigned int*)0X50007000)) &= (~(0x3<<20));
  (*((unsigned int*)0X50007000)) |= (0x1<<20);
  (*((unsigned int*)0X50006000)) &= (~(0x3<<16));
  (*((unsigned int*)0X50006000)) |= (0x1<<16);
  //3.设置推挽输出
  (*((unsigned int*)0X50006004)) &= (~(0x1<<10));
  (*((unsigned int*)0X50007004)) &= (~(0x1<<10));
  (*((unsigned int*)0X50006004)) &= (~(0x1<<8));
  //4.设置输出速度为低速
  (*((unsigned int*)0X50006008)) &= (~(0x3<<20));
  (*((unsigned int*)0X50007008)) &= (~(0x3<<20));
  (*((unsigned int*)0X50006008)) &= (~(0x3<<16));
  //5.设置无上拉下拉
  (*((unsigned int*)0X5000600c)) &= (~(0x3<<20));
  (*((unsigned int*)0X5000700c)) &= (~(0x3<<20));
  (*((unsigned int*)0X5000600c)) &= (~(0x3<<16));

    // 串口相关设置
    //1.UART4和GPIOB/GPIOG的时钟使能
    RCC->MP_AHB4ENSETR |=(0x1<<2);
    RCC->MP_AHB4ENSETR |=(0x1<<6);
    RCC->MP_APB1ENSETR |=(0x1<<16);
    //2.设置PB2和PG11的管脚复用
    GPIOB->MODER &=(~(0x3<<4));
    GPIOB->MODER |=(0x2<<4);//设置复用
    GPIOB->AFRL &=(~(0xF<<8));
    GPIOB->AFRL |=(0x8<<8);//设置uart4功能复用
    GPIOG->MODER &=(~(0x3<<22));
    GPIOG->MODER |=(0x2<<22);//设置复用
    GPIOG->AFRL &=(~(0xF<<12));
    GPIOG->AFRL |=(0x6<<12);//设置uart4功能复用
    //3.先去设置串口禁用,方便设置数据格式
    USART4->CR1&=(~0x1);
    //4,设置8位数据位
    USART4->CR1&=((~0x1)<<12);
    USART4->CR1&=((~0x1)<<28);
    //5.设置没有奇偶校验USART->的第十位为0
    USART4->CR1&=(~(0x1<<10));
    //6.设置16倍采样
    USART4->CR1&=(~(0x1<<15));
    //7.设置1位停止位
    USART4->CR2&=(~(0x3<<12));
    //8.设置1分频
    USART4->PRESC&=(~(0xF));
    //9.设置波特率为115200bps
    USART4->BRR|=0x22B;
    //10.发送器.接受器使能
    //11.串口使能
    USART4->CR1&=(~(0xF));
    USART4->CR1|=(0xD);
}
//封装函数发送一个字符数据
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 led_on()
{   
  (*((unsigned int*)0X50006014)) |= (0x1<<10);   
  (*((unsigned int*)0X50007014)) |= (0x1<<10);
  (*((unsigned int*)0X50006014)) |= (0x1<<8);
}
void led_off()
{
  (*((unsigned int*)0X50006014)) &= (~(0x1<<10));
  (*((unsigned int*)0X50007014)) &= (~(0x1<<10));
  (*((unsigned int*)0X50006014)) &= (~(0x1<<8));
}

main.c

#include "uartt.h"

int main()

{

  //1.串口初始化

  uart4_init();

  char a;

  while(1)

  {

    myputchar('\n');

    myputchar('\r');

    //2.从串口读取一个字符

    a=mygetchar();

    if (a=='a')

        {

            led_on();

        }

        else if(a=='b')

        {

            led_off();

        }            

    myputchar(a+1);

  }

  return 0;

}

uatr.h

#ifndef __UARTT_H__
#define __UARTT_H__
#include"stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"
void uart4_init();
void myputchar(char i);
char mygetchar();
void led_on();
void led_off();
#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值