2024-4-15-ARM作业

实现字符串数据收发函数的封装

源代码:

main.c

复制代码
#include "gpio.h"

#include "uart4.h"



int main()

{

	uart4_config();

	while (1)

	{

		// char a=getchar();

		// putchar(a+1);

		char s[20];

		gets(s);

		puts(s);

		//putchar('\n');

		putchar('\r');



	}



	return 0;

}

uart4.c

复制代码
#include "uart4.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"

void uart4_config()
{
    //使能
    RCC->MP_AHB4ENSETR |= (0x1 << 1);
    RCC->MP_AHB4ENSETR |= (0x1 << 6);
    RCC->MP_APB1ENSETR |= (0x1 << 16);

    //PB2管脚复用
    GPIOB->MODER &= (~(0x3 << 4));
    GPIOB->MODER |= (0x2 << 4);

    //PG11管脚复用
    GPIOG->MODER &= (~(0x3 << 22));
    GPIOG->MODER |= (0x2 << 22);
    // PG11 为 UART4_TX
    GPIOG->AFRH &= (~(0xF << 12));
    GPIOG->AFRH |= (0x6 << 12);
    // PB2 为 UART4_RX
    GPIOB->AFRH &= (~(0xF << 8));
    GPIOB->AFRH |= (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 << 0);
}

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();
        putchar(*s);
        if ((*s) == '\r')
            break;
        s++;
    }
    *s = '\0';
    putchar('\n');
}

实现效果:

相关推荐
简单电磁炮1 小时前
硬件9 arm时钟树
arm开发
Echo_cy_1 小时前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
武汉万象奥科2 小时前
万象奥科OpenHarmony 6.1 LTS适配完成,RK3576核心板再添新生态
arm开发·嵌入式硬件·物联网·rk3576·arm核心板
亿道电子Emdoor3 小时前
【Arm】解决Keil MDK无法查看外设寄存器的问题
stm32·单片机·嵌入式硬件
BW.SU3 小时前
瑞佑RUI--工业UI,拖拽即成
stm32·单片机·51单片机·gui·人机界面·单片机可视化设计
染予4 小时前
上位机时间戳精度不够,时间无法对比怎么解决
单片机·嵌入式硬件
現実君4 小时前
关于MCU下位替换FPGA的经验与方案
单片机·嵌入式硬件·fpga开发
m0_547486664 小时前
《单片机原理及应用》全套PPT课件2026版
单片机·嵌入式硬件
十月的皮皮5 小时前
STM32从零到量产开发:四路继电器工业控制模块开发原理小灶 · 合集
stm32·单片机·嵌入式硬件·stm32cubemx·hal库
小羊先生car5 小时前
F429-HAL 库驱动框架(2026/7/22)
单片机·嵌入式硬件