串口实验:收发数据

功能:收发字符串 

 通过循环调用字符收发函数,实现字符串接收和发送:

ubuntu@ubuntu:~/zz/ARM_pro/05uArt/05uart$ cat src/gpio.c
#include "gpio.h"

//初始化串口;接收RD--PB2;发送TD--PG11
void uart_init()
{
	//RCC使能GPIOB,GPIOG控制器
	RCC->MP_AHB4ENSETR |= (0x1<<1);
	RCC->MP_AHB4ENSETR |= (0x1<<6);
	//RCC使能UART控制器
	RCC->MP_APB1ENSETR |= (0x1<<16);
	/******GPIO使能********/
	//设置GPIOB---PB2引脚为复用功能
	GPIOB->MODER &= (~(0x3<<4));
	GPIOB->MODER |= (0x1<<5);

	//设置GPIOG---PG11引脚为复用功能
	GPIOG->MODER &= (~(0x3<<22));
	GPIOG->MODER |= (0x1<<23);

	//设置复用的功能为串口
	GPIOB->AFRL &= (~(0xf<<8));
	GPIOB->AFRL |= (0x1<<11); //AF8:1000
	GPIOG->AFRH &= (~(0xf<<12));
	GPIOG->AFRH |= (0x3<<13); //AF6:0110

	/********UART4异步*********/
	//设置数据宽度8bit传输[12][28]=00
	USART4->CR1 &= (~(0x1<<12));
	USART4->CR1 &= (~(0x1<<28));
	//设置串口16倍采样率
	USART4->CR1 &= (~(0x1<<15));
	//设置串口无奇偶校验
	USART4->CR1 &= (~(0x1<<10));
	//设置串口发送数据寄存器使能
	USART4->CR1 |= (0x1<<3);
	//设置串口接收数据寄存器使能
	USART4->CR1 |= (0x1<<2);
	//设置串口使能*******************先判断似能,0禁用

	USART4->CR1 |= (0x1<<0);
	/***************/
	//设置串口停止位为1位
	USART4->CR2 &= (~(0x3<<12));
	//设置串口波特率BRR115200
	//系统提供的时钟源64MHZ*10^6/115200=0x22b
	USART4->BRR = 0x22b;
	//设置串口分频
	USART4->PRESC &= (~0xf);
}
//发送一个字符
void put_char(const char ch)
{
	//判断发送服务器状态位
	//当发送寄存器发完当前的才能发下一个数据[7]=1可以继续发
	while(!(USART4->ISR &(0x1<<7)));  //!=1跳出循环
	//将数据放到发送寄存器
	USART4->TDR =ch;
	//判断发送数据是否完成:[6]=0未完成,则一直发
	while((USART4->ISR &(0x1<<6))==0);
}
//发送字符串
void put_string(const char *str)
{
	int i=0;
	while(str[i]!='\0')
	{
		//一个一个字符的发送
		put_char(str[i]);
		i++;
	}

	//1.判断发送寄存器有内容再发,[7]=0则等待接收
//	while(!(USART4->ISR &(0x1<<7)));
	//将数据放到发送寄存器
//	USART4->TDR = *str;
	//发送完成即结束[6]=0未完成,则等待完成
//	while((USART4->ISR &(0x1<<6))==0);

}

//接收字符
char get_char()
{

	//判断接收是否有数据,没有则等待
	//[5]=0未收到数据
	while((USART4->ISR &(0x1<<5))==0);
	//收到的字符+1返回,收到a返回b
	return USART4->RDR;
}
//接收字符串
	char buf[30]="";

char *get_string()
{

	//一个一个的接收
	int i = 0;
	//当收到字符串,则返回字符串的地址
	while((buf[i]=get_char())!='\n')
	{
		put_char(buf[i]);
		i++;
	}
	buf[i]='\0';
	//终端换行
	put_char('\n');
	return buf;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值