STM32中斷

目錄

      • stm32中斷原理
      • 標準庫
      • 高低電平使LED亮滅燈
      • 采用串口中斷方式做串口通信

stm32中斷原理

在STM32微控制器中,中斷是一種重要的事件驅動機制,用于處理實時事件而無需持續輪詢。中斷在處理外部事件(如按鍵輸入、定時器溢出等)時非常有用。以下是關于STM32中斷的基本原理:
中斷控制器:STM32微控制器內部有一個中斷控制器,負責管理和分配中斷請求。中斷控制器會根據中斷優先級來確定哪個中斷應該被處理。
中斷優先級:每個中斷源都有一個優先級,優先級較高的中斷會在優先級較低的中斷之前得到處理。在STM32中,中斷優先級通常通過NVIC(Nested Vectored Interrupt Controller)進行配置。
中斷向量表:中斷向量表是一個存儲中斷處理函數地址的表格。當發生中斷時,處理器會根據中斷號在中斷向量表中查找對應的中斷處理函數的地址并跳轉執行。
中斷處理流程:當發生中斷時,處理器會立即暫停當前任務,保存當前上下文(如寄存器狀態)并跳轉到中斷處理函數。中斷處理函數執行完畢后,會恢復之前保存的上下文并返回到中斷發生的地方繼續執行。
配置中斷:要在STM32中啟用中斷,通常需要配置相應的中斷優先級、中斷觸發條件以及中斷處理函數。這通常涉及設置相關的寄存器和中斷控制器。

標準庫

在STM32微控制器開發中,標準庫通常指的是STMicroelectronics提供的STM32標準外設庫(Standard Peripheral Library)或者Cube庫(Cube庫是HAL庫的前身,提供了更高級的抽象層)。這些庫提供了一系列函數和驅動程序,用于簡化對STM32外設(如GPIO、UART、SPI等)的控制和配置。
以下是關于STM32標準庫的一些重要信息:
功能:STM32標準庫提供了一組函數,用于配置和控制微控制器的外設。這些函數可以幫助開發者快速編寫代碼,而無需深入了解底層寄存器的操作。
使用:開發者可以通過包含相應的頭文件并調用庫中的函數來使用STM32標準庫。例如,要配置一個GPIO引腳,可以調用庫中提供的函數來設置引腳的模式、速度、上拉/下拉等屬性。
優點:使用STM32標準庫可以簡化開發流程,減少對寄存器級編程的需求,提高代碼的可移植性和可維護性。
替代品:隨著時間的推移,STMicroelectronics逐漸推出了Cube庫(Cube庫包含了HAL庫和LL庫),提供了更高級的抽象層和更豐富的功能。Cube庫通常被認為是標準庫的更先進版本。

高低電平使LED亮滅燈

連接硬件:
將一個LED連接到STM32F103核心板的GPIOA端口的一個引腳(比如PA5)。
將一個開關(用杜邦線模擬)連接到GPIOB端口的一個引腳(比如PB0)。

編寫中斷處理程序:
首先,需要初始化GPIOA和GPIOB端口為輸入和輸出模式,并啟用相應的中斷功能。
然后,編寫中斷處理程序,當檢測到GPIOB端口引腳的狀態改變時,執行相應的操作來控制GPIOA端口引腳的狀態。

編程實現:
在你的STM32F103項目中,你需要設置GPIOA引腳為輸出模式,用于控制LED。設置GPIOB引腳為輸入模式,用于讀取開關狀態。
配置GPIOB引腳的中斷觸發條件,例如上升沿或下降沿觸發中斷。
在中斷服務程序中,讀取GPIOB引腳的狀態,如果檢測到狀態變化,根據開關狀態控制GPIOA引腳來點亮或熄滅LED。

調試和測試:
燒錄程序到STM32F103核心板上,確保硬件連接正確。
測試開關的功能,檢查LED是否根據開關狀態正確亮滅。

采用串口中斷方式做串口通信

分別實現:
(1)當stm32接收到1個字符“s”時,停止持續發送“hello windows!”; 當接收到1個字符“t”時,持續發送“hello windows!”
(2)當stm32接收到字符“stop stm32!”時,停止持續發送“hello windows!”; 當接收到字符“go stm32!”時,持續發送“hello windows!”

