【极海APM32F4xx Tiny】学习笔记07-串口使用框架

这篇具有很好参考价值的文章主要介绍了【极海APM32F4xx Tiny】学习笔记07-串口使用框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mcu 串口外设简介

该芯片内置多达 6 个通用同步/异步收发器,USART1/6 接口通信速率可达 10.5Mbit/s,其它USART/UART 的通信速率可达 5.25Mbit/s,所有 USART/UART 可配置波特率、奇偶校验位、停止位、数据位长度,都可以支持 DMA
函数库

本函数库主要是用来后期开发方便使用,将所有的变量封装在一个结构体内部
该函数库使用的是接收非空中断+空闲中断的方式收数据
头文件

    #ifndef __BSP_USART_IT_H
    #include "bsp_delay.h"
    #include "apm32f4xx.h"
    #include "apm32f4xx_gpio.h"
    #include "apm32f4xx_eint.h"
    #include "apm32f4xx_rcm.h"
    #include "apm32f4xx_syscfg.h"
    #include "apm32f4xx_misc.h"
    #include "apm32f4xx_usart.h"
    //缓冲区的大小
    #define RX_BUFF_SIZE 256
    //串口id定义,对外部的操作均使用该id操作
    typedef enum
    {
    UART_1,
    UART_2,
    UART_NUM
    }em_uart_id;
    //数据发送函数
    void bsp_uart_send_data(em_uart_id id,uint8_t *dat, uint32_t count);
    //初始化所有配置的串口
    void bsp_uart_it_init_all(void);
    //接收数据
    void bsp_uart_recv_data(em_uart_id id,uint8_t *dat, uint32_t *count);
    #endif

