STM32之USART

Posted nwjlq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32之USART相关的知识,希望对你有一定的参考价值。

(2):对printf scanf进行重定向且利用串口控制开发板上的LED灯(输入奇数LED1亮 偶数LED1灭)

重点:1.对c语言中的输入输出重定向必须配置keil使用微软lib库并且加入头文件stdio.h( #include<stdio.h> )

技术图片

2:重写fputc  fgetc函数。

LED原理图:

技术图片

头文件:注意添加stdio.h头文件

#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"
#include <stdio.h>
//发送引脚配置
#define USART_TX_CLK           RCC_APB2Periph_GPIOA
#define USART_TX_PORT          GPIOA
#define USART_TX_PIN           GPIO_Pin_9

//接收引脚配置
#define USART_RX_CLK           RCC_APB2Periph_GPIOA
#define USART_RX_PORT          GPIOA
#define USART_RX_PIN           GPIO_Pin_10

//串口配置
#define USART                  USART1
#define USART_CLK              RCC_APB2Periph_USART1

void USART_Config(void);//初始化

#endif

USART配置:

//引脚初始化
static void USART_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    //开启TX RX端口时钟
    RCC_APB2PeriphClockCmd(USART_TX_CLK|USART_RX_CLK,ENABLE);
    
    //TX引脚初始化
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽
    GPIO_InitStruct.GPIO_Pin=USART_TX_PIN;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(USART_TX_PORT,&GPIO_InitStruct);
    
    //RX引脚初始化
    GPIO_InitStruct.GPIO_Pin=USART_RX_PIN;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(USART_RX_PORT,&GPIO_InitStruct);
}
//模式初始化
static void USART_Mode_Config(void)
{
    USART_InitTypeDef USART_InitStruct;
    //开启串口时钟
    RCC_APB2PeriphClockCmd(USART_CLK,ENABLE);
    
    USART_InitStruct.USART_BaudRate=115200;//波特率配置
    USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//模式 发送 接收模式
    USART_InitStruct.USART_Parity=USART_Parity_No;//是否开启校验
    USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位
    USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据长度 8位
    USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//是否硬件流控制
    
    USART_Init(USART,&USART_InitStruct);//初始化
    
    USART_Cmd(USART,ENABLE);//使能USART串口
    
}

//初始化
void USART_Config(void)
{
    USART_GPIO_Config();//GPIO配置
    USART_Mode_Config();//USART模式配置
}

发送数据辅助函数:

//发送一个字节函数
static void USART_SendByteData(uint8_t data)
{
    USART_SendData(USART,data);
    while(USART_GetFlagStatus(USART,USART_FLAG_TXE)==RESET);//等待发送完成
}

重写fputc fgetc函数:

//重定向 printf puts putchar函数
int fputc(int ch,FILE*fp)
{
    USART_SendByteData(ch);
    return ch;
}
//重定向 scanf gets getchar 
int fgetc(FILE*fp)
{
    while(USART_GetFlagStatus(USART,USART_FLAG_RXNE)==RESET);//等待接收数据
    return USART_ReceiveData(USART);
}

main函数:

#include "stm32f10x.h"
#include "usart.h"

void LED_Config(void);//LED0引脚初始化

int main()
{
    uint8_t value=0;
    USART_Config();
    LED_Config();
    while(1)
    {
        value=getchar();
        value-=48;//字符数字与实际的数值相差48
        if(value%2==1)
            GPIO_ResetBits(GPIOC,GPIO_Pin_0);//点亮
        else
            GPIO_SetBits(GPIOC,GPIO_Pin_0);//熄灭
    }
}

void LED_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    //开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    
    GPIO_Init(GPIOC,&GPIO_InitStruct);//初始化
    
    GPIO_SetBits(GPIOC,GPIO_Pin_0);//默认熄灭
}

注意:字符数字与实际的数值相差48:

技术图片

 效果:

技术图片

以上是关于STM32之USART的主要内容,如果未能解决你的问题,请参考以下文章

STM32之USART

STM32之USART

STM32之USART1串口:蓝牙接收字符控制LED亮灭

STM32学习USART之基础篇

stm32之波特率USART

STM32+ESP8266配置