AT32重映射输出PWM

最近在用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左右。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用部分重映射的例程,将STM32定时器3的通道1和通道2配置为PWM输出: ```c #include "stm32f4xx.h" void TIM3_PWM_Init(void) { // 启用定时器3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 定时器初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; // 初始化定时器3的时基配置 TIM_TimeBaseInitStruct.TIM_Prescaler = 0; // 不分频 TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 上计数模式 TIM_TimeBaseInitStruct.TIM_Period = 999; // 设置ARR为999,频率为1kHz TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频为1 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); // 配置定时器3的通道1和通道2作为PWM输出 TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 输出使能 TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性为高 TIM_OCInitStruct.TIM_Pulse = 0; // 初始占空比为0 TIM_OC1Init(TIM3, &TIM_OCInitStruct); TIM_OC2Init(TIM3, &TIM_OCInitStruct); // 配置定时器3通道1和通道2的GPIO引脚 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // 启用GPIOB时钟 GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); // 将PB4引脚映射到定时器3通道1 GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); // 将PB5引脚映射到定时器3通道2 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; // 复用模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; // PB4和PB5 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // 100MHz输出速度 GPIO_Init(GPIOB, &GPIO_InitStruct); // 启动定时器3 TIM_Cmd(TIM3, ENABLE); } ``` 这个例程将定时器3配置为1kHz的PWM输出,占空比初始值为0。你可以根据需要修改TIM_TimeBaseInitStruct.TIM_Period的值来调节PWM的频率。使用GPIO_PinAFConfig函数将PB4和PB5引脚映射到定时器3的通道1和通道2。最后,通过调用TIM_Cmd函数启动定时器3。 请注意,这只是一个简单的例程,你可能需要根据你的具体需求进行更多的配置和调整。请参考STM32的相关文档以获取更多详细信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值