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 分钟前
ADCU-Ethernet-以太网在AUTOSAR与Linux架构下对比
arm开发·单片机·汽车
szxinmai主板定制专家1 小时前
基于ZYNQ MPSOC船舶数据采集仪器设计(一)总体设计方案,包括振动、压力、温度、流量等参数
arm开发·人工智能·嵌入式硬件·fpga开发
坤坤藤椒牛肉面4 小时前
ARM基础内容
arm开发
szxinmai主板定制专家6 小时前
基于ZYNQ MPSOC船舶数据采集仪器设计(三)振动,流量,功耗,EMC,可靠性测试
arm开发·人工智能·嵌入式硬件·fpga开发
忆和熙10 小时前
ARMv8异常级别与执行状态的转换机制(ARMv8异常机制——异常处理中,执行状态与异常级别的转换机制)
arm开发·arm异常
ARM+FPGA+AI工业主板定制专家13 小时前
基于ARM+FPGA+AI的船舶状态智能监测系统(一)总体设计
网络·arm开发·人工智能·机器学习·fpga开发·自动驾驶
梦..1 天前
Allegro学习记录(一)
arm开发·单片机·嵌入式硬件·学习·硬件架构·硬件工程·pcb工艺
EnglishJun1 天前
ARM嵌入式学习(七)--- 汇编基础(数据指令、函数调用原理、中断原理)
arm开发·学习
Nan_Feng_ya1 天前
基于STM32的智能手表复刻成功(完全开源)
arm开发·stm32·pcb工艺·智能手表
移远通信1 天前
Helios SDK开发指南__入门准备
arm开发