本帖最后由 jf_32467263 于 2022-6-19 12:18 编辑
三、pwm定时器配置 首先需要重点设定以下参数: ① 重装载RLD寄存器值:该函数有两个重装载值,通常配置reload即可,而ex_reload用于当reload寄存器不够时提供扩展
- 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;//设定比较值cmp cmp_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类似。
|