使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面使用PWM來實現LED呼吸燈效果。
1 新建項目
- 在PIO主頁新建項目pwm,框架選擇libopencm3,開發板選擇 MonkeyPi_STM32_G070RB;
- 新建完成后在src目錄新建主程序文件main.c;
- 然后更改項目文件platformio.ini的燒寫和調試方式:
1upload_protocol = cmsis-dap
2debug_tool = cmsis-dap
2 PWM配置
- GPIO設置為復用PWM輸出
1/**
2 * @brief gpio config
3 *
4 */
5static void gpio_setup(void)
6{
7 rcc_periph_clock_enable(RCC_GPIOC);
8
9 gpio_mode_setup(GPIOC,
10 GPIO_MODE_AF,
11 GPIO_PUPD_NONE,
12 GPIO12);
13
14 gpio_set_output_options(GPIOC,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO12);
15
16 //TIM14_CH1 , AF2
17 gpio_set_af(GPIOC,GPIO_AF2,GPIO12);
18}
- PWM配置
1/**
2 * @brief pwm channel setup
3 *
4 */
5static void pwm_setup(void)
6{
7 rcc_periph_clock_enable(RCC_TIM14);
8
9 /* Timer global mode:
10 * - No divider
11 * - Alignment edge
12 * - Direction up
13 */
14 timer_set_mode(TIM14, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
15
16 /*
17 * APB1 PRE = 1, TIMPCLK = PCLK
18 * APB1 PRE != 1, TIMPCLK = PCLK * 2
19 */
20 timer_set_prescaler(TIM14, (rcc_apb1_frequency/100000-1)); //100KHz
21
22 /* Disable preload. */
23 timer_disable_preload(TIM14);
24 timer_continuous_mode(TIM14);
25
26 /* Timer Period */
27 timer_set_period(TIM14, 20-1); /* 100kHz /20 = 5 KHz */
28
29 /* Set the initual output compare value for OC1. */
30 timer_set_oc_mode(TIM14, TIM_OC1, TIM_OCM_PWM1);
31 timer_set_oc_value(TIM14, TIM_OC1, 20*0.3); //duty = 0.3
32
33 /* Enable output */
34 timer_enable_oc_output(TIM14, TIM_OC1);
35 timer_enable_counter(TIM14);
36}
先配置定時器的預分頻和周期,這里設置到周期為5KHz,可以參考定時器章節的說明;
然后使用timer_set_oc_value 設置占空比,占空比根據定時器周期計算,比如這里設置為30%占空比;
- 將程序燒寫到開發板后可以測量引腳的輸出PWM波形如下:
image-20220912105400109
3 呼吸燈效果
實現呼吸燈效果就是更改占空比,讓其從0-100變化在從100-0變化即可;
1int duty = 0;
2
3while(1){
4
5 //from 0 - 100
6 for(duty=0; duty <= 100; duty++){
7 duty = duty + 1;
8 timer_set_oc_value(TIM14,TIM_OC1, 20*duty/100);
9
10 //delay some time
11 for(int i=0; i<600000; i++){
12 __asm__("nop");
13 }
14 }
15
16 //from 100-0
17 for(duty=100;duty>=0; duty--){
18 duty = duty - 1;
19 timer_set_oc_value(TIM14,TIM_OC1, 20*duty/100);
20
21 //delay some time
22 for(int i=0; i<600000; i++){
23 __asm__("nop");
24 }
25
26 }
27
28}
通過 timer_set_oc_value 改變輸出占空比,然后延時一定時間即可達到呼吸燈的效果。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
led
+關注
關注
242文章
23277瀏覽量
660846 -
PWM
+關注
關注
114文章
5186瀏覽量
213919 -
STM32
+關注
關注
2270文章
10900瀏覽量
355985 -
開發板
+關注
關注
25文章
5050瀏覽量
97456 -
呼吸燈
+關注
關注
10文章
110瀏覽量
42728
發布評論請先 登錄
相關推薦
STM32G0開發筆記:FreeRTOS和FreeModbus庫使用
使用Platformio平臺的libopencm3開發框架來開發STM32G0,以下為FreeRTOS和FreeModbus庫使用。
STM32G0開發筆記:使用FreeRTOS系統的隊列Queue
使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為使用FreeRTOS系統的隊列Queue。
STM32G0開發筆記:GPIO接按鍵的使用方式
使用Platformio平臺的libopencm3開發框架來開發STM32G0,下面為GPIO接按鍵的使用方式。
評論