底层 DAY4作业

1、在键盘输入字符串,在串口工具显示字符串

(1)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++);
}
 
 
char buff[50]={0};
 
int main()
{
	hal_uart4_init();
	//put_char('A');
	//put_string("uart4test*****************");
	//put_string("12345678");
	put_string("uart4 test*****************\r");
	
	/*
	while(1)
	{
		put_char(get_char()+1);	 //only A-Z a-z 0-9
	}
	*/
	while (1)
	{
		get_string();
		put_string(buff);
	}
	
	
	return 0;
}

(2)src/uart4.c

#include "uart4.h"
//初始化 uart 
extern char buff[50];
void hal_uart4_init()
{
	/******RCC章节**************/
	RCC->MP_AHB4ENSETR |= (0x1<<1 | 0x1<<6);
	RCC->MP_APB1ENSETR |= (0x1<<16);
	/********使能GPIOB组控制器***********/
	//PB2----> UART4_RX
	GPIOB->MODER &= (~(0b11<<4));
	GPIOB->MODER |= (0b10<<4);
	GPIOB->AFRL &= (~(0b1111<<8));
	GPIOB->AFRL |= (0b1000<<8);
	//使能GPIOG组控制器---->UART4_TX
	GPIOG->MODER &= (~(0b11<<22));
	GPIOG->MODER |= (0b10<<22);
	GPIOG->AFRH &= (~(0b1111<<12));
	GPIOG->AFRH |= (0b0110<<12);
	/********使能UART4组控制器***********/
	//M bit init(M1 M0) , sampling 16(OVER8), no even odd parity(PCE)
	USART4->CR1 &= (~(0x1<<28 | 0x1<<12 | 0x1<<15 | 0x1<<10));
	//TE RE UE
	USART4->CR1 |= (0x1<<3 | 0x1<<2 | 0x1<<0);
	//1 stop bit
	USART4->CR2 &= (~(0b11<<12));
	//BRR= 64MHz/115200 = 0x22B
	USART4->BRR =  0x22B;
	//no prescaling
	USART4->PRESC &= 0b0000;
}
 
//发送一个字符
void put_char(const char str)
{
	//判断发送数据寄存器是否为空==>UART_ISR[7]   is 1,if it's 1,then the next byte could be sent
	//读0:发送数据寄存器为满,需要等待
	//读1:发送数据寄存器为空,发送下一个字节
	while(!(USART4->ISR & (0x1<<7)));
	USART4->TDR = str;
	//判断发送数据是否完成     0 not finshed 1 finshed
	while (!(USART4->ISR & (0x1<<6)));
	if ('\r'==str)
	{
		put_char('\n');
	}
	
	
	
}
 
 
//发送一个字符串 
void put_string(const char* string)
{
	//判断是否为\0
	const char *p = string;
	while (*p!='\0')
	{
		put_char(*p);
		p++;
	}
}
 
 
//接收一个字符 
char get_char()
{
	char ret;
	//1.判断RXNE是否为1,数据接收,0 数据不接收
	while (!(USART4->ISR & (0x1<<5)));
	//调用put_char
	ret = USART4->RDR;
	return ret;
}
 
 
//接收一个字符串
char* get_string()
{
	//for循环
	
	//loop: 接收一个字符,然后显示出来
 
	//判断键盘回车是否按下\r
 
	int i;
	for(i = 0; i < sizeof(buff)-1;i++)
	{
		// receive a char
		buff[i] = get_char();
		// display the char 
		put_char(buff[i]);
		if ('\r'==buff[i])
		{
			break;
		}
		
	}
	return buff;
}

(3)include/uart4.h

#ifndef __UART4_H__
#define __UART4_H__
#include "stm32mp1xx_uart.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
 
//初始化 uart 
void hal_uart4_init();
 
//发送一个字符
void put_char(const char str);
 
//发送一个字符串
void put_string(const char* string);
 
 
//接收一个字符 
char get_char();
 
 
//接收一个字符串 
char* get_string();
 
 
#endif

实验结果图

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值