32單片機串口數據接收、空閑IDLE中斷詳解

一、前提說明

????????一開始寫單片機程序的時候不太清楚空閑中斷這個東西,每次用串口接收數據,都要再開一個定時器,在定時器內進行倒計時,每次接收數據就重置計時時間,計時結束就觸發中斷,再判斷所有接收的數據,當然這種方法也并不過時,因為不是所有單片機都有空閑中斷這個東西的,空閑中斷實際是為開發者串口接收數據提供了部分便利而已,無論是用定時器還是空閑中斷原理實際都是一樣的。另外我們要知道很多32單片機都是使用的Arm核心,而外設部分是單片機廠商自己設計的,所以各家的設計思想和實現方式也各有不同,切勿以固定思維去判斷。

????????這里我只對比兩款常用單片機的空閑中斷,只是為了說明不同品牌實現空閑中斷的方式也不同,但作用都是差不多的。

1、GD32單片機

設計思想:只在接收完一組數據之后觸發一次空閑

用法1:

? ? ? ? 初始化直接打開接收中斷和空閑中斷,在一組串口數據接收完成就會觸發一次空閑中斷,然后在空閑中斷內對數據進行處理,特別注意不但要清標志位還要再額外讀一下數據寄存器。

用法2:

? ? ? ? 初始化關閉空閑中斷,打開接收中斷,在串口接收中斷內開啟空閑中斷,在空閑中斷內關閉空閑中斷,這樣就可以保證不會一直進入空閑中斷,然后在空閑中斷內對數據進行處理。

2、STM32單片機

設計思想:只在接收完一組數據之后觸發一次空閑

用法1:

? ? ? ? 初始化直接打開接收中斷和空閑中斷,在一組串口數據接收完成就會觸發一次空閑中斷,然后在空閑中斷內對數據進行處理,特別注意不但要清標志位還要再額外讀一下數據寄存器。

注意:gd32單片機的方法二并不適用與stm32

3、其他單片機

另外還有一些單片機品牌連空閑中斷都沒有設計的,完全不考慮開發者的感受,這里抨擊一下,我就不點名了。

二、示例代碼

1、GD32

//串口初始化
void DW_PortCfg(void)
{rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_AF);gpio_init(DW_MODULE_PORT,DW_URXD_MODE,GPIO_OSPEED_50MHZ,DW_URXD_PIN);gpio_init(DW_MODULE_PORT,DW_UTXD_MODE,GPIO_OSPEED_50MHZ,DW_UTXD_PIN);rcu_periph_clock_enable(DW_UART_RCU);usart_deinit(DW_UART);usart_baudrate_set(DW_UART,DW_BUAD_RATE);usart_stop_bit_set(DW_UART,USART_STB_1BIT);usart_word_length_set(DW_UART,USART_WL_8BIT);usart_parity_config(DW_UART,USART_PM_NONE);usart_hardware_flow_rts_config(DW_UART, USART_RTS_DISABLE);usart_hardware_flow_cts_config(DW_UART, USART_CTS_DISABLE);usart_receive_config(DW_UART, USART_RECEIVE_ENABLE);usart_transmit_config(DW_UART, USART_TRANSMIT_ENABLE);usart_enable(DW_UART);usart_interrupt_enable(DW_UART,USART_INT_RBNE);nvic_irq_enable(DW_UART_IRQn,0,1);
}
//中斷服務函數
void USART2_IRQHandler(void){if(usart_interrupt_flag_get(DW_UART,USART_INT_FLAG_RBNE)==SET){dwRecvChar(usart_data_receive(DW_UART));usart_interrupt_flag_clear(DW_UART,USART_INT_FLAG_RBNE);usart_interrupt_enable(DW_UART,USART_INT_IDLE);}else if(usart_interrupt_flag_get(DW_UART,USART_INT_FLAG_IDLE)){dwRecvFinish();usart_interrupt_flag_clear(DW_UART,USART_INT_FLAG_IDLE);usart_interrupt_disable(DW_UART,USART_INT_IDLE);}
}

2、STM32

void uart_init(u32 bound){//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA時鐘//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器//USART 初始化設置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//開啟空閑中斷USART_Cmd(USART1, ENABLE);
}void USART1_IRQHandler(void)                	//串口1中斷服務程序
{uint16_t data;  if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)  { USART2_RX_BUF[length++] = USART2->DR & 0x0FF;    //接收數據}if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)  { data = USART1->SR;  //清空空閑中斷標志位操作data = USART1->DR;  }  
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63975.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入探討 Go 中的高級表單驗證與翻譯:Gin 與 Validator 的實踐之道20241223

深入探討 Go 中的高級表單驗證與翻譯:Gin 與 Validator 的實踐之道 在現代后端開發中,表單驗證是保證數據完整性和服務穩定性的核心環節。如何優雅、高效地實現表單驗證,同時提供人性化的錯誤提示,是每位開發者的必修課。在本文中…

掌握 Ansys ACP 中的參考方向:簡化復雜的復合材料設計

概括 在復合材料分析領域,精度至關重要,尤其是在定義纖維方向和鋪層時。Ansys ACP(Ansys Composite PrepPost)提供了強大的工具來建立參考方向,這是實現精確結構模擬的關鍵步驟。在本博客中,我們將揭開在 …

Vue2學習(一)——Vue簡介、Vue指令與指令修飾符

一、Vue簡介 Vue是一套用于構建用戶界面的漸進式框架。 所謂漸進式就是循序漸進,不一定非得把Vue中的所有API都學完才能開發Vue,可以學一點開發一點。 Vue2官網地址:https://v2.cn.vuejs.org/ Vue3官網地址:https://cn.vuejs…

Redis--通用命令學習

目錄 一、引言 二、基礎命令 1.set 2.get 3.keys 3.1 keys ? 3.2 keys * 3.3 keys [abe] 3.4 keys [^] 3.5 keys [a-b] 4.exists 5.delete 6.expire 7.ttl 8.type 三、Redis中的過期策略(面試題) 1.惰性刪除 2.定期刪除 …

Linux程序設計(第四版)| 學習筆記

上次學習Linux相關內容還是上學的時候為了應付考試,最近有項目涉及Linux,重新學習以下。 很多年前關于Linux的總結 一、入門 1.概念 (1) UNIX 1)定義:指的是一種遵循特定規范的計算機操作系統。 2)特點:簡單性、集中性、可重用…

