本帖最后由 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
//创建日期: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); //使能TIM14在CCR1上的预装载寄存器
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); //清除中断标志位
}
|