UART串口实验

1.键盘输入的字符加一

 2.键盘输出字符

 头文件

#ifndef __UART4_H__
#define __UART4_H__

#include "../common/include/stm32mp1xx_uart.h"
#include "../common/include/stm32mp1xx_rcc.h"
#include "../common/include/stm32mp1xx_gpio.h"
// 初始化的函数
void hal_uart4_init(void);

// 发送一个字节的函数
void hal_send_char(const char ch);

// 发送字符串的函数 
void hal_send_string(const char *string);

// 接收一个字符的函数
char hal_recv_char(void);

// 接收一个字符串的函数
char * hal_recv_string();
#endif // __UART4_H__

源文件

#include "../include/uart4.h"
void hal_uart4_init()
{
    //RCC使能
    RCC->MP_AHB4ENSETR |=(0x1<<1)|(0x1<<6);
    RCC->MP_APB1ENSETR |=(0x1<<16);   //UART使能
    //GPIO的配置
    GPIOB->MODER  &=(~(0x3<<4));
    GPIOB->MODER |=(0x1<<5);
    GPIOG->MODER  &=(~(0x3<<22));
    GPIOG->MODER |=(0x1<<23);
    //GPIO引脚多功能复用,引脚功能的选用
    GPIOB->AFRL  &=(~(0xf<<8));      //PB2选用AF8功能1000【11:8】
    GPIOB->AFRL |=0x8<<8;
    GPIOG->AFRH &=(~(0xf<<12));  //[15:12],PG11选AF6
    GPIOG->AFRH |=(0x6<<12);
     if (USART4->CR1 & (0x1 << 0))
    {           // 等待之前的串口的数据发送完成之后在禁止串口
        USART4->CR1 &= (~(0x1 << 0)); // 禁止串口的使能
    }
    //设置UART4_CR1
    USART4->CR1 &=(~(0x1<<12|0x1<<28));//设置长度为8   00   12 28
    //使能RE TE寄存器
    USART4->CR1 |=0x3<<2;
    //校验位不设置
    USART4->CR1 &=(~(0x1<<10));
    //设置采样率
    USART4->CR1 &=(~(0x1<<15));   //设置16倍采样率
    //CR2设置停止位 1位
    USART4->CR2 &=(~(0x3<<12));
    //设置分频 8分频
    USART4->PRESC &=(~(0xf));
    USART4->PRESC |=0x1<<2;
    //设置波特率
    USART4->BRR=0x45;
    //使能UE 要放在最后
    USART4->CR1 |=0x1;
}

// 发送一个字节的函数
void hal_send_char(const char ch)
{
    while(1)
    {
        if(USART4->ISR &0x1<<7)
        {
            USART4->TDR=ch;
            break;
        }
        
    }
    //如果出现换行,移动光标
    if (ch=='\n')
        {
            hal_send_char('\r');
        }
        
}

// 发送字符串的函数 
void hal_send_string(const char *string)
{
    for(int i=0;string[i]!='\0';i++)
    {
        hal_send_char(string[i]);
    }
}

// 接收一个字符的函数
 
char hal_recv_char(void)
{
    char ch;
   
    while(!(USART4->ISR & 0x1<<5))
    {
    }
    ch=(char)USART4->RDR;
    return ch;
}

// 接收一个字符串的函数
 char string[100]={0};
char * hal_recv_string()
{
   
    int i=0;
   
    for(i=0;i<99;i++)
    {
        string[i]=hal_recv_char();
        hal_send_char(string[i]);
        if(string[i]=='\r')
        {
           break;
        }
    }
     string[i]='\0';
     hal_send_char('\n');
     return string;
    
}

主函数

#include "./include/led.h"
#include "./include/uart4.h"
extern void printf(const char *fmt, ...);
void delay_ms(unsigned int ms)
{
	int i, j;
	for (i = 0; i < ms; i++)
		for (j = 0; j < 1800; j++)
			;
}
int main()
{
	char c;
	char *str;
	hal_uart4_init(); 
	//hal_send_string("usart test code\n");
	//hal_send_string("usart init finished\n");
	while (1)
	{
#if 0
		// 测试接收一个字符
		c = hal_recv_char();  
		hal_send_char(c+1); 
#endif
#if 1
		// 测试接收一个字符串,并发送一个字符串的函数
		str = hal_recv_string();
		hal_send_string(str);
		hal_send_char('\n');
#endif
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值