2013-10-23 49 views
0

我试图产生占空比为50%的2MHz PWM。我的问题是我无法清除中断标志。这里是我的代码:STM32无法清除PWM中断标志

#include "includes.h" 

TIM_TimeBaseInitTypeDef TIM1_InitStruncture; 

TIM_TimeBaseInitTypeDef TIM3_InitStruncture; 
TIM_OCInitTypeDef  TIM3_OCInitStructure; 

SPI_InitTypeDef   SPI_InitStructure; 

void Timer3_IRQHandler(void) 
{ 
    if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET) 
    { 
    TIM_ClearFlag(TIM3, TIM_IT_CC3); 
    //dummy code 
    ++StatusReg; 
    } 
} 

void CLK_init() 
{ 
    //activez HSI 
    RCC_HSICmd(ENABLE); 
    //astepst sa se activeze HSI 
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); 
    //setez HSI ca sursa de clock 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); 

    //activez HSE 
    RCC_HSEConfig(RCC_HSE_ON); 
    //astept sa se termine secventa de activare 
    while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); 

    //setez HSE (8MHz) ca input py PLL 
    //setez factotul de multiplicare 9 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); 

    //activez PLL-ul 
    RCC_PLLCmd(ENABLE); 

    //astept sa se termine secventa de activare 
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); 

    #ifdef EMB_FLASH 
    // 5. Init Embedded Flash 
    // Zero wait state, if 0 < HCLK 24 MHz 
    // One wait state, if 24 MHz < HCLK 56 MHz 
    // Two wait states, if 56 MHz < HCLK 72 MHz 
    // Flash wait state 
    FLASH_SetLatency(FLASH_Latency_2); 
    // Half cycle access 
    FLASH_HalfCycleAccessCmd(FLASH_HalfCycleAccess_Disable); 
    // Prefetch buffer 
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 
    #endif // EMB_FLASH 

    //setez iesirea de la PLL ca sursa de CLK 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 
} 

void Port_C_Enable() 
{ 
    //GPIO_InitTypeDef GPIOC_InitStructure; 

    //resetez portul C (just in case) 
    RCC->APB2RSTR |= RCC_APB2RSTR_IOPCRST; 
    RCC->APB2RSTR &= ~RCC_APB2RSTR_IOPCRST; 

    //activez CLK-ul pentru portul C 
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; 
    /* 
    GPIOC_InitStructure.GPIO_Pin  = GPIO_Pin_5; 
    GPIOC_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIOC_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; 

    GPIO_Init(GPIOC, &GPIOC_InitStructure); 
    */ 
} 

void Timer3_Init() 
{ 
    NVIC_InitTypeDef NVIC_InitStructure; 

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure); 

    //reset Timer3 (just in case) 
    //RCC->APB1RSTR |= RCC_APB1RSTR_TIM3RST; 
    //RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM3RST; 

    //give clock to Timer-ul 3 
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; 

    //frequency 2Mhz 
    TIM3_InitStruncture.TIM_Period    = 36; 
    TIM3_InitStruncture.TIM_Prescaler   = 0; 
    TIM3_InitStruncture.TIM_ClockDivision  = 0;//TIM_CKD_DIV1; 
    TIM3_InitStruncture.TIM_CounterMode   = TIM_CounterMode_CenterAligned3; 

    TIM_TimeBaseInit(TIM3, &TIM3_InitStruncture); 

    TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE); 

    TIM_Cmd(TIM3, ENABLE); 

    //dutycicle 50% 
    TIM3_OCInitStructure.TIM_OCMode   = TIM_OCMode_PWM2; 
    TIM3_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High; 
    TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM3_OCInitStructure.TIM_Pulse   = 18; 

    TIM_OC3Init(TIM3, &TIM3_OCInitStructure); 
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_ARRPreloadConfig(TIM3, ENABLE); 
    TIM_Cmd(TIM3, ENABLE); 
} 

void GPIO_Configuration(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 

    /*GPIOB Configuration: TIM3 channel1, 2, 3 and 4 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;*/ 

    //GPIO_Init(GPIOC, &GPIO_InitStructure); 

    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);  

    /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_Init(GPIOB, &GPIO_InitStructure); 
} 

void NVIC_init(void) 
{ 
    // NVIC init 
    #ifndef EMB_FLASH 
    /* Set the Vector Table base location at 0x20000000 */ 
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
    #else /* VECT_TAB_FLASH */ 
    /* Set the Vector Table base location at 0x08000000 */ 
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 
    #endif 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); 
} 

void SPI_init() 
{ 
    SPI_InitStructure.SPI_Direction   = SPI_Direction_1Line_Tx; 
    SPI_InitStructure.SPI_Mode    = SPI_Mode_Master; 
    SPI_InitStructure.SPI_DataSize   = SPI_DataSize_16b; 
    SPI_InitStructure.SPI_CPOL    = SPI_CPOL_Low; 
    SPI_InitStructure.SPI_CPHA    = SPI_CPHA_1Edge; 
    SPI_InitStructure.SPI_NSS     = SPI_NSS_Soft; 
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; 
    SPI_InitStructure.SPI_FirstBit   = SPI_FirstBit_MSB; 
    SPI_InitStructure.SPI_CRCPolynomial  = 0; 

    SPI_Init(SPI2, &SPI_InitStructure); 
} 

void main(void) 
{ 
    #ifdef DEBUG 
    debug(); 
#endif 

// NVIC_SETPRIMASK(); 

    CLK_init(); 

    NVIC_init(); 

    Port_C_Enable(); 
    GPIO_Configuration(); 

    //Timer1_Init(); 
    Timer3_Init(); 

    TIM_Cmd(TIM1, ENABLE); 

    unsigned int j=0; 
    while(1) 
    { 
    //dummy code 
    ++j; 
    if(j == 0xff) 
    { 
     j=0; 
    } 
    } 
} 

谁能告诉我,为什么CCR3(捕获/比较寄存器3标志)居高不下?

谢谢。

+0

您正在使用哪种微控制器? –

+0

这是你的计时器中断处理程序中的真实代码吗?你使用变量'StatusReg',这是宣告无处。您的问题如下所示:https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FTIMER7%20INTERRUPT%20FLAG% 20NOT%20CLEARING&FolderCTID = 0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews = 711 –

回答

1

注意不要混合如下:

  • TIM_ClearFlag会议记录应当与TIM_FLAG_CC1
  • TIM_ClearITPendingBit使用记录应当与TIM_IT_CC1

据我了解中。否则,你可以有一些避免标记设置的掩码。

0

感谢aamxip为您的答案。

我发现了这个问题。看来配置是正确的,但我没有足够的时间来执行ISR(中断服务程序)。一旦每36个CLK产生一个新的中断,它就需要约30条指令或更多的指令才能进入ISR。 经过更多的研究后,我发现我并不真的需要那个频率,我采用了不同的方法,有点打击。