串口通讯实验
结果:没完成
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