2024-07-01 ARM作业

串口通讯实验

结果:没完成

main.c
cs 复制代码
#include "uart4.h"
char Str;
int main()
{
	//串口通信初始化
	hal_uart_init();
	while(1){
		// hal_delayms(1000);
		// Str = hal_get_char();
		// if(Str){
		// 	hal_put_char(Str+1);
		// }
		
	}

	return 0;
}
uart4.c
cs 复制代码
#include "uart4.h"
void hal_delayms(int ms)
{
    int i,j;
    for(i=0;i<ms;i++){
        for(j=0;j<2000;j++);
    }
}
void hal_uart_init()
{
    /*****RCC初始化*********/
   
    //AHB4总线使能GPIOB[1]、GPIOG寄存器[6]
    RCC->MP_AHB4ENSETR |= (1<<1);
    RCC->MP_AHB4ENSETR |= (1<<6);
    //APB1总线使能USART4寄存器[16]
    RCC->MP_APB1ENSETR |= (1<<16);

    /*****UART初始化********/
    //PRESC 不分频 [3:0]=0000
    USART4->PRESC &= 0<<3;
    //BRR 规定波特率 16倍采样率 64M 115200
    USART4->BRR=0X22B;//64000000/115200
    //CR1
    //设置M[1:0]='00'位,分别为[28][12]位 规定数据位长度8位
    USART4->CR1 &= ~(1<<28);
    USART4->CR1 &= ~(1<<12);
    //采样率设置 16位 [15]=0 (UE==0时设置)
    USART4->CR1 &= ~(1<<15);
    //无校验位 [10]=0 (UE==0时设置)
    USART4->CR1 &= ~(1<<10);
    //设置TE位,在发送的一开始发送空闲帧 [3]=1
    //设置RE,检测开始位 [2] = 1
    //设置UE位,使能USART 1 [0]=1
    USART4->CR1 |= 0x0D;//1101
    //CR2
    //规定停止位1位 [13:12]=00
    USART4->CR2 &= ~(0x3<<12);
    
    /*****GPIO初始化********/
    //设置PB[2] RX PG[11]TX 为复用模式 10
    GPIOB->MODER &= ~(0x3<<4);
    GPIOB->MODER |= 1<<5;
    GPIOG->MODER &= ~(0x03<<22);
    GPIOG->MODER |= 1<<23;
    //配置寄存器为USART功能 AF8
    GPIOB->AFRL &= ~(0xf<<8);
    GPIOB->AFRL |= (0x8<<8);
    GPIOG->AFRH &= ~(0xf<<12);
    GPIOG->AFRH |= (0x3<<13);
}
void hal_put_char(char str){
    //判断ISR[7]的值
    if((USART4->ISR & 0x00000080) ==0x00000080){
        //表示数据寄存器为空
        USART4->TDR=str;
    }
    //判断ISR[6]的值
    if((USART4->ISR & 0x00000040) ==0x00000040){
        //一次数据发送完成
    }
}
char hal_get_char(){
    //判断ISR[5]的值
    if((USART4->ISR & 0x00000020) == 0x00000020){
        //表明收到数据
        return USART4->RDR;
    }
    return 0;
}
uart4.h
cs 复制代码
#ifndef __LED_H__
#define __LED_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
void hal_uart_init();//uart初始化
void hal_put_char(char str);//发送一个字符
void hal_put_string(char *string);//发送一个字符串
char hal_get_char();//接受一个字符
char hal_get_string();//接受一个字符串
void hal_delayms(int ms);
#endif
相关推荐
Joshua-a13 小时前
macOS下arm编译缺少stdint.h等问题
arm开发·macos
蚂蚁舞16 小时前
在arm架构的Debian系统手动安装和卸载Mysql8的操作
arm开发·debian·安装mysql·mysql8·卸载mysql
m0_5713728216 小时前
嵌入式学习——ARM 体系架构1
arm开发·学习
生涯にわたる学び21 小时前
自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
arm开发
李小白202002021 天前
windows 10系统安装arm虚拟机
arm开发
亿道电子Emdoor3 天前
【ARM】PACK包管理
arm开发
wypywyp3 天前
基于arm芯片的驱动开发——温湿度传感器dht11
arm开发·驱动开发
亿道电子Emdoor4 天前
【ARM】MDK如何实现使用Hex文件完成程序烧录
arm开发·stm32·单片机
彻骨寒风4 天前
在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
运维·arm开发·jenkins
2301_1472583695 天前
ARM - GPIO 标准库开发
arm开发