中斷方式的數據接收

中斷接收簡介

回顧之前的代碼在這里插入圖片描述
之前的代碼是 等待標志位RXNE位為1才有數據 進而讀取數據存放在變量c中 再根據c變量的數據是為0還是為1進而編寫燈亮滅的代碼 if語句
但這樣的代碼明顯不符合裸機多任務的編程模型 因為在while中為進程 進程執行的時間不能大于5ms 但是while(RXNE==0)這條語句的執行時間是由發送數據的一方決定的 當發送方1s后發送數據 這條語句就執行1s 完全超出了裸機多任務模型的時間
右邊的代碼則是使用了中斷 數據通過RX引腳進入 當狀態寄存器SR 的RXNE標志位由0變為1就通過USART1觸發一次中斷 傳遞到NVIC進而執行中斷函數

配置中斷源

產生電平型的中斷源
在這里插入圖片描述
USART產生的是電平型的中斷 當標志位由0變為1就產生中斷 在SR狀態寄存器中 每一個標志位都可以觸發中斷 都可以觸發7個電平型的中斷源
中斷共用
在這里插入圖片描述
這七個標志位共用一個中斷源(節省中斷源) 在stm32中NVIC是管理中斷源的 當這七個標志位當中只要有一個為1通過這個或門就會觸發中斷源 傳遞到NVIC中 那如果產生了中斷 那到底是那個標志位為1觸發了中斷呢? 我們去查詢sr寄存器即可 if 語句判斷到底是那個標志位觸發了中斷 (可能是一個 也可能是多個)
中斷屏蔽
在這里插入圖片描述
中斷傳輸到NVIC過程中有一個開關 閉合就能通過中斷 打開就屏蔽了中斷信號 那我們如何實現屏蔽一個標志位產生的中斷呢? 就是左下角的結構 將中斷標志位和中斷使能位通過一個與門相互連接 當中斷使能位為0不管中斷標志位為1還是為0都無法通過或門觸發中斷源 當中斷使能位為1就等于閉合了開關 中斷標志位即可正常工作 注意中斷標志位FE NE ORE都是共用了一個中斷使能位eie 當中斷使能位eie為0就屏蔽了這三個中斷標志位的中斷觸發請求 其他的中斷標志位都是各自有一個獨立的中斷使能位
編程接口
在這里插入圖片描述
第一個編程接口(函數)就是通過配置藍色的中斷使能寄存器來屏蔽 使能中斷的 第二個接口就是查詢狀態寄存器的標志位 第三個接口是清除標志位 當觸發了中斷 如PE標志位觸發了中斷就為1 然后需要調用這個函數來手動清零
USART_ITConfig
在這里插入圖片描述
USART_GetITStatus
在這里插入圖片描述
USART_ClearITPendingBit在這里插入圖片描述

中斷接收數據的編程思路

數據處理能夠瞬間完成
在這里插入圖片描述
套用裸機多任務的模型 就是初始化 然后進程函數 再到中斷服務函數 但是中斷函數中處理數據的速度要大于數據接收的速度(不然等到下一個數據發送過來還在處理上一個數據會造成數據的丟失和出錯) 那小于10us就看作瞬間完成 那么這里對數據的處理就是判斷if語句還有向對應的gpio模塊的ODR寄存器寫入對應的0或1 遠遠小于10us 視為瞬間完成 符合裸機多任務模型的時間需求
在這里插入圖片描述
如第一幅圖 處理數據的時間遠遠小于數據傳來的時間(箭頭代表數據傳輸進來) 在兩個數據傳輸中數據已經處理完成
第二幅圖當箭頭傳入 (數據傳入) 當第一個箭頭(第一個數據)傳入開始處理數據 第二個箭頭(代表第二個數據傳入)傳入后還在處理第一個數據接著第三個數據傳入 導致了第二個數據的重載 (丟失了第二個數據) 導致數據傳輸的錯誤
但是數據處理的時間確實太長了怎么辦?
在這里插入圖片描述
那我們就不在中斷服務函數中處理 就把數據傳到緩存區在傳入進程函數中延時處理

改進串口編程實驗

因為 這次數據處理的時間很短就只是個點燈 所以可以放在中斷服務函數中執行

usart初始化

在這里插入圖片描述
編寫中斷響應函數
在這里插入圖片描述
清除中斷的操作可以為第二步和第三步 因為標志位RXNE為1表示有數據接收
當讀取了數據RXNE標志位就會由1變為0 所以第三步讀取數據也相當于清除了中斷

