[原创] MXCHIP+(3)Using PWM to generate audio

mars4zhu   2015-1-4 09:48 楼主



MXCHIP+3Using PWM to generate audio
文档编号
RD-0101-A0
关键字
MX1081, STM32F20x, STM32Cube, STM32 HAL Driver
摘要
本文档记录了使用STM32Cube的图形化配置工具STM32CubeMX来建立MX1081MCU——STM32F20x,LQFP176的初始化代码,并使用固件库——STM32Cube F2来实现音频的生成和输出。。
Mars4zhu

目  录

插图索引

表格索引
错误!未找到目录项。


1 创建STM32CubeMX工程1.1. 选择MCU
根据MX1081Datasheet,我们得知MX1081内部MCU内核是STM32F20x LQFP176封装,1M Flash,但不知为205还是207哪一种,而且F2xx系列MCU都向下兼容,因此选择了F217 LQFP176的,1M-FlashMCU
1.2. 设置引脚功能
MX1081Datasheet得知Core1081(核心板)的LEDPI9,因此我们在STM32CubeMXPinOut中设置PI9GPIO_Output,同时应该选择Sys中的SWD接口,此时STM32CubeMx自动将PA13PA14设置为SWDIOSWCLK功能。
file:///C:\Users\JamesChu\AppData\Local\Temp\ksohtml\wps9093.tmp.png
图 11  STM32CubeMX配置MX1081-MCU的系统引脚
最重要的当然是采用PWM输出引脚。使用PA2作为TIM2channal3PWM输出引脚。

图片8.png

图 12  STM32CubeMX配置MX1081-MCUPWM引脚
1.3. 设置MCU运行时钟
STM32CubeMXClock Configuration,这里选择了MCUHSI内部高速时钟,并采用PLL对其倍频到最大频率,如下图:
file:///C:\Users\JamesChu\AppData\Local\Temp\ksohtml\wps90E3.tmp.png
图 13  STM32CubeMX配置MX1081-MCU的时钟
1.4. 设置MCU外设初始化模式
STM32CubeMXConfiguration,设置MX1081PWM初始化参数,如下图:
图片9.png
图 14  STM32CubeMX配置MX1081-MCUPWM初始化
1.5. 设置工程参数和代码生成
STM32CubeMX菜单栏的Project-->Project Settings里面,配置工程生成的目录、工具链、代码生成的库引用/复制、用户代码的保留等功能。如下图:
file:///C:\Users\JamesChu\AppData\Local\Temp\ksohtml\wps9105.tmp.png
图 15  STM32CubeMX配置MX1081-MCU的功能参数
1.6. 生成代码和工程项目文件
最后点击菜单栏的Project-->Generate Code,则STM32CubeMX自动生成了对应的目录,并添加相应的库文件或引用到工程中。
2 增加用户代码,输出Audio音频2.1. 生成音频数据
为了生成音频数据,使用了一个wave文件转成C文件的工具软件wav2c。该软件读取.wav文件中的音频数据,然后生成C代码。
file:///C:\Users\JamesChu\AppData\Local\Temp\ksohtml\wps9115.tmp.png
图 21  使用WAV2C生成音频数据的C文件
2.2. 添加用户代码
STMCubeMX生成的代码里,main函数分别调用几个初始化函数(也是自动生成)后,MCU的引脚、外设就进入了我们设置的状态。因此直接在后面添加简单的用户代码即可,如下:
static float volumn = 1.0f;
void HAL_SYSTICK_Callback()
{
       
        uint8_t DAC_Value = audio_data[HAL_GetTick()%audio_data_len]/volumn;       
       
        HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_8B_R, DAC_Value);
       
       
        DAC_Value = audio_data2[HAL_GetTick()%audio_data_len2]/volumn;       
       
        HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_8B_R, 0xFF-DAC_Value);
       
        TIM2->CCR3 = DAC_Value;
       
}
/* USER CODE END 4 */
以上代码使用systick中断来更新PWM的数据。这是systick应设置为音频数据的同样的采样率。
3 运行效果
使用Jlink下载后,连接open1081analog-modulePA4,可以听到音频声音。
Keil中修改Volume的值,可以改变音量。
file:///C:\Users\JamesChu\AppData\Local\Temp\ksohtml\wps9135.tmp.png
图 31  MX1081-MCU的音频输出效果图

DAC输出音频的都一样。 只是感觉PWM的音质更好。就不在重复上传视频了。
4 总结
STM32Cube提供了固件库,用户可直接调用固件库函数来开发,并且可以很好的实现STM32-MCU全系列的代码一致性。同时STM32CubeMX工具提供的可视化引脚、外设、时钟等配置功能,可以帮助快速完成工程的建立、初始化。大大降低了开发者的工作量。
经过实测,使用PWMDAC可以提供更好的音质输出。


版本历史(Revision History
版本号
发布时间
内容
A0
2014-12-11
初次发布。

回复评论 (3)

很关心楼主是怎样用PWM方法实现音频输出的。
点赞  2015-1-12 12:55
引用: dontium 发表于 2015-1-12 12:55
很关心楼主是怎样用PWM方法实现音频输出的。


就是用音频采样率同样的产生timer中断, 然后在中断例程里面修改另一个timer的占空比, 就成了音频数据了。

点赞  2015-1-13 10:14
这样的话,PWM的频率就应该是44K或以上了,并且要在每个周期内对占空比修正。

这倒是个好办法,CPU的速度可以应付
点赞  2015-1-13 16:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复