ソフト S/PDIF トランスミッタ (13)

今回は STM32CubeMX のプロジェクト・ファイル (.ioc ファイル) を掲載し、ソース・プログラムの本体は次回の記事に掲載します。
後に示すリストを「コピー・アンド・ペースト」してプロジェクト・ファイルを作成し、STM32CubeMX に読み込ませ、C コードを生成すれば、ユーザ・プログラム部分が空白のソース・コードができあがります。
そのなかで、「main.c」を次回に示すリストで置き換えればソフト S/PDIF トランスミッタ・プログラムになります。
CubeMX および HAL ライブラリは、この記事を書いている時点での最新バージョン、

  • STM32CubeMX V4.3.1
  • STM32CubeF4 V1.3.0

を使用しています。
STM32CubeMX 自体のダウンロード/インストール/使用方法についての説明は省略します。
適当な場所に新規に「soft_spdif」フォルダを作成し、そこに下のリストを「コピー・アンド・ペースト」して作ったプロジェクト・ファイルを「soft_spdif.ioc」という名前でセーブしてください。
違うファイル名を付けることも可能ですが、その場合にはプロジェクト・ファイル内でプロジェクト名/ファイル名を指定している部分も変更してください。
また、使用するライブラリ・ファイルのコピーを格納するフォルダや生成される C ソース・ファイルを格納するフォルダは、プロジェクト・ファイルと同じレベルに作成されるので、新規フォルダ内にプロジェクト・ファイルを置いておかないと既存のファイル/フォルダと混在してしまいます。
STM32CubeMX の起動画面で「Load Project」のリンクをクリックし、現れる「Load Project」ダイアログで上記の .ioc ファイルを指定すればプロジェクトが読み込まれます。

