16bit resolution PWM wave player with SD card, super lite version.

Dependencies:   mbed DirectSPI FastPWM

Supported boards (confirmed):
Nucleo-F030R8
Nucleo-L152RE
Nucleo-F401RE
Nucleo-F411RE

Only compilation is OK (unchecked, but may work):
Nucleo-L073RZ
Nucleo-F334R8
Nucleo-F303RE
Nucleo-F429ZI
Nucleo-F446RE
Nucleo-F446ZE
Nucleo-L476RG

Supported SD card:
SDSC/SDHC card,
FAT16 and FAT32.
(1) At first, format SD card using SD Card Formatter
https://www.sdcard.org/downloads/formatter_4/index.html
(2) Copy PCM wav files to the SD card.
Supported file:
PCM wave file that have file extension ".wav" on root directory.
16bit/8bit, fs(sampling rate)=32kHz,44.1kHz,48kHz.
Stereo/Mono.

Hardware setting:
Refer to the file port_setting.txt
PWM output port:
Left upper(Hi) PWM 8bit out: PB_5 (TM3_CH2)
Right upper(Hi) PWM 8bit out: PB4 (TM3_CH1)
Left lower(Low) PWM 8bit out: PC_9 (TM3_CH4)
Right lower(Low) PWM 8bit out: PC_8 (TM3_CH3)
http://mpu.up.seesaa.net/image/16bit-wave-player-output-schema.png
USER_BUTTON: PC_13(default button)
Next song: One click in Play mode.
Pause : Push long time .
Play : One click from Pause.

pwm_lib.h

Committer:
mimi3
Date:
2020-10-09
Revision:
21:dc161a192ba7
Parent:
0:9a5c2fb0d96f

File content as of revision 21:dc161a192ba7:

#ifndef __PWM_LIB_H__
#define __PWM_LIB_H__

#include "sys.h"
#include "FastPWM.h"

/*
 * PWM Timer interrupt module
 * */
#if defined(TIM3)
#   define TIM_PWM      TIM3
#   define TIM_PWM_IRQ  TIM3_IRQn
#else
#   error Edit this file properly !
#endif

#define TPWM                        FastPWM
//#define TPWM                        PwmOut
#define PWM_TIMER_PRE_SCALE         1
#define pwm_dutyL_hi(m)                pwmLeftHi.pulsewidth_ticks(  m );
#define pwm_dutyR_hi(m)                pwmRightHi.pulsewidth_ticks( m );
#define pwm_dutyL_low(m)               pwmLeftLow.pulsewidth_ticks( m );
#define pwm_dutyR_low(m)               pwmRightLow.pulsewidth_ticks( m );

// Use PWM3-1,PWM3-2 with TIM3
#define PWM_PORT_LEFT_HI    PB_5    // TIM3_CH2
#define PWM_PORT_RIGHT_HI   PB_4    // TIM3_CH1
// Use PWM3-3,PWM3-4 with TIM3
#define PWM_PORT_LEFT_LOW   PC_9    // TIM3_CH4
#define PWM_PORT_RIGHT_LOW  PC_8    // TIM3_CH3

/*
 * Timer and Interrupt definitions
 * */
#define periodTimerIntrStart()  __HAL_TIM_ENABLE_IT(  &TimHandle_pwm, TIM_IT_UPDATE )
#define periodTimerIntrStop()   __HAL_TIM_DISABLE_IT( &TimHandle_pwm, TIM_IT_UPDATE )
#define periodTimerIntrClear()  __HAL_TIM_CLEAR_FLAG( &TimHandle_pwm, TIM_FLAG_UPDATE)
#define pwmPeriodIntrEnable()    NVIC_EnableIRQ(  TIM_PWM_IRQ )
#define pwmPeriodIntrDisable()   NVIC_DisableIRQ( TIM_PWM_IRQ )

extern TPWM pwmLeftHi,pwmRightHi;
extern TPWM pwmLeftLow,pwmRightLow;
extern uint8_t gPcmShifNum;
void setPwmPeriod(int);
uint8_t calcPcmValidBits( void );

void pwm_period_timer_start();
void pwm_period_timer_stop();
void pwm_init() ;
#endif /* __PWM_LIB_H__ */