arm day 7

完成字符串收发函数的封装并且验证现象,一个字符串发送接受后会有'\n' '\r'

src/uart.c

cs 复制代码
#include"uart.h"

void uart4_init()
{
    //设置UART4的RCc时钟使能
    //RCC_MP_APB1ENSETR[16]->1
    RCC->MP_APB1ENSETR |= (0x1<<16);
    //设置GPIOB和GPIOG的时钟使能
    //RCC_MP_AHB4ENSETR[6]->1
    //RCC_MP_AHB4ENSETR[1]->1
    RCC->MP_AHB4ENSETR |= (0x1<<1);
    RCC->MP_AHB4ENSETR |= (0X1<<6);
    //设置PG11和PB2功能复用为UART4功能
    //PG11
    //GPIOG_MODER[23:22]->10
    GPIOG->MODER &= (~(0X3<<22));
    GPIOG->MODER |= (0X2<<22);
    //GPIOG_AFRH[15:12]->0110   
    GPIOG->AFRH &= (~(0xf<<12));
    GPIOG->AFRH |= (0x6<<12);
    //PB2
    //GPIOB_MODER[5:4]->10
    //GPIOB_AFRL[11:8]->1000
    GPIOB->MODER &= (~(0x3<<4));
    GPIOB->MODER |= (0X2<<4);
    GPIOB->AFRL &= (~(0xF<<8));
    GPIOB->AFRL |= (0x8<<8);
    //禁用串口
    USART4->CR1 &=(~0x1);
    //设置数据8个数据位 CR1[28]->0  CR1[12]-》0
    USART4->CR1 &= (~(0X1<<28));
    USART4->CR1 &= (~(0X1<<12));
    //设置没有校验位CR1[10]->0
    USART4->CR1 &= (~(0X1<<10));
    //设置1个停止位CR2[13:12]->00
    USART4->CR2 &= (~(0x3<<12));
    //设置16倍采样 CR1[15]->0
    USART4->CR1 &= (~(0X1<<15));
    //设置波特率为115200 BRR=0X22B
    USART4->BRR |= 0X22B;
    //设置1分频 PRESC[3:0]->0000
    USART4->PRESC &= (~(0XF));
    //使能发送器 CR1[3]->1
    USART4->CR1 |= (0X1<<3);
    //使能接收器 CR1[2]->1
    USART4->CR1 |= (0X1<<2);
    //使能串口 CR1[0]->1
    USART4->CR1 |= (0X1);

}
char buffer[50];
//串口发送一个字符
void putchar(char c)
{
    //判断发送数据寄存器有没有数据,没有数据时可以发送
    while(!(USART4->ISR&(0X1<<7)));
    USART4->TDR=c;//将要发送的数据保存在发送寄存器中
    while(!(USART4->ISR&(0X1<<6)));//数据传输完成,函数结束
}
//串口接受一个字符
char getchar()
{
    char c;
    //判断是否有数据准备好
    while(!(USART4->ISR&(0X1<<5)));//数据传输完成,函数结束
    c=USART4->RDR;
    return c;
    
}
//串口发送一个字符串
void puts(char *s)
{

    //就是一个一个字符发
    while(*s)
    {
        putchar(*s++);
    }
    putchar('\n');//换行
    putchar('\r');//回车
}

//串口接收一个字符串
char *gets()
{
    unsigned int i;
    for(i=0;i<49;i++)
    {
        //1.接收一个字符放在buffer缓冲区中
            buffer[i] = getchar();
        //2.接收一个字符回显一个字符
            putchar(buffer[i]);
        //enter---->'\r'
        if(buffer[i] == '\r')
            break;
    }
    buffer[i] = '\0';//字符串以'\0'结尾
    putchar('\n');//字符串输入结束后,让光标回到下一行
    return buffer;
}

main.c

cs 复制代码
#include "uart.h"

int main()
{
    char c;
    char *s;
    uart4_init();//串口初始化
    while(1)
    {
        //接收字符串
        s=gets();
        puts(s);//发送字符串
    }
    return 0;
}

include/uart.h

cs 复制代码
#ifndef __UART_H__
#define __UART_H__
#include"stm32mp1xx_uart.h"
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"

void uart4_init();
void putchar(char c);
char getchar();
void puts(char *s);
char *gets();
#endif
相关推荐
森G6 小时前
四、Linux设备驱动介绍
linux·arm开发·ubuntu
GilgameshJSS6 小时前
STM32H743-ARM例程36-DNS
c语言·arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS19 小时前
STM32H743-ARM例程33-TOUCH
c语言·arm开发·stm32·单片机·嵌入式硬件
wanhengidc1 天前
云手机存在的意义是什么
运维·服务器·arm开发·安全·智能手机
陌上花开缓缓归以1 天前
phy降速自愈到100M重试流程分析
arm开发
凉、介1 天前
ARM 总线技术 —— APB
arm开发·笔记·学习
电鱼智能的电小鱼2 天前
基于电鱼 ARM 工控机的煤矿主控系统高可靠运行方案——让井下控制系统告别“死机与重启”
arm开发·人工智能·嵌入式硬件·深度学习·机器学习
陌上花开缓缓归以2 天前
linux系统启动失败之flash异常分析
arm开发
电鱼智能的电小鱼3 天前
基于电鱼 ARM 工控机的井下AI故障诊断方案——让煤矿远程监控更智能、更精准
网络·arm开发·人工智能·算法·边缘计算
GilgameshJSS4 天前
STM32H743-ARM例程35-DHCP
c语言·arm开发·stm32·单片机·嵌入式硬件