源文件文章来源地址https://www.toymoban.com/news/detail-599670.html


    /* Includes */
    #include "../usart_it/bsp_uart_it.h"
    #include <string.h>
    typedef struct
    {
    GPIO_T *tx_gpio_grp;
    GPIO_PIN_T tx_pin;
    uint32_t tx_rcc;
    GPIO_PIN_SOURCE_T tx_pin_source;
    GPIO_T *rx_gpio_grp;
    GPIO_PIN_T rx_pin;
    uint32_t rx_rcc;
    GPIO_PIN_SOURCE_T rx_pin_source;
    GPIO_AF_T gpio_af;
    USART_T *uart;
    IRQn_Type irq;
    uint32_t uart_rcc;
    uint8_t rx_buff[RX_BUFF_SIZE];
    uint16_t rx_count;
    uint16_t idle;
    } uart_it_t;
    static uart_it_t uarts_it[]=
    {
    { GPIOA,GPIO_PIN_9,RCM_AHB1_PERIPH_GPIOA,GPIO_PIN_SOURCE_9,
    GPIOA,GPIO_PIN_10,RCM_AHB1_PERIPH_GPIOA,GPIO_PIN_SOURCE_10,GPIO_AF_USART1,
    USART1,USART1_IRQn,RCM_APB2_PERIPH_USART1
    },
    { GPIOA,GPIO_PIN_2,RCM_AHB1_PERIPH_GPIOA,GPIO_PIN_SOURCE_2,
    GPIOA,GPIO_PIN_3,RCM_AHB1_PERIPH_GPIOA,GPIO_PIN_SOURCE_3,GPIO_AF_USART2,
    USART2,USART2_IRQn,RCM_APB1_PERIPH_USART2
    },
    };
    static void bsp_uart_it_config(uart_it_t *puart)
    {
    USART_Config_T usartConfigStruct;
    usartConfigStruct.baudRate = 115200;
    usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
    usartConfigStruct.mode = USART_MODE_TX_RX;
    usartConfigStruct.parity = USART_PARITY_NONE;
    usartConfigStruct.stopBits = USART_STOP_BIT_1;
    usartConfigStruct.wordLength = USART_WORD_LEN_8B;
    if (puart->uart == USART1 || puart->uart == USART6)
    {
    RCM_EnableAPB2PeriphClock(puart->uart_rcc);
    }
    else
    {
    RCM_EnableAPB1PeriphClock(puart->uart_rcc);
    }
    /** USART configuration */
    USART_Config(puart->uart, &usartConfigStruct);
    /** Enable USART1 RXBNE interrput */
    USART_EnableInterrupt(puart->uart, USART_INT_RXBNE);
    USART_EnableInterrupt(puart->uart,USART_INT_IDLE);
    USART_ClearStatusFlag(puart->uart, USART_FLAG_RXBNE);
    NVIC_EnableIRQRequest(puart->irq,1,0);
    /** Enable USART */
    USART_Enable(puart->uart);
    }
    static void bsp_uart_it_gpio_config(uart_it_t *puart)
    {
    GPIO_Config_T GPIO_configStruct;
    GPIO_ConfigStructInit(&GPIO_configStruct);
    /** 使能gpio的rcc*/
    RCM_EnableAHB1PeriphClock(puart->tx_rcc|puart->rx_rcc );
    /** Connect PXx to USARTx_Tx */
    GPIO_ConfigPinAF(puart->tx_gpio_grp, puart->tx_pin_source, puart->gpio_af);
    /** Connect PXx to USARTx_Rx */
    GPIO_ConfigPinAF(puart->rx_gpio_grp, puart->rx_pin_source, puart->gpio_af);
    /** Configure USART Tx as alternate function push-pull */
    GPIO_configStruct.mode = GPIO_MODE_AF;
    GPIO_configStruct.pin = puart->tx_pin;
    GPIO_configStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(puart->tx_gpio_grp, &GPIO_configStruct);
    /** Configure USART Rx as input floating */
    GPIO_configStruct.mode = GPIO_MODE_AF;
    GPIO_configStruct.pin = puart->rx_pin;
    GPIO_Config(puart->rx_gpio_grp, &GPIO_configStruct);
    }
    void bsp_uart_it_init_all(void)
    {
    for(int i=0; i<UART_NUM; i++)
    {
    bsp_uart_it_gpio_config(uarts_it+i);
    bsp_uart_it_config(uarts_it+i);
    }
    }
    void bsp_uart_send_data(em_uart_id id,uint8_t *dat, uint32_t count)
    {
    uart_it_t *puart;
    if(UART_NUM>id)
    puart = uarts_it+id;
    while(puart && count--)
    {
    while(USART_ReadStatusFlag(puart->uart, USART_FLAG_TXBE) == RESET);
    USART_TxData(puart->uart, *dat++);
    }
    }
    #define min(num0,num1) (num0>num1?num1:num0)
    void bsp_uart_recv_data(em_uart_id id,uint8_t *dat, uint32_t *count)
    {
    uart_it_t *puart;
    if(UART_NUM>id)
    puart = uarts_it+id;
    if(puart && dat&&count)
    {
    *count = min(puart->rx_count,*count);
    memcpy(dat, puart->rx_buff,*count);
    puart->rx_count=0;
    }
    else{
    *count=0;
    }
    }
    static void bsp_uart_ira_handler(uart_it_t *puart)
    {
    if(USART_ReadIntFlag(puart->uart, USART_INT_RXBNE) == SET)
    {
    USART_ClearIntFlag(puart->uart, USART_INT_RXBNE);
    puart->rx_buff[puart->rx_count++%RX_BUFF_SIZE] = (uint8_t)USART_RxData(puart->uart);
    }
    else if (USART_ReadIntFlag(puart->uart, USART_INT_IDLE) == SET)
    {
    USART_ClearIntFlag(puart->uart, USART_INT_IDLE);
    puart->idle=1;
    USART_RxData(puart->uart);
    }
    }
    void USART1_IRQHandler(void)
    {
    bsp_uart_ira_handler(uarts_it+UART_1);
    }
    void USART2_IRQHandler(void)
    {
    bsp_uart_ira_handler(uarts_it+UART_2);
    }

## main.c
   uint8_t buff[1024];
 int main(void)
 {
 	bsp_uart_it_init_all();
 	bsp_uart_send_data(UART_1,"HELLO",6);
 	while(1)
 	{
 	bsp_uart_recv_data(UART_1,buff,1024);
 	}
}

