2015-01-23 5 views
2

내 STM32030R8T6의 두 핀에서 PWM 기능을 사용하려고합니다. Nucleo 개발 보드에 있으며 Keil을 사용하고 있습니다. 학습을 위해 저는 주로 this website에있는 자료를 따르고 있지만 다른 MCU를 사용하기 때문에 해당 사이트에서 적응했습니다. 실제로 PWM을 설정하는 것이 그리 많지 않으므로 내가 뭘 잘못했는지는 잘 모르겠다. 온보드 LED가 초당 1.5 번 깜박이기 때문에 타이머가 작동한다는 것을 알았지 만 Ch1과 내 범위와 Ch2 출력 핀을 나는 아무것도 얻지 않는다. 난 꽤 핀이 제대로 기능을 설정하고 24 MHz의를 보여주는 MCO 핀과 동일하게 설정되어 있기 때문에 대체 기능 푸시 - 당겨 설정되어 있는지 (내 싼 범위가 결정하는 몇 가지 문제가있다 ...). 관련성 높은 모든 관련 코드를 첨부했습니다. 그리고 사용자의 편의를 위해 :STM32F030 PWM 설정 문제

UM0360 Reference Manual (STM32F030...)

나는뿐만 아니라 Nucleo 사용 설명서 및 장치 시트에 대한 링크를 게시 할 것입니다 그러나 이것은 내 첫 번째 질문입니다 내 명성 때문에 나는, 두 개 이상의 링크를 게시 할 수 없습니다 열 개 미만.

제가 잘못하고있는 것에 대한 도움은 감사하겠습니다. 나는 바보 같은 것이라고 확신합니다.

#include "stm32f0xx.h" 

void Initializations(void); 

int main(void) 
{ 
    Initializations(); 

    while(1) 
    { 
     /* Toggle onboard LED whenever timer overflows */ 
     if((TIM3->SR & TIM_SR_UIF)) 
     { 
      TIM3->SR &= ~TIM_SR_UIF; 
      GPIOA->ODR ^= GPIO_ODR_5; 
     }   
    } 
} 

void Initializations(void) 
{ 
    /* CLK CONFIG */ 
    RCC->CFGR |= RCC_CFGR_HPRE_DIV2 | 
       RCC_CFGR_PPRE_DIV16 | 
       RCC_CFGR_MCO_SYSCLK | 
       RCC_CFGR_PLLMUL6; 

    /* Activate PLL, wait */ 
    RCC->CR |= RCC_CR_PLLON; 
    while(!(RCC->CR & RCC_CR_PLLRDY)); 
    RCC->CFGR |= RCC_CFGR_SW_PLL; 

    /* Enable IO CLKs */ 
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN; 
    RCC->AHBENR |= RCC_AHBENR_GPIOCEN; 

    /* Enable peripheral CLKs */ 
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; 
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN; 

    /* PIN INITIALIZATIONS */ 
    GPIOA->MODER |= GPIO_MODER_MODER5_0 |  // Onboard LED (General output) 
        GPIO_MODER_MODER2_1 |  // USART2 TX (Alternate function) 
        GPIO_MODER_MODER3_1 |  // USART2 RX (Alternate function) 
        GPIO_MODER_MODER6_1 |  // TIM3 CH1 (Alternate function) 
        GPIO_MODER_MODER7_1 |  // TIM3 CH2 (Alternate function) 
        GPIO_MODER_MODER8_1 |  // MCO (Alternate function) 
        GPIO_MODER_MODER9_1 |  // USART1 TX (Alternate function) 
        GPIO_MODER_MODER10_1;  // USART1 RX (Alternate function) 

    /* TIMER INITS */ 
    TIM3->PSC = 7; 
    TIM3->ARR = 59999; 

    /* CCM1 */ 
    TIM3->CCMR1 |= TIM_CCMR1_OC1M_0 | 
        TIM_CCMR1_OC1M_1; 

    TIM3->CCR1 |= 4499; 
    TIM3->CCER |= TIM_CCER_CC1E;    // Enable Ch1 

    /* CCM2 */ 
    TIM3->CCMR1 |= TIM_CCMR1_OC2M_0 | 
        TIM_CCMR1_OC2M_1; 

    TIM3->CCR2 |= 29999; 
    TIM3->CCER |= TIM_CCER_CC2E;    // Enable Ch2 

    TIM3->CR1 |= TIM_CR1_CEN;     // Enable TIM3 

    /* USART INITS */ 
    RCC->CFGR3 |= RCC_CFGR3_USART1SW_0;   // Clock USART1 from SYSCLK 
} 
+0

인터럽트를 사용하지 않으시겠습니까? – bunkerdive

+0

또한, 'RCC-> APB2ENR | = RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN;'해당 포트를 활성화하고 다른 기능 블록을 사용 하시겠습니까? – bunkerdive

+0

예,이 MCU의 AHBENR 레지스터에 있습니다. 비트가 여전히 IOPxEN이더라도 컴파일러가 대신 GPIOxEN을 사용합니다. 둘 다 같은 번호입니다. –

답변

1

대체 기능을 사용하도록 핀을 설정하는 것 외에도 사용할 대체 기능을 설정해야합니다.

이것은 연결된 문서의 8.3.2 절 (pdf 128 페이지)에 설명되어 있습니다.

AFRL (핀 0-7) 및 AFRH (핀 8-15) 레지스터가 포트에 있습니다.

코드를 기반으로 예를 들어

, 및 TIM3 대체 기능 2를 사용하고 핀 6, 7,에있는 경우 (그리고 다른 코드가 현재이었다 가정 0) 당신은

GPIOA->AFRL |= (2 << (6 * 4)) | (2 << (7 * 4)); 

그것을하면 할 거라고 0이 아니거나 확신하고 싶다면 먼저 비트를 마스크 해제하십시오 (각 핀은 4 비트를 얻습니다).

(참고로 헤더의 이름이 내 것과 다를 수 있으며 대체 기능이 다를 수도 있으며 일반적으로 STM32F407 또는 STM32F334와 함께 작동합니다. 필요한 기능을 확인하기 위해 대체 기능 표를 찾으려면 위 링크 된 가족 참조 설명서)

더 일반적인 형태는 AFRL에 대한

mode << (pin * 4) 

입니다 반대로, 사용중인 특정 칩의 데이터 시트에 그를보고있다
mode << ((pin - 8) * 4) 
012 AFRH 용

.

+0

나는이 레지스터를 놓쳤다는 것을 믿을 수 없다. 많은 타이밍과 완벽한 타이밍 덕분에, 나는 이제 막 지저분하고 불편한 인터럽트 계획을 사용하려고한다. –