文章目錄
- 一、實驗內容
- 二、DMA簡介
- 三、點亮LED燈中斷實驗
- (1)工程創建
- (2)編譯
- (3)燒錄
- (4)運行結果
- 四、串口中斷通信實驗
- (1)工程創建
- (2)編譯
- (3)器材連接與燒錄
- (4)運行效果
- 五、串口DMA發送資料實驗
- (1)工程創建
- (2)編譯
- (3)燒錄
- (4)運行效果
- 五、個人總結
- 六、參考文獻
一、實驗內容
-
用stm32F103核心板的GPIOA端一管腳接一個LED,GPIOB埠一引腳接一個開關(用杜邦線模擬代替),采用中斷模式編程,當開關接高電平時,LED亮燈;接低電平時,LED滅燈,
-
采用串口中斷方式重做上周的串口通信作業,
-
STM32采用串口DMA方式,用115200bps或更高速率向上位機連續發送資料,
二、DMA簡介
DMA全稱Direct Memory Access,即直接存盤器訪問,
直接存盤器存取(DMA)用來提供在外設和存盤器之間或者存盤器和存盤器之間的高速資料傳輸,DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和回復現場程序,通過硬體為RAM和IO設備開辟一條直線傳輸資料的通道,使得CPU的效率大大提高,DMA傳輸將資料從一個地址空間復制到另一個地址空間,當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實作和完成的,
STM32F1最多有2個DMA控制器,DMA2僅存在于大容量產品中,DMA1有7個通道,DMA2有5個通道,每個通道專門用來管理來自于一個或多個外設對存盤器訪問的請求,還有一個仲裁起來協調各個DMA請求的優先權,在STM32中文參考手冊第144頁中給出了DMA的框圖,

在STM32中文參考手冊第142頁比較詳細的介紹了DMA的主要特性

三、點亮LED燈中斷實驗
(1)工程創建
1、打開STM32CUBEMX,新建一個工程

2、芯片選擇STM32F103C8,直接雙擊芯片型號,

3、點擊SYS,Debug選擇Serial Wire

4、點擊RCC,High speed選擇Crystal

5、點擊GPIO,選擇管腳,這里LED連PA6管腳,按鍵連PB1管腳
連接LED的管腳選擇GPIO_Output

按鍵所連的管腳選擇GPIO_EXIT1

6、PA6,PB1命名

給中斷設定下降沿觸發,并且上拉電阻,

7、配置中斷優先級,因為此處只有一個中斷,因此它的優先級為0,為最高,如果有多個中斷則可設為0,1,2,3,

8、配置時鐘,設時鐘頻率為72MHZ

9、工程命名,設定保存目錄,之后點擊GENERATE CODE生成

(2)編譯
1、打開keil檔案,在main.c中修改callback程式,用到的庫函式是HAL_GPIO_TogglePin()
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
{HAL_GPIO_TogglePin(led1_GPIO_Port,led1_Pin);
}
}

2、運行成功,生成.hex檔案

(3)燒錄

(4)運行結果

四、串口中斷通信實驗
(1)工程創建
1、RCC和SYS和CLOCK設定同上,引腳不需要,
2、點擊Connectivity的USART1,MODE選擇Asynchronous(異步通信模式),并且點擊NVIC Settings,勾選Enabled,

3、工程命名,然后生成工程檔案,

(2)編譯
1、打開keil檔案
2、在main添加存放資料的陣列代碼
uint8_t a[]="Hello windows!\n";

3、在main添加回轉函式
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));
}

4、在main添加中斷函式
HAL_UART_Transmit_IT(&huart1, a, sizeof(a));

5、編譯成功,生成.hex檔案,

(3)器材連接與燒錄
核心板連接方式和我上篇博客連接方式一樣
參考鏈接:https://blog.csdn.net/qq_45930985/article/details/121024027

燒錄

(4)運行效果
這里需要BOOT0由1置0,然后點擊RESET,打開野火除錯助手,

五、串口DMA發送資料實驗
(1)工程創建
1、RCC和CLOCK設定同上
2、點擊USART1,MODE選擇Asynchronous(異步通信模式),并且使得USART1中斷使能
波特率設定為115200 Bits/s,傳輸資料長度為8 Bit,奇偶檢驗無,停止位1 接收和發送都使能,

3、點擊NVIC Settings,勾選Enabied,

4、點擊DMASettings ,再點擊 Add 添加兩個通道,傳輸速率設定為medium

5、模式設定為Normal,勾選Memory

6、點擊System view,選擇DMA,點擊ADD的添加

7、命名工程,然后點擊GENERATE CODE生成工程檔案

(2)編譯
1、打開keil檔案,在main.c中添加如下代碼
uint8_t Senbuff[] = "Hello windows!\n"; //定義資料發送陣列
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_Delay(1000);


2、編譯成功,

(3)燒錄
打開mcuisp軟體

(4)運行效果
打開野火除錯助手,這里同樣需要BOOT0由1置0,點擊RESET

五、個人總結
這一次實驗是在上一次的基礎上增加中斷的程序,實驗難度就沒有那么大了,基本對于軟體的操作在上一次都熟悉了,但是中斷的程序還是需要去借鑒別人的實驗程序來豐富自己的實際動手操作經驗,
六、參考文獻
1、https://blog.csdn.net/as480133937/article/details/104827639/
2、https://www.cnblogs.com/breezy-ye/articles/12157442.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352018.html
標籤:其他
上一篇:2021完整版物聯網智慧公廁方案