#include "stm32f10x.h"
#include "stm32f10x_pal.h"static  void USART_Recv_Init(void);int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC的中斷優先級分組PAL_Init();USART_Recv_Init();while(1){}
}static  void USART_Recv_Init(void)
{//1.初始化IO引腳//PB6 Tx PB7  Rx (經過了AFIO映射映射到了PB6和PB7引腳)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIOB的時鐘//初始化PB6GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_6;GPIOInitStruct.GPIO_Mode =  GPIO_Mode_AF_PP;//PIN6為復用推挽模式GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIOInitStruct);//初始化PB7GPIOInitStruct.GPIO_Pin = GPIO_Pin_7;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOB,&GPIOInitStruct);//初始化PC13RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//開啟GPIOC的時鐘GPIOInitStruct.GPIO_Pin = GPIO_Pin_13 ;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC,&GPIOInitStruct);//復用功能重映射RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_USART1 ,ENABLE);//使能USART1的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART的參數//9600 8為數據有效位 無奇偶校驗 1停止位為1位  Tx|RxUSART_InitTypeDef USART1InitStruct;USART1InitStruct.USART_BaudRate = 9600;USART1InitStruct.USART_WordLength = USART_WordLength_8b ;USART1InitStruct.USART_StopBits = USART_StopBits_1;USART1InitStruct.USART_Parity = USART_Parity_No;USART1InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;USART1InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;//硬件流控USART_Init(USART1,&USART1InitStruct);//配置中斷源USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//標志位RXNE的使能//NVIC的參數設置NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = USART1_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;//搶占優先級NVICInitStruct.NVIC_IRQChannelSubPriority =0;//子優先級NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);//閉合總開關USART_Cmd(USART1,ENABLE);
}void USART1_IRQHandler(void)
{uint8_t c;if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET){c = USART_ReceiveData(USART1); //清除了中斷也讀取了數據if(c == '0'){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}if(c == '1'){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}}}

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

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

相關文章

Qt/QML編程學習之心得:一個Qt工程的學習筆記(九)

1、.pro文件 加CONFIG += c++11,才可以使用Lamda表達式(一般用于connect的內嵌槽函數) 2、QWidget 這是Qt新增加的一個類,基類,窗口類,QMainWindow和QDialog都繼承與它。 3、Main函數 QApplication a應用程序對象,有且僅有一個 a.exec() 進行消息循環、阻塞 MyWi…

《圖解Java數據結構與算法:微課視頻版》簡介

本書系統、全面地介紹數據結構的基礎理論與算法設計,精選數據結構考研習題和各類典型例題進行講解,案例和課后習題豐富,突出對數據結構算法實踐能力的培養。本書算法均采用Java語言實現,示例代碼可直接上機運行。 本書配套資源豐…

Spring-jdbcTemplate-配置數據庫連接池,配置文件方式beans.xml

1、jdbc.properties jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql:///studb jdbc.userroot jdbc.pwd123456 2、beans.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&…

Python BDD 框架比較之 pytest-bdd vs behave

pytest-bdd和behave是 Python 的兩個流行的 BDD 測試框架&#xff0c;兩者都可以用來編寫用戶故事和可執行的測試用例&#xff0c; 具體選擇哪一個則需要根據實際的項目狀況來看。 先簡單看一下兩者的功能&#xff1a; pytest-bdd 基于pytest測試框架&#xff0c;可以與pytest…

港口大型設備狀態監測及預測性維護策略

在現代港口運營中&#xff0c;大型設備的正常運行對于保障港口作業的高效性至關重要。為了實現設備的可靠性和持續性&#xff0c;港口管理者需要采取一系列狀態監測和預測性維護策略。 推進自動化和智能化是提高港口大型設備狀態監測和維護管理效率的重要途徑。通過應用先進的…

【計算機網絡筆記】數據鏈路層概述

系列文章目錄 什么是計算機網絡&#xff1f; 什么是網絡協議&#xff1f; 計算機網絡的結構 數據交換之電路交換 數據交換之報文交換和分組交換 分組交換 vs 電路交換 計算機網絡性能&#xff08;1&#xff09;——速率、帶寬、延遲 計算機網絡性能&#xff08;2&#xff09;…

讀像火箭科學家一樣思考筆記07_探月思維

1. 挑戰“不可能”的科學與企業 1.1. 互聯網 1.1.1. 和電網一樣具有革命性&#xff0c;一旦你插上電源&#xff0c;就能讓自己的生活充滿活力 1.1.2. 互聯網的接入可以幫助人們擺脫貧困&#xff0c;拯救生命 1.1.3. 互聯網還可以提供與天氣相關的信息 1.2. 用廉價、可靠的…

Windows如何截取屏幕圖片以及動態圖

在制作PPT或是其他演示文稿或是說明文檔的時候&#xff0c; 常常需要截取網頁或是屏幕的截圖&#xff0c;在Windows中有多種方式可以實現截取屏幕。 Windows 截取屏幕圖片的方式 在Windows 中截取屏幕中某個區塊的方式有&#xff1a; 方式1. 最原始的方式&#xff1a; 點擊 …

C練習題_2

一、單項選擇題(本大題共20小題,每小題2分,共40分。在每小題給出的四個備選項中選出一個正確的答案&#xff0c;并將所選項前的字母填寫在答題紙的相應位置上。&#xff09; 以下敘述中錯誤的是&#xff08;) A.對于double類型數組&#xff0c;不可以直接用數組名對數組進行整…

機器學習與藥物篩選的心得體會

機器學習在藥物設計里面的應用可以說還是比較常見的&#xff0c;尤其是搞計算的都會或多或少的涉及到這塊。比如國內做這塊比較多的&#xff0c;浙江大學的侯廷軍教授&#xff0c;北京化工大學的閆愛霞教授&#xff0c;華東理工大學的幾個做模擬計算的老師&#xff0c;上海藥物…

Unity機器學習 ML-Agents第一個例子

上一節我們安裝了機器學習mlagents的開發環境&#xff0c;本節我們創建第一個例子&#xff0c;了解什么是機器學習。 我們的例子很簡單&#xff0c;就是讓機器人自主移動到目標位置&#xff0c;不能移動到地板范圍外。 首先我們來簡單的了解以下機器學習的過程。 機器學習的過…

分布式鎖之基于zookeeper實現分布式鎖(三)

3. 基于zookeeper實現分布式鎖 實現分布式鎖目前有三種流行方案&#xff0c;分別為基于數據庫、Redis、Zookeeper的方案。這里主要介紹基于zk怎么實現分布式鎖。在實現分布式鎖之前&#xff0c;先回顧zookeeper的相關知識點 3.1. 知識點回顧 3.1.1. 安裝啟動 安裝&#xff1a…

『亞馬遜云科技產品測評』活動征文|搭建圖床chevereto

『亞馬遜云科技產品測評』活動征文&#xff5c;搭建圖床chevereto 提示&#xff1a;本篇文章授權活動官方亞馬遜云科技文章轉發、改寫權&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒體平臺&#xff0c;第三方開發者媒體等亞馬遜云科技官方渠道 文章目錄 『…

Python 獲取本地和廣域網 IP

Python 獲取本地IP &#xff0c;使用第三方庫&#xff0c;比如 netifaces import netifaces as nidef get_ip_address():try:# 獲取默認網絡接口&#xff08;通常是 eth0 或 en0&#xff09;default_interface ni.gateways()[default][ni.AF_INET][1]# 獲取指定網絡接口的IP地…

字符串相加

題意&#xff1a; 給定兩個字符串形式的非負整數 num1 和num2 &#xff0c;計算它們的和并同樣以字符串形式返回。 你不能使用任何內建的用于處理大整數的庫&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接將輸入的字符串轉換為整數形式。 示例 1&#xff…

利用STM32CubeMX解讀時鐘樹

1&#xff0c;低速時鐘 LSE是外部晶振作時鐘源&#xff0c;主要提供給實時時鐘模塊&#xff0c;所以一般采用32.768KHz。LSI是由內部RC振蕩器產生&#xff0c;也主要提供給實時時鐘模塊&#xff0c;頻率大約為40KHz。(LSE和LSI)只是提供給芯片中的RTC(實時時鐘)及IWDG(獨立看門…

【c++】棧教程

今天來講講棧 棧是什么&#xff1f; 老樣子&#xff0c;先來看一道題&#xff1a; 【棧】棧的基本操作 描述 棧的定義&#xff1a;棧是一種特殊的表這種表只在表頭進行插入和刪除操作。因此&#xff0c;表頭對于棧來說具有特殊的意義&#xff0c;稱為棧頂。相應地&#xff0…

佳易王羽毛球館計時計費軟件燈控系統安裝教程

佳易王羽毛球館計時計費軟件燈控系統安裝教程 佳易王羽毛球館計時計費軟件&#xff0c;點擊開始計時的時候&#xff0c;自動打開燈&#xff0c;結賬后自動關閉燈。 因為場館每一場地的燈功率都很大&#xff0c;需要加裝交流接觸器。這個由專業電工施工。 1、計時計費功能 &…

docker安裝mysql8

之前自己在網上找了一些docker安裝mysql8的方法&#xff0c;結果都不行&#xff0c;于是自己根據自己遇到的情況再結合網上搜索到的安裝方式調整了一下&#xff0c;成功執行安裝。以下是我自己的執行命令 先拉取docekr鏡像 docker pull mysql:8.0.20啟動鏡像 docker run -p 3…

使用Git bash切換Gitee、GitHub多個Git賬號

Git是分布式代碼管理工具&#xff0c;使用命令行的方式提交commit、revert回滾代碼。這里介紹使用Git bash軟件來切換Gitee、GitHub賬號。 ? ? 假設在gitee.com上的郵箱是alicefoxmail.com 、用戶名為alice&#xff1b;在github上的郵箱是bobfoxmail.com、用戶名為bob。 賬號…