代碼:

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include <string.h>void SystemClock_Config(void);char c;//指令 0:停止  1:開始
char message[]="hello Windows\n";//輸出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//標志 0:停止發送 1.開始發送int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();//設置接受中斷HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);//當flag為1時,每秒發送一次信息//當flag為0時,停止while (1){if(flag==1){//發送信息HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF); //延時HAL_Delay(1000);}}
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{//當輸入的指令為0時,發送提示并改變flagif(c=='s'){flag=0;	}//當輸入的指令為1時,發送提示并改變flagelse if(c=='t'){flag=1;	}//當輸入不存在指令時,發送提示并改變flagelse {flag=0;HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF); }//重新設置中斷HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);  
}
/* USER CODE END 4 */
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}

編譯沒有錯誤后,進行燒錄就完了。

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

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

相關文章

【辦公類-21-18】20240701 養老護理員初級選擇題488,制作PyQt5圖形界面GUI

背景需求&#xff1a; 6月16日育嬰師高級考完了。運氣好&#xff0c;抽到的是”護理患腹瀉的幼兒”&#xff0c;“晨檢與家長溝通”&#xff0c;“4個月嬰兒喂蛋黃”&#xff0c;“21個月食譜”&#xff0c;都是我背過的題目&#xff08;沒有抽到感統&#xff09; 于是一放假&…

【C語言】解決C語言報錯:Invalid Pointer

文章目錄 簡介什么是Invalid PointerInvalid Pointer的常見原因如何檢測和調試Invalid Pointer解決Invalid Pointer的最佳實踐詳細實例解析示例1&#xff1a;未初始化的指針示例2&#xff1a;已釋放的指針示例3&#xff1a;返回局部變量的指針示例4&#xff1a;野指針 進一步閱…

three.js獲取深度圖

在Three.js中&#xff0c;獲取深度圖&#xff08;Depth Map&#xff09;通常涉及幾個步驟。深度圖是一個圖像&#xff0c;其中每個像素的值表示從攝像機到場景中相應點的距離。以下是如何在Three.js中獲取深度圖的基本步驟&#xff1a; 設置WebGLRenderer&#xff1a;確保你的T…

Android裁剪內核后編譯報錯compatibility matrix

【問題描述】&#xff1a; 優化開機速度&#xff0c;裁剪kernel&#xff0c;注釋掉模型模塊后如&#xff1a;# CONFIG_HID_SONY is not set&#xff0c;出現編譯報錯。 checkvintf E 07-01 16:32:02 160 160 check_vintf.cpp:620] files are incompatible: Runtime info a…

《化學工程與裝備》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答 問&#xff1a;《化學工程與裝備》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。 問&#xff1a;《化學工程與裝備》級別&#xff1f; 答&#xff1a;省級。主管單位&#xff1a;福建石油化工集團有限責任公司 …

昇思25天學習打卡營第6天|網絡構建

網絡構建 概念模型模型參數 概念 神經網絡模型是由神經網絡層和Tensor操作構成的&#xff0c;mindspore.nn提供了常見神經網絡層的實現&#xff0c;在MindSpore中&#xff0c;Cell類是構建所有網絡的基類&#xff0c;也是網絡的基本單元。一個神經網絡模型表示為一個Cell&…

技術革新:如何用數據中臺實現數字化轉型

作為程序員&#xff0c;我們總是對技術如何改變企業運作充滿好奇。今天&#xff0c;我們將深入探討森馬集團如何利用數據中臺技術&#xff0c;實現從傳統數據分析到數字化轉型的華麗轉身。 1. 技術背景&#xff1a;森馬集團的數字化挑戰 森馬集團&#xff0c;一個在服飾行業占…

[單master節點k8s部署]8.pod健康探測

k8s默認的健康檢查機制是&#xff0c;每個容器都有一個監控進程&#xff0c;如果進程退出時返回碼非零&#xff0c;則認為容器發生故障。 存活探測 監測pod是否處于運行狀態&#xff0c;當liveness probe探測失敗的時候&#xff0c;根據重啟策略判斷是否需要重啟。適用于需要…

【Win測試】窗口捕獲的學習筆記

2 辨析筆記 2.1 mss&#xff1a;捕獲屏幕可見區域&#xff0c;不適合捕獲后臺應用 Claude-3.5-Sonnet: MSS庫可以用來捕獲屏幕上可見的內容&#xff1b;然而&#xff0c;如果游戲窗口被其他窗口完全遮擋或最小化&#xff0c;MSS將無法捕獲到被遮擋的游戲窗口內容&#xff0c;而…

