2022年7月23日 星期六

STM32 使用DMA控制PWM輸出訊號

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

1. SYS設定。

*Debug: Serial Wire

*勾選System Wake-Up


2. RCC設定。

High Speed Clock(HES): Crystal/Ceramic Resonator


3. TIM1設定。

Clock Source: Internal Clock

Channel1: PWM Generation CH1

設定好後,可以看到PIN腳PA8設定成PWM輸出。


注意: 如果PWM輸出訊號每次結束後,訊號要維持在低電位,要看PWM輸出訊號結束時,是在高電為還是低電位,來設定"CH  Polarity"為"Low" 或是 "High",因為"Low"、"High"這是一個訊號反向的設定。


4. 設定 Clock參數。

*PLL Source Mux: HSE
*System Clock Mux: PLLCLK
*HCLK(MHz): 72

設定好後,可以看到APB2 time clock(MHz) 等於72MHz,PWM的Tim Clock是以此為基礎。

5. TIM1 > Parameter Setting設定。

Prescaler(PSC - 16 bits value) : 72-1

Counter Period(AutoReload Register - 16 bits value): 1000

這裡設定Prescaler為72MHz~1MH範圍, 設定Counter Period為1000~1為頻率範圍,公式如下。

Tim Clock : 72MHz / 72 = 1MHz

Freq: 1MHz / 1000 = 1KHz 




6. TIM1 > DMA Setting設定。

按"Add" 增加DMA設定,DMA Request選擇"TIM1_CH1",Direction選擇"Memory To Peripheral", Mode設定成"Normal", Data Width都設定成"Half Word"。


7. 計畫管理設定。

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

8. 建立一個矩陣,存放PWM高電位的時間,之前設定週期為1KHz,所以矩陣內參數100等於100us。

/* USER CODE BEGIN PD */

#define HPOT 10

uint16_t DataBuf[HPOT] = {900, 200, 300, 400, 500, 600, 700, 800, 900, 0};


9. 設定啟動PWM控制。

  /* USER CODE BEGIN 2 */

HAL_Delay(200);

        HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t*)&DataBuf, HPOT);


10. 設定PWM訊號輸出一次後關閉。

/* USER CODE BEGIN 0 */

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)

{

if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)

{

  HAL_TIM_PWM_Stop_DMA(htim, TIM_CHANNEL_1);

}

}


11. PWM輸出結果如下所示,Cursor量測出每一個週期為1KHz,共9個不同頻率的週期。

注意:不知道為什麼HPOT參數給10,最後指出來9個週期,因此矩陣最後一個參數我這裡直接設為0。








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的訊號。


2022年7月21日 星期四

STM32 新增專案

 1. 點選"STM32CubeMX"程式。


2.  點選"ACCESS TO MCU SELECTOR",使用選擇MCU型號的方式建立專案。


3. 在"Commercial Part Number"欄位輸入開發板上MCU的型號,之後在"MCUs/MPUs List:"欄位中,快點兩下確定專案使用的MCU型號。


4. 點選"SYS",設定Debug傳輸介面,這裡選擇"Serial Wire",並勾選"System Wake-Up"。


5. 開發板上MCU腳位PC13,有接LED燈,所以點選"PC13"並設定模式為"GPIO_Output"。


6. 選擇"Project Manager"標籤欄,"Project Name"欄位輸入計畫名稱,"Project Location"點選Browse按鍵選擇存檔路徑,"Toolchain / IDE"下拉式選單選擇"MDK-ARM"。


7. 設定完成,點選"GENERATE CODE",產生專案程式,之後跳出開啟Keil C視窗,點選"Open Project"。


8. 開啟Keil C後,選擇main.c,輸入控制GPIO程式。

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

HAL_Delay(500);// Delay 500ms

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_Delay(500);// Delay 500ms


9. 點選"Build"編譯程式,沒有錯誤後按"Download"開始燒錄。


10. 燒錄完成後按開發板上的"Reset"鍵,就可以看到LED在閃爍。


注意: 燒錄時,出現ST-LINK無法連結,請依照下列步驟操作

http://science-boy-not-difficult.blogspot.com/2022/07/keil-c-stm32st-link-connection-error.html

STM32 Setup_4-Keil C上安裝STM32的Keil Pack

1. 至ARM KEIL官網下載,STM32F1xx的Keil Pack。



2. 點選"Keil MDK"開發工具。


3. 開啟Keil C後,點選"Pack Installer",再選擇"File" > "Import"。


4. 選擇STM32F1xx的Keil Pack檔。


5. 安裝完成後,可以查看安裝結果。






STM32 Setup_3-安裝STM32CubeMX

 1. 至ST官網下載"STM32CubeMX"安裝檔,並解壓縮。

2. 點選"SetupSTM32CubeMX-6.5.0-Win.exe"執行STM32CubeMX安裝執行檔。STM32CubeMX是STM32產生韌體C語言原始程式專案的工具,產生的專案支援多家IDE開發工具。

 

3. 按"Next"至下一步。


4. 勾選選項後,按"Next"至下一步。


5. 勾選選項後,按"Next"至下一步。


6. 確認安裝路徑,按"Next"至下一步。


7. 按"Next"至下一步,開始安裝。


8. 安裝完成,按"Next"至下一步。


9.  按"Done"結束安裝程序。


10. 桌面上新增了"STM32CubeMX"的ICON。








STM32 Setup_2-ST-LINK驅動程式安裝

 1. 至ST官網下載"STM32 ST-LINK Utility"安裝檔,並解壓縮。


2. 點選"setup.exe"執行安裝檔。
3. 按"Next>"至下一步。

4. 按"Yes"至下一步。

5. 安裝路徑,按"Next>"至下一步。

6. 安裝驅動程式,按"下一步>"至下一步。

7. 驅動程式安裝完成,按"完成"。

8. 按"Finish"結束安裝。

9. 安裝完成在桌面會增加"STM32 ST-LINK Utility"的ICON,可以開啟"裝置管理員",檢查驅動程式是否安裝成功。

10. 開啟"STM32 ST-LINK Utility",點選"ST-LINK" > "Firmware updata",更新韌體。

11. 點選"Device Connect",連結ST-LINK。

12. 按"Yes >>>>"開始更新,更新完成按下跳出視窗的"確定",結束驅動程式安裝。