ARM(实验二)

uart4.h

复制代码
#ifndef __H__
#define __H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"

//RCC/GPIO/UART4章节初始化
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

复制代码
#ifndef __H__
#define __H__

#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_uart.h"

//RCC/GPIO/UART4章节初始化
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
ubuntu@ubuntu:~/ARM00/04uart_4/include$ cd ..
ubuntu@ubuntu:~/ARM00/04uart_4$ cd src
ubuntu@ubuntu:~/ARM00/04uart_4/src$ cat uart4.c
#include "uart4.h"

//RCC/GPIO/UART4章节初始化
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章节初始化
	//1.设置PB2引脚为复用功能
	GPIOB->MODER &= (~(0x3 << 4));
	GPIOB->MODER |= (0x1 << 5);

	//2.设置PB2引脚复位功能为UART4_RX
	GPIOB->AFRL &= (~(0xf << 8));
	GPIOB->AFRL |= (0x1 << 11);

	//1.设置PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3 << 22));
	GPIOG->MODER |= (0x1 << 23);
	
	//2.设置PG11引脚复位功能为UART4_TX
	GPIOB->AFRH &= (~(0xf << 12));
	GPIOB->AFRH |= (0x3 << 13);


	//UART4章节初始化	
	//0.设置UE=0
	USART4->CR1 |= (0X1);

	//1.设置UART4串口1位起始位,8位数据位 CR1[28][12]=00
	USART4->CR1 &= (~(0X1 << 12));
	USART4->CR1 &= (~(0X1 << 28));

	//2.设置UART4串口没有校验位 CR1[10]=0
	USART4->CR1 &= (~(0X1 << 10));

	//3.设置UART4串口1位停止位 CR2[13:12] = 00
	USART4->CR2 &=(~(0X3 << 12));
	//4.设置UART4串口16倍采样率 CR1 [15]= 0
	USART4->CR1 &=(~(0X1 << 15));

	//5.设置UART4串口不分频 PRESC[3:0] = 0000
	USART4-> PRESC &= (~(0Xf));
	
	//6.设置UART4串口波特率为115200 BRR =0x22B
	USART4->BRR &= (~(0Xffff));
	USART4->BRR |=(0X22B);

	//7.设置UART4串口发送器使能 CR1[3]=1
	USART4->CR1 |= (0X1 << 3);

	//8.设置UART4串口接收器使能CR1[2]=1 
	USART4->CR1 |= (0X1 << 2);

	//9.设置UART4串口使能 CR[0]=1
	USART4->CR1 |=(0X1);
	
}

//发送一个字符函数
void hal_put_char(const char str)
{
	//判断发送数据寄存器是否为空
	while(!(USART4->ISR &(0X1<<7)));
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器为空,可以发送数据	
	//2.将发送的数据,赋值给发送数据寄存器中
	USART4->TDR=str;

	//判断一帧数据是否发送完成
	while(!(USART4->ISR &(0x1<<6)));

}
//发送一个字符串函数
void hal_put_string(const char* string)
{
	
	//判断是否为'/0'
	
	//一个一个字符进行发送就行了
	for (int i=0;string[i]!=0;i++)
	{
		hal_put_char(string[i]);
	}

}
//接受一个字符函数
char hal_get_char()
{
	while(!(USART4->ISR & (0X1<<5)));
	//判断接收数据寄存器中,是否接受数据	
	//将接受数据寄存器中的内容,读出来
	
	return (char)USART4->RDR;

}
//接受一个字符串函数
char* hal_get_string()
{
	static char p[32]="";
	for(int i=0;i<sizeof(p);i++)
	{
		p[i]=hal_get_char();
		hal_put_char(p[i]);
		if(p[i]=='\r')
		{
			hal_put_char('\n');
			p[i+1]='\n';
			p[i+2]='\0';
			break;
		}
	}
	return p;
}

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()
{
	while(1)
	{
//	hal_put_char(hal_get_char()+1);
	hal_put_string(hal_get_string());
	}
	return 0;
}
相关推荐
17(无规则自律)4 小时前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞17 小时前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠1 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠2 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟2 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9562 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt
unicrom_深圳市由你创科技2 天前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
松涛和鸣2 天前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
松涛和鸣2 天前
69、Linux字符设备驱动实战
linux·服务器·网络·arm开发·数据库·驱动开发