串口实验->10.3

一、uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_uart.h"


//1.初始化函数
void uart4_init();
//2.发送一个字符
void put_char(const char str);
//3.接收一个字符
char get_char();
char* get_string();
void put_string(const char* str);

#endif


二、 uart.c

#include "uart4.h"



void uart4_init()

{

	//RCC

	RCC->MP_AHB4ENSETR |=(0x1 << 1);

	RCC->MP_AHB4ENSETR |=(0x1 << 6);

	RCC->MP_APB1ENSETR |=(0x1 << 16);

	//GPIO

	//复用

	GPIOB->MODER &=(~(0x3 << 4));

	GPIOB->MODER |=(0x2 << 4);

	GPIOG->MODER &=(~(0x3 << 22));

	GPIOG->MODER |=(0x2 << 22);

	//设置为串口

	GPIOB->AFRL &=(~(0xF << 8));

	GPIOB->AFRL |=(0x8 << 8);

	GPIOG->AFRH &=(~(0xF << 12));

	GPIOG->AFRH |=(0x6 << 12);

	

	//UART4

	if(USART4->CR1 & (0x1 << 0))

	{

		USART4->CR1 &=(~(0x1 << 0));

	}

	//设置为8位数据位

	USART4->CR1 &=(~(0x1 << 28));

	USART4->CR1 &=(~(0x1<< 12));

	//16倍采样率

	USART4->CR1 &=(~(0x1 << 15));

	//禁止奇偶校验位

	USART4->CR1 &=(~(0x1 << 10));

	//发送寄存器使能

	USART4->CR1 |=(0x1 << 3);

	//接收寄存器使能

	USART4->CR1 |=(0x1 << 2);

	//设置停止位

	USART4->CR2 &=(~(0x3 << 12));

	//设置波特率

	USART4->BRR &= (~(0xffff));

	USART4->BRR |=(0x22B);

	//设置串口不分频

	USART4->PRESC &=(~0xF);

	//设置串口使能

	USART4->CR1 |=(0x1);	



}

//2.发送一个字符

void put_char(const char str)

{

	//判断发送寄存器是否为空

	while(!(USART4->ISR &(0x1 << 7)));

	//清零

	USART4->TDR &=(~(0xFF));

	//赋值

	USART4->TDR=str;



	//判断发送寄存器是否发送成功

	while(!(USART4->ISR &(0x1 << 6)));



}

//3.接收一个字符

char get_char()

{

	char ch;

	while(!(USART4->ISR &(0x1 << 5)));

	ch=USART4->RDR;

	return ch;

}



//3.发送一个字符串

void put_string(const char* str)

{

	//判断是否为'\0'

	while(*str != '\0')

	{

		put_char(*str);

		str++;

	}

	put_char('\n');

	put_char('\r');

	//一个一个字符的进行发送



}

char buffer[50] = {0};

//5.接收一个字符串

char* get_string()

{

	//1.循环进行接

	//2.循环的实现:接收一个字符之后,就要发送一个字符

	//3.当键盘回车按下之后,代表字符串接收结束'\r'

	//4.字符串需要补'\0'



	while(!(USART4->ISR & (0x1 << 5)));



	int i = 0;

	while((buffer[i] = get_char()) != '\r' )

	{

		put_char(buffer[i]);

		i++;

	}

	buffer[i] = '\0';

	put_char('\n');

	return buffer;

}

三、main.c

#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()

{

	uart4_init(); // 初始化

	while(1)

	{

		//put_char(get_char());

		put_string(get_string());

	}

	return 0;

}

四、执行结果

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值