到了这里,关于【极海APM32F4xx Tiny】学习笔记07-串口使用框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【QT 自研上位机 与 STM32F4xx下位机联调>>>can通信测试-基础样例-联合文章】

    之前做个qt的上位机软件,现在有了qt下位机软件,是使用STM32,有了这两项,相当我们凑够了步数,可做做一期联合文章,完全可以联合调试,并且在写can的下位机是,当时就有了这个联合文章想法。 实验环境还是挺重要的,因为有时候,在你电脑上能运行的东西,在别人的

    2024年02月05日
    浏览(26)
  • 极海APM32F035电机控制专用MCU

           去年11月份一次偶然的机会,看到面包板论坛提供极海半导体针推出的低压电机测试板,此电机控制板基于专用控制芯片APM32F035基础上设计而成。APM32F035是一款基于Arm Cortex-M0+内核,集成FOC算法中常用的数学运算加速器(Cordic,Svpwm,硬件除法器等),并且集成了运放

    2024年02月03日
    浏览(23)
  • STM32F4X USART串口使用

    串口是MCU与外部通信的重要通信接口,也是MCU在开发过程中的调试利器。串口通信有几个重要的参数,分别是波特率、起始位、数据位、校验位。双方在进行串口通信前必须要约定好通信的参数,否则会导致通信失败。 起始位是自动产生,无需配置,通常是产生一个低电平为

    2024年02月11日
    浏览(31)
  • STM32F4 基于USART串口的蓝牙通信

    目录 一、硬件资源 连接方案 其他配置 二、实验原理 基本定义 USART介绍 USART工作原理 数据发送 数据接收 蓝牙HM-10配置 三、代码部分 usart.c usart.h Serial.c Serial.h main.c 结语 STM32F401,OLED,蓝牙hm10 连接方案 设备1的TX与设备2的RX连接,这样设备1发送的数据可以被设备2接收到。

    2024年01月17日
    浏览(29)
  • 调试STM32F4 USB3300 USB_HS虚拟串口

    参考了csdn上面的几篇文章,经历了一个多小时的调试排除找bug,终于成功了! 通过STM32cubeMx配置USB phy芯片 1. 2. 3. 4. 5.生成代码出来,打开工程,编译下载通过。 在上电之前,电脑得先安装ST的USB 虚拟串口驱动 点击前往下载--STSW-STM32102 - STM32虚拟COM端口驱动程序 - STMicroelect

    2024年02月02日
    浏览(47)
  • 【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

    最近在学习STM32的USB功能,主要是想要使用虚拟串口(VCP)功能,来解决串口传输速率较低的问题,达到于上位机高效通信的目的。 使用芯片:STM32F407ZGT6 使用函数:HAL库 使用工具:STM32CubeMX + Keil uVision5 串口工具:VOFA 主要配置内容: 调试模式为Serial; 使用外部时钟 设置为

    2024年02月21日
    浏览(49)
  • 串口通信(stm32F4)——通过串口助手发送led on或者led off控制LED灯的亮灭

    通过串口助手发送led on来点亮LED灯,发送led off来关闭LED灯(这里是LED1,其端口是GPIOF,引脚是PIN10,串口是USART1,其端口是GPIOA,引脚是PIN9、PIN10,一个用来收数据,一个用来发收据) 初始化LED; 初始化串口; 编写接收数据中断函数; 编写空闲中断函数。 2.1 初始化LED 2.2 初

    2024年02月16日
    浏览(37)
  • 正点原子stm32F407学习笔记5——串口通信实验

    上位机给开发板发送数据,开发板将收到的数据发回给上位机 串口设置的一般步骤可以总结为如下几个步骤: 串口时钟使能,GPIO 时钟使能。 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。 GPIO 初始化设置:要设置模式为复用功能。 串口参数初始化:设置波特率,字长,奇

    2024年02月06日
    浏览(27)
  • GD32F4单片机实现接收超时中断+DMA实现串口的不定长接收和DMA发送

    环形缓冲区+定时器超时中断的方式 优点 环形缓冲区可以接收多帧数据 数据帧超时间隔可以设置 缺点 设备任务比较繁重时,使用中断接收可能会丢失数据。尤其是在长时间关闭中断或者串口中断优先级不高时 频繁进出中断。在使用RTOS的系统中,每收到一个数据就会进行一

    2024年02月15日
    浏览(39)
  • APM32F072单片机进入STOP模式,并通过RTC Wakeup Timer和USART1串口接收事件唤醒

    串口初始化(注意USART1时钟源要选择HSI): 使用power_init函数初始化RTC,然后调用power_enter_stop_mode(n)函数进入STOP模式,n秒后自动唤醒,或由USART1接收唤醒:

    2024年02月13日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包