2017-01-18 6 views
0

私は可能な限りこれを分離しようとしています(比較のためにTIM3コードをコメントアウトすることによって)。私はTIM3上でうまく動作するPWMを持っていますが、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

Timer TIM1に 'TIM_Output_Compare_N_State'を定義して、' 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()を呼び出す(間違っている)か、タイマーを有効にした後に、それも変です。

は、私は問題を解決する最も簡単な方法は、(「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の初心者はそれを聞いていなかった。私はSTM32CubeF0をダウンロードしてチェックアウトします。 –

+0

あなたが気にしていたSPLの例へのリンクを投稿できますか?私はあなたが話していたことを正確に見ているのか分からない。 –

+0

STM32シリーズ(STM32F0、STM32F1、...)にはそれぞれ独自の標準周辺ライブラリ(このライブラリを使用しているあなたのコード)があり、[ここ](http://www.st.com/en/embedded-software/stm32-standard-peripheral-libraries .html?querycriteria = productId = LN1939)。また、ライブラリのフォルダ内には、フォルダ(例: "STM32F0xx_StdPeriph_Examples")があるフォルダを見つけることができる "プロジェクト"フォルダがあります。 STM32CubeFXはSPLではなくHALを使用しているため、現在のコードはCubeでは動作しません。 – Yuriy

関連する問題