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
相关推荐
VekiSon3 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件
代码游侠5 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
陌上花开缓缓归以1 天前
LiteOS和RTOS 系统选型分析
arm开发
深圳市九鼎创展科技1 天前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
森焱森1 天前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化
森G2 天前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
VekiSon2 天前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上2 天前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)2 天前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞3 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm