CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラムを,入力として STM32F746 の内蔵 ADC を使うように変更したもの. http://seminar.cqpub.co.jp/ccm/ES18-0020

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Committer:
MikamiUitOpen
Date:
Wed Nov 08 11:43:52 2017 +0000
Revision:
1:501a83a5ee9d
Parent:
0:ab7a35d87173
2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:ab7a35d87173 1 //-----------------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 2 // SaiIO class
MikamiUitOpen 0:ab7a35d87173 3 // BSP_DISCO_F746NG Rev.9 に合わせて変更
MikamiUitOpen 0:ab7a35d87173 4 // InitInput() の内容を一部変更(変更前の部分はコメントアウト)
MikamiUitOpen 0:ab7a35d87173 5 //
MikamiUitOpen 0:ab7a35d87173 6 // 2017/09/17, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:ab7a35d87173 7 //-----------------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 8
MikamiUitOpen 0:ab7a35d87173 9 #include "SAI_InOut.hpp"
MikamiUitOpen 0:ab7a35d87173 10
MikamiUitOpen 0:ab7a35d87173 11 namespace Mikami
MikamiUitOpen 0:ab7a35d87173 12 {
MikamiUitOpen 0:ab7a35d87173 13 // Constructor
MikamiUitOpen 0:ab7a35d87173 14 SaiIO::SaiIO(InOutBoth ioBoth, int size, int fs,
MikamiUitOpen 0:ab7a35d87173 15 uint16_t inputDevice)
MikamiUitOpen 0:ab7a35d87173 16 : FS_(fs), IOBOTH_(ioBoth)
MikamiUitOpen 0:ab7a35d87173 17 {
MikamiUitOpen 0:ab7a35d87173 18 nData_ = size;
MikamiUitOpen 0:ab7a35d87173 19 bufferSize_ = (size*2)*2;
MikamiUitOpen 0:ab7a35d87173 20
MikamiUitOpen 0:ab7a35d87173 21 if (ioBoth != OUTPUT)
MikamiUitOpen 0:ab7a35d87173 22 {
MikamiUitOpen 0:ab7a35d87173 23 inBuffer_.SetSize((size*2)*2);
MikamiUitOpen 0:ab7a35d87173 24 inOffset_ = 0;
MikamiUitOpen 0:ab7a35d87173 25 captured_ = false;
MikamiUitOpen 0:ab7a35d87173 26 }
MikamiUitOpen 0:ab7a35d87173 27 if (ioBoth != INPUT)
MikamiUitOpen 0:ab7a35d87173 28 {
MikamiUitOpen 0:ab7a35d87173 29 outBuffer_.SetSize((size*2)*2);
MikamiUitOpen 0:ab7a35d87173 30 tmp_.SetSize(size*2);
MikamiUitOpen 0:ab7a35d87173 31 tmpIndex_ = 0;
MikamiUitOpen 0:ab7a35d87173 32 xferred_ = false;
MikamiUitOpen 0:ab7a35d87173 33 ClearBuffer();
MikamiUitOpen 0:ab7a35d87173 34 }
MikamiUitOpen 0:ab7a35d87173 35 InitCodec(inputDevice);
MikamiUitOpen 0:ab7a35d87173 36 }
MikamiUitOpen 0:ab7a35d87173 37
MikamiUitOpen 0:ab7a35d87173 38 // Input start
MikamiUitOpen 0:ab7a35d87173 39 void SaiIO::RecordIn()
MikamiUitOpen 0:ab7a35d87173 40 {
MikamiUitOpen 0:ab7a35d87173 41 if (BSP_AUDIO_IN_Record(inBuffer_, bufferSize_) == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 42 ErrorTrap();
MikamiUitOpen 0:ab7a35d87173 43 }
MikamiUitOpen 0:ab7a35d87173 44
MikamiUitOpen 0:ab7a35d87173 45 // Switching input device and run
MikamiUitOpen 0:ab7a35d87173 46 void SaiIO::SwitchInputDevice(int sw)
MikamiUitOpen 0:ab7a35d87173 47 {
MikamiUitOpen 0:ab7a35d87173 48 uint16_t dev = (sw == 0) ?
MikamiUitOpen 0:ab7a35d87173 49 INPUT_DEVICE_DIGITAL_MICROPHONE_2
MikamiUitOpen 0:ab7a35d87173 50 : INPUT_DEVICE_INPUT_LINE_1;
MikamiUitOpen 0:ab7a35d87173 51 InitInput(dev);
MikamiUitOpen 0:ab7a35d87173 52 ClearBuffer();
MikamiUitOpen 0:ab7a35d87173 53 RecordIn();
MikamiUitOpen 0:ab7a35d87173 54 if (IOBOTH_ == BOTH) PlayOut();
MikamiUitOpen 0:ab7a35d87173 55 }
MikamiUitOpen 0:ab7a35d87173 56
MikamiUitOpen 0:ab7a35d87173 57 // If captured, return true
MikamiUitOpen 0:ab7a35d87173 58 bool SaiIO::IsCaptured()
MikamiUitOpen 0:ab7a35d87173 59 {
MikamiUitOpen 0:ab7a35d87173 60 if (!captured_) return false;
MikamiUitOpen 0:ab7a35d87173 61
MikamiUitOpen 0:ab7a35d87173 62 inIndex_ = inOffset_;
MikamiUitOpen 0:ab7a35d87173 63 captured_ = false;
MikamiUitOpen 0:ab7a35d87173 64 return true;
MikamiUitOpen 0:ab7a35d87173 65 }
MikamiUitOpen 0:ab7a35d87173 66
MikamiUitOpen 0:ab7a35d87173 67 void SaiIO::PlayOut()
MikamiUitOpen 0:ab7a35d87173 68 {
MikamiUitOpen 0:ab7a35d87173 69 ClearBuffer();
MikamiUitOpen 0:ab7a35d87173 70 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:ab7a35d87173 71 if (BSP_AUDIO_OUT_Play(outBuffer_, bufferSize_*AUDIODATA_SIZE)
MikamiUitOpen 0:ab7a35d87173 72 == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 73 ErrorTrap();
MikamiUitOpen 0:ab7a35d87173 74 }
MikamiUitOpen 0:ab7a35d87173 75
MikamiUitOpen 0:ab7a35d87173 76 // Return true if transfer completion to output
MikamiUitOpen 0:ab7a35d87173 77 bool SaiIO::IsXferred()
MikamiUitOpen 0:ab7a35d87173 78 {
MikamiUitOpen 0:ab7a35d87173 79 if (!xferred_) return false;
MikamiUitOpen 0:ab7a35d87173 80
MikamiUitOpen 0:ab7a35d87173 81 tmpIndex_ = 0;
MikamiUitOpen 0:ab7a35d87173 82 xferred_ = false;
MikamiUitOpen 0:ab7a35d87173 83 return true;
MikamiUitOpen 0:ab7a35d87173 84 }
MikamiUitOpen 0:ab7a35d87173 85
MikamiUitOpen 0:ab7a35d87173 86 void SaiIO::Output(int16_t xL, int16_t xR)
MikamiUitOpen 0:ab7a35d87173 87 {
MikamiUitOpen 0:ab7a35d87173 88 tmp_[tmpIndex_++] = xL; // Left
MikamiUitOpen 0:ab7a35d87173 89 tmp_[tmpIndex_++] = xR; // Right
MikamiUitOpen 0:ab7a35d87173 90 }
MikamiUitOpen 0:ab7a35d87173 91
MikamiUitOpen 0:ab7a35d87173 92 void SaiIO::ErrorTrap()
MikamiUitOpen 0:ab7a35d87173 93 {
MikamiUitOpen 0:ab7a35d87173 94 DigitalOut led1(LED1);
MikamiUitOpen 0:ab7a35d87173 95 fprintf(stderr, "\r\n#### ERROR ####\r\n");
MikamiUitOpen 0:ab7a35d87173 96 while(true)
MikamiUitOpen 0:ab7a35d87173 97 {
MikamiUitOpen 0:ab7a35d87173 98 led1 = !led1;
MikamiUitOpen 0:ab7a35d87173 99 wait_ms(250);
MikamiUitOpen 0:ab7a35d87173 100 }
MikamiUitOpen 0:ab7a35d87173 101 }
MikamiUitOpen 0:ab7a35d87173 102
MikamiUitOpen 0:ab7a35d87173 103 // Initialize audio input and output
MikamiUitOpen 0:ab7a35d87173 104 void SaiIO::InitCodec(uint16_t inputDevice)
MikamiUitOpen 0:ab7a35d87173 105 {
MikamiUitOpen 0:ab7a35d87173 106 if (inputDevice != 0) InitInput(inputDevice);
MikamiUitOpen 0:ab7a35d87173 107
MikamiUitOpen 0:ab7a35d87173 108 if (IOBOTH_ == OUTPUT)
MikamiUitOpen 0:ab7a35d87173 109 if (BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:ab7a35d87173 110 100, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 111 ErrorTrap();
MikamiUitOpen 0:ab7a35d87173 112
MikamiUitOpen 0:ab7a35d87173 113 if (IOBOTH_ != OUTPUT) SetInput();
MikamiUitOpen 0:ab7a35d87173 114 if (IOBOTH_ != INPUT) SetOutput();
MikamiUitOpen 0:ab7a35d87173 115 }
MikamiUitOpen 0:ab7a35d87173 116
MikamiUitOpen 0:ab7a35d87173 117 void SaiIO::InitInput(uint16_t inputDevice)
MikamiUitOpen 0:ab7a35d87173 118 {
MikamiUitOpen 0:ab7a35d87173 119 int audioInVolume = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 0:ab7a35d87173 120 70 : 90;
MikamiUitOpen 0:ab7a35d87173 121 InputFp = (inputDevice == INPUT_DEVICE_INPUT_LINE_1) ?
MikamiUitOpen 0:ab7a35d87173 122 &SaiIO::InputNormal : &SaiIO::InputReversal;
MikamiUitOpen 0:ab7a35d87173 123 if (IOBOTH_ == BOTH)
MikamiUitOpen 0:ab7a35d87173 124 /*
MikamiUitOpen 0:ab7a35d87173 125 if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:ab7a35d87173 126 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 127 */
MikamiUitOpen 0:ab7a35d87173 128 if (BSP_AUDIO_IN_OUT_Init(inputDevice, OUTPUT_DEVICE_HEADPHONE,
MikamiUitOpen 0:ab7a35d87173 129 FS_, DEFAULT_AUDIO_IN_BIT_RESOLUTION,
MikamiUitOpen 0:ab7a35d87173 130 DEFAULT_AUDIO_IN_CHANNEL_NBR) == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 131 ErrorTrap();
MikamiUitOpen 0:ab7a35d87173 132
MikamiUitOpen 0:ab7a35d87173 133 if (IOBOTH_ == INPUT)
MikamiUitOpen 0:ab7a35d87173 134 if (BSP_AUDIO_IN_Init(inputDevice,
MikamiUitOpen 0:ab7a35d87173 135 audioInVolume, FS_) == AUDIO_ERROR)
MikamiUitOpen 0:ab7a35d87173 136 ErrorTrap();
MikamiUitOpen 0:ab7a35d87173 137 }
MikamiUitOpen 0:ab7a35d87173 138
MikamiUitOpen 0:ab7a35d87173 139 void SaiIO::SetInput()
MikamiUitOpen 0:ab7a35d87173 140 {
MikamiUitOpen 0:ab7a35d87173 141 NVIC_SetVector(AUDIO_IN_SAIx_DMAx_IRQ,
MikamiUitOpen 0:ab7a35d87173 142 (uint32_t)AUDIO_IN_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:ab7a35d87173 143 }
MikamiUitOpen 0:ab7a35d87173 144
MikamiUitOpen 0:ab7a35d87173 145 void SaiIO::SetOutput()
MikamiUitOpen 0:ab7a35d87173 146 {
MikamiUitOpen 0:ab7a35d87173 147 NVIC_SetVector(AUDIO_OUT_SAIx_DMAx_IRQ,
MikamiUitOpen 0:ab7a35d87173 148 (uint32_t)AUDIO_OUT_SAIx_DMAx_IRQHandler);
MikamiUitOpen 0:ab7a35d87173 149 BSP_AUDIO_OUT_SetAudioFrameSlot(CODEC_AUDIOFRAME_SLOT_02);
MikamiUitOpen 0:ab7a35d87173 150 }
MikamiUitOpen 0:ab7a35d87173 151
MikamiUitOpen 0:ab7a35d87173 152 void SaiIO::ClearBuffer()
MikamiUitOpen 0:ab7a35d87173 153 {
MikamiUitOpen 0:ab7a35d87173 154 if (IOBOTH_ != OUTPUT)
MikamiUitOpen 0:ab7a35d87173 155 for (int n=0; n<bufferSize_; n++) inBuffer_[n] = 0;
MikamiUitOpen 0:ab7a35d87173 156 for (int n=0; n<bufferSize_; n++) outBuffer_[n] = 0;
MikamiUitOpen 0:ab7a35d87173 157 for (int n=0; n<nData_*2; n++) tmp_[n] = 0;
MikamiUitOpen 0:ab7a35d87173 158 }
MikamiUitOpen 0:ab7a35d87173 159
MikamiUitOpen 0:ab7a35d87173 160 // For line input
MikamiUitOpen 0:ab7a35d87173 161 void SaiIO::InputNormal(int16_t &xL, int16_t &xR)
MikamiUitOpen 0:ab7a35d87173 162 {
MikamiUitOpen 0:ab7a35d87173 163 xL = inBuffer_[inIndex_++];
MikamiUitOpen 0:ab7a35d87173 164 xR = inBuffer_[inIndex_++];
MikamiUitOpen 0:ab7a35d87173 165 }
MikamiUitOpen 0:ab7a35d87173 166
MikamiUitOpen 0:ab7a35d87173 167 // For MEMS microphone input
MikamiUitOpen 0:ab7a35d87173 168 void SaiIO::InputReversal(int16_t &xL, int16_t &xR)
MikamiUitOpen 0:ab7a35d87173 169 {
MikamiUitOpen 0:ab7a35d87173 170 xR = inBuffer_[inIndex_++];
MikamiUitOpen 0:ab7a35d87173 171 xL = inBuffer_[inIndex_++];
MikamiUitOpen 0:ab7a35d87173 172 }
MikamiUitOpen 0:ab7a35d87173 173
MikamiUitOpen 0:ab7a35d87173 174 void SaiIO::Captured(int32_t offset)
MikamiUitOpen 0:ab7a35d87173 175 {
MikamiUitOpen 0:ab7a35d87173 176 captured_ = true;
MikamiUitOpen 0:ab7a35d87173 177 inOffset_ = offset;
MikamiUitOpen 0:ab7a35d87173 178 }
MikamiUitOpen 0:ab7a35d87173 179
MikamiUitOpen 0:ab7a35d87173 180 void SaiIO::FillBuffer(uint32_t offset)
MikamiUitOpen 0:ab7a35d87173 181 {
MikamiUitOpen 0:ab7a35d87173 182 int k = offset;
MikamiUitOpen 0:ab7a35d87173 183 for (int n=0; n<nData_*2; n++)
MikamiUitOpen 0:ab7a35d87173 184 outBuffer_[k++] = tmp_[n];
MikamiUitOpen 0:ab7a35d87173 185 xferred_ = true;
MikamiUitOpen 0:ab7a35d87173 186 }
MikamiUitOpen 0:ab7a35d87173 187
MikamiUitOpen 0:ab7a35d87173 188 int32_t SaiIO::nData_;
MikamiUitOpen 0:ab7a35d87173 189 int32_t SaiIO::bufferSize_;
MikamiUitOpen 0:ab7a35d87173 190
MikamiUitOpen 0:ab7a35d87173 191 __IO bool SaiIO::captured_;
MikamiUitOpen 0:ab7a35d87173 192 __IO int32_t SaiIO::inOffset_;
MikamiUitOpen 0:ab7a35d87173 193
MikamiUitOpen 0:ab7a35d87173 194 Array<uint16_t> SaiIO::outBuffer_;
MikamiUitOpen 0:ab7a35d87173 195 Array<uint16_t> SaiIO::tmp_;
MikamiUitOpen 0:ab7a35d87173 196 __IO bool SaiIO::xferred_;
MikamiUitOpen 0:ab7a35d87173 197 }