初级会员

- 积分
- 60
- 金钱
- 60
- 注册时间
- 2020-3-7
- 在线时间
- 12 小时
|
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;
}
}
|
|