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
相关推荐
路溪非溪38 分钟前
BLE的广播、扫描和连接等工作机制总结
linux·arm开发·驱动开发
忆和熙3 小时前
AArch64异常指令与异常表(ARMv8异常机制——AArch64异常调用指令与异常表)
arm开发·arm异常
szxinmai主板定制专家5 小时前
基于 STM32 + FPGA 船舶电站控制器设计与实现
arm开发·人工智能·stm32·嵌入式硬件·fpga开发·架构
Flamingˢ6 小时前
基于ARM的裸机程序设计和开发(三):C编程基础与Zynq裸机开发常用方法
c语言·arm开发·单片机
EnglishJun6 小时前
ARM嵌入式学习(八)--- 汇编应用:点亮led
汇编·arm开发·学习
ARM+FPGA+AI工业主板定制专家15 小时前
基于ARM+FPGA+AI的船舶状态智能监测系统(二)软硬件设计,模拟量,温度等采集与分析
arm开发·人工智能·目标检测·fpga开发
梅尔文.古17 小时前
ADCU-Ethernet-以太网在AUTOSAR与Linux架构下对比
arm开发·单片机·汽车
szxinmai主板定制专家18 小时前
基于ZYNQ MPSOC船舶数据采集仪器设计(一)总体设计方案,包括振动、压力、温度、流量等参数
arm开发·人工智能·嵌入式硬件·fpga开发
坤坤藤椒牛肉面21 小时前
ARM基础内容
arm开发
szxinmai主板定制专家1 天前
基于ZYNQ MPSOC船舶数据采集仪器设计(三)振动,流量,功耗,EMC,可靠性测试
arm开发·人工智能·嵌入式硬件·fpga开发