最近在用AT32F403AVGT7,本来想用想用正常的TMR1的TMR_SELECT_CHANNEL_1和TMR_SELECT_CHANNEL_2做PWM输出,但是不巧的是PA8和PA9我做其他用了,所以今天记录下用PE9和PE11的重映射功能输出PWM。
配置代码
/**
* @brief PWM参数配置TMR1配置
* @param none
* @retval none
*/
static void PWM_configuration(void)
{
//定时器输出配置结构体
tmr_output_config_type tmr_oc_init_structure;
//GPIO配置结构体
gpio_init_type gpio_init_struct;
//使能TMR1时钟
crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);
//复用时钟使能
crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
//重映射TIMER1
gpio_pin_remap_config(TMR1_MUX_11,TRUE);
//开启GPIOE时钟
crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE); //开启gpioB时钟
//初始化GPIO参数
gpio_default_para_init(&gpio_init_struct);
//引脚
gpio_init_struct.gpio_pins = GPIO_PINS_9 | GPIO_PINS_11;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; //推挽输出
gpio_init_struct.gpio_pull = GPIO_PULL_NONE; //无上下拉
gpio_init_struct.gpio_mode = GPIO_MODE_MUX; //复用
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOE, &gpio_init_struct);
//设置重装载值和预分频 预分频239 重装载值99 周期1ms
tmr_base_init(TMR1, 999, 239);
//设置为向上计数方式
tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);
//初始化定时器输出结构体
tmr_output_default_para_init(&tmr_oc_init_structure);
//PWM模式A
tmr_oc_init_structure.oc_mode = TMR_OUTPUT_CONTROL_PWM_MODE_A;
//输出通道空闲
tmr_oc_init_structure.oc_idle_state = FALSE;
//极性,高电平有效
tmr_oc_init_structure.oc_polarity = TMR_OUTPUT_ACTIVE_HIGH;
//使能输出
tmr_oc_init_structure.oc_output_state = TRUE;
//设置TMR1的通道1
tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_1, &tmr_oc_init_structure);
//设置TMR1的通道1的数据寄存器的值(占空比) 占空比= 120 / 999
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, 120);
//设置TMR1的通道1的数据寄存器的值,溢出事件时更新
tmr_output_channel_buffer_enable(TMR1, TMR_SELECT_CHANNEL_1, TRUE);
//设置TMR1的通道1
tmr_output_channel_config(TMR1, TMR_SELECT_CHANNEL_2, &tmr_oc_init_structure);
//设置TMR1的通道1的数据寄存器的值(占空比)
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, 120);
//设置TMR1的通道1的数据寄存器的值,溢出事件时更新
tmr_output_channel_buffer_enable(TMR1, TMR_SELECT_CHANNEL_2, TRUE);
tmr_period_buffer_enable(TMR1, TRUE); //TMR1 的重载值,溢出事件时更新
tmr_output_enable(TMR1, TRUE); //使能输出,高级定时器特有。
tmr_counter_enable(TMR1, TRUE); //使能tmr,开始计数
}
这里输出后可以使用万用表测量对应引脚输出大概是0.39-0.4V左右。