arm:day6

实现UART通信:

1.键盘输入一个字符'a',串口工具显示'b'

arm:day6_第1张图片

 2.键盘输入一个字符串"nihao",串口工具显示"nihao"

arm:day6_第2张图片

uart.h

#ifndef __UART4_H__
#define __UART4_H__

#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.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

uart4.c

#include "uart4.h"

extern void delay_ms(int ms);

//PB2 --> UART4_RX
//PG11 --> UART4_TX
void hal_uart4_init()
{
	//RCC章节
	//1.使能GPIOB组
	RCC->MP_AHB4ENSETR |= (0x1 < 1);
	//2.使能GPIOG组
	RCC->MP_AHB4ENSETR |= (0x1 < 6);
	//3.使能UART4组
	RCC->MP_APB1ENSETR |= (0x1 < 16);
	

	//GPIO章节
	//复用功能模式 复用功能为串口接收/发送
    GPIOB->MODER &= (~(0x3 << 4));
    GPIOB->MODER |= (0x2 << 4);
    GPIOB->AFRL &= (~(0xf << 8));
    GPIOB->AFRL |= (0x1 << 11);

    GPIOG->MODER &= (~(0x3 << 22));
    GPIOG->MODER |= (0x2 << 22);
    GPIOG->AFRH &= (~(0xf << 12));
    GPIOG->AFRH |= (0x3 << 13);


	//UART4章节 8N1 115200对应位使能
	//1.判断UE是否使能,如果等于1,禁止
	if (USART4->CR1 & 0x1)	//设置UE位不使能,否则其他位无法设置
	{
		delay_ms(500);
		USART4->CR1 &= (~(0x1 << 0));
	}
	//2.设置8N1 无校验位
	USART4->CR1 &= (~(0x1 << 28));	//CR1[28][12]=00 8位数据位
	USART4->CR1 &= (~(0x1 << 12));
	USART4->CR2 &= (~(0x3 << 12));	//设置一位停止位
	USART4->CR1 &= (~(0x1 << 10));	//设置无校验位
	//3.设置16倍采样率
	USART4->CR1 &= (~(0x1 << 15));
	//4.设置串口不分频
	USART4->PRESC &= (~(0xf << 0));
	//5.设置串口波特率115200
	USART4->BRR |= 0x22b;
	//6.设置串口发送位使能
	USART4->CR1 |= (0x1 << 3);
	//7.设置串口接收位使能
	USART4->CR1 |= (0x1 << 2);
	//8.设置串口使能
	USART4->CR1 |= (0x1 << 0);	//最后设置UE使能	
}

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

	//发送数据寄存器 = str 
	USART4->TDR = str;
	
	//判断发送数据寄存器是否完成
	while (!(USART4->ISR & (0x1 << 6)));
}

//发送一个字符串
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 ch;

	//判断接收数据寄存器是否有数据
	while (!(USART4->ISR & (0x1 << 5)));

	//ch = 接收数据寄存器
	ch = USART4->RDR;
	return ch;
}

char buffer[32]={};
//接收一个字符串
char *hal_get_string()
{
	//for循环
	//判断键盘回车键是否按下 \r
	unsigned int i = 0;
	for (i=0; i<31; i++)
	{
		//接收一个字符,放入buffer
		buffer[i] = hal_get_char();

		//回显到串口工具,发送一个字符
		hal_put_char(buffer[i]);
		if (buffer[i] == '\r')
			break;
	}
	buffer[i] = '\0';
	hal_put_char('\n');

	return buffer;
}

main.c

#include "uart4.h"

extern void printf(const char* fmt, ...);
void delay_ms(int ms)
{
	int i;
	for (i=0; i

你可能感兴趣的:(arm开发)