4142|4

13

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

stm32用定时器配置输出PWM波形 [复制链接]

最近开始学习STM32用定时器配置输出PWM波形,遇到了瓶颈,在网上百度了很多资料,发现大部分都是通过TIM3来实现PWM输出的,讲述也不近详细。我这边参考TIM3的例子,来对TIM4进行相应配置,意外发现GPIOB_Pin_9配置成复用推挽输出时,即使对管脚直接置1,输出电平仍然是低电平。stm32定时器相关知识不够,希望有大神能提点哈!

此帖出自stm32/stm8论坛

最新回复

对管脚直接置1,输出电平仍然是低电平,不使能PWM的配置时,是不是可以输出高低电平。这个io配成PWM功能,就不能当成普通io操作。  详情 回复 发表于 2017-11-29 12:43
点赞 关注
 

回复
举报

18

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 axbin 于 2017-11-28 16:20 编辑

正好有一个STM32F429的pwm驱动蜂鸣器的例子,一共就那么几个寄存器,一看就明白,变量是手动定义的

//PWM mode 1 - In upcounting, channel 1 is active as long as TIMx_CNTTIMx_CCR1 else active(OC1REF = 1).
#define def_TIM_OCMODE_PWM1                6
//PWM mode 2 - In upcounting, channel 1 is inactive as long as TIMx_CNTTIMx_CCR1 else inactive.
#define def_TIM_OCMODE_PWM2                7

static u32 g_Counter_Clock = 0;

void TIM2_Init(void)
{
        // 禁用中断
        NVIC_DisableIRQ(TIM2_IRQn);

        // 开timer寄存器的读写clock
        SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);

        // 停止计数
        CLEAR_BIT(TIM2->CR1, TIM_CR1_CEN);

        // 默认Upcounter
        // 默认UIE=0,禁用中断
        // 默认Edge-aligned mode
        // Select update request source
        SET_BIT(TIM2->CR1, TIM_CR1_URS); // Only counter overflow/underflow generates an update interrupt

        // 默认Master mode = Reset
        //TIM2->CR2 |= 0;
        // Slave mode disabled,禁止从模式,Timer的时钟来自内部时钟
        WRITE_REG(TIM2->SMCR, 0);

        // 设置Timer的分频,直接以CK_CNT运行,这里CK_CNT来自APB1 timer clock
        WRITE_REG(TIM2->PSC, 0);

        g_Counter_Clock = g_APB1TimerClock;

        // 设置Channel3 以PWM1模式输出 TIMx_CNT         SET_BIT(TIM2->CCMR2, (def_TIM_OCMODE_PWM1 << TIM_CCMR2_OC3M_Pos));

        // 默认极性OC1 active high,active时输出1
        CLEAR_BIT(TIM2->CCER, TIM_CCER_CC3P);

        // 启用以下两个Preload register的作用:如果重新设置分频和占空比不会立即加载,在一个周期结束后再起作用
        // Preload register on TIMx_CCR3 enabled
        SET_BIT(TIM2->CCMR2, TIM_CCMR2_OC3PE);
        // TIMx_ARR register is buffered
        SET_BIT(TIM2->CR1, TIM_CR1_ARPE);
}
        
// 决定PWM的频率        
void TIM2_PWM_UpdateFrequency(u32 frequency)
{
        if (frequency > 0)
        {
                // auto-reload value which decides PWM frequency
                WRITE_REG(TIM2->ARR, g_Counter_Clock / frequency - 1);
        }
}

// 决定PWM的占空比 duty: 0~100
void TIM2_PWM_UpdateDuty(u32 duty)
{
        if (duty <= 100)
        {
                WRITE_REG(TIM2->CCR3, duty * (TIM2->ARR + 1) / 100);
        }
}

// duty: 0~100
void TIM2_PWM_Start(u32 frequency, u32 duty)
{
        TIM2_PWM_UpdateFrequency(frequency);

        TIM2_PWM_UpdateDuty(duty);

        // 产生一次Update Event,把preload register的值更新shadow register
        SET_BIT(TIM2->EGR, TIM_EGR_UG);

        //IO port B clock enable
        SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);

        // PB10 as TIM2-CH3
        SET_BIT(GPIOB->MODER, (def_PORT_MODE_AF << GPIO_MODER_MODE10_Pos)); // AF mode of PB10
        SET_BIT(GPIOB->AFR[1], (1 << GPIO_AFRH_AFSEL10_Pos)); // AF1 of PB10

        // 启动TIM2
        SET_BIT(TIM2->CR1, TIM_CR1_CEN);

        // OC3 signal is output on the corresponding output pin
        SET_BIT(TIM2->CCER, TIM_CCER_CC3E);
}

void TIM2_PWM_Stop(void)
{
        CLEAR_BIT(TIM2->CR1, TIM_CR1_CEN);

        // OC3 is not active
        CLEAR_BIT(TIM2->CCER, TIM_CCER_CC3E);

        // PB10恢复默认输入模式,保证三极管断开,使蜂鸣器断电
        CLEAR_BIT(GPIOB->MODER, GPIO_MODER_MODE10_Msk);
}
此帖出自stm32/stm8论坛
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
复用以后不可以再对操作
此帖出自stm32/stm8论坛
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

4
 
对管脚直接置1,输出电平仍然是低电平,不使能PWM的配置时,是不是可以输出高低电平。这个io配成PWM功能,就不能当成普通io操作。
此帖出自stm32/stm8论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(初级)

5
 
感谢各位大神的即时指点,能够根据芯片数据手册做一些PWM输出波形的基础配置了,之前一直没有怎么注意到TIM4定时器输出PWM对相应输出管脚有一定的限制,改了后,能够正常了。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表