2017-01-18 109 views
0

我試圖儘可能地隔離它(通過評論工作TIM3代碼進行比較)。我有PWM在TIM3上正常工作,但在TIM1上沒有看到任何東西。最初,這個問題在一些TIM_OCInitStructure的評論中被指出。電話,但我有他們在那裏,仍然沒有看到任何信號。有沒有人看到代碼中缺少其他任何東西?使用TIM1在STM32F0上PWM的錯誤

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); 
} 

////////////////// 原始的問題 //////////////////

有沒有人看到這段代碼的問題?

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); 

問題是與

TIM_OC1Init(TIM1, &TIM_OCInitStructure); 

的錯誤是

assert_param()失敗:文件 「../system/src/stm32f0-stdperiph/stm32f0xx_tim.c」,第811行。查看該行是:

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

TIM_OC1Init()函數似乎適用於TIM3,但不適用於TIM1。我在這個論壇上看到其他人使用TIM_OC1Init()作爲TIM1,所以我不確定這個問題對我來說是什麼。這不是我如何設置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'代表'TIM1'。 – 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(),這也很奇怪。

我認爲,解決這個問題的最簡單方法是複製粘貼SPL的例子(如「STM32F0xx_StdPeriph_Lib_V1.5.0 \項目\ STM32F0xx_StdPeriph_Examples \ TIM \ TIM_7PWMOutputs」)的所有漂亮的代碼,然後去除多餘的。

+0

TIM_CtrlPWMOutputs(TIM1,ENABLE);做到了,謝謝!我將該行添加到TIM_TIMER_Init()的末尾,並且按預期執行了一切。不夠感謝你! ////////挖掘更多內容,TIM_OCNIdleState,TIM_OCNPolarity和TIM_OCIdleState可以被移除並且沒有效果。不知道我明白,因爲他們是正確的根據原始帖子中的原始assert_param()錯誤/////////感謝SPL的例子。 STM32的新手並沒有聽說過。我下載了STM32CubeF0並將檢查出來。 –

+0

你能發佈一個鏈接到SPL的例子嗎?我不確定我看到你在說什麼。 –

+0

STM32系列(STM32F0,STM32F1,...)每個都有其自己的標準外設庫(您所看到的代碼使用此庫),可以在[此處]找到它們(http://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries html的?querycriteria =的productId = LN1939)。在庫文件夾內有文件夾「Projects」,你可以在其中找到帶有例子的文件夾(在你的案例中爲「STM32F0xx_StdPeriph_Examples」)。 STM32CubeFX使用HAL代替SPL,所以你當前的代碼不能用於Cube。 – Yuriy