首先需要重點設定以下參數:
- static inline void pwm_set_reload(PWM_Type *pwm_x,uint8_t ex_reload,uint32_t reload)
② 比較值cmp:用于定時器計數時判斷計數是否溢出
③ 比較模式mode:用于設定定時器比較模式,有輸出比較與輸入比較兩種
typedef enum pwm_cmp_mode {pwm_cmp_mode_output_compare = 0, /**< output compare*/pwm_cmp_mode_input_capture = 1, /**< input compare*/} pwm_cmp_mode_t;
④ 觸發方式更新update_trigger:分為以下四種更新方式:
typedef enum pwm_register_update {pwm_shadow_register_update_on_shlk = 0, /**< after software set shlk bit of shlk register*/pwm_shadow_register_update_on_modify = 1, /**?immediately after the register being modified*/pwm_shadow_register_update_on_hw_event = 2, /**?after hardware event assert*/pwm_shadow_register_update_on_sh_synci = 3, /**< after SHSYNCI assert */} pwm_shadow_register_update_trigger_t;
官方也給出了一個PWM定時器配置的示例,示例如下
void config_pwm(PWM_Type *ptr, uint8_t pin, uint8_t cmp_index, uint32_t reload, bool cmp_initial_zero, uint8_t hw_event_cmp){pwm_cmp_config_t cmp_config = {0};pwm_config_t pwm_config = {0};pwm_stop_counter(ptr);pwm_get_default_pwm_config(ptr, &pwm_config);//復位默認pwm寄存器配置pwm_get_default_cmp_config(ptr, &cmp_config);//復位默認比較寄存器配置pwm_config.enable_output = false;pwm_config.dead_zone_in_half_cycle = 0;//半周期PWM死區設定pwm_config.invert_output = false;//反轉輸出電平設定pwm_set_reload(ptr, 0, reload);//設置重裝載值pwm_set_start_count(ptr, 0, 0);//設置PWM定時器起始值//預配置寄存器信息cmp_config.mode = pwm_cmp_mode_output_compare;//設定PWM定時器比較模式為cmp_config.cmp = cmp_initial_zero ? 0 : reload + 1;//設定比較值cmpcmp_config.update_trigger = pwm_shadow_register_update_on_modify;//更新觸發方式為立即更新pwm_config_cmp(ptr, cmp_index, &cmp_config);//PWM配置更新//更新觸發器類型,以便在硬件事件(重新加載)時更新比較值cmp_config.update_trigger = pwm_shadow_register_update_on_hw_event;//將pwm配置為cmp驅動的輸出if (status_success != pwm_setup_waveform(ptr, pin, &pwm_config, cmp_index, &cmp_config, 1)) {printf("failed to setup waveformn");while(1);}//pwm_setup_waveform設定輸出PWM波形//配置硬件事件cmp_config.cmp = reload - 1;cmp_config.update_trigger = pwm_shadow_register_update_on_hw_event;pwm_load_cmp_shadow_on_match(ptr, hw_event_cmp, &cmp_config);//設定影子寄存器}
PWM定時器配置完成后,對定時器中斷綁定服務函數及分配相應優先級,并使能開始計數即可完成設定
static inline void pwm_start_counter(PWM_Type *pwm_x)intc_m_enable_irq_with_priority(irq, priority)
使用時如需更新PWM輸出狀態即占空比,可使用以下函數進行邊沿對齊
- pwm_update_raw_cmp_edge_aligned(pwm, pwm_cmp, duty);
以上,加之上篇的GPIO與外部中斷的介紹,對于MCU的簡單應用暫告一段落,GPIO、外部中斷、PWM定時器為MCU最基本的功能,對于體驗而言還是比較輕松的,配置起來也不是特別繁瑣,主要歸功于官方所提供的庫函數,使用的流程也與傳統的MCU類似。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
mcu
+關注
關注
146文章
17171瀏覽量
351519 -
先楫半導體
+關注
關注
10文章
214瀏覽量
2127
發布評論請先 登錄
相關推薦
有獎提問!先楫半導體HPM6E00系列新品發布會!!
半導體HPM6E00新品預覽”的活動,盛況空前。
自此之后一直收到大家的信息,問什么時候能夠買到HPM6E00,這不,我們來了~
先楫
發表于 06-20 11:45
先楫半導體 hpm_sdk v1.5.0 正式發布
先楫半導體 hpm_sdk v1.5.0 正式發布!功能升級更強大
版本更新概況
新支持的IDE
IAR Embedded Workbench for RISC-V (測試版本3.20
發表于 04-08 11:14
芯原2.5D GPU IP賦能先楫半導體HPM6800系列RISC-V MCU
芯原股份(股票代碼:688521.SH)與先楫半導體(簡稱“先楫”)的合作,為高性能圖形處理領域帶來了新的突破。
【先楫HPM5361EVK開發板試用體驗】(原創)5.手把手實戰AI機械臂
與ChatGPT API結合,使機械臂能夠基于視覺信息和AI指令進行動作。
今天先更新到這里...
謝謝!
接上四篇:
【先楫HPM5361EVK開發
發表于 02-06 10:28
評論