极海APM32F407IG Tiny Board开发板测评9:利用DAC实现音频输出
利用DAC实现音频输出
DAC数模转换器DAC与ADC模数转换相反,是将数字量转换为模拟量输出,APM32F407提供了2个12位的DAC,可配置为输入8位或12位数据。
先利用DAC和定时器输出方波三角波正弦波等各种波形,能用于DAC输出的只有这两个IO
选用PA4,用按键切换波形
代码实现
uint8_t dacvalue = 0;
uint8_t wavetype = 0;
uint16_t wavestep = 0;
uint8_t sinvalues[91] = {0,4,9,13,18,22,27,31,35,40,44,49,53,57,62,66,70,75,79,83,87,91,96,100,104,108,112,116,120,124,127,131,135,139,143,146,150,153,157,160,164,167,171,174,177,180,183,186,190,192,195,198,201,204,206,209,211,214,216,219,221,223,225,227,229,231,233,235,236,238,240,241,243,244,245,246,247,248,249,250,251,252,253,253,254,254,254,255,255,255,255};
void tim3_init()
{
TMR_BaseConfig_T TMR_TimeBaseStruct;
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = 41;
TMR_TimeBaseStruct.repetitionCounter = 0;
TMR_TimeBaseStruct.period = 999;
TMR_ConfigTimeBase(TMR3, &TMR_TimeBaseStruct);
TMR_EnableInterrupt(TMR3,TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR3_IRQn, 0, 0);
TMR_Enable(TMR3);
}
void dac_init()
{
GPIO_Config_T gpioConfig;
DAC_Config_T dacConfig;
/* Enable GPIOA clock */
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
/* DAC out PA4 pin configuration */
GPIO_ConfigStructInit(&gpioConfig);
gpioConfig.mode = GPIO_MODE_AN;
gpioConfig.pupd = GPIO_PUPD_NOPULL;
gpioConfig.pin = GPIO_PIN_4;
GPIO_Config(GPIOA, &gpioConfig);
/* Enable DAC clock */
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_DAC);
/* DAC channel 1 configuration */
DAC_ConfigStructInit(&dacConfig);
dacConfig.trigger = DAC_TRIGGER_NONE;
dacConfig.waveGeneration = DAC_WAVE_GENERATION_NONE;
dacConfig.maskAmplitudeSelect = DAC_LFSR_MASK_BIT11_1;
dacConfig.outputBuffer = DAC_OUTPUT_BUFFER_ENABLE;
DAC_Config(DAC_CHANNEL_1, &dacConfig);
/* Enable DAC channel 1 */
DAC_Enable(DAC_CHANNEL_1);
}
void proc_dac()
{
uint8_t changed = 0;
switch(wavetype)
{
case 0:
if(wavestep > 0)
wavestep -= 1;
else
{
if(dacvalue == 0)
dacvalue = 255;
else
dacvalue = 0;
changed = 1;
wavestep = 99;
}
break;
case 1:
dacvalue+=1;
changed = 1;
break;
case 2:
if(wavestep > 0)
wavestep -= 1;
else
{
wavestep = 10;
dacvalue+=15;
changed = 1;
}
break;
case 3:
if(wavestep < 255)
{
dacvalue=wavestep;
changed = 1;
}
else if(wavestep > 300 && wavestep < 556)
{
dacvalue= 555 - wavestep;
changed = 1;
}
if(wavestep < 600)
wavestep++;
else
wavestep = 0;
break;
case 4:
if(wavestep < 90)
{
dacvalue = sinvalues[wavestep];
changed = 1;
}
else
{
dacvalue = sinvalues[180 - wavestep];
changed = 1;
}
if(wavestep < 179)
wavestep++;
else
wavestep = 0;
break;
case 5:
if(wavestep < 90)
{
dacvalue = 127 + (sinvalues[wavestep]/2);
changed = 1;
}
else
{
dacvalue = 128 - (sinvalues[180 - wavestep]/2);
changed = 1;
}
if(wavestep < 179)
wavestep++;
else
wavestep = 0;
break;
case 6:
if(wavestep < 90)
{
dacvalue = 127 + (sinvalues[wavestep]/2);
changed = 1;
}
else if(wavestep < 180)
{
dacvalue = 127 + (sinvalues[180 - wavestep]/2);
changed = 1;
}
else if(wavestep < 270)
{
dacvalue = 128 - (sinvalues[wavestep - 180]/2);
changed = 1;
}
else
{
dacvalue = 128 - (sinvalues[360 - wavestep]/2);
changed = 1;
}
if(wavestep < 359)
wavestep++;
else
wavestep = 0;
break;
default:
break;
}
if(changed > 0)
DAC_ConfigChannel1Data(DAC_ALIGN_8BIT_R,dacvalue);
}
int main(void)
{
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
dac_init();
tim3_init();
while (1)
{
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
yuyy_delay_ms(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
wavetype += 1;
wavestep = 0;
if(wavetype > 6)
wavetype = 0;
}
}
}
}
void TMR3_IRQHandler(void)
{
if(TMR_ReadIntFlag(TMR3, TMR_INT_UPDATE) == SET)
{
proc_dac();
TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE);
}
}
运行效果
这样就实现了可控的电压输出,我们生活中所用的耳机音箱等最终也是向喇叭输出模拟量,所以理论上是能够利用这个DAC来输出音频的,接下来尝试一下。
先选一段音频,用Adobe Audition转换为WAV,为了少占用点空间加之DAC最大只支持12位,这里按如下参数导出。
之所以要转成这个格式是因为这个格式下文件内存储的就是数字电平信息。
用winhex打开转换后的wav文件,复制中间的一段内容,用这个选项可以直接以数组的形式复制,把复制的数组粘贴到代码中。
音频的采样频率是6000Hz,定时器这里也要调整参数以匹配采样率。
uint16_t wavestep = 0;
void tim3_init()
{
TMR_BaseConfig_T TMR_TimeBaseStruct;
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
TMR_TimeBaseStruct.division = 13;
TMR_TimeBaseStruct.repetitionCounter = 0;
TMR_TimeBaseStruct.period = 999;
TMR_ConfigTimeBase(TMR3, &TMR_TimeBaseStruct);
TMR_EnableInterrupt(TMR3,TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR3_IRQn, 0, 0);
TMR_Enable(TMR3);
}
DAC初始化代码和之前一样,播放代码
#define AUDIO_DATA_LEN 57552
uint8_t play = 0;
const uint8_t audio_data[57552] = {/*音频数组*/};
int main(void)
{
APM_TINY_PBInit(BUTTON_KEY1,BUTTON_MODE_GPIO);
APM_TINY_PBInit(BUTTON_KEY2,BUTTON_MODE_GPIO);
dac_init();
tim3_init();
while (1)
{
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
yuyy_delay_ms(30);
if(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET)
{
while(APM_TINY_PBGetState(BUTTON_KEY1) == BIT_RESET);
play = 1-play;
}
}
}
}
void TMR3_IRQHandler(void)
{
if(TMR_ReadIntFlag(TMR3, TMR_INT_UPDATE) == SET)
{
if(play > 0)
{
DAC_ConfigChannel1Data(DAC_ALIGN_8BIT_R,audio_data[wavestep]);
wavestep += 1;
if(wavestep == AUDIO_DATA_LEN)
wavestep = 0;
}
TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE);
}
}
运行效果,没有放大电路直接接喇叭几乎听不到声音,接到音箱上还可以。
成功用DAC播放了音频,开发板上还有USB和网口,可以尝试结合USB做个USB声卡,或者通过USB读取U盘中的WAV文件进行播放,或者利用以太网口通过网络播放,或者还可以用ADC连接MIC实现录音再用DAC播放,这里就不展开了,有兴趣的可以去尝试一下。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由咪猫转载自世强,原文标题为:【极海APM32F407IG Tiny Board开发板测评】9.利用DAC实现音频输出,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
极海APM32F407IG Tiny Board开发板测评2:Keil MDK开发环境搭建
上文我们对极海APM32F407IG Tiny Board开发板进行了开箱测评,本文将介绍Keil MDK开发环境搭建。
【经验】APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件的方法
本文详细介绍了如何将极海半导体APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件,其他APM32带有以太网控制器的MCU,在RT-Thread使用LwIP网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。
APM32芯得 | 基于极海APM32E103系列MCU的SPI转CAN芯片MCP2515移植测试
极海半导体APM32E103系列MCU支持CAN协议2.0A和2.0B,通信波特率最大为1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。将杜邦线按照引脚配置,接好线后仿真就能测试回环模式下收发数据了。可以看到断点打到接收部分,可以接收到CAN数据,与发送的数据一致。
tandby模式下,如何唤醒MCU APM32的RTC与WKUP?
APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。
极海APM32F407IG Tiny Board开发板测评5:UART通讯+SPI驱动LCD12864+I2C读取D
上文对极海APM32F407IG Tiny Board开发板进行了按键+定时器测试,本文将就UART通讯+SPI驱动LCD12864+I2C读取D展开测试。
还可以这样玩?极海半导体APM32F411系列MCU与pyocd的火花
前段时间笔者学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?本文中极海半导体与大家分享能够自动化完成重复操作的设计经验。
【应用】极海半导体MCU APM32F103系列用于HMI人机界面,可满足HMI功耗调整、蓝牙通信等需求
本文推荐采用极海半导体推出的APM32F103系列MCU作为HMI人机界面的主控,最高96MHz工作频率,FLASH 256K,SRAM 64K,支持FPU单元;资源丰富,有CRC/RTC/DMA通道,两个DMA;通信接口丰富。
【经验】极海MCU APM32F103 IAP的实现方式
拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。
极海联亮相2024全球MCU及嵌入式生态发展大会,展出新技术和产品并发表演讲
2024年7月25日,2024全球MCU及嵌入式生态发展大会在深圳君悦酒店举行,由AspenCore主办。极海作为特邀嘉宾在主论坛进行演讲,并展出新技术和产品,包括搭载Arm Cortex M52内核且采用Helium技术的G32R5系列实时控制MCU和针对电机市场的栅极驱动器与APM32M3514系列SoC等新品。
【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富
某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。
极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域
极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。
Mbed OS适配极海APM32F407IG TinyBoard,灵活便捷、简单易用
Mbed OS是一款基于Arm® Cortex®-M架构设计的免费开源物联网操作系统,由Arm及其技术伙伴协作开发,具有连接性、易用性、安全性、模块化、支持设备管理和机器学习等特点,同时可提供软件库、开发硬件、教程和代码示例等资源,帮助开发人员轻松构建、测试和部署物联网设备。适配极海APM32F407IG TinyBoard。
极海半导体32位MCU-M4选型表
极海半导体的APM32系列是基于Arm® Cortex®-M0+/M3/M4内核的优质国产32位通用MCU,具有低功耗、高性能、高集成度以及快速移植等特性。凭借优异的系统性能、丰富的协处理功能以及灵活的使用体验,有助于用户缩短产品设计时间、降低开发成本、实现性能最优化。
产品型号
|
品类
|
内核
|
Frequency(MHz)
|
FLASH(KB)
|
SRAM(KB)
|
SDRAM
|
Voltage
|
GPTMR(16bit)
|
GP TMR(32bit)
|
Advanced TMR(16bit)
|
Basic TMR
|
Systick
|
IWDG
|
WWDG
|
ADC 12-bit Cell
|
ADC 12-bit channels
|
DAC 12-bit channels
|
EMMC
|
SPI
|
I2S
|
I2C
|
U(S)ART
|
CAN
|
SDIO
|
USB OTG_FS
|
DCI
|
Ethernet
|
Package
|
对照型号
|
APM32F407IET6
|
32位MCU
|
ARM Cortex-M4
|
168MHz
|
512KB
|
192+4KB
|
1
|
1.8~3.6
|
8
|
2
|
2
|
2
|
1
|
1
|
1
|
3
|
24
|
2
|
1
|
3
|
2
|
3
|
4+2
|
2
|
1
|
1
|
1
|
1
|
LQFP176
|
STM32F407IET6
|
选型表 - 极海半导体 立即选型
极海车规级MCU凭借可靠的产品品质,斩获“2023汽车芯片50强”与“MCU创新先锋”两项大奖
近日,极海车规级MCU凭借可靠的产品品质、专业周到的客户技术支持服务,以及量产级解决方案良好的市场表现,相继斩获“2023汽车芯片50强”、“MCU创新先锋奖”两项行业大奖。作为国内领先的32位车规级芯片设计企业,极海积极布局以服务汽车智能化、电动化、网联化的快速融合。
APM32F411 高性能高适配型 MCU
描述- 该资料介绍了APM32F411高性能高适配型MCU的特点和应用。这款MCU采用55nm先进工艺制程,基于Arm® Cortex®-M4F内核,具备高速运算能力和丰富的外设接口。它适用于多种工业和消费电子领域。
型号- APM32F4,APM32F411
电子商城
现货市场
服务
可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。
最小起订量: 1000 提交需求>
拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论