2017-06-22 20 views
-1

私は組み込みプログラミングの初心者です。現在、STM32F469Iディスカバリボードを使用したプロジェクトに取り組んでいます。私はARMツールチェーンと付属のドライバでEclipseを使用しています。私は特定のアドレスでチップにフラッシュされたバイナリオーディオファイルを再生することに固執しています。私はコードをいくつかのサンプルファイルに基づいて作成しましたが、私は単にそれを動作させようとしています。STM32F469Iディスカバリで実行されないオーディオ転送コールバック

現時点では、コードはバッファを再生するポイントまで機能しますが、スタックされているように見えます。バッファーはループで再生されています(これを確認するためにバッファーのサイズを変更しました)、それを聞くことができますが、それはすべて起こります。転送割り込みコールバックは決して実行されないので、バッファは再フォーマットせず、完全なサンプルは決して再生されません。

私はバッファを補充するために外部からの干渉を使用しようとしましたが、これを試してもスタックされません。また、LEDを点灯させてデバッグしようとしましたが、サンプルを再生した直後に効果的に停止することが確認されています。無限のwhileループは決して実行されず、転送割り込みは決して実行されません。

私の質問です - どうしてスタックされていて、なぜ割り込みがトリガされていないのですか?

ご協力いただければ幸いです!問題の原因を特定するの利益のために

#include "main.h" 

static void SystemClock_Config(void); 

#define AUDIO_FILE_ADDRESS 0x08010000 
#define AUDIO_FILE_SIZE  (180*1024) 
#define PLAY_HEADER   0x2C 
#define PBSIZE    4096 
uint16_t      PlayBuff[PBSIZE]; 

int OFFSET = 0; 
int TransferState = 0; 
int CycleCount1 = 1; 
int CycleCount2 = 1; 

int main(void) 
{ 
    uint32_t PlaybackPosition = PBSIZE + PLAY_HEADER; 
    HAL_Init(); 
    /* Configure the system clock to 180 MHz */ 
    SystemClock_Config(); 
    // Fill the buffer first time round 
    for(int i=0; i <= PBSIZE; i++) 
    { 
     PlayBuff[i]=*((__IO uint16_t *)(AUDIO_FILE_ADDRESS + PLAY_HEADER + i)); 
    } 
    BSP_AUDIO_OUT_Init(2,50,AUDIO_FREQUENCY_16K); 
    BSP_AUDIO_OUT_Play(PlayBuff,PBSIZE); 

    while(1){ 
     if(TransferState==1){ 
      // refill the first part of the buffer 
      TransferState=0; 
      OFFSET = CycleCount1*PBSIZE; 
      for(int i=0; i <= PBSIZE/2; i++){ 
        PlayBuff[i]=*((__IO uint16_t *)(AUDIO_FILE_ADDRESS + PLAY_HEADER + OFFSET)); 
       } 
      CycleCount1++; 

     } 
     if(TransferState==2){ 
      // refill the second part of the buffer 
      OFFSET = CycleCount2*PBSIZE+PBSIZE; 
      TransferState=0; 
      for(int i=PBSIZE/2; i <= PBSIZE; i++){ 
       PlayBuff[i]=*((__IO uint16_t *)(AUDIO_FILE_ADDRESS + PLAY_HEADER + OFFSET)); 
       } 
      CycleCount2++; 

     } 
    } 
} 

void BSP_AUDIO_OUT_TransferComplete_CallBack(void) 
{ 
    TransferState=2; 
} 

void BSP_AUDIO_OUT_HalfTransfer_CallBack(void){ 
    TransferState=1; 
} 

それがないすべてのバッファを果たしているように、私はさらにコードを下にトリミングされてきました。割り込みの呼び出しを削除して、問題の原因を特定しました。

