本篇詳細的記錄瞭如何使用STM32CubeMX配置STM32L431RCT6的通用定時器外設,產生PWM驅動無源蜂鳴器。
1. 準備工作
硬件準備
- 開發板
首先需要準備一個開發板,這裏我準備的是STM32L4的開發板(BearPi):
- 蜂鳴器
這裏我直接使用擴展板上的蜂鳴器,如圖:
蜂鳴器的原理圖如下:
軟件準備
- 需要安裝好Keil - MDK及芯片對應的包,以便編譯和下載生成的代碼;
Keil MDK和串口助手的安裝包都可以關注“小熊派開源社區”微信公衆號,在資料教程一欄中可獲取安裝包。
2.生成MDK工程
選擇芯片型號
打開STM32CubeMX,打開MCU選擇器:
搜索並選中芯片STM32L431RCT6
:
配置時鐘源
- 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
- 如果使用默認內部時鐘(HSI),這一步可以略過;
這裏我都使用外部時鐘:
配置通用定時器TIM16
知識小卡片——STM32L431的定時器
STM32L431xx 系列有 1 個高級定時器(TIM1), 3 個通用定時器(TIM2、TIM15、TIM16),兩個基本定時器(TIM6、TIM7),還有兩個低功耗定時器(LPTIM1、LPTIM2)。
STM32L431 的通用 TIMx (TIM2、TIM15、TIM16)定時器功能包括:
-
16 位(TIM15,TIM16)/32 位(TIM2)向上、向下、向上/向下自動裝載計數器,注意:
TIM15、TIM16 只支持向上(遞增)計數方式; -
16 位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲 1~65535 之間的任
意數值。 -
4 個獨立通道(TIMx_CH1~4, 其中 TIM15 最多 2 個通道, TIM16 最多 1 個
通道),這些通道可以用來作爲:- 輸入捕獲
- 輸出比較
- PWM 生成(邊緣或中間對齊模式)
- 單脈衝模式輸出
-
可使用外部信號控制定時器和定時器互連的同步電路。
-
如下事件發生時產生中斷/DMA:
- 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
- 觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)
- 輸入捕獲
- 輸出比較
知識小卡片結束啦~
接下來開始配置TIM16定時器的PWM功能:
首先選擇TIM
,選擇通道1的功能,默認的CH1是PA6
引腳,但是開發板上是與 PB8 連接的,所以在右邊將PB8配置爲TIM16_CH1
:
接下來是對TIM16的參數設置,參照數據手冊中的RCC時鐘樹,TIM16內部時鐘來源是PCLK2 = 80Mhz
,我們的目的是產生1khz
的PWM,所以預分頻係數設置爲80-1
,自動重載值爲1000-1
,得到的計時器更新中斷頻率即爲80000000/80/1000 = 1000 Hz = 1K Hz
:
其餘的一些設置保持默認即可,最後配置PWM佔空比:
配置時鐘樹
STM32L4的最高主頻到80M,所以配置PLL,最後使HCLK = 80Mhz
即可:
生成工程設置
代碼生成設置
最後設置生成獨立的初始化文件:
生成代碼
點擊GENERATE CODE
即可生成MDK-V5工程:
3. 在MDK中編寫、編譯、下載用戶代碼
啓動定時器併產生PWM
最後在main
函數中開啓TIM2並使能其中斷(TIM2初始化代碼之後):
while (1)
{
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_Delay(1000);
HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1);
HAL_Delay(1000);
}
測試結果
編譯下載後即可聽到無源蜂鳴器開始工作。
至此,我們已經學會如何使用通用定時器產生PWM驅動蜂鳴器,下一節將講述如何使用硬件IIC接口讀寫EEPROM。