OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3820|回复: 3

配置TIM1的PWM输入捕获,但程序卡死,求大神指点

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
发表于 2020-4-6 23:26:44 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 凌曦月 于 2020-4-8 10:34 编辑

初学者,TIM3通道1PA6配置为比较输出,TIM1的通道1PA8配置为输入捕获,PA6通过跳线接到PA8,测量PA6的占空比和周期,然后通过串口显示,但程序卡死在void HardFault_Handler(void);求大神指点
以下是代码:
#include "stm32f10x.h"
#include "bsp_TIM.h"
#include <stdio.h>

int main(void)
{
        USART_Config();
        
        TIM_OutPut_Config();
        TIM_Advance_Config();
        printf("这是一个TIM实验");
        while(1)
        {}
}



#include "bsp_TIM.h"
#include "stm32f10x.h"
#include <stdio.h>
void TIM_OutPut_Config()
{
        
        GPIO_InitTypeDef  GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        
        
  TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStruct;
        TIM_OCInitTypeDef  TIM_OC_InitStruct;
        TIM_TimeBase_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBase_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBase_InitStruct.TIM_Period=9;
        TIM_TimeBase_InitStruct.TIM_Prescaler=71;
        TIM_TimeBase_InitStruct.TIM_RepetitionCounter=0;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBase_InitStruct);
        
        TIM_OC_InitStruct.TIM_OCMode=TIM_OCMode_PWM1;
        TIM_OC_InitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OC_InitStruct.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC_InitStruct.TIM_Pulse=5;
        TIM_OC1Init(TIM3,& TIM_OC_InitStruct);
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
        
        TIM_Cmd(TIM3,ENABLE);
}


void NVIC_Config()
{
  NVIC_InitTypeDef  NVIC_InitStruct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel= TIM1_CC_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);
}







void TIM_Advance_Config()
{

        GPIO_InitTypeDef  GPIO_InitStruct;
        NVIC_Config();
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
        
        
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/*--------------------时基结构体初始化-------------------------*/
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        
        TIM_TimeBaseStructure.TIM_Period=999;        
        
        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_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


        /*--------------------输入捕获结构体初始化-------------------*/        

        
  TIM_ICInitTypeDef  TIM_ICInitStructure;

        
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        
  TIM_ICInitStructure.TIM_ICFilter = 0x0;
        
  TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);
  TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);               

  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);


  
  TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);        
        
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);

  TIM_Cmd(TIM1, ENABLE);

}



中断程序:
__IO uint16_t IC1Value=0;
__IO uint16_t IC2Value=0;
__IO float Frequency;
__IO float DutyCycle;
void  TIM1_CC_IRQHandler()
{
        TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
        IC1Value=TIM_GetCapture1(TIM1);
        IC2Value=TIM_GetCapture2(TIM1);
  if(IC1Value!=0)
  {
                DutyCycle= (float)((IC2Value+1) * 100) / (IC1Value+1);
                Frequency = (72000000/(71+1))/(float)(IC1Value+1);
                printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
        }               
        else
        {
          Frequency=0;
                DutyCycle=0;
        }
}

















最佳答案

查看完整内容[请看2#楼]

问题已解决,谢谢!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2020-3-7
在线时间
12 小时
 楼主| 发表于 2020-4-6 23:26:45 | 显示全部楼层
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-10-28
在线时间
5 小时
发表于 2020-4-11 19:07:00 | 显示全部楼层
请问楼主如何解决的?我改了开发板的程序,用PB10的TIM2CH3,但是没有反应,谢谢。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2020-10-7
在线时间
5 小时
发表于 2020-12-1 21:35:08 | 显示全部楼层
大佬!!!能不能说说怎么解决的啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 20:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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