ARM 3月28日作业

1.include/uart.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mplxx_uart.h"


#define RCC_AHB4_ENSETR (*(volatile unsigned int *)0x50000A28)
#define RCC_MP_APB1ENSETR (*(volatile unsigned int *)0x50000A00)
#define GPIOB_MODER (*(volatile unsigned int *)0x50003000)
#define GPIOG_MODER (*(volatile unsigned int *)0x50008000)
#define GPIOB_AFRL (*(volatile unsigned int *)0x50003020)
#define GPIOG_AFRH (*(volatile unsigned int *)0x50008024)


//初始化串口函数
void hal_uart4_init();

//发送一个字符
void put_char(const char str);

//发送一个字符串
void put_string(const char* string);

//接收一个字符
char get_char();

//接收一个字符串
char* get_string();







#endif

2.src/uart.c

#include "uart4.h"


//初始化串口函数
void hal_uart4_init()
{
 /*****rcc章节初始化*****************/
	//使能GPIOG GPIOG
	 RCC_MP_AHB4ENSETR |= (0x1<<1);
 	 RCC_MP_AHB4ENSETR |= (0x1<<6);
	//使能uart4
	RCC_MP_APB1ENSETR |=(0x1<<16);

	
/*****GPIO章节初始化****************/
 	//设置PB2引脚为UART4_RX   PG11引脚为UART4_TX
	 GPIOE_MODER |=(0x3<<4);
	 GPIOE_MODER &=(~(0x1<<4));
	 
	 GPIOE_MODER |=(0x3<<22);
	 GPIOE_MODER =(~(0x1<<22));

	//设置PB2引脚复用功能为UART4_RX   PG11引脚为复用功能为UART4_TX
	GPIOB_AFRL |=(0xF<<8);
	GPIOB_AFRL &=(~(0x7<<8);

	GPIOG_AFRH &=(~(0xF<<12));
	GPIOG_AFRH |=(0x3<<13);


/*****UART章节初始化****************/
	//1.USART_CR1:
	//设置串口1位起始位,8位数据位
	USART4->CR1 &=(~(0x1<<12));
    USART4->CR1 &=(~(0x1<<28));

	//设置串口16倍采样率
	USART4->CR1 &=(~(0x1<<10));

	//设置串口无奇偶校验位
	USART4->CR1 &=(~(0x1<<10));

	//设置串口发送器位使能
	USART4->CR1 &=(0x1<<3);

	//设置串口接收器位使能
	USART4->CR1 &=(0x1<<2);

	//设置串口位使能
	USART4->CR1 &=0x1; 
	
	//2.USART_BRR:设置串口波特率
	USART4->BRR&=0x22b;

	//3.USART_CR2:设置串口停止位位数
	USART4->CR2&=(~(0x3<<12)); 


	//4.USART_PRESC:设置串口分频器
	USART4->PRESC&=(~(0xF));




}
//发送一个字符
void put_char(const char str)
{
	//判断发送数据寄存器是否为空,为空才可以发送下一个字节数据
	//读0:发送数据寄存器满,需要等待
	//读1:发送数据寄存器空,可以发送下一个字节数据
	while(!(USART4->ISR & (0x1<<7)));
	USART4->TDR =str;
}
//发送一个字符串
void put_string(const char* string)
{
	//判断字符串是否结束'\0'
	while (*string)
		{
			put_char(*string++);
		}
		put_char('\n');

}
//接收一个字符
char get_char()
{
	//1.判断接收数据寄存器是否有数据
	//2.读0:表示没有接收到数据,没有数据可读
	// 读1:接收到数据,有数据可读
	while(!(USART4->ISR & (1<<5)));
	char zifu;
	zifu = USART4->RDR ;	
	return zifu ;
}
//接收一个字符串
char* get_string()
{
	//循环进行接收
	//循环实现:接收一个字符,回显一个字符
	//键盘的回车键按下之后,对应字符的是 '\r'
	
	char arr[50]="";
	int i;
	for(i=0;i<49;i++)
	{
		arr[i]=get_char();
		put_char(arr[i]);
		if(arr[i]=='\r')
		{
			break;
		}
	}
	arr[i]='\0';

	return arr;

}

3.include/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()
{
   hal_uart4_init();
   put_string("hello world\n");
	while (1)
	{
		put_string(get_string());
	}
	return 0;
}

4.软件打不开  破解破不了 结果 显示不了  在努力卸载软件重新下载中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值