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
相关推荐
17(无规则自律)3 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞16 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发