功能:收发字符串
通过循环调用字符收发函数,实现字符串接收和发送:
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;
}