用Timer1验证过程序功能没有问题,但是将引脚换成PA7和Timer13就出不来波形了。
rcu_periph_clock_enable(RCU_GPIOA);
// rcu_periph_clock_enable(RCU_AF);
gpio_pin_remap_config(GPIO_TIMER13_REMAP, ENABLE);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_7);//
```c
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER13);//RCU_TIMER1
timer_deinit(TIMER13);//TIMER1
/* TIMER1 configuration */
timer_initpara.prescaler = 179;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 15999;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER13,&timer_initpara);//TIMER1
// /* CH0,CH1 and CH2 configuration in PWM mode */
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
// timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
// timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
// timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER13,TIMER_CH_0,&timer_ocintpara);//TIMER1
timer_channel_output_pulse_value_config(TIMER13,TIMER_CH_0,15999*0.5f);//TIMER1
timer_channel_output_mode_config(TIMER13,TIMER_CH_0,TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER13,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
timer_channel_output_pulse_value_config(TIMER13,TIMER_CH_1,15999*0.5f);//TIMER1
timer_channel_output_mode_config(TIMER13,TIMER_CH_1,TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER13,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
/* auto-reload preload enable */
timer_auto_reload_shadow_enable(TIMER13);
/* auto-reload preload enable */
timer_enable(TIMER13);
```
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据你提供的代码,可以看出你在配置 PA7 和 Timer13 为 PWM 输出时,使用了引脚重映射功能 gpio_pin_remap_config(GPIO_TIMER13_REMAP, ENABLE)
,这意味着你需要将 PA7 引脚连接到正确的重映射引脚上。
根据 GD32E503 数据手册,PA7 可以重映射到 TIMER13_CH0,因此你需要将 PA7 引脚连接到开发板上对应的重映射引脚上,以便正确地输出 PWM 波形。
另外,还需要注意以下几点:
确保已经使能了 GPIOA 和 TIMER13 的时钟,你的代码中已经使用了 rcu_periph_clock_enable(RCU_TIMER13)
,但是没有使用 rcu_periph_clock_enable(RCU_GPIOA)
,因此需要添加该行代码。
在配置 TIMER13_CH0 为 PWM 输出时,你需要调用 timer_channel_output_config()
函数,将 timer_ocintpara
结构体中的 outputnstate
和 ocnpolarity
成员设置为默认值 TIMER_CCXN_DISABLE
和 TIMER_OCN_POLARITY_HIGH
,因为 TIMER13_CH0 没有对应的互补输出和极性。
在调用 timer_channel_output_pulse_value_config()
函数设置占空比时,需要注意参数的范围。根据你的代码,timer_initpara.period
的值为 15999,因此可以设置占空比为 50% 的脉宽为 8000,即 timer_channel_output_pulse_value_config(TIMER13, TIMER_CH_0, 8000)
。
下面是修改后的代码片段,仅供参考:
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_TIMER13);
gpio_pin_remap_config(GPIO_TIMER13_REMAP, ENABLE);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
timer_parameter_struct timer_initpara = {
.prescaler = 179,
.alignedmode = TIMER_COUNTER_EDGE,
.counterdirection = TIMER_COUNTER_UP,
.period = 15999,
.clockdivision = TIMER_CKDIV_DIV1,
.repetitioncounter = 0
};
timer_init(TIMER13, &timer_initpara);
timer_oc_parameter_struct timer_ocintpara = {
.outputstate = TIMER_CCX_ENABLE,
.ocpolarity = TIMER_OC_POLARITY_HIGH,
.ocidlestate = TIMER_OC_IDLE_STATE_LOW
};
timer_channel_output_config(TIMER13, TIMER_CH_0, &timer_ocintpara);
timer_channel_output_pulse_value_config(TIMER13, TIMER_CH_0, 8000);
timer_channel_output_mode_config(TIMER13, TIMER_CH_0, TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER13, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
timer_auto_reload_shadow_enable(TIMER13);
timer_enable(TIMER13);
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
该回答引用chatgpt:希望对你有帮助,如果没有用,不喜勿喷
根据你提供的代码,我发现你没有开启Timer13的通道0中断。需要使用 eclic_enable_interrupt(TIMER13_IRQn, 1, 1); 或者 nvic_irq_enable(TIMER13_IRQn, 1, 1); 开启中断。此外,在中断处理函数中清除中断标志,例如在 void TIMER13_IRQHandler(void) 函数中,需要调用 timer_interrupt_flag_clear(TIMER13, TIMER_INT_CH0) 清除通道0的中断标志。
此外,我还注意到你使用了 gpio_pin_remap_config(GPIO_TIMER13_REMAP, ENABLE) 函数来重映射引脚,这个函数的作用是将 Timer13_CH0 的输出映射到 PA7 引脚上,但你需要确认你的硬件支持该映射功能,否则可能导致引脚不输出 PWM 波形。
首先需要确认引脚和定时器的配置是否正确。对于PA7和Timer13,需要将PA7设置为复用功能,并将其复用为Timer13的CH0输出。同时,需要使能GPIOA和Timer13的时钟。以下是配置代码示例:
// 使能GPIOA和Timer13的时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_TIMER13);
// 配置PA7为复用功能并复用为Timer13的CH0输出
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
gpio_pin_remap_config(GPIO_TIMER13_PARTIAL_REMAP, ENABLE);
// 配置Timer13为PWM输出模式
timer_oc_parameter_struct timer_ocinitpara;
timer_parameter_struct timer_initpara;
timer_struct_para_init(&timer_initpara);
timer_struct_para_init(&timer_ocinitpara);
timer_deinit(TIMER13);
timer_initpara.prescaler = 71; // 分频系数
timer_initpara.period = 999; // 自动重装载值
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; // 时钟分频
timer_initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数
timer_init(TIMER13, &timer_initpara);
timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // 输出极性为高
timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; // 使能捕获比较通道
timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; // 输出空闲状态为低
timer_ocinitpara.ocmode = TIMER_OC_MODE_PWM1; // PWM模式1
timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // 输出极性为高
timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH; // 输出空闲状态为高
timer_ocinit(TIMER13, TIMER_CH_0, &timer_ocinitpara);
// 启动定时器
timer_enable(TIMER13);
在配置完成后,即可通过改变Timer13的CCR值来控制PWM波的占空比。例如,设置CCR为500,则占空比为50%。
timer_channel_output_pulse_value_config(TIMER13, TIMER_CH_0, 500);
注意,在使用Timer13输出PWM波时,其时钟频率为SystemCoreClock/72,即72MHz。因此,分频系数需要设置为71,以得到1MHz的计数频率。同时,在设置自动重装载值时,需要考虑到PWM波的频率和分辨率,以得到合适的自动重装载值。
GD32实战13__PWM
可以借鉴下
https://blog.csdn.net/qq_17854661/article/details/91951400
引用chatGPT作答,首先,您需要确认引脚映射是否正确,并且PA7是否已经被正确配置为复用模式。
您在代码中使用了函数gpio_pin_remap_config(),这表明您使用了重映射功能。 请确保您的芯片确实支持此功能,并且您已经正确地配置了重映射寄存器以将TIMER13映射到PA7上。
接下来,请确认您的PWM配置是否正确。 在您的代码中,您只配置了通道0的PWM模式,但您似乎没有配置通道1的PWM模式。 您可以尝试将通道1的PWM模式配置与通道0的PWM模式配置相同,看看是否会有任何改善。
另外,您可以通过使用示波器检查PWM波形的输出情况,以帮助您进一步诊断问题。
最后,请确保您的TIMER13时钟已经启用,并且您已经正确地配置了TIMER13的初始化参数。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
从你提供的代码和描述中,我们可以看出你正在尝试使用GD32E503的TIMER13模块输出PWM波到PA7引脚上。但是你描述说没有出现PWM波。我根据你提供的信息,将尝试解决该问题。
首先,我们应该确认TIMER13时钟已经开启。在你的代码中,我们可以看到RCU_TIMER13已经被开启。但你注释掉了RCU_AF,而GPIO复用时钟(RCU_AF)必须开启,因为TIMER13的CH0的输出映射到了PA7上。
因此,我们需要开启RCU_AF,方法如下:
rcu_periph_clock_enable(RCU_AF);
其次,我们应该在GPIOA上设置引脚复用。你的代码中,gpio_pin_remap_config(GPIO_TIMER13_REMAP, ENABLE)表示你已经开启了TIMER13的复用,但没有贴出下面的具体代码。我假定你已经设置好了GPIOA上PA7的复用为TIMER13_CH0了。那么,在你的初始化代码timer_initpara之后, 应该加上如下设置GPIOA引脚的代码:
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
这将启用GPIOA上PA7的复用功能,并设置为推挽输出模式,频率为50MHz。GPIO_MODE_AF_PP宏表示该引脚被设置为复用模式推挽输出。
最后,请确保你的TIMER13输出引脚(COMP13)是正确地连接到PA7引脚上。
关于代码中的其他内容:
timer_channel_output_config(TIMER13,TIMER_CH_0,&timer_ocintpara);
这里表示你正在初始化TIMER13的CH0,但你没有初始化CH1。
timer_channel_output_pulse_value_config(TIMER13,TIMER_CH_0,15999*0.5f);
你将CH0的占空比设置为50%(15999*0.5f)。
timer_channel_output_pulse_value_config(TIMER13,TIMER_CH_1,15999*0.5f);
你没有初始化CH1占空比。
timer_channel_output_mode_config(TIMER13,TIMER_CH_0,TIMER_OC_MODE_PWM0);
你已经设置了CH0的PWM模式为0。
timer_channel_output_shadow_config(TIMER13,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);
你没有启用影子寄存器。建议启动。如果你打算使用影子寄存器,将最后一个参数由TIMER_OC_SHADOW_DISABLE更改为TIMER_OC_SHADOW_ENABLE。
最后,我们可以看到你已经正确的初始化了TIMER13,并设置了CH0的占空比。如果你的PA7引脚的复用设置正确,则可以在PA7引脚上看到PWM波。如果仍然没有出现波形,请确认引脚连接。
如果我的回答解决了您的问题,请采纳!