美文网首页
STM32-UART-发送/接收 学习笔记

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

作者: 水妖 | 来源:发表于2022-04-25 10:46 被阅读0次

STM32_Study: STM32_Study (gitee.com)

不逼逼 贴代码

usart.c
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>

/**
 * @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-发送/接收 学习笔记

    STM32_Study: STM32_Study (gitee.com)[https://gitee.com/wa...

  • RxBus简单使用

    配置 Rxbus封装 RxBus使用 发送 接收 记录自己的android学习笔记。欢迎互相学习Github

  • FreakZ 路由发现机制

    FreakZ学习笔记:路由发现机制 路由发现机制只有在发送通信包的过程中会被调用,而接收过程因为发送时候已经进行了...

  • UDP接受端实现

    学习了发送端之后也要学习接受端在创建接收端的时候,需要指明接收端的端口,这个端口要和发送端发送的端口一致getAd...

  • 10月12日C++学习总结

    今天学习了发送与接收流式数据、进程和线程、工作线程、线程的终止、MFC下多线程的同步机制、 发送与接收流式数据:...

  • AsynSocket 源码解析之二

    CocoaAsyncSocket 源码学习摘要: GCDAsynSocket 读取socket数据(接收对方发送过...

  • sptest

    # Spring Kafka 学习笔记 ## 1 接收消息 接收消息需要提供MessageListenerCont...

  • 基于C++的邮件收发客户端,附源码可参考!

    基于VC6.0编写的一个学习实例 ,与Email接收和发送相关的程序,用这个程序可接收指定邮箱中的邮件,也可以发送...

  • 2019-08-19

    仪器设备器件发送/接收单(作为借用单留存) 发送单位:发送人:(送货单位)日期 接收单位:接收人:日期 名称,型号...

  • 协程 Select

    接收 发送

网友评论

      本文标题:STM32-UART-发送/接收 学习笔记

      本文链接:https://www.haomeiwen.com/subject/kklfyrtx.html