圏9研究所 工作室

圏9研究所の開発情報資料など

STM32F103 BluePill USBマイク その3:マイク実装

1.概要
 マイクを接続しSTM32CubeIDEに導入したTinyUSBで処理する

2.構成
 コンデンサマイクモジュール → BluePillボード :ADC > DMA > TinyUSB → MacBook Air

3.仕様

項目

仕様

ボード

BluePill:STM32F103C8T6/CBT6

USB

USB Audio 2.0

 LEDによる状態表示

サンプリング

48kHz モノラル 16bit

マイク入力

ADC 12bit VCC/2±VCC/2

 サンプリング1

 ADC読込値を16倍して感度アップ

 

4.STM32CubeIDEプロジェクト作成
 TinyUSB audio_test にADC読込等を追加

1)MCU/MPU
 STM32F103C8T/CBT いずれか

2)STM32CubeMX設定
  TinyUSB audio_test に下記追加
 ・ADC トリガー:TIM3 48kHz, DMA取込
 ・GPIO LED点灯ポート出力

タブ

項目

設定

Pinout & Configuration

System Core

DMA

DMA1

ADC1, Mode : Circular, Memory : Harf word

 

GPIO

PC13

Output User Label : LED

NVIC

 

DMA1

 

USB high priority or CAN TX interrupts

USB low priority or CAN RX0 interrupts

RCC

 

High Speed Clock(HSE) : Crystal/Ceramic Resonator

SYS

 

Debug : Serial Wire

Analog

ADC1

IN8

NVIC : DMA1, DMA : DMA1

Parameter : Right alignment

External Trigger : TIM3 Trigger Out Event

Timers

TIM3

 

Mode : Internal Clock

Parameter : 48kHz=72MHz / (1499 + 1), Trigger Event : Update

Connectivity

USB

 

Device(FS) Middlewareは選択しない

Clock Configuration

 

 

 

HSE:8MHz, SYSCLK:72MHz, USB:48MHz

Project Manager

Linker setting

 

 

Minimum Heap Size:0x1000

Minimum Stack Size:0x1000

 

5.コード詳細
1)データフロー
 処理周期:USB割込 1ms毎 48データ

項目

データ

処理

ADC取込

マイクアンプ出力 VCC/2±VCC/2 12bit 変換

DMAでリングバッファに取込

TIM3 48kHz 48データ/周期

DMAリングバッファ

 int16_t adc_buffer[48]

ADC値変換

感度とVCC/2のオフセット調整変換しUSB出力待機バッファに格納

 

USB出力待機バッファ

 int16_t in_buffer[96]1/2交互に使用

 (ping pong buffer)

USB出力

変換済みの48データを転送

USB出力バッファ

uint16_t test_buffer_audio[48]

 

2)ファイル
(1)ファイル構成
 TinyUSB audio_test プロジェクトをコピーし変更する

(2)修正ファイル一覧

ファイル

修正変更内容

Core/Src/main.c

STM32CubeMXが生成する main.c に追記

 TinyUSB audio_test では audio_test main.c を統合したが別ファイルにする

Core/Src/usb.mic.c

Core/Inc/usb_mic.h

TinyUSB audio_test main.c ファイル名を変更し内容を修正する

 audio_test main関数の内容は関数化して新しいmain.cから呼び出す

 他のファイルから呼び出すために usb_mic.h を新設する

Core/Src/stm32f1xx_it.c

#define usb_mic.h 追記他

 

3)各ファイル内容
(1)main.c
 USER CODE Includes : インクルードファイルとバッファ関連変数宣言

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "tusb.h"
#include "usb_mic.h"

int16_t adc_buffer[AUDIO_IN_PACKET / 2] = {0};
int16_t in_buffer[AUDIO_IN_PACKET];
uint8_t in_buffer_half = 0;

/* USER CODE END Includes */