程序通过外部中断函数从端口检测电机的输出脉冲个数,到一定的个数执行停止转换方向的操作。本来是可以运行的。但是加入了定时器中断之后,外部中断就不能运行了。检测不到脉冲个数。请问是什么原因附件有源程序。
定时器中断文件timer.c
#include "timer.h"
#include "led.h"
#include "exti.h"
#include "usart.h"
void TIM3_init_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=arr;
TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
mc=mcshu*1000;
printf("%d\r\n",mc); //?ò??OK?á?????ò????
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
外部中断文件exti.c
#include "exti.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_Struct;
NVIC_InitTypeDef NVIC_Struct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
KEY_Init();
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
EXTI_Struct.EXTI_Line=EXTI_Line4;
EXTI_Struct.EXTI_LineCmd=ENABLE;
EXTI_Struct.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_Struct.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_Struct);
NVIC_Struct.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_Struct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Struct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_Struct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_Struct);
}
void EXTI4_IRQHandler(void)
{
mcshu++;
if (mcshu<192*0.2){TIM_SetCompare1(TIM14,flag*(1-mcshu/192));}
else if(mcshu>192*0.8){TIM_SetCompare1(TIM14,flag*mcshu/192);}
else TIM_SetCompare1(TIM14,0);
if (mcshu>=192)
{
printf("%d",mcshu);
mcshu=0;
biaozhi=(biaozhi+1)%2;
if(biaozhi==0)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay_ms(1000);
GPIO_SetBits(GPIOF,GPIO_Pin_7);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
printf("a\r\n");
}
else
{
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
delay_ms(1000);
GPIO_SetBits(GPIOF,GPIO_Pin_10);
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
printf("b\r\n");
}
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
主函数main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "exti.h"
#include "stm32f4xx_exti.h"
#include "timer.h"
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
mcshu=0;
biaozhi=0;
LED_Init();
EXTIX_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
TIM3_init_Init(10000-1,8400-1);
uart_init(115200);
flag=1000;
TIM14_PWM_Init(flag-1,84-1);
TIM_SetCompare1(TIM14,0);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
GPIO_SetBits(GPIOF,GPIO_Pin_7);
while(1)
{
printf("OK\r\n");
delay_ms(1000);
}
}
|