硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4198|回复: 4
收起左侧

[技术讨论] STM32F103定时器DMA方式PWM输出

[复制链接]

5

主题

23

回帖

38

积分

新手上路

积分
38
发表于 2019-9-26 11:49:33 | 显示全部楼层 |阅读模式
本帖最后由 ZSR20181017 于 2019-9-26 15:21 编辑

问题是:PWM可以输出,频率和占空比都对,但是PWM方波的个数无法指定?


static void TIM_Channel_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

static void BaseTime_Config(void)
{
    TIM_TimeBaseInitTypeDef        TIM_TimeBaseStructure;
    //开启定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//RCC_APB1Periph_TIM4
//    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
   
    TIM_DeInit(TIM4);
   
    TIM_TimeBaseStructure.TIM_Period = (10-1);
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
   
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;   
//    TIM_TimeBaseStructure.TIM_RepetitionCounter=10;
    //初始化基本定时器
    TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
    //清除计数器中断标志
//    TIM_ClearFlag(TIM4,TIM_FLAG_Update);
    //开启计数器中断
//    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
   
   


//    TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC3Ref);//TIM4的OC3REF信号做为触发输出
   
    TIM_OCInitTypeDef  TIM_OCInitStructure;
   
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
    TIM_OCInitStructure.TIM_Pulse = 3;
   
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
   
//    TIM_CtrlPWMOutputs(TIM4,ENABLE);
//   
//    TIM_ARRPreloadConfig(TIM4, ENABLE);
   
    //使能定时器
    TIM_Cmd(TIM4,ENABLE);
//        TIM_Cmd(TIM4,DISABLE);


    DMA_InitTypeDef DMA_InitStructure;
   
    DMA_DeInit(DMA1_Channel5);
   
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&TIM4->CCR1;//TIM4->CCR1
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)buff;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_BufferSize = 10;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
   
    DMA_Init(DMA1_Channel5,&DMA_InitStructure);//DMA1_Channel1
   
    DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);//DMA1_Channel1
    DMA_ClearFlag( DMA1_FLAG_TC5 );//DMA1_FLAG_TC1
    TIM_DMACmd(TIM4, TIM_DMA_Update, ENABLE);
    DMA_Cmd(DMA1_Channel5,ENABLE);//DMA1_Channel1
}


/*中断服务函数*/

void DMA1_Channel5_IRQHandler(void)
{
        if(DMA_GetITStatus(DMA1_IT_TC5) != RESET )
        {

            DMA_ClearITPendingBit(DMA1_IT_TC5);
            DMA_Cmd(DMA1_Channel5,DISABLE);
            TIM_Cmd(TIM4,DISABLE);

            
        }
        
}




回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2019-9-26 11:50:55 | 显示全部楼层
恳请硬汉指导下,怎么修改?不知道从哪下手了
回复

使用道具 举报

39

主题

929

回帖

1051

积分

至尊会员

积分
1051
发表于 2019-9-26 13:56:54 | 显示全部楼层
1.  DMA的NVIC中断需要配置:
    srtNVIC.NVIC_IRQChannel = DMA1_Channel5_IRQn;
    srtNVIC.NVIC_IRQChannelPreemptionPriority = 1;
    srtNVIC.NVIC_IRQChannelSubPriority = 1;
    srtNVIC.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( &srtNVIC );
2. TIM的DMA需要配置:
    TIM_DMAConfig( TIM4 , TIM_DMABase_CR1 , TIM_DMABurstLength_1Transfer );
    TIM_DMACmd( TIM4 , TIM_DMA_Update , ENABLE );

回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2019-9-26 14:05:01 | 显示全部楼层
ghslfgkkl88 发表于 2019-9-26 13:56
1.  DMA的NVIC中断需要配置:
    srtNVIC.NVIC_IRQChannel = DMA1_Channel5_IRQn;
    srtNVIC.NVIC_IRQ ...

static void BASE_TIM_NVIC_Config(void)
{
                NVIC_InitTypeDef                NVIC_InitStructure;
                //设置中断优先组
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
                //设置中断源
                NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;//DMA1_Channel1_IRQn/TIM4_IRQn
       
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
               
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
               
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
               
                NVIC_Init(&NVIC_InitStructure);
}
中断优先级配置了
回复

使用道具 举报

5

主题

23

回帖

38

积分

新手上路

积分
38
 楼主| 发表于 2019-9-26 14:11:20 | 显示全部楼层
ghslfgkkl88 发表于 2019-9-26 13:56
1.  DMA的NVIC中断需要配置:
    srtNVIC.NVIC_IRQChannel = DMA1_Channel5_IRQn;
    srtNVIC.NVIC_IRQ ...

感谢你指导
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 06:10 , Processed in 0.156180 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表