国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【極海APM32F4xx Tiny】學(xué)習(xí)筆記07-串口使用框架

這篇具有很好參考價(jià)值的文章主要介紹了【極海APM32F4xx Tiny】學(xué)習(xí)筆記07-串口使用框架。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

mcu 串口外設(shè)簡介

該芯片內(nèi)置多達(dá) 6 個(gè)通用同步/異步收發(fā)器,USART1/6 接口通信速率可達(dá) 10.5Mbit/s,其它USART/UART 的通信速率可達(dá) 5.25Mbit/s,所有 USART/UART 可配置波特率、奇偶校驗(yàn)位、停止位、數(shù)據(jù)位長度,都可以支持 DMA
函數(shù)庫

本函數(shù)庫主要是用來后期開發(fā)方便使用,將所有的變量封裝在一個(gè)結(jié)構(gòu)體內(nèi)部
該函數(shù)庫使用的是接收非空中斷+空閑中斷的方式收數(shù)據(jù)
頭文件

    #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"
    //緩沖區(qū)的大小
    #define RX_BUFF_SIZE 256
    //串口id定義,對(duì)外部的操作均使用該id操作
    typedef enum
    {
    UART_1,
    UART_2,
    UART_NUM
    }em_uart_id;
    //數(shù)據(jù)發(fā)送函數(shù)
    void bsp_uart_send_data(em_uart_id id,uint8_t *dat, uint32_t count);
    //初始化所有配置的串口
    void bsp_uart_it_init_all(void);
    //接收數(shù)據(jù)
    void bsp_uart_recv_data(em_uart_id id,uint8_t *dat, uint32_t *count);
    #endif

源文件文章來源地址http://www.zghlxwxcb.cn/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);
 	}
}

