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
相关推荐
轩辰~9 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
ARM&开发(Haidong)9 小时前
ARM 获取cpu个数
arm开发
憧憬一下1 天前
PCIe_Host驱动分析_设备枚举
arm开发·嵌入式硬件·嵌入式·pcie·linux驱动开发
7yewh1 天前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
憧憬一下3 天前
PCIe_Host驱动分析_地址映射
arm开发·嵌入式硬件·嵌入式·linux驱动开发·pci/pcie
楼兰公子3 天前
相机主要调试参数
arm开发·驱动·camera·v4l2
7yewh4 天前
嵌入式驱动RK3566 HDMI eDP MIPI 背光 屏幕选型与调试提升篇-eDP屏
linux·arm开发·驱动开发·嵌入式硬件·嵌入式linux·rk·edp
千千道5 天前
深入理解 Linux 内核启动流程
linux·arm开发·驱动开发
徐某人..6 天前
ARM嵌入式学习--第八天(PWM)
arm开发·学习·arm
aiamia6 天前
CAN配置---波特率中断引脚等---autochips-AC7811-ARM-M3内核
arm开发·单片机·mcu·车载系统·汽车