目錄
- 一、準備作業
- 二、新建工程
- 三、執行
- 四、參考
一、準備作業
- STM32開發板(我的是STM32F103C8T6)
- STM32CubeMx軟體、 IDE: Keil軟體
- STM32F1xxHAL庫
- 用stm32F103核心板的GPIOA端一管腳接一個LED,GPIOB埠一引腳接一個開關(用杜邦線模擬代替),采用中斷模式編程,當開關接高電平時,LED亮燈;接低電平時,LED滅燈,
- 采用串口中斷方式的串口通信,
- 按鍵管腳 PB0
- LED管腳 PA12
二、新建工程
- New Project

- 搜索芯片型號
- 選擇芯片
- 創建工程
- 設定RCC

- 點擊RCC
- 高速時鐘(HSE)選擇外部晶振
- 軟體自動配置管腳
- GPIO初始化
LED:1個GPIO_OUTPUT (輸出模式)
按鍵:1個GPIO_EXITx(外部中斷模式)

- 點擊對應管腳
- 設定對應模式


我們的按鍵選擇上升沿觸發中斷
-
設定串口的中斷

-
設定NVIC(嵌套向量中斷控制器)

-
DMA設定

根據DMA通道預覽可以知道,我們用的USART1 的TX RX 分別對應DMA1 的通道4和通道5
- 點擊DMA Settings 點擊 Add 添加通道
- 選擇USART_RX USART_TX 傳輸速率設定為中速
- DMA傳輸模式為正常模式
- DMA記憶體地址自增,每次增加一個Byte(位元組)
- 時鐘源設定

- 選擇外部時鐘HSE 8MHz
- PLL鎖相環倍頻9倍
- 系統時鐘來源選擇為PLL
- 設定APB1分頻器為 /2
- 專案檔案設定

- 設定專案名稱
- 設定存盤路徑
- 選擇basic
- 選擇所用IDE

這個看自己的選擇
- 創建工程檔案

隨后我們可以在stm32f1xx_it.c中看到我們所配置的中斷服務函式 并且可以看到gpio的初始化分到了gpio.c里面

三、執行
- GPIO中斷
重寫回呼函式
在main.c中
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
}
while回圈中
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET); HAL_Delay(1000);
結果:
- 串口中斷
在main.c中
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
if(length>20){
memset(message,0,sizeof(message));
HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
memset(message,0,sizeof(message));
length=0;
}
else{
message[length++]=c;
if(c=='\n'){
HAL_UART_Transmit(&huart1, (uint8_t *)&message, sizeof(message),0xFFFF);
length=0;
memset(message,0,sizeof(message));
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);//重新設定中斷
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback could be implemented in the user file
*/
}
在while中
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
HAL_UART_Transmit(&huart1, (uint8_t *)&data, sizeof(data),0xFFFF);
}

- DMA通信
main.c
uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n "; //定義資料發送陣列
在while回圈中
//DMA
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);

四、參考
https://blog.csdn.net/as480133937/article/details/104827639
https://blog.csdn.net/as480133937/article/details/98983268
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352021.html
標籤:其他
上一篇:STM32中斷與DMA通信編程
