day6-arm

include/uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_uart.h"
void uart4_config();
void putchar(char dat);
char getchar();
void puts(char *s);
void gets(char *s);
#endif

main.c

#include "uart4.h"
//手动封装延时函数
void delay_ms(int ms)
{
    int i,j;
    for(i=0;i<ms;i++)
    {
        for(j=0;j<2000;j++)
        {

        }
    }
}
int main()
{
    //uart4初始化
    uart4_config();
    char a;
    while(1)
    {
        a=getchar();//接收一个字符
        putchar(a+1);  //现象,发送a,输出b
    }
    return 0;
}

src/uart4.c

#include "uart4.h"
 
void uart4_config()
{
    //使能GPIOB\GPIOG\UART4的外设时钟
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |= (0x1<<6);
    RCC->MP_APB1ENSETR |= (0x1<<16);
    //设置PG11和PB2为管脚复用功能
    //PG11
    GPIOG->MODER &= (~(0x3<<22));
    GPIOG->MODER |= (0x2<<22);
    //PB2
    GPIOG->MODER &= (~(0x3<<4));
    GPIOG->MODER |= (0x2<<4);
    //设置PG11为UART4_TX功能
    GPIOG->AFRH &= (~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);
    //设置PB2为UART4_RX功能
    GPIOB->AFRL &= (~(0xf<<8));
    GPIOB->AFRL |= (0x8<<8);
    //设置串口不使能
    USART4->CR1 &= (~0x1);
    //设置8位数据位
    USART4->CR1 &= (~(0x1<<12));
    USART4->CR1 &= (~(0x1<<28));
    //设置没有校验位
    USART4->CR1 &= (~(0x1<<10));
    //设置时钟频率不分频
    USART4->PRESC &= (~0xf);
    //设置16倍采样
    USART4->CR1 &= (~(0x1<<15));
    //设置1位停止位
    USART4->CR2 &= (~(0x3<<12));
    //设置波特率为115200
    USART4->BRR = 0x22b;
    //使能发送器
    USART4->CR1 |= (0x1<<3);
    //使能接收器
    USART4->CR1 |= (0x1<<2);
    //使能串口
    USART4->CR1 |= 0x1;
}
 
//发送单个字符
void putchar(char dat)
{
    //当发送寄存器中有数据时就一直阻塞
    while(!(USART4->ISR & (0x1<<7)));
    //反之没有数据则发送数据
    USART4->TDR = dat;
    //当发送的数据完成后结束发送
    while(!(USART4->ISR & (0x1<<6)));
}
 
//接收单个字符
char getchar()
{
    //当接收寄存器中没有数据时就一直阻塞
    while(!(USART4->ISR & (0x1<<5)));
    //有数据就返回
    return USART4->RDR;
 
}
 
//发送字符串
void puts(char *s)
{
    while(1)
    {
        if(*s=='\0')
        {
            break;
        }
        putchar(*s);
        s++;
    }
    //发送一个回车
    putchar('\n');
    putchar('\r');
    
 
}
 
//接收字符串
void gets(char *s)
{
    while(1)
     {
        //循环接收单个字符
        *s = getchar();
        //当检测到回车键‘\r’被按下,结束
        if(*s == '\r')
        {
            break;
        }
        putchar(*s);
        s++;
 
     }
     //在接收的字符串最后补上一个'\0'
     *s = '\0';
     //发送一个'\n'表示在串口工具下一行进行显示
     putchar('\n');
}
 

相关推荐

  1. <span style='color:red;'>ARM</span> <span style='color:red;'>day</span><span style='color:red;'>6</span>

    ARM day6

    2024-04-22 19:48:09      56 阅读
  2. arm day6

    2024-04-22 19:48:09       60 阅读
  3. ARM day6

    2024-04-22 19:48:09       42 阅读
  4. day6-arm

    2024-04-22 19:48:09       39 阅读
  5. 4.15 day6 ARM

    2024-04-22 19:48:09       41 阅读
  6. arm-day6控制灯

    2024-04-22 19:48:09       34 阅读
  7. <span style='color:red;'>ARM</span> <span style='color:red;'>day</span>4

    ARM day4

    2024-04-22 19:48:09      60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 19:48:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 19:48:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 19:48:09       82 阅读
  4. Python语言-面向对象

    2024-04-22 19:48:09       91 阅读

热门阅读

  1. go下载依赖时超时timeout

    2024-04-22 19:48:09       34 阅读
  2. Ubuntu22.04.4 - MySQL8 - 笔记

    2024-04-22 19:48:09       45 阅读
  3. 如何管理一个团队,因为有些人他不听我的话?

    2024-04-22 19:48:09       45 阅读
  4. C++实战篇(一)——自旋锁的使用

    2024-04-22 19:48:09       43 阅读
  5. pinpoint接入及接入tomcat

    2024-04-22 19:48:09       37 阅读
  6. Git的SSH密钥配置

    2024-04-22 19:48:09       39 阅读
  7. pull获取最新代码

    2024-04-22 19:48:09       36 阅读
  8. react18 antd 引入导航栏之后一些bug,解决方法收集

    2024-04-22 19:48:09       36 阅读