システムクロックを設定し、バッファを満たし、オーディオを初期化してから、LEDをオンにする必要があります。次に、オーディオバッファを再生し、1秒待ってから、LEDを消灯させます。それはループでバッファーを再生します(円形モードの場合と同じですが)、スタックされてLEDをオフにすることはありません。私は通常のモードでそれを実行しようとしましたが、単にバッファを一度再生し、つづります。

これは私がバッファを間違って設定/充填したと思うようになります。

#include "main.h" 

static void SystemClock_Config(void); 

#define AUDIO_FILE_ADDRESS 0x08010000 
#define PLAY_HEADER   0x17569 
#define PBSIZE    4096 
uint16_t      PlayBuff[PBSIZE]; 

int main(void) 
{ 
    BSP_LED_Init(LED1); 
    HAL_Init(); 
    /* Configure the system clock to 180 MHz */ 
    SystemClock_Config(); 
    // Fill the buffer first time round 
    for(int i=0; i <= PBSIZE; i++) 
    { 
     PlayBuff[i]=*((__IO uint16_t *)(AUDIO_FILE_ADDRESS + PLAY_HEADER + i)); 
    } 
    BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE ,50,AUDIO_FREQUENCY_44K); 

    BSP_LED_On(LED1); 

    BSP_AUDIO_OUT_Play(PlayBuff,PBSIZE); 

    HAL_Delay(1000); 

    BSP_LED_Off(LED1); 
} 

また、これまで解決策がなくても、同様の問題を抱えているオンラインの他の人のインスタンスも見つかりました。どんな助けでも大歓迎です。

+0

コードは難読化されており、メイントランスのデスタスターです。これらの定義とキャストは、コードを追加する際に、今ではないにしても、問題を引き起こしています。初心者ではなく、走り回るのではなく、最初に腰を下ろしてから歩くことを学ぶべきです。サンプルコードを複製するようですが、実際にはそれを理解していません。それは災害を求めている。 – Olaf

+0

ええ、それは完全にはっきりしていないし、はい、それはすべての時点で混乱のビットです。私は外部割り込み、ADC、systickタイマー、LCD上のSTemWin GUIインターフェースを使用してCANを成功させましたが、これは私が苦労しているものです。私の理解は、私が認めて嬉しいことではありません。私の解釈は、バッファを作成し、それを特定のアドレスにロードされたオーディオビンファイルの最初の4096で埋めることです。その後、それを再生し、無限ループに入ります。中断はバッファの再生を途中で引き起こすはずですが、そうではありません。 –

+0

デバッガをデバッグに使用してください! sidenoteとして:そのSTlib HALのごみを取り除く。それはあなたのコードを膨らませ、無益に複雑さを完全に加え、コードを遅くします。ハードウェアレジスタに直接アクセスするドライバーを書き込んでください。 – Olaf

答えて

-1

私はおそらくあなたが揮発性としてTransferStateを定義する必要があると思う特定のボードに精通していません。

volatile int TransferState = 0;

これは、組み込みおよびマルチスレッド開発ではかなり一般的な問題です。コンパイラは、レジスタ内の変数TransferStateを最適化して、異なるコンテキスト(コールバック)からの更新を実際に見ることはありません。揮発性のため、そうすることができません

+0

これは、マルチスレッド通信には不十分です。これがアトミックが使用されるべきものです。 – Olaf

0

私はこの問題を発見しました。私はstm32f4xx_it.cにDMAインターラプトを設定していませんでした。

void DMA2_Stream3_IRQHandler(void) 
{ 
    HAL_DMA_IRQHandler(haudio_out_sai.hdmatx); 
} 

私もBSP_AUDIO_OUT_Play()を使用するときに音がその下低音fluctating何かが間違っていることを発見しました。

以下を使用すると正しく動作します。

/* Start the playback */ 
    if(0 != audio_drv->Play(AUDIO_I2C_ADDRESS, NULL, 0)) 
    { 
    Error_Handler(); 
    } 
    if(HAL_OK != HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t *) PlayBuff, PLAY_BUFF_SIZE)) 
    { 
    Error_Handler(); 
    } 
関連する問題