打印

有没有GD的技术支持?GD32F103C8T6 定时器 PWM输出的问题

[复制链接]
3883|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sqqdfny|  楼主 | 2015-10-22 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sqqdfny 于 2015-10-22 15:14 编辑

同一个板子,之前用STM32F103C8T6  定时器 TIM2  CH(PA1)输出 PWM,换用GD之后,没输出了。软件没做任何更改,其它功能都是OK的。


static u32 buzzerOnCount = 0;
static u32 buzzerOnTimeTick = 0;
static _bool buzzerOnFlag = 0;
//===================================================================
//蜂鸣器
void BUZZER_ON()             
{
        TIM2->CR1 |= BIT0;  //start
        buzzerOnFlag = 1;
}

void BUZZER_OFF()            
{
  TIM2->CR1 &= ~BIT0;  //stop
        TIM2->CNT = 0;
        buzzerOnFlag = 0;
}

#define GetBeerStatus()                (buzzerOnFlag > 0 ? 1 : 0)



//蜂鸣器控制
void BuzzerTimeHook(void)
{
        if(buzzerOnCount)
        {
                if(buzzerOnTimeTick)
                {
                        buzzerOnTimeTick --;
                        return;
                }
               
                if(!GetBeerStatus())
                {
                        BUZZER_ON();
                        buzzerOnTimeTick = SYSTEM_TICK / 10;
                }
                else
                {
                        BUZZER_OFF();
                        buzzerOnCount -- ;
                        buzzerOnTimeTick = (SYSTEM_TICK / 20);       
                }
        }       
}

void BuzzerOn(u32 cnt)
{
        buzzerOnCount = (cnt > 10) ? 10 : cnt;
}

void BuzzerInit(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        TIM2->PSC = 23;                          //1us
        TIM2->ARR = 250;                              //250us
        TIM2->CR1 = (0 << 4) | (1 << 7);  //
        TIM2->CR2 = 0;
        TIM2->SMCR = 0;                   //
        TIM2->DIER = 0;                   //
        TIM2->CCER = 0;
        TIM2->CCMR1 = (1<<10) | (7<<12);
        TIM2->CCMR2 = 0;
        TIM2->CCER = (1<<4) | (0<<5);
        TIM2->CCR2 = 125;
}
//=================================================================
void BuzzerEnterSleep(void)
{
        TIM2->CR1 &= ~BIT0;  //stop
        TIM2->CNT = 0;
        buzzerOnFlag = 0;
}
//=================================================================

//end files

沙发
mgiga| | 2015-10-22 16:09 | 只看该作者
你看下程序里TIM2中断标志位他是怎么清零的,如果他是读寄存器进行清零的话你改成软件清零试一下。

使用特权

评论回复
板凳
sqqdfny|  楼主 | 2015-10-22 17:06 | 只看该作者
mgiga 发表于 2015-10-22 16:09
你看下程序里TIM2中断标志位他是怎么清零的,如果他是读寄存器进行清零的话你改成软件清零试一下。 ...

你好,能不能详细解释一下。不是很明白你的意思,我只是输出 PWM,没有开启中断。谢谢。

使用特权

评论回复
地板
sqqdfny|  楼主 | 2015-10-22 17:10 | 只看该作者
sqqdfny 发表于 2015-10-22 17:06
你好,能不能详细解释一下。不是很明白你的意思,我只是输出 PWM,没有开启中断。谢谢。 ...

我在MDK仿真里面看定时器是正常运行的,就是PA1没有输出 PWM

使用特权

评论回复
5
mgiga| | 2015-10-23 13:29 | 只看该作者
本帖最后由 mgiga 于 2015-10-23 13:31 编辑
sqqdfny 发表于 2015-10-22 17:10
我在MDK仿真里面看定时器是正常运行的,就是PA1没有输出 PWM

就是那个PWM产生的程序,我也不知道芯片内部是怎么产生要输出的PWM波的(硬件生成OR软件生成),如果是软件生成的话很可能用到了某个中断,STM的时候读取状态寄存器就能自动清零,但GD不能。PWM生成的处理过程可能STM与GD是有差别的,不知道是不是这个原因,但是如果方便的话你可以换成GD的库试一下

使用特权

评论回复
6
vivilzb1985| | 2015-10-24 17:30 | 只看该作者
这个看下相关的输出IO口的设置的吧

使用特权

评论回复
7
microGiga| | 2015-10-28 18:23 | 只看该作者
要研究一下原来的源代码中初始化TIM2的和PA1的代码具体是怎么配置的。如果确定时钟源已经正确启动就要比较一下定时器的链路中的配置是否一致。

使用特权

评论回复
8
diedmen| | 2021-4-23 14:50 | 只看该作者
这个问题是怎么解决的?我也遇到一样的问题

使用特权

评论回复
9
zeshoufx| | 2021-4-23 15:14 | 只看该作者
你对比了两者的寄存器吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

1

粉丝