STM32mp157A的UART4串口通信

//include/uart4.h

#ifndef __UART4_H__                          
#define __UART4_H__                          
                                             
#include "stm32mp1xx_rcc.h"                  
#include "stm32mp1xx_gpio.h"                 
#include "stm32mp1xx_uart.h"                 
                                             
//初始化                                     
void hal_uart4_init();                       
                                             
//发送一个字符                               
void hal_put_char(const char str);           
                                             
//发送一个字符串                             
void hal_put_string(const char* string);     
                                             
//接收一个字符                               
char hal_get_char();                         
                                             
//接收一个字符串                             
char* hal_get_string();                      
                                             
#endif                                       
#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); 	//USART4使能

	/*********GPIO章节初始化************/
	
//1.GPIOB组初始化
	//PB2引脚设置复用功能模式 [5:4]=10
	GPIOB->MODER &= (~(0x3 << 4));
	GPIOB->MODER |= (0x1 << 5);
	//PB2复用 AF8 USART4_RX [11:8]=1000
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);
	
//2.GPIOG组初始化
	//PG11引脚设置复用功能模式 [23:22]=10
	GPIOG->MODER &= (~(0x3 << 22));
	GPIOG->MODER |= (0x1 << 23);
	//PG11复用 AF6 USART4_TX [15:12]=0110
	GPIOG->AFRH &= (~(0xf << 12));
	GPIOG->AFRH |= (0x3 << 13);

	/*********USART4章节初始化***********/
	//0.设置串口UE=0
 	USART4->CR1 &= (~(0x1 << 0));	
	
	//1.设置1位起始位,8位数据位
	USART4->CR1 &= ~((0x1 << 12) | (0x1 << 28));	
	
	//2.没有奇偶校验位
	USART4->CR1 &= (~(0x1 << 10));
	
	//3.设置1位停止位
	USART4->CR2 &= (~(0x3 << 12));
	
	//4.设置16倍采样率
	USART4->CR1 &= (~(0x1 << 15));
	
	//5.设置串口不分频
	USART4->PRESC &= (~0xf);
	
	//6.设置串口波特率为115200
	USART4->BRR = 0x22B;
	
	//7.设置串口发送器使能
	USART4->CR1 |= (0x1 << 3);
	
	//8.设置串口接收器使能
	USART4->CR1 |= (0x1 << 2);
	
	//9.设置串口使能
	USART4->CR1 |= 0x1;

}


//发送一个字符
void hal_put_char(const char str)
{
	//1.判断发送数据寄存器是否为空 --->ISR[7] 即TXE
	//为空,才能发送下一位数据;为满,需要等待
	//读0为满,需要等待 	读1为空,发送数据
	while(!(USART4->ISR & (0x1 << 7)));  //读到0则等待

	//2.将发送的内容 赋值给发送数据寄存器
	//TDR[8:0] = 要发送的数据
	USART4->TDR = str;
	
	//3.判断一帧数据是否发送完成 ISR[6]
	//读到0:没有发送完成,需要等待  读1:发送完成
	while(!(USART4->ISR & (0x1 << 6)));  //读到0则等待
	
}

//发送一个字符串
void hal_put_string(const char* string)
{
	//判断是否为'\0'
	//一个一个字符进行发送
	while(*string)
	{
		hal_put_char(*string++);
	}
	hal_put_char('\n');
	hal_put_char('\r');
	
}

//接收一个字符
char hal_get_char()
{
	char str;
	//1.判断接收数据寄存器是否接收到数据 --->ISR[5] 即RXNE
	//读0:没有接收到数据 	读1:接收到数据
	while(!(USART4->ISR & (0x1 << 5)));  //读到0则等待
	
	//2.接收读取到的数据	
	str = USART4->RDR;
	return str;

}

//接收一个字符串
char string[50]={0};
char* hal_get_string()
{
	//循环进行接收
	//当键盘的回车键按键之后,代表字符串输出完成,即接收到'\r'
	unsigned int i=0;
	while(i<49)
	{
		string[i]=hal_get_char();
		hal_put_char(string[i]);
		if(string[i] == '\r')
			break;
		i++;
	}

	string[i]= '\0';
	hal_put_char('\n');
	hal_put_char('\r');
	return string;
}
#include "uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
    int i,j;
    for(i = 0; i < ms;i++)
        for (j = 0; j < 1800; j++);   
}


int main()
{
    //初始化
    hal_uart4_init();
    hal_put_char('\n');
    hal_put_char('\r');
    hal_put_string("test test test!!!!!");
    while(1)
    {   
        //hal_put_char(hal_get_char()+1); //发送单个字符
        hal_put_string(hal_get_string()); //发送字符串      
    }
    return 0;
}

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值