天津惠靈頓:從心,致逐夢康橋|在這所天津國際學校從容不迫中走近夢想

在剛剛落下帷幕的申請季中&#xff0c;來自惠靈頓天津校區的Herman&#xff0c;陸續收到了劍橋大學、帝國理工學院、紐約大學、瓦薩學院等10余封錄取通知書。面對紛至沓來的名校肯定&#xff0c;經歷了短暫的塵埃落定的喜悅&#xff0c;Herman很快恢復了往日里的泰然自若。在他…

cv::Mat類的矩陣內容輸出的各種格式的例子

操作系統&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code編程語言&#xff1a;C11 功能描述 我們可以這樣使用&#xff1a;cv::Mat M(…); cout << M;&#xff0c;直接將矩陣內容輸出到控制臺。 輸出格式支持多種風格&#xff0c;包括O…

第5章:Electron加載與顯示內容(2)

5.4 加載和顯示不同類型的資源 Electron 支持加載和顯示多種類型的資源&#xff0c;包括圖片、視頻和其他靜態文件。 5.4.1 加載圖片的示例代碼 index.html&#xff1a; <!DOCTYPE html> <html> <head><title>Load Image</title> </head&…

字符串常量池StringTable

String s1 "a"; 從常量池中取符號a->運行時常量池 ->"a"放入字符串常量池 -> 給s1 String s2 "b"; String s3 s1s2; 創建 new StringBuilder().append("a").append("b").toString() String s4 "a"&q…

鴻蒙使用 @Builder擴展出來的布局數據更新沒法更新UI

由于業務的復雜&#xff0c;所以我們把相關UI抽離出來。但是數據變化了&#xff0c;沒法更新UI Builder MyGridLayout() { } 通過日志打印發現數據的確是更新了&#xff0c;但是UI就沒沒辦法&#xff0c;如何解決呢 Entry Component struct Page35 {// State sArray: bool…

【ajax實戰09】內容管理頁面——刪除功能

本文章目標&#xff1a;點擊刪除圖標實現對應數據刪除 實現步驟如下&#xff1a; 一&#xff1a;將服務器端獲取數據中數據id值綁定到刪除圖標&#xff08;重點&#xff09; 即在渲染時&#xff0c;利用自定義屬性&#xff0c;為td設置id值 <td data-id "${ele.id}…

CEPH client.admin key獲取

通過初始化完畢后&#xff0c;admin節點會在/etc/ceph目標下生成對應的配置文件和對應的key文件&#xff0c;通過ceph orch host add 增加的默認是沒有的 如果很不幸admin節點掛了&#xff0c;怎么在其它節點使用ceph -s 命令呢 啟蒙方法(比較實用) key可以通過ceph auth expor…

chunkers/maxent_ne_chunker/english_ace_multiclass.pickle 找不到

首先在這個nltk_data &#xff1a; NLTK Data官方下的數據集&#xff0c;找不到english_ace_multiclass.pic 說明缺少這個文件 : 那么在 nlp/resources/chunkers/maxent_ne_chunker/english_ace_multiclass.pickle at master teropa/nlp (github.com) 下載那兩個文件 : 然…

在Vue3項目中引入Vite進行熱更新

第一步&#xff1a;初始化一個Vue3項目&#xff0c;可以使用Vue CLI 在開始之前&#xff0c;我們需要確保已經安裝了Vue CLI。可以通過以下命令安裝Vue CLI&#xff1a; bash npm install -g vue/cli 接下來&#xff0c;使用Vue CLI初始化一個Vue3項目&#xff1a; bash vue …

基于SpringBoot的CSGO賽事管理系統

您好&#xff01;我是專注于計算機技術研究的碼農小野。如果您對CSGO賽事管理系統感興趣或有相關開發需求&#xff0c;歡迎隨時聯系我。 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot框架&#xff0c;Java技術 工具&#xff1a;Eclipse&a…

邁阿密色主題學科 HTML5靜態導航源碼

源碼介紹 邁阿密色主題學科 HTML5靜態導航源碼&#xff0c;源碼直接上傳可用&#xff0c;有技術的可以拿去寫個后端搜索調用百度接口&#xff0c;也可用于做引導頁下面加你網址添加一個A標簽就行了&#xff0c;很簡單&#xff0c;需要的朋友就拿去吧 界面預覽 源碼下載 邁阿…