文章目錄
- 一、中斷
- 1.資料傳輸方式
- 2.中斷程序
- 3.中斷的作用:
- 4.中斷優先級:
- 二、HAL庫中斷點亮LED燈
- 三、HAL庫中斷串口通信
- 四、DMA
- 1.概念
- 2.STM32F103C8T6以DMA方式實作連續發送
- 五、總結
- 六、參考鏈接
一、中斷
1.資料傳輸方式
(1)無條件傳輸:處理器不必了解外部設備狀態,直接進行資料傳輸,用于指示燈和按鍵等簡單設備
(2)查詢方式:傳輸前,一方先查詢另一方的狀態,若已經準備好就傳輸,否則繼續查詢,
(3)中斷方式:乙方通過申請中斷的方式與另一方進行資料傳輸,收發雙方可以并行作業,
(4)直接儲存器訪問:處理器內部建立片內外設和記憶體之間的傳輸通道,傳輸程序不需要吃處理器參與,
2.中斷程序
(1)中斷發生:CPU在處理某一時間A時,發生了另一時間B,請求CPU迅速去處理
(2)中斷處理:CPU暫停當前的作業,轉去處理事件B
(3)中斷回傳:當CPU處理完事件B后,再回到事件A中被暫停的地方繼續處理事件A
3.中斷的作用:
(1)可以解決快速的CPU與慢速的外部設備之間的傳送資料的矛盾,
(2)CPU可以分時為多個外部設備服務,提高計算機的利用率,
(3)CPU能夠及時處理應用系統的隨機事件,增強系統的實用性,
(4)CPU可以處理設備故障及掉電等突發事件,提高系統可靠性,
4.中斷優先級:
處理器根據不同中 斷的重要程式設定 不同的優先等級, 不同優先級中斷的 處理原則是:高級 中斷可以打斷低級 中斷;低級中斷不 能打斷高級中斷,
二、HAL庫中斷點亮LED燈
(1)選上自己的芯片型別,找到PB5,選擇為GPIO——EXTI5中斷模式

(2)PA1引腳設定為輸出

(2)PB5的GPIO mode

(4)PA1引腳配置,默認設定為高電平,處于熄滅狀態

(5)開啟中斷

(6)RCC配置:配置時鐘源為外部時鐘源

(7)時鐘樹設定

(8)專案管理

點擊generate code,打開project,
(9)在專案代碼中,打開stm32f1xx_hal_gpio.c檔案可以找到中斷服務函式

根據我們前面的設定,上升沿就會觸發這個函式,在這個函式中呼叫了另外一個名為HAL_GPIO_EXTI_Callback()函式

這個函式是回呼函式,前面__weak表示此函式為虛函式,需要用戶重寫,
在main.c檔案中添加如下代碼:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1); //翻轉電平
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
編譯,結果如下:

三、HAL庫中斷串口通信
CubeMX配置:
配置USART1為異步通信模式:

配置串口:

使能USART1中斷

生成代碼,打開專案,
撰寫代碼:
在main.c中添加定義
uint8_t aRxBuffer; //接收中斷緩沖
uint8_t Uart1_RxBuff[256]; //接識訓沖
uint8_t Uart1_Rx_Cnt = 0; //接識訓沖計數
uint8_t cAlmStr[] = "資料溢位(大于256)\r\n";
在main函式如下位置處添加代碼:
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
/**
* @brief Rx Transfer completed callbacks.
* @param huart pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(Uart1_Rx_Cnt >= 255) //溢位判斷
{
Uart1_Rx_Cnt = 0;
for(int i=0;i<255;i++)
{
Uart1_RxBuff[i]=0;
}
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;
for(int i=0;i<255;i++)
{
Uart1_RxBuff[i]=0;
} //清空陣列
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再開啟接收中斷
}
/* USER CODE END 4 */
運行除錯結果如下:

四、DMA
1.概念

串口DMA發送函式:HAL_UART_Transmit_DMA

2.STM32F103C8T6以DMA方式實作連續發送
CubeMX
RCC設定外部高速時鐘HSE 選擇外部時鐘源
設定串口

DMA設定



打開工程
在main.c中添加定義
uint8_t aRxBuffer; //接收中斷緩沖
uint8_t Uart1_RxBuff[256]; //接識訓沖
uint8_t Uart1_Rx_Cnt = 0; //接識訓沖計數
uint8_t cAlmStr[] = "資料溢位(大于256)\r\n";
在main.c中添加代碼
/* USER CODE BEGIN Init */
uint8_t Senbuff[] = "HELLO WORLD!!!"; //定義資料發送陣列
/* USER CODE END Init */
在while回圈中添加代碼:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff)-1); //串口發送Senbuff陣列
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
五、總結
本實驗主要是學習stm32中斷、DMA通信原理和編程方法,采用中斷模式編程,當開關接高電平時,LED亮燈;接低電平時,LED滅燈,STM32采用串口DMA方式,用115200bps或更高速率向上位機連續發送資料,
六、參考鏈接
https://blog.csdn.net/qq_45659777/article/details/121110712?spm=1001.2014.3001.5501
https://blog.csdn.net/qq_45659777/article/details/121111629?spm=1001.2014.3001.5501
https://blog.csdn.net/as480133937/article/details/104827639/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354749.html
標籤:其他
上一篇:linux幾個沒用但是有趣的命令
下一篇:stm32中斷和連續發送資料
