2017-01-18 2 views
0

가능한 한 이것을 분리하려고합니다 (비교를 위해 작동하는 TIM3 코드를 주석으로 처리). PWM이 TIM3에서 잘 작동하지만 TIM1에서 아무 것도 보지 못했습니다. 원래이 문제는 TIM_OCInitStructure의 일부 주석에 지적되었습니다. 전화하지만, 나는 그들 모두를 거기에 가지고 있고, 아직도 어떤 신호도 보지 않고있다. 코드에 누락 된 것이있는 사람이 있습니까?STM32F0에서 PWM을 위해 TIM1을 사용하는 중 오류

void TIM_TIMER_Init(void) 
{ 
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 

// RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3EN, ENABLE); //timer 3 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //timer 1 
    TIM_TimeBaseStructure.TIM_Prescaler = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseStructure.TIM_Period = 4799; // PER = F_timer/F_pwm - 1 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 

    // Initialize TIMx 
// TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

    // Start count on TIMx 
// TIM_Cmd(TIM3, ENABLE); 
    TIM_Cmd(TIM1, ENABLE); 
} 

void TIM_PWM_Init(void) 
{ 
    TIM_OCInitTypeDef TIM_OCInitStructure; 

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; // PWM1/PWM2 = set/clear on compare match 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; 
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; 
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; 
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; 

    TIM_OCInitStructure.TIM_Pulse = 959; // 20% Duty Cycle on ch. 1 
// TIM_OC1Init(TIM3, &TIM_OCInitStructure); 
// TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 
/* 
    TIM_OCInitStructure.TIM_Pulse = 1919; // 40% Duty Cycle on ch. 2 
// TIM_OC2Init(TIM3, &TIM_OCInitStructure); 
// TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_OC2Init(TIM1, &TIM_OCInitStructure); 
    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); 

    TIM_OCInitStructure.TIM_Pulse = 2879; // 60% Duty Cycle on ch. 3 
// TIM_OC3Init(TIM3, &TIM_OCInitStructure); 
// TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_OC3Init(TIM1, &TIM_OCInitStructure); 
    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); 

    TIM_OCInitStructure.TIM_Pulse = 3839; // 80% Duty Cycle on ch. 4 
// TIM_OC4Init(TIM3, &TIM_OCInitStructure); 
// TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_OC4Init(TIM1, &TIM_OCInitStructure); 
    TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); 
*/} 

//"using convenience methods instead of CMSIS" 
void TIM_PINS_Init(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 

// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); //enabling port C 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //enabling port A 

    // Alternative Functions for pins 
// GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_0); // PC6 
// GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_0); // PC7 
// GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_0); // PC8 
// GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_0); // PC9 

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2); // PA8 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // PA9 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2); // PA10 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2); // PA11 

    // Set pins 
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

// GPIO_Init(GPIOC, &GPIO_InitStructure); 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
} 

////////////////// 원래의 질문에 //////////////////

누구나이 코드에 문제가 있습니까? 파일 "../system/src/stm32f0-stdperiph/stm32f0xx_tim.c", 줄 811 :

TIM_OCInitTypeDef TIM_OCInitStructure; 

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 

    TIM_OCInitStructure.TIM_Pulse = 959; // 20% Duty Cycle on ch. 1 
    TIM_OC1Init(TIM3, &TIM_OCInitStructure); 
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); 
    TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); 

문제는 오류가

assert_param() 실패

TIM_OC1Init(TIM1, &TIM_OCInitStructure); 

함께 . 그 선을 그을 찾고 있습니다 :

if((TIMx == TIM1) || (TIMx == TIM15) || (TIMx == TIM16) || (TIMx == TIM17)) 
    { 
    assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState)); // <- line 811 

TIM_OC1Init() 함수는 TIM1 TIM3을 위해 작동하는 것 같다,하지만. 이 포럼의 다른 사용자가 TIM1에 TIM_OC1Init()을 사용하는 것을 보았으므로이 문제가 무엇인지 잘 모릅니다. 이게 제가 ch.1을 어떻게 설정합니까?

+0

타이머 3에 동일한 제어 구조를 전달한 다음 타이머 1에 동일한 제어 구조를 전달했기 때문일 수 있습니까? –

+0

나는 그것에 대해서 너무 궁금했다. 내가 tim3을 주석 처리하면 오류가 같은 –

+0

입니다 물건이 타이머 TIM1의'TIM_Output_Compare_N_State'을 정의하는 것 같다, 추가하려고'TIM__OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable,'또는'TIM__OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable,'호출하기 전에' TIMOC1Init'을 실행합니다. – gmug

답변

0

당신이 줄 코드 IS_TIM_OUTPUTN_STATE에서 실패하는 것은 이상한 일입니다. 당연히 STL 오류일지도 몰라요. TIM_OutputNState_Enable에서 TIM_OutputNState_Disable을 변경하십시오.

어설 션을 잡으면 프로그램이 무한 루프에 빠지며 다음 설정 코드가 실행되지 않으므로 pwm 신호가 생성되지 않습니다. 또한 정의되지 않은 USE_FULL_ASSERT, 나쁜 정책으로 타이머를 구성하려고 할 수는 있지만 적어도 떨어지게 할 것은 없습니다.

코드 측면에서 TIM_CtrlPWMOutputs (TIM1, ENABLE)를 추가하려고 할 수 있습니다. 타이머를 구성하고 활성화 한 후 그리고 당신의 함수가 이상하게 보입니다. rcc를 사용하기 전에 TIM_PWM_Init()을 호출하거나, 타이머를 활성화 한 후에도 이상하게 보입니다.

나는 문제를 해결하는 가장 쉬운 방법은 ("STM32F0xx_StdPeriph_Lib_V1.5.0 \ 프로젝트 \ STM32F0xx_StdPeriph_Examples \ TIM \ TIM_7PWMOutputs"같은) SPL 예에서 모든 아름다운 코드를 복사하여 붙여 넣기 한 후 여분을 제거하는 것입니다 생각합니다.

+0

TIM_CtrlPWMOutputs (TIM1, ENABLE); 그랬지, 고마워! 그 줄을 TIM_TIMER_Init()의 끝에 추가했고 모든 것이 예상대로 수행되었습니다. 충분히 고마워 할 수 없어! //////// TIM_OCNIdleState, TIM_OCNPolarity 및 TIM_OCIdleState를 더 이상 파서 제거 할 수는 없습니다. 그들이 원래 게시물의 원래 assert_param() 오류 바로 아래에 있기 때문에 나는 그것을 이해하지 못했습니다 ///////// SPL 예제를 보내 주셔서 감사합니다. STM32를 처음 접한 사람은 STM32에 대해 들어 본 적이 없었습니다. 나는 STM32CubeF0를 다운로드하고 그것을 체크 아웃 할 것이다. –

+0

마음에 들었던 SPL 예제에 대한 링크를 게시 할 수 있습니까? 나는 네가 무슨 말을하고 있는지 정확히 알지 못한다. –

+0

STM32 시리즈 (STM32F0, STM32F1, ...) 각각은 자체의 표준 주변 장치 라이브러리 (내가 본 라이브러리를 사용하는 코드)를 가지고 있습니다. [here] (http://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries .html? querycriteria = productId = LN1939). 라이브러리 폴더에는 예제가있는 폴더 ("STM32F0xx_StdPeriph_Examples")를 찾을 수있는 폴더 "Projects"가 있습니다. STM32CubeFX는 SPL 대신 HAL을 사용하므로 현재 코드가 Cube에서 작동하지 않습니다. – Yuriy

관련 문제