[UART输出字符和字符串]

本文详细介绍了在STM32上使用UART进行字符和字符串传输的实现过程,包括UART的初始化设置,如GPIO配置、波特率设定、数据格式设置等。同时,提供了发送字符、字符串以及接收字符和字符串的函数实现,方便在实际应用中进行串口通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

main.cua

#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_uart_init();

	while(1)
	{
		hal_put_char(hal_get_char()+1);

		//hal_put_string(hal_get_string());
	}
	return 0;
}

uart.h

#ifndef __UART_H__
#define __UART_H__

void __uart_init();

void __uart_putc(const char data);

void __uart_puts(const  char  *pstr);

char __uart_getc(void);

#endif 

uart.c

#include "uart4.h"
//初始化函数
void hal_uart_init(){
/**********RCC章节初始化**********/

//1.使能GPIOB组控制器 
RCC->MP_AHB4ENSETR |= (0x1<<1);
//2.使能GPIOG组控制器 
RCC->MP_AHB4ENSETR |=(0x1<<6);
//3.使能UART4组控制器 
RCC->MP_APB1ENSETR |= (0x1<<16);

/**********GPIO章节初始化**********/

//1.设置PB2引脚为复用功能模式
GPIOB->MODER &= (~(0x3<<4)); //00
GPIOB->MODER |= (0x2<<4); //10
//2.设置PB2引脚为复用功能模式UART4_RX  
//AFRL[11:8] = 1000
GPIOB->AFRL &= (~(0xf<<8)); //0000
GPIOB->AFRL |= (0x8<<8); //1000
//3.设置PG11引脚为复用功能模式 
//MODER[23:22] = 10
GPIOG->MODER &= (~(0x3<<22)); //00
GPIOG->MODER |= (0x2<<22); //10

//4.设置PG11引脚为复用功能模式UART4_TX 
//AFRH[15:12] = 0110    
GPIOG->AFRL &= (~(0xf<<12)); //0000
GPIOG->AFRL |= (0x1<<13); //0010
GPIOG->AFRL |= (0x1<<14); //0110

/**********UART章节初始化**********/
//8N1 115200 TE RE UE
//0.前提条件UE=0
//1.通过寄存器设置8位数据位 无奇偶校验位 
//CR1[28][12] = 00,CR1[10] = 0
USART4->CR1 &= (~(0x1 << 12));
USART4->CR1 &= (~(0x1 << 28));

USART4->CR1 &= (~(0x1 << 10));

//2.通过寄存器设置1位停止位 
//CR2[13:12]=00
USART4->CR2 &=(~(0x1<<12));
USART4->CR2 &=(~(0x1<<12));

//3.通过CR1寄存器设置串口16倍采样率 CR1[15] = 0
USART4->CR1 &= (~(0x1 << 15));
//4.通过PRESC寄存器设置串口不分频 PRESC[3:0] = 0000
USART4->PRESC &= (~(0xf));
//5.通过BRR寄存器设置串口波特率位115200 BRR=0x22b
USART4->BRR &= (~(0xffff));
USART4->BRR |= (0x22b);
//通过CR1寄存器设置串口TE位使能 TE[3] = 1
USART4->CR1 |= (0x1 << 3);
//通过CR1寄存器设置串口RE位使能 TE[2] = 1
USART4->CR1 |= (0x1 << 2);
//通过CR1寄存器设置串口UE位使能 TE[0] = 1
USART4->CR1 |= (0x1 << 0);

}

//发送一个字符
void hal_put_char(const char str)
{
    //1.判断发送数据寄存器是否为空ISR[7]
    //读0:表示发送数据寄存器满,需要等待
    //读1:表示发送寄存器为空,发送下一个字节数据
    //    USART4->ISR & (0x1 << 7)
    while(!(USART4->ISR & (0x1 << 7)));//while(1/0)
    USART4->TDR &=(~(0x1ff));

    //2.将要发送的数据,放入到发送数据寄存器中
    USART4->TDR &=str;
    //3.判断发送数据寄存器是否发送完成
    while(!(USART4->ISR & (0x1 << 6)));//while(1/0)
}
//发送一个字符串
void hal_put_string(const char* string)
{
    //判断是否为'\0',一个字符一个字符进行发送
    while(*string)
    {
        hal_put_char(*string);
        string++;
    }
    hal_put_char('\r');
    hal_put_char('\n');
}

//接收一个字符
char hal_get_char()
{
    char ch;
    //1.判断接收数据寄存器中是否有数据可读
    while(!(USART4->ISR & (0x1 << 5)));
    //2.将接收数据寄存器中的内容赋值给ch
    ch = USART4->RDR;
    return ch;
}

//定义全局变量
char arr[512] = "0";
//接收一个字符串
char* hal_get_string()
{
    int i=0;
    //循环进行接收
    while(1)
    {
        //1.判断接收数据寄存器中是否有数据可读
        while(!(USART4->ISR & (0x1 << 5)));
        //2.将接收数据寄存器中的内容赋值给arr
        //判断字符是否为'\r',break
        if(USART4->RDR == '\r')
        {
            arr[i] = '\0';
            break;
        }
        arr[i] = USART4->RDR;
        hal_put_char(arr[i]);
        i++;
    }
    hal_put_char('\r');
    hal_put_char('\n');
    return arr;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值