CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラムを,入力として STM32F746 の内蔵 ADC を使うように変更したもの. http://seminar.cqpub.co.jp/ccm/ES18-0020
Dependencies: mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG
F746_SAI_IO_New/SAI_InOut.hpp@0:ab7a35d87173, 2017-10-07 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Oct 07 03:28:40 2017 +0000
- Revision:
- 0:ab7a35d87173
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:ab7a35d87173 | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:ab7a35d87173 | 2 | // SaiIO class (Header) |
MikamiUitOpen | 0:ab7a35d87173 | 3 | // 2017/03/17, Copyright (c) 2017 MIKAMI, Naoki |
MikamiUitOpen | 0:ab7a35d87173 | 4 | //----------------------------------------------------------- |
MikamiUitOpen | 0:ab7a35d87173 | 5 | |
MikamiUitOpen | 0:ab7a35d87173 | 6 | #ifndef F746_SAI_IO_HPP |
MikamiUitOpen | 0:ab7a35d87173 | 7 | #define F746_SAI_IO_HPP |
MikamiUitOpen | 0:ab7a35d87173 | 8 | |
MikamiUitOpen | 0:ab7a35d87173 | 9 | #include "mbed.h" |
MikamiUitOpen | 0:ab7a35d87173 | 10 | #include "stm32746g_discovery_audio.h" |
MikamiUitOpen | 0:ab7a35d87173 | 11 | #include "BSP_AudioIn_Overwrite.hpp" |
MikamiUitOpen | 0:ab7a35d87173 | 12 | #include "BSP_AudioOut_Overwrite.hpp" |
MikamiUitOpen | 0:ab7a35d87173 | 13 | #include "Array.hpp" |
MikamiUitOpen | 0:ab7a35d87173 | 14 | |
MikamiUitOpen | 0:ab7a35d87173 | 15 | namespace Mikami |
MikamiUitOpen | 0:ab7a35d87173 | 16 | { |
MikamiUitOpen | 0:ab7a35d87173 | 17 | class SaiIO |
MikamiUitOpen | 0:ab7a35d87173 | 18 | { |
MikamiUitOpen | 0:ab7a35d87173 | 19 | public: |
MikamiUitOpen | 0:ab7a35d87173 | 20 | enum InOutBoth { INPUT, // input only |
MikamiUitOpen | 0:ab7a35d87173 | 21 | OUTPUT, // output only |
MikamiUitOpen | 0:ab7a35d87173 | 22 | BOTH }; // input and output |
MikamiUitOpen | 0:ab7a35d87173 | 23 | // Constructor |
MikamiUitOpen | 0:ab7a35d87173 | 24 | // inputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 or |
MikamiUitOpen | 0:ab7a35d87173 | 25 | // INPUT_DEVICE_INPUT_LINE_1 |
MikamiUitOpen | 0:ab7a35d87173 | 26 | // inputDevice == 0 : not use input device |
MikamiUitOpen | 0:ab7a35d87173 | 27 | SaiIO(InOutBoth ioBoth, int size, int fs, |
MikamiUitOpen | 0:ab7a35d87173 | 28 | uint16_t inputDevice = 0); |
MikamiUitOpen | 0:ab7a35d87173 | 29 | virtual ~SaiIO() {} |
MikamiUitOpen | 0:ab7a35d87173 | 30 | |
MikamiUitOpen | 0:ab7a35d87173 | 31 | int32_t GetLength() { return nData_; } |
MikamiUitOpen | 0:ab7a35d87173 | 32 | |
MikamiUitOpen | 0:ab7a35d87173 | 33 | void RecordIn(); |
MikamiUitOpen | 0:ab7a35d87173 | 34 | // sw = 0: DIGITAL_MICROPHONE_2 |
MikamiUitOpen | 0:ab7a35d87173 | 35 | // 1: LINE_1 |
MikamiUitOpen | 0:ab7a35d87173 | 36 | void SwitchInputDevice(int sw); |
MikamiUitOpen | 0:ab7a35d87173 | 37 | |
MikamiUitOpen | 0:ab7a35d87173 | 38 | bool IsCaptured(); |
MikamiUitOpen | 0:ab7a35d87173 | 39 | // Input using SAI |
MikamiUitOpen | 0:ab7a35d87173 | 40 | void Input(int16_t &xL, int16_t &xR) |
MikamiUitOpen | 0:ab7a35d87173 | 41 | { (this->*InputFp)(xL, xR); } |
MikamiUitOpen | 0:ab7a35d87173 | 42 | |
MikamiUitOpen | 0:ab7a35d87173 | 43 | void StopIn() { BSP_AUDIO_IN_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 0:ab7a35d87173 | 44 | void PauseIn() { BSP_AUDIO_IN_Pause(); } |
MikamiUitOpen | 0:ab7a35d87173 | 45 | void ResumeIn() { BSP_AUDIO_IN_Resume(); } |
MikamiUitOpen | 0:ab7a35d87173 | 46 | |
MikamiUitOpen | 0:ab7a35d87173 | 47 | void PlayOut(); |
MikamiUitOpen | 0:ab7a35d87173 | 48 | bool IsXferred(); |
MikamiUitOpen | 0:ab7a35d87173 | 49 | // Output using SAI |
MikamiUitOpen | 0:ab7a35d87173 | 50 | void Output(int16_t xL, int16_t xR); |
MikamiUitOpen | 0:ab7a35d87173 | 51 | |
MikamiUitOpen | 0:ab7a35d87173 | 52 | void StopOut() { BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW); } |
MikamiUitOpen | 0:ab7a35d87173 | 53 | void PauseOut() { BSP_AUDIO_OUT_Pause(); } |
MikamiUitOpen | 0:ab7a35d87173 | 54 | void ResumeOut() { BSP_AUDIO_OUT_Resume(); } |
MikamiUitOpen | 0:ab7a35d87173 | 55 | |
MikamiUitOpen | 0:ab7a35d87173 | 56 | // IF you use both input and output of SAI, |
MikamiUitOpen | 0:ab7a35d87173 | 57 | // you can use following function |
MikamiUitOpen | 0:ab7a35d87173 | 58 | bool IsCompleted() |
MikamiUitOpen | 0:ab7a35d87173 | 59 | { return IsCaptured() && IsXferred(); } |
MikamiUitOpen | 0:ab7a35d87173 | 60 | |
MikamiUitOpen | 0:ab7a35d87173 | 61 | // Following two member functions are called from |
MikamiUitOpen | 0:ab7a35d87173 | 62 | // callback functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:ab7a35d87173 | 63 | static void Captured1st() { Captured(0); } |
MikamiUitOpen | 0:ab7a35d87173 | 64 | static void Captured2nd() { Captured(bufferSize_/2); } |
MikamiUitOpen | 0:ab7a35d87173 | 65 | |
MikamiUitOpen | 0:ab7a35d87173 | 66 | // Following two member functions are called from |
MikamiUitOpen | 0:ab7a35d87173 | 67 | // callback functions in "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:ab7a35d87173 | 68 | static void FillBuffer1st() { FillBuffer(0); } |
MikamiUitOpen | 0:ab7a35d87173 | 69 | static void FillBuffer2nd() { FillBuffer(bufferSize_/2); } |
MikamiUitOpen | 0:ab7a35d87173 | 70 | |
MikamiUitOpen | 0:ab7a35d87173 | 71 | // Called form the functions in "BSP_AudioIn_Overwrite.cpp" |
MikamiUitOpen | 0:ab7a35d87173 | 72 | // and "BSP_AudioOut_Overwrite.cpp" |
MikamiUitOpen | 0:ab7a35d87173 | 73 | static void ErrorTrap(); |
MikamiUitOpen | 0:ab7a35d87173 | 74 | |
MikamiUitOpen | 0:ab7a35d87173 | 75 | private: |
MikamiUitOpen | 0:ab7a35d87173 | 76 | const int FS_; |
MikamiUitOpen | 0:ab7a35d87173 | 77 | const InOutBoth IOBOTH_; |
MikamiUitOpen | 0:ab7a35d87173 | 78 | |
MikamiUitOpen | 0:ab7a35d87173 | 79 | Array<uint16_t> inBuffer_; |
MikamiUitOpen | 0:ab7a35d87173 | 80 | static Array<uint16_t> outBuffer_; |
MikamiUitOpen | 0:ab7a35d87173 | 81 | static Array<uint16_t> tmp_; |
MikamiUitOpen | 0:ab7a35d87173 | 82 | |
MikamiUitOpen | 0:ab7a35d87173 | 83 | __IO int32_t inIndex_; |
MikamiUitOpen | 0:ab7a35d87173 | 84 | __IO int32_t tmpIndex_; |
MikamiUitOpen | 0:ab7a35d87173 | 85 | |
MikamiUitOpen | 0:ab7a35d87173 | 86 | static int32_t nData_; |
MikamiUitOpen | 0:ab7a35d87173 | 87 | static int32_t bufferSize_; |
MikamiUitOpen | 0:ab7a35d87173 | 88 | static __IO bool captured_; |
MikamiUitOpen | 0:ab7a35d87173 | 89 | static __IO int32_t inOffset_; |
MikamiUitOpen | 0:ab7a35d87173 | 90 | static __IO bool xferred_; |
MikamiUitOpen | 0:ab7a35d87173 | 91 | |
MikamiUitOpen | 0:ab7a35d87173 | 92 | void InitCodec(uint16_t inputDevice); |
MikamiUitOpen | 0:ab7a35d87173 | 93 | void InitInput(uint16_t inputDevice); |
MikamiUitOpen | 0:ab7a35d87173 | 94 | void SetInput(); |
MikamiUitOpen | 0:ab7a35d87173 | 95 | void SetOutput(); |
MikamiUitOpen | 0:ab7a35d87173 | 96 | void ClearBuffer(); |
MikamiUitOpen | 0:ab7a35d87173 | 97 | |
MikamiUitOpen | 0:ab7a35d87173 | 98 | // This function pointer is assigned by |
MikamiUitOpen | 0:ab7a35d87173 | 99 | // InputNormal() or InputReversal() |
MikamiUitOpen | 0:ab7a35d87173 | 100 | void (SaiIO::*InputFp)(int16_t &, int16_t &); |
MikamiUitOpen | 0:ab7a35d87173 | 101 | // For line input |
MikamiUitOpen | 0:ab7a35d87173 | 102 | void InputNormal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 0:ab7a35d87173 | 103 | // For MEMS microphone input |
MikamiUitOpen | 0:ab7a35d87173 | 104 | void InputReversal(int16_t &xL, int16_t &xR); |
MikamiUitOpen | 0:ab7a35d87173 | 105 | |
MikamiUitOpen | 0:ab7a35d87173 | 106 | static void Captured(int32_t offset); |
MikamiUitOpen | 0:ab7a35d87173 | 107 | static void FillBuffer(uint32_t offset); |
MikamiUitOpen | 0:ab7a35d87173 | 108 | }; |
MikamiUitOpen | 0:ab7a35d87173 | 109 | } |
MikamiUitOpen | 0:ab7a35d87173 | 110 | #endif // F746_SAI_IO_HPP |