STM32-UART-发送/接收 学习笔记

STM32_Study: STM32_Study (gitee.com)

不逼逼 贴代码

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

/**
 * @brief
 * UART:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
 * 库  : STM32F10x_StdPeriph_Lib_V3.5.0
 *
 */
void usart1_init(void)
{
    // 1.使能时钟 GPIO / USART
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  // GPIO时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART时钟使能

    // 2.配置GPIO_pin脚 TX / RX
    GPIO_InitTypeDef gpio_initStructure;                  // GPIO_INIT结构体
    gpio_initStructure.GPIO_Pin = GPIO_Pin_9;             //配置引脚
    gpio_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出
    gpio_initStructure.GPIO_Speed = GPIO_Speed_50MHz;     //速度
    GPIO_Init(GPIOA, &gpio_initStructure);                //初始化 输出引脚
    gpio_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    gpio_initStructure.GPIO_Pin = GPIO_Pin_10;            //配置引脚
    GPIO_Init(GPIOA, &gpio_initStructure);                //初始化 输入引脚

    // 3.UART初始化并使能
    USART_InitTypeDef usart_init_type_def;                                          // usart结构体
    usart_init_type_def.USART_BaudRate = 115200;                                    //波特率  115200
    usart_init_type_def.USART_WordLength = USART_WordLength_8b;                     //长度 8bit
    usart_init_type_def.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                 // usart模式  输入和输出
    usart_init_type_def.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制 无
    usart_init_type_def.USART_Parity = USART_Parity_No;                             //校验位 无
    usart_init_type_def.USART_StopBits = USART_StopBits_1;                          //停止位 1
    USART_Init(USART1, &usart_init_type_def);                                       //初始化usart
    USART_Cmd(USART1, ENABLE);                                                      //使能USART1

    //至此,发送已经可以使用
    //可调用USART_SendData(USART1, (uint16_t)data) 发送数据
    //也可以重写fputc然后使用printf()打印函数(下方有该函数);

    // 4.1使能接收中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断 USART_IT_RXNE:Receive Data register not empty interrupt 非空中断(字面意思)

    // 4.2NVIC配置  “内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)”
    NVIC_InitTypeDef nvic_init_type_def;                      // NVIC_Init 结构体
    nvic_init_type_def.NVIC_IRQChannel = USART1_IRQn;         //通道配置
    nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE;           //使能
    nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
    nvic_init_type_def.NVIC_IRQChannelSubPriority = 1;        //响应优先级
    NVIC_Init(&nvic_init_type_def);
}

/**
 * @brief 重载C prinf的调用函数
 * 注:需要开启KEIL软件里面的 Target->User Micro LIB 选项
 *
 * @param ch
 * @param f
 * @return int
 */
int fputc(int ch, FILE *f)
{

    // while ((USART1->SR & 0X40) == 0);
    // //DR:数据寄存器
    // USART1->DR = (uint16_t)ch;
    // return ch;

    // 获取标志位:USART1->SR
    // SR:status register, 状态寄存器
    // USART_FLAG_TC (=0X40) : Transmission Complete flag 发送完成标志
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        ;
    //循环发送,直到发送完毕
    USART_SendData(USART1, (uint16_t)ch);
    return ch;
}
/**
 * @brief 配置中断4.1/4.2后,触发中断时中断系统会调用该函数
 *
 */
void USART1_IRQHandler(void)
{
    uint16_t data;
    //判断USART1当前状态是否是非空中断
    // USART_IT_RXNE(0x0525):Receive Data register not empty interrupt 非空中断
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        //接收数据 return : uint16_t
        data = USART_ReceiveData(USART1);
        //接收完毕 发送出去 (测试使用)
        //可以创建接收数据uint8_t temp[10]将每一个数据合并一起.
        USART_SendData(USART1, data);
    }
}
/**
 * @brief 测试
 *
 */
void usart1_test(void)
{
    printf("Hello world !");
}

usart.h
#include "stm32f10x.h"
#ifndef __USART_H__
#define __USART_H__

//初始化uart
void usart1_init(void);

//测试
void usart1_test(void);

#endif

你可能感兴趣的:(STM32-UART-发送/接收 学习笔记)