到了這里,關(guān)于【極海APM32F4xx Tiny】學(xué)習(xí)筆記07-串口使用框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【QT 自研上位機(jī) 與 STM32F4xx下位機(jī)聯(lián)調(diào)>>>can通信測(cè)試-基礎(chǔ)樣例-聯(lián)合文章】

    【QT 自研上位機(jī) 與 STM32F4xx下位機(jī)聯(lián)調(diào)>>>can通信測(cè)試-基礎(chǔ)樣例-聯(lián)合文章】

    之前做個(gè)qt的上位機(jī)軟件,現(xiàn)在有了qt下位機(jī)軟件,是使用STM32,有了這兩項(xiàng),相當(dāng)我們湊夠了步數(shù),可做做一期聯(lián)合文章,完全可以聯(lián)合調(diào)試,并且在寫can的下位機(jī)是,當(dāng)時(shí)就有了這個(gè)聯(lián)合文章想法。 實(shí)驗(yàn)環(huán)境還是挺重要的,因?yàn)橛袝r(shí)候,在你電腦上能運(yùn)行的東西,在別人的

    2024年02月05日
    瀏覽(27)
  • 極海APM32F035電機(jī)控制專用MCU

    極海APM32F035電機(jī)控制專用MCU

    ? ? ? ?去年11月份一次偶然的機(jī)會(huì),看到面包板論壇提供極海半導(dǎo)體針推出的低壓電機(jī)測(cè)試板,此電機(jī)控制板基于專用控制芯片APM32F035基礎(chǔ)上設(shè)計(jì)而成。APM32F035是一款基于Arm Cortex-M0+內(nèi)核,集成FOC算法中常用的數(shù)學(xué)運(yùn)算加速器(Cordic,Svpwm,硬件除法器等),并且集成了運(yùn)放

    2024年02月03日
    瀏覽(21)
  • STM32F4X USART串口使用

    STM32F4X USART串口使用

    串口是MCU與外部通信的重要通信接口,也是MCU在開發(fā)過程中的調(diào)試?yán)?。串口通信有幾個(gè)重要的參數(shù),分別是波特率、起始位、數(shù)據(jù)位、校驗(yàn)位。雙方在進(jìn)行串口通信前必須要約定好通信的參數(shù),否則會(huì)導(dǎo)致通信失敗。 起始位是自動(dòng)產(chǎn)生,無需配置,通常是產(chǎn)生一個(gè)低電平為

    2024年02月11日
    瀏覽(28)
  • STM32F4 基于USART串口的藍(lán)牙通信

    STM32F4 基于USART串口的藍(lán)牙通信

    目錄 一、硬件資源 連接方案 其他配置 二、實(shí)驗(yàn)原理 基本定義 USART介紹 USART工作原理 數(shù)據(jù)發(fā)送 數(shù)據(jù)接收 藍(lán)牙HM-10配置 三、代碼部分 usart.c usart.h Serial.c Serial.h main.c 結(jié)語 STM32F401,OLED,藍(lán)牙hm10 連接方案 設(shè)備1的TX與設(shè)備2的RX連接,這樣設(shè)備1發(fā)送的數(shù)據(jù)可以被設(shè)備2接收到。

    2024年01月17日
    瀏覽(52)
  • 調(diào)試STM32F4 USB3300 USB_HS虛擬串口

    調(diào)試STM32F4 USB3300 USB_HS虛擬串口

    參考了csdn上面的幾篇文章,經(jīng)歷了一個(gè)多小時(shí)的調(diào)試排除找bug,終于成功了! 通過STM32cubeMx配置USB phy芯片 1. 2. 3. 4. 5.生成代碼出來,打開工程,編譯下載通過。 在上電之前,電腦得先安裝ST的USB 虛擬串口驅(qū)動(dòng) 點(diǎn)擊前往下載--STSW-STM32102 - STM32虛擬COM端口驅(qū)動(dòng)程序 - STMicroelect

    2024年02月02日
    瀏覽(23)
  • 【STM32】STM32F4中USB的CDC虛擬串口(VCP)使用方法

    【STM32】STM32F4中USB的CDC虛擬串口(VCP)使用方法

    最近在學(xué)習(xí)STM32的USB功能,主要是想要使用虛擬串口(VCP)功能,來解決串口傳輸速率較低的問題,達(dá)到于上位機(jī)高效通信的目的。 使用芯片:STM32F407ZGT6 使用函數(shù):HAL庫 使用工具:STM32CubeMX + Keil uVision5 串口工具:VOFA 主要配置內(nèi)容: 調(diào)試模式為Serial; 使用外部時(shí)鐘 設(shè)置為

    2024年02月21日
    瀏覽(78)
  • 串口通信(stm32F4)——通過串口助手發(fā)送led on或者led off控制LED燈的亮滅

    串口通信(stm32F4)——通過串口助手發(fā)送led on或者led off控制LED燈的亮滅

    通過串口助手發(fā)送led on來點(diǎn)亮LED燈,發(fā)送led off來關(guān)閉LED燈(這里是LED1,其端口是GPIOF,引腳是PIN10,串口是USART1,其端口是GPIOA,引腳是PIN9、PIN10,一個(gè)用來收數(shù)據(jù),一個(gè)用來發(fā)收據(jù)) 初始化LED; 初始化串口; 編寫接收數(shù)據(jù)中斷函數(shù); 編寫空閑中斷函數(shù)。 2.1 初始化LED 2.2 初

    2024年02月16日
    瀏覽(21)
  • 正點(diǎn)原子stm32F407學(xué)習(xí)筆記5——串口通信實(shí)驗(yàn)

    正點(diǎn)原子stm32F407學(xué)習(xí)筆記5——串口通信實(shí)驗(yàn)

    上位機(jī)給開發(fā)板發(fā)送數(shù)據(jù),開發(fā)板將收到的數(shù)據(jù)發(fā)回給上位機(jī) 串口設(shè)置的一般步驟可以總結(jié)為如下幾個(gè)步驟: 串口時(shí)鐘使能,GPIO 時(shí)鐘使能。 設(shè)置引腳復(fù)用器映射:調(diào)用 GPIO_PinAFConfig 函數(shù)。 GPIO 初始化設(shè)置:要設(shè)置模式為復(fù)用功能。 串口參數(shù)初始化:設(shè)置波特率,字長,奇

    2024年02月06日
    瀏覽(28)
  • GD32F4單片機(jī)實(shí)現(xiàn)接收超時(shí)中斷+DMA實(shí)現(xiàn)串口的不定長接收和DMA發(fā)送

    GD32F4單片機(jī)實(shí)現(xiàn)接收超時(shí)中斷+DMA實(shí)現(xiàn)串口的不定長接收和DMA發(fā)送

    環(huán)形緩沖區(qū)+定時(shí)器超時(shí)中斷的方式 優(yōu)點(diǎn) 環(huán)形緩沖區(qū)可以接收多幀數(shù)據(jù) 數(shù)據(jù)幀超時(shí)間隔可以設(shè)置 缺點(diǎn) 設(shè)備任務(wù)比較繁重時(shí),使用中斷接收可能會(huì)丟失數(shù)據(jù)。尤其是在長時(shí)間關(guān)閉中斷或者串口中斷優(yōu)先級(jí)不高時(shí) 頻繁進(jìn)出中斷。在使用RTOS的系統(tǒng)中,每收到一個(gè)數(shù)據(jù)就會(huì)進(jìn)行一

    2024年02月15日
    瀏覽(27)
  • APM32F072單片機(jī)進(jìn)入STOP模式,并通過RTC Wakeup Timer和USART1串口接收事件喚醒

    串口初始化(注意USART1時(shí)鐘源要選擇HSI): 使用power_init函數(shù)初始化RTC,然后調(diào)用power_enter_stop_mode(n)函數(shù)進(jìn)入STOP模式,n秒后自動(dòng)喚醒,或由USART1接收喚醒:

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包