文章目錄
- 一、相關概念
- 1.中斷概念
- 2.中斷程序
- 3.中斷作用
- 4.中斷優先級
- 5.中斷回應程序
- 二、 CubeMX中斷控制LED燈
- 1.創建專案
- 2.代碼修改
- 3.運行結果
- 三、HAL庫中斷串口通信
- 1.創建專案
- 2.代碼修改
- 3.運行結果
- 四、總結
- 參考鏈接
一、相關概念
1.中斷概念
中斷是指計算機運行程序中,出現某些意外情況需主機干預時,機器能自動停止正在運行的程式并轉入處理新情況的程式,處理完畢后又回傳原被暫停的程式繼續運行,

2.中斷程序
①中斷發生:當CPU在處理某一事件A時,發生了另一事件B,請求CPU迅速去處理,
②中斷處理:CPU暫停當前的作業,轉去處理事件B,
③中斷回傳:當CPU將事件B處理完畢后,再回到事件A中被暫停的地方繼續處理事件,

3.中斷作用
速度匹配:可以解決快速的CPU與慢速的外部設備之間傳送資料的矛盾,
分時操作:CPU可以分時為多個外部設備服務,提高計算機的利用率,
實時回應:CPU能夠及時處理應用系統的隨機事件,增強系統的實時性,
可靠性高:CPU可以處理設備故障及掉電等突發事件,提高系統可靠性,
4.中斷優先級
處理器根據不同中斷的重要程式設定不同的優先等級,不同優先級中斷的處理原則是:高級中斷可以打斷低級中斷;低級中斷不能打斷高級中斷,

5.中斷回應程序

二、 CubeMX中斷控制LED燈
1.創建專案
①新建專案File->New Project
②選擇芯片為STM32F103C8
③選擇PC13設定為GPIO_Output輸出模式,PB9設定為GPIO_EXTI9中斷模式

④PB9的GPIO mode;PC13引腳配置,默認設定為High,處于熄滅狀態


⑤RCC配置時鐘和SYS配置

⑥開啟中斷

⑦時鐘樹設定(HCLK改為72)

⑧生成代碼并打開Keil
2.代碼修改
在main.c中加入以下代碼
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13); //翻轉電平
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
3.運行結果
①燒錄boot0置1,boot1置0

②運行結果
存個作業存個作業
三、HAL庫中斷串口通信
1.創建專案
①新建專案File->New Project
②選擇芯片為STM32F103C8
③選擇USART1為異步通信模式

④RCC配置時鐘和SYS配置

⑤配置串口

波特率為115200 Bits/s
傳輸資料長度為8 Bit
奇偶檢驗無
停止位1 接收和發送都使能
⑥使能中斷

2.代碼修改
在頭檔案后定義資料
uint8_t aRxBuffer;//接識訓沖中斷
uint8_t Uart1_RxBuff[256];//接識訓沖
uint8_t Uart1_Rx_Cnt=0;//接識訓沖計數
uint8_t cAlmStr[]="資料溢位(大于256)";
重寫HAL_UART_RxCpltCallback函式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(Uart1_Rx_Cnt >= 255) //溢位判斷
{
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);
}
else
{
Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer; //接收資料轉存
if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)||(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判斷結束位
{
HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //將收到的資訊發送出去
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空陣列
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再開啟接收中斷
}
主函式內寫上一個接收中斷函式
int main(void)
{
//初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
//接收中斷函式
HAL_UART_Receive_IT(&huart1,(uint8_t*)&aRxBuffer,1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.運行結果

四、總結
設定了中斷之后,可以在回呼函式里寫想要實作功能,當觸發中斷的時候就會實作功能,不過還是得注意中斷也有優先級;高回應優先級的中斷要等待已被回應的低回應優先級的中斷執行結束后才能得到回應,
參考鏈接
【STM32CubeMX】HAL庫中斷方式UART串口通信
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354755.html
標籤:其他
上一篇:資料可視化探索
