2013-10-23 6 views
0

듀티 사이클이 50 % 인 2MHz PWM을 생성하려고합니다. 내 문제는 내가 인터럽트 플래그를 지울 수 없다는 것입니다. CCR3 (캡처/3 플래그 등록 비교) 왜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; 
    } 
    } 
} 

사람이 말해 줄 수 높은 상태로 유지 : 여기 내 코드는?

감사합니다. 다음 혼합하지에

+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_IT_CC1

과 함께 사용되어야한다 TIM_FLAG_CC1

  • TIM_ClearITPendingBit과 함께 사용되어야한다

    • TIM_ClearFlag. 그렇지 않으면 설정하라는 표시를하지 않는 마스크가있을 수 있습니다.

  • 0

    답변 해 주셔서 감사합니다.

    문제점을 발견했습니다. 구성이 정확하지만 ISR (인터럽트 서비스 루틴)을 실행할 충분한 시간이없는 것 같습니다. 36 CLK마다 새로운 인터럽트가 생성되고 ISR에 들어가기 위해 약 30 개 이상의 명령어가 필요합니다. 더 많은 조사가 끝난 후에 나는 그 주파수가 정말로 필요하지 않다는 것을 알게되었고, 나는 비트 - 뱅잉 (bit-banging)이라는 다른 접근법을 채택했습니다.

    관련 문제