物联网之STM32开发四(中断系统)
STM32-中斷系統
內容概要:
STM32中斷系統概述
外部中斷控制器EXTI
按鍵中斷實例
串口中斷實例
STM32中斷系統概述:
內容概要:
中斷的基本概念
嵌套向量控制器NVIC
中斷及異常向量表
中斷優先級
中斷的基本概念:
?處理器中的中斷:在處理器中,中斷是一個過程,即CPU在正常執行程序的過程中,遇到外部/內部的緊急事件需要處理,暫時中止當前程序的執行,轉而去為處理緊急的事件,待處理完畢后再返回被打斷的程序處繼續往下執行。中斷在計算機多任務處理,尤其是即時系統中尤為重要。比如uCOS,FreeRTOS等。
意義:中斷能提高CPU的效率,同時能對突發事件做出實時處理。實現程序的并行化,實現嵌入式系統進程之間的切換。
中斷處理過程:
進入中斷:
? ??? 處理器自動保存現場到堆棧里
? ? ? {PC, xPSR, R0-R3, R12, LR}
? ? ? 一旦入棧結束,ISR便可開始執行
? ? ? 晚到的中斷會重新取ISR地址,但無需再次保存現場
退出中斷:
? ? ? 中斷前的現場被自動從堆棧中恢復
? ? ? 一旦出棧完成,繼續執行被中斷打斷的指令
? ? ? 出棧的過程也可被打斷,使得隨時可以響應新的中斷,而不再進行 ? ?
? ? ?現場保存
STM32F0中斷的體系結構:
NVIC的主要功能:
中斷管理 ?
支持異常及中斷向量化處理 ?
支持嵌套中斷
中斷管理:
Cortex-M0處理器中,每一個外部中斷都可以被使能或者禁止,并且可以被設置為掛起狀態或者清除狀態。處理器的中斷可以電平的形式的,也可以是脈沖形式的,這樣中斷控制器就可以處理任何中斷源。
中斷和異常向量表:
STM32F0中斷和異常向量: ? ? ??
? ? Cortex-M0內核可以處理15個內部異常,和32個外部中斷。 ? ? ?
? ? STM32F051實際上只使用了6個內部異常和28個外部中斷。
當異常或中斷發生時,處理器會把PC設置為一個特定地址,這一地址就稱為異常向量。每一類異常源都對應一個特定的入口地址,這些地址按照優先級排列以后就組成一張異常向量表。
向量化處理中斷的好處:
? ??統的處理方式需要軟件去完成。采用向量表處理異常,M0處理器會從存儲器的向量表中,自動定位異常的程序入口。從發生異常到異常的處理中間的時間被縮減。
注:中斷和異常的區別:中斷是微處理器外部發送的,通過中斷通道送入處理器內部,一般是硬件引起的,比如串口接收中斷,而異常通常是微處理器內部發生的,大多是軟件引起的,比如除法出錯異常,特權調用異常等待。不管是中斷還是異常,微處理器通常都有相應的中斷/異常服務程序。
嵌套中斷:
STM32F0中斷的優先級: ? ?
? ? 3個固定的優先級,都是負值,不能改變 ?
? ? 四個可編程優先級,用兩個bit位表示,00,01,10,11 ?
? ? 優先級越小優先級越高
注:不同優先級的中斷同時發生,優先處理優先級編號較小的那個 同樣優先級的中斷同時發生,中斷向量號較小的那個優先響應。
外部中斷控制器EXTI
內容概要:
外部中斷控制器EXTI
系統配置控制器SYSCFG
外部中斷/事件框圖
外部中斷控制器EXTI:
在 STM32F05x 中,共有最多 28 中斷 / 事件線可用:
GPIO 口連接到 16 個外部中斷 / 事件線
系統配置控制器 (SYSCFG):
該器件具有一組配置寄存器。系統配置控制器的主要用途如下:
● 在部分 IO 口上啟用或禁用 I2C 超快模式 (Fast Mode Plus) 。
● 重映射部分從 TIM16 和 TIM17 , USART1 和 ADC 的 DMA 觸發源到其它不同的 DMA 通道上。
● 重映射存儲器到代碼起始區域。
● 管理連接到 GPIO 口的外部中斷。
● 管理系統的可靠性特性。
SYSCFG 外部中斷配置寄存器 1-4 (SYSCFG_EXTICR1—4):
外部中斷 / 事件框圖:
按鍵中斷實例
內容概要:
按鍵原理圖分析
按鍵中斷編程步驟分析
按鍵中斷編程實例
按鍵原理圖分析:
按鍵中斷編程步驟分析:
1、使能相應的時鐘
2、配置GPIO管腳為中斷功能
3、設置中斷優先級
4、使能相應的中斷
5、實現中斷服務程序
按鍵中斷編程實例:
配置引腳功能:
設置串口:
打開中斷:
設置中斷觸發方式:
導出工程:
追入向量表中對應的函數:
繼續往下追相應的函數:
繼續往下追:
需要重新編寫的中斷處理程序:
重新編寫中斷處理程序并添加必要的頭文件:
串口中斷實例
內容概要:
原理圖分析
串口中斷編程步驟分析
串口中斷編程實例
串口原理圖分析
串口中斷編程步驟分析:
1、使能相應的時鐘
2、配置GPIO管腳為串口功能
3、設置中斷優先級
4、使能相應的中斷
5、實現中斷服務程序
串口中斷編程實例:
引腳功能選擇為串口功能
設置通信協議
打開對應中斷
在中斷向量表中找到對應的向量,往里面追
串口接收中斷的實現 ?
找到串口接收模式下的函數,繼續往里面追
找到回調函數并改寫
改寫代碼如下:
main.c中定義一個全局變量用于存放字符串,并將串口接收中斷使能:
uint8_t buf[10];?
HAL_UART_Receive_IT(&huart1, buf, 1); //串口接收中斷使能(這里設置的是接收一個字符就中斷)在usart.c中重新編寫回調函數:
??extern uint8_t buf[10]; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart->Instance==USART1){//HAL_UART_Transmit(&huart1, "receive success!\n", 17, 100);printf("receive success : %c\n", buf[0]); //如果調用printf函數,則需要重新編寫fputc函數HAL_UART_Receive_IT(&huart1, buf, 1); //每次調用中斷程序后都要重新使能} }重新編寫fputc函數如下: int fputc(int ch,FILE *f){ while((USART1->ISR&(1<<7)) == 0); USART1->TDR=(uint8_t)ch;return ch; }測試結果:
?
串口發送中斷的實現
串口發送中斷使能:
HAL_UART_Transmit_IT(&huart1, "TX\n", 3);//串口發送中斷使能追加到回調函數:
重新編寫回調函數:
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if(huart->Instance==USART1)//判斷是否為串口1的發送中斷{printf("tx success!\n");//如果發生中斷,則打印一句話} }測試結果:
?
?
總結
以上是生活随笔為你收集整理的物联网之STM32开发四(中断系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽三国服务器维护,官方平台霸榜三个月《
- 下一篇: 最新发布 Debian 系统的详细安装过