你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 TIM8 输入捕获功能

[复制链接]
qianqiandenian 提问时间:2018-6-19 17:26 /
采用stm32f407 使用TIM8通道3初始化成输入捕获功能,捕获PB15高电平和低电平的脉宽。是使用两种方式实现:中断和DMA,有波形,但是都采集不到数据,不知道是那的问题。
1.DMA方式
void TIM8_Config(void)
{
        TIM_ICInitTypeDef          TIM_ICInitStructure;
        DMA_InitTypeDef         DMA_InitStructure;
        GPIO_InitTypeDef         GPIO_InitStructure;

        TIM_Cmd(TIM8, DISABLE);

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

        /* TIM1 clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
        /* GPIO clock enable */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOB, &GPIO_InitStructure);   

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_TIM8);

        DMA_DeInit(DMA2_Stream2);
       
        while (DMA_GetCmdStatus(DMA2_Stream2) != DISABLE)
        {
        }

        /* Configure DMA Stream */
        DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&TIM8->CCR3);;
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)cap_buffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        DMA_InitStructure.DMA_BufferSize = 1024;//1
        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_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;

        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream2, &DMA_InitStructure);

        DMA_Cmd(DMA2_Stream2, ENABLE);

        TIM_DeInit(TIM8);   
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;           
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//TIM_ICPolarity_Falling;//TIM_ICPolarity_BothEdge;////TIM_ICPolarity_Rising;         
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;      
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;      
        TIM_ICInitStructure.TIM_ICFilter = 0x0;

        TIM_ICInit(TIM8, &TIM_ICInitStructure);

// //         /* Select the TIM3 Input Trigger: TI2FP2 */
//         TIM_SelectInputTrigger(TIM8, TIM_TS_TI2FP2);//TIM_TS_ETRF);
// //         /* Select the slave Mode: Reset Mode */
//         TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Reset);
// //         /* Enable the Master/Slave Mode */
//         TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable);
        TIM_DMAConfig(TIM8,TIM_DMABase_CCR3,TIM_DMABurstLength_2Bytes);
        /* TIM1 CC2 DMA Request enable */
        TIM_DMACmd(TIM8,TIM_DMA_CC3, ENABLE);
       
        /* TIM1 CC2 DMA Request enable */
        TIM_DMACmd(TIM8,TIM_DMA_Update, ENABLE);
       
        /* TIM enable counter */
        TIM_Cmd(TIM8, ENABLE);
}
2.中断方式
void TIM8_Config(void)
{
        TIM_ICInitTypeDef          TIM_ICInitStructure;
        GPIO_InitTypeDef         GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        TIM_DeInit(TIM8);  

        /* TIM1 clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
        /* GPIO clock enable */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOB, &GPIO_InitStructure);   

        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_TIM8);



        TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;           
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;//TIM_ICPolarity_BothEdge;//TIM_ICPolarity_Falling;//TIM_ICPolarity_BothEdge;////TIM_ICPolarity_Rising;         
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;      
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;      
        TIM_ICInitStructure.TIM_ICFilter = 0x0;

        TIM_ICInit(TIM8, &TIM_ICInitStructure);

//   TIM_ITConfig(TIM8, TIM_IT_Update | TIM_IT_CC3, ENABLE);
        TIM_ITConfig(TIM8,  TIM_IT_CC3, ENABLE);
        TIM_Cmd(TIM8, ENABLE);

//         TIM_SelectInputTrigger(TIM8, TIM_TS_TI1F_ED );

    NVIC_InitStructure.NVIC_IRQChannel = TIM8_BRK_TIM12_IRQn;//TIM8_BRK_TIM12_IRQn; TIM8_CC_IRQn
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
               
}

unsigned int fff=0;
void TIM8_BRK_TIM12_IRQHandler(void)
{
//         if(TIM_GetITStatus(TIM8,TIM_IT_Update)==SET)
//         {
// //                 SetTextValueInt32(2,3,sssssss++);
//                 TIM_ClearITPendingBit(TIM8,TIM_IT_Update);
//         }
        if(TIM_GetITStatus(TIM8,TIM_IT_CC3)==SET)
        {
//                 SetTextValueInt32(2,1,sss++);
                                        cap_buffer[fff]=TIM_GetCapture3(TIM8);//»ñÈ¡µ±Ç°µÄ²¶»ñÖµ.
                                        fff++;
                TIM_ClearITPendingBit(TIM8,TIM_IT_CC3);
        }

}

两种方式都采集不到数据。

赞 收藏 1 评论4 发布时间:2018-6-19 17:26

举报

4个回答
qianqiandenian 回答时间:2018-6-19 17:31:33
高电平和低电平时间是微秒级别的
qianqiandenian 回答时间:2018-6-20 12:12:53
换成这样的中断也不行,
void TIM8_CC_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM8,TIM_IT_CC3)==SET)
        {
                                        cap_buffer[fff]=TIM_GetCapture3(TIM8);//»ñÈ¡µ±Ç°µÄ²¶»ñÖµ.
//                                          = TIM8->CCR3;
                                        fff++;
              
        }
     TIM_ClearITPendingBit(TIM8,TIM_IT_CC3);
}
shanji 回答时间:2018-6-21 09:28:00
F1系列是只有CH1和CH2才能捕获,F4系列的话你翻翻手册,是不是也是和F1一样?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

he129807 回答时间:2018-6-21 10:01:05
打开仿真调试,先看一下初始化完定时器和IO之后各个寄存器对不对。
然后全速运行采集过程中暂停看看 CCR3寄存器有没有值。
一般配置没问题就不会出问题。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版