STM32的定时中断无法进入中断处理函数的问题

suiyuan2009 2017-09-03 10:21:59
打算利用TIM3_CH1通道输出方波,然后声明一个全局变量steps,在TIM3的中断里面对steps进行自减计数,以实现TIM3_CH1只发出指定steps个数的脉冲。
其中PC6->led7(正常TIM3_CH1连接的端口),
PC1->led2(中断函数里面控制的端口),
PC0->led1(main函数里面控制的端口)(已经在led.h中定义好了,包括位带操作)
但是在调试时候发现,led7会一直闪烁,但是不会停止。表明实际无法没有进入中断。
但是一个诡异的现象是,当我加进下面注释的那一段循环代码之后,就全都正常了,
led1、led2、led7全都正常闪烁,led2在闪烁5次后停止,led7在闪烁10次后停止,完全正常。只是led1并没有按照预期的闪烁5次就停止。实在是无法知道这个是什么原因?请大神们指点一二。
代码如下:
#include "system.h"
#include "SysTick.h"
extern u16 steps;

int main()
{
/* int i = 5; */
SysTick_Init(72);
LED_Init();
Move(10);
/* while(i)
{
led1 = 0;
delay_ms(200);
led1 = 1;
delay_ms(200);
i--;
} */
}

以下是定时器配置函数
#include "StepperDriverTIM3.h"

u16 steps; //全局变量,以记录脉冲数。在中断函数里面进行自减
int led2Status = 0; //记录led2的当前状态

void Move(u16 num)
{
NVIC_InitTypeDef NVIC_InitStructure;

steps = num;

TIM3_CH1_PWM_Init(2000-1, 7200*5-1);

TIM_SetCompare1(TIM3, 1500);

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void TIM3_CH1_PWM_Init(u16 per,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);

TIM_DeInit(TIM3);
TIM_TimeBaseInitStructure.TIM_Period=per;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = per/2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3,ENABLE);

TIM_Cmd(TIM3,ENABLE);

TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
}

void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
steps--;
led2=led2Status;
led2Status = 1- led2Status;
if(!steps)
{
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_Cmd(TIM3,DISABLE);
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}

#ifndef _led_H
#define _led_H

#include "system.h"

#define LED_PORT GPIOC
#define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define LED_PORT_RCC RCC_APB2Periph_GPIOC


#define led1 PCout(0)
#define led2 PCout(1)
#define led3 PCout(2)

void LED_Init(void);
...全文
3557 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
樰桜咲 2019-05-05
  • 打赏
  • 举报
回复
想看多个定时器同时工作的状态定义标识,我的干到一起了,标志也是
suiyuan2009 2017-09-04
  • 打赏
  • 举报
回复
已找到原因,main函数里面忘了搞个死循环,来等待中断产生。
suiyuan2009 2017-09-03
  • 打赏
  • 举报
回复
补充下,用的STM32F103ZET6的板子,会不会是我的端口被什么占用了呢?但是按道理没有打开端口复用时钟,是不是就不会存在占用问题呢?

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