2022年7月22日 星期五

STM32 使用DMA控制GPIO Port輸出訊號

這裡開發板MCU是使用"STM32F103C8T6"做實驗。 

1. SYS設定。

*Debug: Serial Wire

*勾選System Wake-Up


2. RCC設定。

High Speed Clock(HES): Crystal/Ceramic Resonator


3. DMA設定。
按"Add" 增加DMA設定,Data Width都設定成"Half Word"。

4. GPIO設定。
選擇GPIO port,需要整個port的IO沒有被其他功能占用,這裡選擇先選擇"port B0"為"GPIO_Output",之後會再程式中修改參數。

5. 設定 Clock參數。
*PLL Source Mux: HSE
*System Clock Mux: PLLCLK
*HCLK(MHz): 72

6. 計畫管理設定。
*Project Name: 輸入計畫名稱
*Project Location: 設定存檔路徑
*Toolchain/IDE: MDK-ARM
設定完成按"GENERATE CODE"。

7. 設定DMA初始化參數,將DMA_NORMAL改成DMA_CIRCULAR。

hdma_memtomem_dma1_channel1.Init.Mode = DMA_CIRCULAR;

8. 設定GPIO初始化參數,將GPIO_PIN_0改成GPIO_PIN_All,由只有PB0輸出改成PB Port輸出。

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_All, GPIO_PIN_RESET);

  /*Configure GPIO pin : PB0 */
  GPIO_InitStruct.Pin = GPIO_PIN_All;

9. 建立一個矩陣存放輸出資料。 
/* USER CODE BEGIN PD */
#define DATA_LENGTH 8
uint32_t dma_buff[DATA_LENGTH] = {0x55555555, 0xAAAAAAAA, 0x55555555, 0xAAAAAAAA, 0x55555555, 0xAAAAAAAA};

10. 設定DMA開始輸出訊號。
  /* USER CODE BEGIN 2 */
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)dma_buff, (uint32_t)&GPIOB->ODR, DATA_LENGTH);

11. 燒錄MCU後,輸出結果如下所示,使用示波器觀察PB0與PB1的訊號。


沒有留言:

張貼留言