#MicroXplorer Configuration settings - do not modify
#Wed Sep 03 18:38:04 JST 2014
Dma.Request0=SPI3_TX
Dma.RequestsNb=1
Dma.SPI3_TX.0.Channel=DMA_CHANNEL_0
Dma.SPI3_TX.0.Direction=DMA_MEMORY_TO_PERIPH
Dma.SPI3_TX.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.SPI3_TX.0.Instance=DMA1_Stream5
Dma.SPI3_TX.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.SPI3_TX.0.MemInc=DMA_MINC_ENABLE
Dma.SPI3_TX.0.Mode=DMA_CIRCULAR
Dma.SPI3_TX.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.SPI3_TX.0.PeriphInc=DMA_PINC_DISABLE
Dma.SPI3_TX.0.Priority=DMA_PRIORITY_LOW
Dma.SPI3_TX.0.RequestParameters=Instance,Channel,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
File.Version=4
I2S3.AudioFreq-Half_Duplex_Master=I2S_AUDIOFREQ_192K
I2S3.DataFormat-Half_Duplex_Master=I2S_DATAFORMAT_16B
I2S3.ErrorAudioFreq-Half_Duplex_Master=0.0 %
I2S3.IPParameters=AudioFreq-Half_Duplex_Master,ErrorAudioFreq-Half_Duplex_Master,RealAudioFreq-Half_Duplex_Master,Standard-Half_Duplex_Master,DataFormat-Half_Duplex_Master
I2S3.RealAudioFreq-Half_Duplex_Master=192.0 KHz
I2S3.Standard-Half_Duplex_Master=I2S_STANDARD_LSB
KeepUserPlacement=true
Mcu.Family=STM32F4
Mcu.IP0=DMA
Mcu.IP1=I2S3
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=SYS
Mcu.IP5=USART2
Mcu.IPNb=6
Mcu.Name=STM32F401R(B-C-D-E)Tx
Mcu.Package=LQFP64
Mcu.Pin0=PC13-ANTI_TAMP
Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=PA14
Mcu.Pin11=PB3
Mcu.Pin12=PB5
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin3=PH0 - OSC_IN
Mcu.Pin4=PH1 - OSC_OUT
Mcu.Pin5=PA2
Mcu.Pin6=PA3
Mcu.Pin7=PA4
Mcu.Pin8=PA5
Mcu.Pin9=PA13
Mcu.PinsNb=13
Mcu.UserName=STM32F401RETx
NVIC.DMA1_Stream5_IRQn=true\:0\:0
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0
NVIC.SysTick_IRQn=true\:0\:0
PA13.GPIOParameters=GPIO_Label
PA13.GPIO_Label=TMS
PA13.Locked=true
PA13.Mode=Serial-Wire
PA13.Signal=SYS_JTMS-SWDIO
PA14.GPIOParameters=GPIO_Label
PA14.GPIO_Label=TCK
PA14.Locked=true
PA14.Mode=Serial-Wire
PA14.Signal=SYS_JTCK-SWCLK
PA2.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_PuPd,GPIO_Mode
PA2.GPIO_Label=USART_TX
PA2.GPIO_Mode=GPIO_MODE_AF_PP
PA2.GPIO_PuPd=GPIO_NOPULL
PA2.GPIO_Speed=GPIO_SPEED_LOW
PA2.Locked=true
PA2.Mode=Asynchronous
PA2.Signal=USART2_TX
PA3.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_PuPd,GPIO_Mode
PA3.GPIO_Label=USART_RX
PA3.GPIO_Mode=GPIO_MODE_AF_PP
PA3.GPIO_PuPd=GPIO_NOPULL
PA3.GPIO_Speed=GPIO_SPEED_LOW
PA3.Locked=true
PA3.Mode=Asynchronous
PA3.Signal=USART2_RX
PA4.Mode=Half_Duplex_Master
PA4.Signal=I2S3_WS
PA5.GPIOParameters=GPIO_Label,GPIO_ModeDefaultOutputPP,GPIO_Speed,GPIO_PuPd,GPIO_Mode
PA5.GPIO_Label=LD2 [Green Led]
PA5.GPIO_Mode=GPIO_MODE_OUTPUT_PP
PA5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
PA5.GPIO_PuPd=GPIO_NOPULL
PA5.GPIO_Speed=GPIO_SPEED_LOW
PA5.Locked=true
PA5.Signal=GPIO_Output
PB3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Mode
PB3.GPIO_Mode=GPIO_MODE_AF_PP
PB3.GPIO_PuPd=GPIO_NOPULL
PB3.GPIO_Speed=GPIO_SPEED_MEDIUM
PB3.Locked=true
PB3.Mode=Half_Duplex_Master
PB3.Signal=I2S3_CK
PB5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Mode
PB5.GPIO_Mode=GPIO_MODE_AF_PP
PB5.GPIO_PuPd=GPIO_NOPULL
PB5.GPIO_Speed=GPIO_SPEED_MEDIUM
PB5.Locked=true
PB5.Mode=Half_Duplex_Master
PB5.Signal=I2S3_SD
PC13-ANTI_TAMP.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI,GPIO_PuPd
PC13-ANTI_TAMP.GPIO_Label=B1 [Blue PushButton]
PC13-ANTI_TAMP.GPIO_ModeDefaultEXTI=GPIO_MODE_EVT_RISING
PC13-ANTI_TAMP.GPIO_PuPd=GPIO_NOPULL
PC13-ANTI_TAMP.Locked=true
PC13-ANTI_TAMP.Signal=GPXTI13
PC14-OSC32_IN.Locked=true
PC14-OSC32_IN.Signal=RCC_OSC32_IN
PC15-OSC32_OUT.Locked=true
PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
PCC.Family=STM32F4
PCC.MCU=STM32F401R(D-E)Tx
PCC.MXVersion=4.3.1
PCC.PartNumber=STM32F401RETx
PCC.Seq0=0
PCC.SubFamily=STM32F401
PCC.Temperature=25
PCC.Vdd=null
PH0\ -\ OSC_IN.Locked=true
PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator
PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
PH1\ -\ OSC_OUT.Locked=true
PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator
PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerOptimize=2
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=false
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F401RETx
ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.3.0
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=soft_spdif.ioc
ProjectManager.ProjectName=soft_spdif
ProjectManager.TargetToolchain=MDK-ARM 4.73
RCC.APB1CLKDivider=RCC_HCLK_DIV2
RCC.HSE_VALUE=8000000
RCC.HSI_VALUE=16000000
RCC.IPParameters=,LSE_VALUE,PLLP,SYSCLKSource,APB1CLKDivider,PLLN,HSE_VALUE,PLLM,HSI_VALUE,PLLQ,PLLSource,VcooutputI2S,PLLI2SR,LSI_VALUE
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.PLLI2SR=5
RCC.PLLM=5
RCC.PLLN=210
RCC.PLLP=RCC_PLLP_DIV4
RCC.PLLQ=7
RCC.PLLSource=RCC_PLLSOURCE_HSE
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VcooutputI2S=61440000
SH.GPXTI13.0=GPIO_EXTI13
SH.GPXTI13.ConfNb=1
boardIOC=true

ピンの設定は下の図のようになります。

メイン・クロック、I2S クロック発生用 PLL の設定は下の図のようになります。