2023.7.5(ARM day_6)

实验一:键盘输入一个字符'a',串口工具显示'b'

实验二:实现现象:键盘输入一个字符串,串口工具回显输入的字符串

#头文件

#ifndef __UART_H__
#define __UART_H__

void __uart_init();

void __uart_putc(const char data);

void __uart_puts(const  char  *pstr);

char __uart_getc(void);

#endif

#功能函数

#include"uar4.h"
void hal_uar4_init()
{
	//1.RCC初始化
	//1.1使能GPIOB对应组控制器
	RCC->MP_AHB4ENSETR |=(0X1 << 1);
	//1.2使能GPIOG对应组控制器
	RCC->MP_AHB4ENSETR |=(0X1 << 6);
	//1.3使能uar4对应组控制器
	RCC->MP_APB1ENSETR |=(0X1 << 16);
	

	//2.GPIO初始化
	//2.1设置PB2引脚为复用模式 0X50003000[4:5]=10
	GPIOB->MODER &=(~(0X3 << 4));
	GPIOB->MODER |=(0x1 << 5);
	//2.2使能PB2为复用模式为 UAR4_RX 0x50003020[11,8]=1000
	GPIOB->AFRL &=(~(0xf << 8));
	GPIOB->AFRL |=(0X1 << 11);
	//2.3设置PG11引脚为复用模式 0X50003000[23:22]=10
	GPIOG->MODER &=(~(0X3 << 22));
	GPIOG->MODER |=(0x1 << 23);
	//2.4使能PG11为复用模式为 UAR4_TX 0x50008004[15:12]=0110
	GPIOG->AFRL &=(~(0xf << 12));
	GPIOG->AFRL |=(0X3 << 13);


	//3.UART初始化
	//3.1设置串口UE=0
	//3.1设置1位初始位,8位数据位 CR1[28][12]=00
	USART4->CR1 &=(~(0x1 << 28));
	USART4->CR1 &=(~(0x1 << 12));
	//3.2设置16倍采样速率  CR1[15]=0
	USART4->CR1 &=(~(0x1 << 15));
	//3.3设置奇偶检验位 CR1[10]=0
	USART4->CR1 &=(~(0X1 << 10));
	//3.3设置1位停止位 CR2[13:12]=00
	USART4->CR2 &=(~(0x3 << 12));
	//3.4设置串口不分频
	USART4->PRESC &= (~0xf);
	//3.5设置串口波特率为115200
	USART4->BRR =0x22B;
	//3.6设置串口发送器使能 CR1[3]=1
	USART4->CR1 |=(0x1 << 3);
	//3.7设置串口接收器使能 CR1[2]=1
	USART4->CR1 |=(0x1 << 2);
	//3.8设置串口使能 CR1[0]=1
	USART4->CR1 |=0x1;
}
//获取一个字符
char hal_get_str()
{
	char str;
	//1.1判断数据寄存器中是否收到数据 ISR[5]
	while(!(USART4->ISR & (0X1 << 5)));
	//1.2收到将寄存器中的内容读取出来
	str=USART4->RDR;
	return str;

}
//发送一个字符
void hal_put_char(const char str)
{
	//1.判断发送数据寄存器是否为空ISR[7]
	//为空才可以发送下一位数据,为满需要等待
	//读0:满 需要等待  读1:发送数据
	while(!(USART4->ISR &(0X1 << 7)));
	//2.将发送的内容,赋值给发送数据寄存器
	USART4->TDR=str;
	//3.判断一帧数据是否发送完成 ISR[6]
	while(!(USART4->ISR & (0x1 << 6)));
	//读0;没有发送完成,需要等待 读1:发送完成
	
}
char str[50]={0};

//获取一个字符串
char* hal_get_string()
{
	//1.1循环进行接收
	//1.2当键盘的回车键按下之后,代表字符串输出完成 '\r'
	unsigned int i=0;
	while(i<49)
	{
		str[i]=hal_get_str();
		hal_put_char(str[i]);
		if(str[i]=='r')
		{
			break;
		}
        i++;
	}
	str[i]='\0';
	hal_put_char('\n');
	hal_put_char('\r');
	return str;
}
//发送一个字符串
void hal_put_string(const char* string)
{
	
     	//1.1判断是否为'/0'
		//1.2一个字符一个字符进行发送
		while(*string)
		{
			hal_put_char(*string++);
		}
				
		hal_put_char('\r');
		hal_put_char('\n');
}

#主函数

#include "uar4.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_uar4_init();
	hal_put_char('\r');
	hal_put_char('\n');
	hal_put_string("yanzhaozhong test");
	while(1)
	{
		hal_put_string(hal_get_string());
		
	}
	return 0;
}


 

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