PostgreSQL 的歷史

title: PostgreSQL 的歷史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能強大且廣泛使用的開源關系型數據庫管理系統。其歷史可以追溯到1986年,當時由加州大學伯克利分校的一個研究團隊開發。文章將深入探討 PostgreSQL 的起源、…

Ubuntu22.04 LTS 安裝nvidia顯卡驅動

準備跑老師給定的Github上的多模態源碼,但是用了這么久ubuntu還沒有嘗試過安裝nvidia驅動,好在也是一次成功,于是記錄下來。 借鑒的是Ubuntu22.04安裝顯卡驅動(高速、避錯版)-CSDN博客這篇文章,按照流程來基本沒有問題,不過個人覺得有些步驟比較冗余,所以記錄下來 主要…

WPS工具欄灰色怎么辦

WPS離線不登錄,開啟工具欄等相關功能 當你在使用WPS的過程中,若因網絡問題或其他特殊原因,導致無法登錄使用WPS時,可根據以下步驟開啟離線兼容模式,開啟此模式后,可在未登錄的狀態下,激活并使用…

國標GB28181-2022平臺EasyGBS:安防監控中P2P的穿透方法

在安防監控領域,P2P技術因其去中心化的特性而受到關注,尤其是在遠程視頻監控和數據傳輸方面。P2P技術允許設備之間直接通信,無需通過中央服務器,這在提高效率和降低成本方面具有明顯優勢。然而,P2P技術在實際應用中也面…

Mac Android studio 升級LadyBug 版本,所產生的bug

當Build 出現,這樣的文字以后: Your build is currently configured to use incompatible Java 21.0.3 and Gradle 7.3.3. Cannot sync the project. We recommend upgrading to Gradle version 8.9. The minimum compatible Gradle version is 8.5. …

com.google.common.collect.ImmutableList$SerializedForm

今天AndroidStudio安裝了個2021版本的,gradle用了7.3.3,創建項目后控制臺總是有這樣一個錯誤: Unable to load class com.google.common.collect.ImmutableList$SerializedForm. This is an unexpected error. Please file a bug containing…

Docker部署Sentinel

一、簡介 是什么:面向分布式、多語言異構化服務架構的流量治理組件 能干嘛:從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性 官網地址:https://sentinelguard.io/zh-c…

HTMLCSSJavaScriptDOM 之間的關系?

一、HTML 中文名:超文本標記語言 英文名:HyperText Markup Language HTML是一種用來結構化Web網頁及其內容的標記語言。 HTML 由一系列的元素組成,這些元素可以用來包圍不同部分的內容,使其以某種方式呈現或者工作。 圖Ⅰ 每…

Hadoop集群(HDFS集群、YARN集群、MapReduce?計算框架)

一、 簡介 Hadoop主要在分布式環境下集群機器,獲取海量數據的處理能力,實現分布式集群下的大數據存儲和計算。 其中三大核心組件: HDFS存儲分布式文件存儲、YARN分布式資源管理、MapReduce分布式計算。 二、工作原理 2.1 HDFS集群 Web訪問地址&…

位運算符、標記位傳參

位運算符: 位運算符作用于操作數的位(bit)。 按位與(&)對應位都為1時結果為1 int a 5; // 0101 int b 3; // 0011 int result a & b; // 0001 按位或(|)對應位至少有一個為1時結…

施耐德變頻器ATV320系列技術優勢:創新與安全并重

在工業自動化領域,追求高效、安全與智能已成為不可阻擋的趨勢。施耐德變頻器ATV320系列憑借其強大的設計標準和全球認證,成為能夠幫助企業降低安裝成本,提高設備性能的創新解決方案。 【全球認證,品質保障】ATV320 系列秉持施耐德…

項目練習:element-ui的valid表單驗證功能用法

文章目錄 一、情景說明二、代碼實現 一、情景說明 一般表單提交的時候,都要對表單數據進行前段驗證。 比如登陸表單提交。 二、代碼實現 package.json "element-ui": "2.15.14",main.js 引用ElementUI import ElementUI from element-ui; i…

【es6復習筆記】Symbol 類型及其應用(9)

一、Symbol 簡介 Symbol 是 JavaScript 中的一種基本數據類型,它表示唯一的標識符。Symbol 的主要目的是防止屬性名沖突,尤其是在多個代碼庫或模塊中共享對象時。Symbol 值可以用作對象的屬性名,這樣可以確保屬性名是唯一的,不會…

Linux挖礦程序排查

一、背景 我們收到一個阿里云安全告警,內容是服務器可能存在挖礦程序。 二、殺死挖礦程序 2.1 找到可疑服務器進程 #1.輸入top命令,輸入shift P會按照cpu的使用率大小從大到小進行排序,cpu使用率高的就是可疑進程。 top #2.查看運行該進程…

zabbix監控山石系列Hillstone配置模版(適用于zabbix6及以上)

監控項: 觸發器: 監控數據: