探索者F4,关于输出PWM同时产生中断的疑问

2019-07-20 23:04发布

本帖最后由 lvsong 于 2016-4-5 12:52 编辑

在探索者F4的PWM试验中,我想让TIM14输出PWM的同时,产生中断,在中断中让LED1实现翻转,在PWM.C文件中增加了允许更新定时器中断的代码(下面红字部分),可是 程序一执行到NVIC_Init(&NVIC_InitStructure);就卡住了,请问问题出在哪里?


#include "pwm.h"
#include "led.h"
//#include "usart.h"
#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////   
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F407开发板
//定时器PWM 驱动代码         
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/4
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司2014-2024
//All rights reserved                                                                                      
//////////////////////////////////////////////////////////////////////////////////  


//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{                                                              
         //此部分需手动修改IO口设置
         
         GPIO_InitTypeDefGPIO_InitStructure;
         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
         TIM_OCInitTypeDef  TIM_OCInitStructure;
         
         NVIC_InitTypeDef NVIC_InitStructure;
         
         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);          //TIM14时钟使能   
         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);          //使能PORTF时钟
         
         GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//GPIOF9复用为定时器14
         
         
         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;           //GPIOF9
         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;        //复用功能
         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_100MHz;    //速度100MHz
         GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;      //推挽复用输出
         GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;        //上拉
         GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
           
         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
         
         TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
         
         //初始化TIM14Channel1 PWM模式   
         TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //比较输出使能
         TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
         TIM_OC1Init(TIM14,&TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM14OC1
         
         

         TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);  //使能TIM14CCR1上的预装载寄存器

TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能


         TIM_ITConfig(TIM14,TIM_IT_Update,ENABLE); //允许定时器14更新中断
         
         TIM_Cmd(TIM14,ENABLE);  //使能TIM14
         
         NVIC_InitStructure.NVIC_IRQChannel=TIM8_TRG_COM_TIM14_IRQn;//定时器14中断
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级1
         NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //子优先级1
         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
         NVIC_Init(&NVIC_InitStructure);
                                                                                               
}  

//定时器14中断服务函数
voidTIM14_IRQHandler(void)
{
         if(TIM_GetITStatus(TIM14,TIM_IT_Update)==SET) //溢出中断
         {
                   LED1=!LED1;//DS1翻转
         }
         TIM_ClearITPendingBit(TIM14,TIM_IT_Update);  //清除中断标志位
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。