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

STM32實(shí)戰(zhàn)(三):利用空閑中斷從串口接收任意長數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了STM32實(shí)戰(zhàn)(三):利用空閑中斷從串口接收任意長數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

“ 想起密碼了,終于想起密碼了(′?ω?`) ”

這次我們利用STM32F103的UART內(nèi)部的空閑中斷來實(shí)現(xiàn)對(duì)串口任意長數(shù)據(jù)的接收,通過簡(jiǎn)潔的手段解決了接收端在事前無法得知數(shù)據(jù)長度的問題。本次教程我們需要一塊STM32核心板與一個(gè)USB轉(zhuǎn)TTL工具。

一、原理介紹

STM32的異步串口接收寄存器可以存放1個(gè)字節(jié),當(dāng)我們開啟接收中斷(RXNEIE)時(shí),當(dāng)串口外設(shè)接收到一個(gè)字節(jié)的數(shù)據(jù)時(shí) 數(shù)據(jù)接收(RXNE)標(biāo)志位置1,同時(shí)觸發(fā)串口中斷,此時(shí)我們可以把接收寄存器RDR中的數(shù)據(jù)轉(zhuǎn)移至我們自定的緩存區(qū)中。

此種方式我們只能一個(gè)字節(jié)一個(gè)字節(jié)的接收數(shù)據(jù),如果我們事先不知道需要接收的數(shù)據(jù)長度或未規(guī)定幀尾內(nèi)容,我們便無法判斷數(shù)據(jù)是否已經(jīng)接收完畢。這時(shí)我們可以采用總線空閑標(biāo)志(IDLE),使能空閑中斷(IDLEIE)當(dāng)檢測(cè)到線路空閑時(shí)會(huì)觸發(fā)串口中斷,我們便知道一幀數(shù)據(jù)接收完成,可以送往上層應(yīng)用中進(jìn)行處理了。

二、代碼編寫

這里我們使用串口1,波特率初始化為115200,因?yàn)閟tm32f1的hal庫似乎實(shí)現(xiàn)不完全,沒有總線空閑相關(guān)的函數(shù),我們這里自己實(shí)現(xiàn)下。如果使用的是stm32f4及以上可以使用函數(shù):

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

1、IO及UART初始化,并使能空閑中斷:

// UART.c

int UARTInit(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* IO初始化 */
	__HAL_RCC_GPIOA_CLK_ENABLE();
    
	GPIO_InitStruct.Pin = GPIO_PIN_9;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
	GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    /* UART1初始化 */
    __HAL_RCC_USART1_CLK_ENABLE();
    
    UARTDev1.UART_Handle.Instance = USART1;
    UARTDev1.UART_Handle.Init.BaudRate = 115200;
    UARTDev1.UART_Handle.Init.Parity = UART_PARITY_NONE;
    UARTDev1.UART_Handle.Init.WordLength = UART_WORDLENGTH_8B;
    UARTDev1.UART_Handle.Init.StopBits = UART_STOPBITS_1;
    UARTDev1.UART_Handle.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&UARTDev1.UART_Handle);

    /* UART1中斷初始化 */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
    
    
    /* UART1啟動(dòng)接收 */
    HAL_UART_Receive_IT(&UARTDev1.UART_Handle, UARTDev1.RxBuffer, UART_RX_BUFFSIZE);
    
    /** UART1開啟空閑中斷 **/
    __HAL_UART_ENABLE_IT(&UARTDev1.UART_Handle, UART_IT_IDLE);
    
    return 0;
}

2、中斷處理函數(shù),這里接收完一幀數(shù)據(jù)后會(huì)原樣發(fā)出去:

// UART.c
void USART1_IRQHandler(void)
{
    UARTDef *huart = &UARTDev1;
    
	HAL_UART_IRQHandler(&huart->UART_Handle);
    /* F1的HAL庫中未實(shí)現(xiàn)IDLE相關(guān)功能,固自行實(shí)現(xiàn) */
    if(__HAL_UART_GET_FLAG(&huart->UART_Handle, UART_FLAG_IDLE))
    {   /* 接收到完整一幀數(shù)據(jù) */
        UARTSendData(huart, UARTDev1.RxBuffer, UART_RX_BUFFSIZE - UARTDev1.UART_Handle.RxXferCount);
        
        /* 重新啟動(dòng)接收 */
        HAL_UART_AbortReceive_IT(&UARTDev1.UART_Handle);
        HAL_UART_Receive_IT(&UARTDev1.UART_Handle, UARTDev1.RxBuffer, UART_RX_BUFFSIZE);
        /* 清空閑中斷 */
        __HAL_UART_CLEAR_IDLEFLAG(&huart->UART_Handle);
    }
}

3、主函數(shù)里別忘了添加初始化函數(shù),因?yàn)樗刑幚矶荚谥袛嘀型瓿闪?,這里主循環(huán)里就放了個(gè)led閃爍的代碼:

int main()
{
	HAL_Init();
    SystemClockInit();
    GPIOInit();
    UARTInit();
    
	while(1)
	{
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
        HAL_Delay(500);
	}
}

三、效果演示

我們當(dāng)前實(shí)現(xiàn)了從串口1接收了一幀數(shù)據(jù)后原樣返回的功能,我們拿出USB轉(zhuǎn)TTL模塊,把RXD、TXD分別與板子的PA9、PA10連接,打開串口調(diào)試助手,設(shè)置好對(duì)應(yīng)波特率,發(fā)送一條信息可以看到我們收到了相同的字符。

stm32中斷接收,stm32,單片機(jī),嵌入式硬件

完整代碼可以從文章最后方下載,不同文章的代碼在不同branch。下次我們討論下SPI的使用。

https://github.com/ss302810694/STM32F103RCT6-Example文章來源地址http://www.zghlxwxcb.cn/news/detail-646735.html

END

到了這里,關(guān)于STM32實(shí)戰(zhàn)(三):利用空閑中斷從串口接收任意長數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(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)文章

  • STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    STM32 cubemx配置DMA+空閑中斷接收不定長數(shù)據(jù)

    本篇文章給大家講解一下DMA+串口空閑中斷接收串口不定長數(shù)據(jù),之前我們也是講解過串口接收不定長數(shù)據(jù)的,那么本篇文章的話將使用DMA來接收不定長數(shù)據(jù)。 串口空閑中斷是指在串口接收到數(shù)據(jù)后,在數(shù)據(jù)的傳輸結(jié)束之后,在一段連續(xù)的空閑時(shí)間內(nèi)沒有接收到新數(shù)據(jù)時(shí)觸發(fā)

    2024年02月19日
    瀏覽(27)
  • STM32 F4串口空閑中斷 + DMA實(shí)現(xiàn)數(shù)據(jù)發(fā)送

    最近在做 STM32 + ROS車的項(xiàng)目,STM32與ROS之間通信由于數(shù)據(jù)量大,所以在 STM32端 使用 空閑中斷 + DMA 的方案來減輕 CPU 的壓力。 一、空閑中斷 空閑中斷 顧名思義為空了,閑了,沒事了進(jìn)的中斷,在 沒有數(shù)據(jù)流 的時(shí)候會(huì)進(jìn)入進(jìn)行讀取。 在我們串口進(jìn)行發(fā)送時(shí)實(shí)則為連續(xù)發(fā)送,兩

    2024年02月16日
    瀏覽(27)
  • 關(guān)于STM32用DMA傳輸U(kuò)ART空閑中斷中接收的數(shù)據(jù)時(shí)無法接收數(shù)據(jù)問題以及解決辦法

    關(guān)于STM32用DMA傳輸U(kuò)ART空閑中斷中接收的數(shù)據(jù)時(shí)無法接收數(shù)據(jù)問題以及解決辦法

    ???????? 串口1相關(guān)的設(shè)置及printf函數(shù)的使用,這里沒放,建議先實(shí)現(xiàn)串口打印功能 可以參考:使用STM32 CUBE IDE配置STM32F7 用DMA傳輸多通道ADC數(shù)據(jù)_stm32cubeide 配置adc_一只小白啊的博客-CSDN博客 ????????普通模式和循環(huán)模式的區(qū)別在于,普通模式下,DMA只會(huì)接收一次數(shù)據(jù),

    2024年02月05日
    瀏覽(19)
  • STM32使用DMA傳輸U(kuò)ART空閑中斷中接收的數(shù)據(jù)遇到的問題以及解決方法

    STM32使用DMA傳輸U(kuò)ART空閑中斷中接收的數(shù)據(jù)遇到的問題以及解決方法

    STM32使用DMA傳輸U(kuò)ART空閑中斷中接收的數(shù)據(jù)遇到的問題以及解決方法 CubeMX配置 串口配置:使用默認(rèn)配置(傳輸數(shù)據(jù)長度為8 Bit,奇偶檢驗(yàn)無,停止位為1 Bit, 接收和發(fā)送都使能),因?yàn)槲业氖荓IN項(xiàng)目所以使用的時(shí)串口的LIN模式,一般就是異步通信 打開DMA傳輸 打開串口接收中斷

    2024年02月05日
    瀏覽(25)
  • 環(huán)形隊(duì)列+DMA空閑中斷+接收串口數(shù)據(jù)

    本次實(shí)驗(yàn)利用環(huán)形隊(duì)列+DMA空閑中斷+串口。。通過這個(gè)實(shí)驗(yàn)可以非常深入的理解隊(duì)列,DMA,串口的知識(shí)。如果你能自己實(shí)現(xiàn)掌握這個(gè)實(shí)驗(yàn),那么你應(yīng)該基本掌握了隊(duì)列,DMA,串口的知識(shí)。 本次使用的是用環(huán)形隊(duì)列當(dāng)緩沖器區(qū)接收串口數(shù)據(jù)。我們可以先區(qū)了解DMA的空閑中斷。本次

    2024年02月13日
    瀏覽(22)
  • stm32串口空閑中斷+DMA傳輸接受不定長數(shù)據(jù)+letter?shell?實(shí)現(xiàn)命令行

    空閑中斷(IDLE),俗稱幀中斷,即第一幀數(shù)據(jù)接收完畢到第二幀數(shù)據(jù)開始接收期間存在一個(gè)空閑狀態(tài)(每接收一幀數(shù)據(jù)后空閑標(biāo)志位置1),檢測(cè)到此空閑狀態(tài)后即執(zhí)行中斷程序。 空閑中斷的優(yōu)點(diǎn)在于省去了幀頭幀尾的檢測(cè) ,進(jìn)入中斷程序即意味著已經(jīng)接收到一組完整數(shù)據(jù),僅需

    2024年02月03日
    瀏覽(26)
  • STM32 串口 DMA 接收任意長度數(shù)據(jù)

    STM32 串口 DMA 接收任意長度數(shù)據(jù)

    DMA 傳輸完成會(huì)產(chǎn)生中斷告知 CPU,這對(duì)于固定長度的數(shù)據(jù)是沒什么問題的。但是對(duì)于不定長的數(shù)據(jù)就不行了,DMA 一定要接收到足夠多(設(shè)定的長度)的數(shù)據(jù)時(shí)才產(chǎn)生完成中斷,如果接收到的數(shù)據(jù)量小于設(shè)定的長度,這個(gè)時(shí)候 CPU 就無法通過中斷方式取處理這點(diǎn)數(shù)據(jù)了。那 CPU

    2024年02月11日
    瀏覽(45)
  • STM32基于HAL庫的串口接受中斷和空閑中斷

    在通信方面。UART由于全雙工通信,可以同時(shí)接受數(shù)據(jù)和發(fā)送數(shù)據(jù)而被廣泛使用。 而接受數(shù)據(jù)則又有很多種方法 比如: 1根據(jù)結(jié)束符判斷,數(shù)據(jù)是字符串形式,所以一般串口接受的接受符就是 \\\"rn\\\"? 換成16進(jìn)制ascil碼顯示就是 0X0D? ?0X0A (對(duì)應(yīng)rn) ?2定時(shí)器中斷,設(shè)計(jì)\\\"喂狗信號(hào)量

    2023年04月08日
    瀏覽(22)
  • STM32 HAL庫 串口中斷接收數(shù)據(jù)包

    STM32 HAL庫 串口中斷接收數(shù)據(jù)包

    目錄 一、CUBEmx配置 1.設(shè)置系統(tǒng)時(shí)鐘,配置SYS,配置時(shí)鐘樹 ??編輯 ?2.配置串口USART1 3.配置NVIC,開啟串口中斷 ?編輯4.點(diǎn)擊GENERATE CODE輸出文件即可 二、代碼部分 0.串口重定向——printf 1.關(guān)于舵機(jī) 2.開啟串口中斷函數(shù) 3.編寫串口回調(diào)函數(shù) 4.主函數(shù)部分 三、實(shí)驗(yàn)現(xiàn)象: 四、總

    2024年02月04日
    瀏覽(23)
  • 【STM32】-串口開發(fā)經(jīng)驗(yàn)分享-基于RTOS+空閑中斷

    【STM32】-串口開發(fā)經(jīng)驗(yàn)分享-基于RTOS+空閑中斷

    目錄 1. 概述? ?? 2.串口介紹 2.1 原理框圖 2.2 RS-232C 2.3 RS-422 2.4 RS-485 2.5 UART 3. STM32 USART介紹 4. CubeMx生成Uart初始化代碼 4.1 NewProject選擇單片機(jī)型號(hào) 4.2 設(shè)置rcc時(shí)鐘 ?4.3 設(shè)置Usart 4.4 初始化代碼 4.5 注意 5 工程源碼解析 5.1 程序架構(gòu) 5.2 源碼 fml_ring_buffer.c fml_usart.c app_usart_task.c stm3

    2023年04月16日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包