ARM_UART串口实验

main.c

cpp 复制代码
#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()
{
    //使能外设时钟
    hal_uart4_init();
    for(int i=0;i<10;i++)
    {
        hal_put_char(hal_get_char());
        hal_put_string("Zzzz\n");
    }
    return 0;
}

UART4.C

cpp 复制代码
#include "uart4.h"
void hal_uart4_init()
{
    //RCC初始化
    RCC->MP_AHB4ENSETR |= (0x1 << 1);//GPIOB使能
    RCC->MP_AHB4ENSETR |= (0X1 << 6);//GPIOG使能
    RCC->MP_APB1ENSETR |= (0X1 << 16);//UART4使能
    //GPIO初始化
    GPIOB->MODER &= (~(0x3 << 4));//PB2清零
    GPIOB->MODER |= (0x2 << 4);//PB2置位10
    GPIOG->MODER &= (~(0x3 << 22));//PG11清零
    GPIOG->MODER |= (0x2 << 22);//PG11置位10
    GPIOB->AFRL &= (~(0XF << 8));//PB2_AFRL清零
    GPIOB->AFRL |= (0X8 << 8);//PB2_AFRL置1000
    GPIOG->AFRH &= (~(0XF << 12));//PB2_AFRL清零
    GPIOG->AFRH |= (0X6 << 12);//PB2_AFRL置0110
    //UART初始化
    USART4->CR1 &= (0XFFFF);//CR1全置零
    USART4->CR1 |= (0XD);//CR1中发送,接收串口使能
    USART4->CR2 &= (~(0x3)<<12);//CR2 置位串口一位停止位
    USART4->PRESC &= (~(0xF));//PRESC 设置不分频
    USART4->BRR=0X22B;//初始化BBR寄存器
}

void hal_put_char(const char str)
{
    while(!(USART4->ISR&=(0X4<<5)))//判断发送数据为不为空
    {
        USART4->TDR=str;
    }
}

void hal_put_string(const char *string)
{
    for(int i=0;i<100;i++)
    {
        char t=string[i];
        hal_put_char(t);
        if(!t)break;
    }
}

char hal_get_char()
{
    while (!(USART4->ISR&=(0x1<<5)));
    char str = USART4->RDR;
    char c;
    int a;
    a = (int)str;
    a++;
    c=(char)a;
    return c;
}

char *hal_get_string()
{
    static char t[100];
    for(int i=0;i<100;i++)
    {
        t[i] = hal_get_char();
        if(!t[i])break;
    }
    return t;
}

uart4.h

cpp 复制代码
#ifndef __UART4_H__
#define __UART4_H__

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

void hal_uart4_init();//uart4初始化

void hal_put_char(const char str);//发送一个字符串

void hal_put_string(const char* string);//发送一个字符串

char hal_get_char();//接收一个字符

char* hal_get_string();//接收一个字符串

#endif
相关推荐
GilgameshJSS4 小时前
STM32H743-ARM例程41-FMC_INDEP
arm开发·stm32·单片机·嵌入式硬件
GilgameshJSS7 小时前
STM32H743-ARM例程38-UART-IAP
c语言·arm开发·stm32·单片机·嵌入式硬件
橘子131 天前
Linux网络基础(一)
linux·网络·arm开发
咯哦哦哦哦2 天前
vscode arm交叉编译 中 cmakeTools 编译器设置
linux·arm开发·vscode·编辑器
GilgameshJSS2 天前
STM32H743-ARM例程40-U_DISK_IAP
c语言·arm开发·stm32·单片机·嵌入式硬件
XINVRY-FPGA3 天前
XC7Z020-1CLG484I Xilinx AMD FPGA Zynq-7000 SoC
arm开发·嵌入式硬件·网络协议·fpga开发·硬件工程·信号处理·fpga
电鱼智能的电小鱼3 天前
基于电鱼 ARM 边缘网关的智慧工地数据可靠传输方案——断点续传 + 4G/5G冗余通信,保障数据完整上传
arm开发·人工智能·嵌入式硬件·深度学习·5g·机器学习
范纹杉想快点毕业3 天前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
wanhengidc4 天前
云手机畅玩 梦幻西游
运维·服务器·arm开发·智能手机·自动化
z202305084 天前
linux之arm SMMUv3 故障和错误(4)
linux·运维·arm开发