打印

STM32F103 利用TIM4进行DMA比较输出遇到问题

[复制链接]
4607|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
是这样的,我想利用定时器2的CH1通道,比较输出波形,然后利用DMA的方式来输出。周期为1000us,分别输出50%, 37.5%, 25%占空比的波形。结果发现了问题。
如果我的DMA设置为单次的,用逻辑分析仪捕获到的波形是对的,如下图所示,3个高电平分别为500us ,  375us , 250us   ;



但是,如果我选择周期性DMA,则波形出现变化,经过分析,就是最后一次的DMA和第一次的DMA重合了,表现的波形如下所示:


这个问题已经折磨我好久了,真的不知道怎么解决。
希望有知道的人能帮助我一下,到底这是怎么回事啊?
沙发
honami520|  楼主 | 2012-5-20 23:59 | 只看该作者
实在是没辙了,只能求助各位。

使用特权

评论回复
板凳
honami520|  楼主 | 2012-5-21 00:07 | 只看该作者
GPIO_InitTypeDef GPIO_InitStruct;
        DMA_InitTypeDef DMA_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        uint16_t TimerPeriod = 0;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        /* GPIOA Configuration: Channel 2 as alternate function push-pull */
        GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStruct);       
       
        /* DMA1 Channel5 Config */
        DMA_DeInit(DMA1_Channel1);

        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM4_CCR1_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = 3;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

        /* DMA1 Channel5 enable */
        DMA_Cmd(DMA1_Channel1, ENABLE);
       
        /* Compute the value to be set in ARR register to generate signal frequency at 17.57 Khz */
        TimerPeriod = (SystemCoreClock / 1000 ) - 1;
        /* Compute CCR1 value to generate a duty cycle at 50% */
        SRC_Buffer[0] = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);
        /* Compute CCR1 value to generate a duty cycle at 37.5% */
        SRC_Buffer[1] = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);
        /* Compute CCR1 value to generate a duty cycle at 25% */
        SRC_Buffer[2] = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);
       
        /* TIM4 Peripheral Configuration --------------------------------------------*/
        /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
       
        /* Channel 2 Configuration in PWM mode */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_Pulse = SRC_Buffer[0];
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
//        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

        TIM_OC1Init(TIM4, &TIM_OCInitStructure);
       
        /* TIM4 Update DMA Request enable */
        TIM_DMACmd(TIM4, TIM_DMA_CC1, ENABLE);
       
//        TIM_CCPreloadControl(TIM4, ENABLE);

        /* TIM1 counter enable */
        TIM_Cmd(TIM4, ENABLE);

        /* Main Output Enable */
        TIM_CtrlPWMOutputs(TIM4, ENABLE);

使用特权

评论回复
地板
honami520|  楼主 | 2012-6-20 15:37 | 只看该作者
结贴。

使用特权

评论回复
5
321weare| | 2012-6-20 17:37 | 只看该作者
路过。。。。:lol

使用特权

评论回复
6
hflyer| | 2012-8-31 16:06 | 只看该作者
3# honami520
楼主还没说说如何好的呢

我碰到了一样的问题,还没解决

使用特权

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

本版积分规则

个人签名:http://stm8.taobao.com/ STM8L152开发板,最新发布30套测试程序,每一套都配视频教程。 承接各类电子产品项目开发,全职接单,有责任心

25

主题

189

帖子

2

粉丝