极海APM32F407IG Tiny Board开发板测评9:利用DAC实现音频输出

2023-10-21 世强
开发板,MCU,APM32F407,APM32F407IG 开发板,MCU,APM32F407,APM32F407IG 开发板,MCU,APM32F407,APM32F407IG 开发板,MCU,APM32F407,APM32F407IG

利用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播放,这里就不展开了,有兴趣的可以去尝试一下。



授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

本文由咪猫转载自世强,原文标题为:【极海APM32F407IG Tiny Board开发板测评】9.利用DAC实现音频输出,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关研发服务和供应服务

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

极海APM32F407IG Tiny Board开发板测评2:Keil MDK开发环境搭建

上文我们对极海APM32F407IG Tiny Board开发板进行了开箱测评,本文将介绍Keil MDK开发环境搭建。

2023-10-17 -  设计经验 代理服务 技术支持 采购服务

【经验】APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件的方法

本文详细介绍了如何将极海半导体APM32F4 MCU在RT-Thread系统上添加以太网驱动和使用LwIP网络组件,其他APM32带有以太网控制器的MCU,在RT-Thread使用LwIP网络功能也是大同小异的,按照这个过程基本都可以把网络功能应用起来。

2023-08-25 -  设计经验 代理服务 技术支持 采购服务

APM32芯得 | 基于极海APM32E103系列MCU的SPI转CAN芯片MCP2515移植测试

极海半导体APM32E103系列MCU支持CAN协议2.0A和2.0B,通信波特率最大为1Mbit/s,并且拥有双CAN接口,能适应更多的应用场合。将杜邦线按照引脚配置,接好线后仿真就能测试回环模式下收发数据了。可以看到断点打到接收部分,可以接收到CAN数据,与发送的数据一致。

2024-11-15 -  设计经验 代理服务 技术支持 采购服务

tandby模式下,如何唤醒MCU APM32的RTC与WKUP?

APM32F103系列低功耗模式有三种:睡眠模式、停止模式和待机模式。通过关闭内核、时钟源、设置调压器来降低功耗。本文极海半导体解析了APM32的tandby模式下的RTC唤醒与WKUP唤醒功能如何实现。

2024-01-27 -  设计经验 代理服务 技术支持 采购服务

极海APM32F407IG Tiny Board开发板测评5:UART通讯+SPI驱动LCD12864+I2C读取D

上文对极海APM32F407IG Tiny Board开发板进行了按键+定时器测试,本文将就UART通讯+SPI驱动LCD12864+I2C读取D展开测试。

2023-10-26 -  设计经验 代理服务 技术支持 采购服务

还可以这样玩?极海半导体APM32F411系列MCU与pyocd的火花

前段时间笔者学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?本文中极海半导体与大家分享能够自动化完成重复操作的设计经验。

2024-08-29 -  设计经验 代理服务 技术支持 采购服务

【应用】极海半导体MCU APM32F103系列用于HMI人机界面,可满足HMI功耗调整、蓝牙通信等需求

本文推荐采用极海半导体推出的APM32F103系列MCU作为HMI人机界面的主控,最高96MHz工作频率,FLASH 256K,SRAM 64K,支持FPU单元;资源丰富,有CRC/RTC/DMA通道,两个DMA;通信接口丰富。

2023-05-25 -  应用方案 代理服务 技术支持 采购服务

【经验】极海MCU APM32F103 IAP的实现方式

拿到了一块APM32F103VC的MINI开发板,在学习了一段时间后发现其有非常丰富的外设资源,主频能达到96Mhz。最近在项目中使用到了IAP(In Application Programming)功能,特来评估一下APM32F103的IAP实现方式。

2022-12-30 -  设计经验 代理服务 技术支持 采购服务

极海联亮相2024全球MCU及嵌入式生态发展大会,展出新技术和产品并发表演讲

2024年7月25日,2024全球MCU及嵌入式生态发展大会在深圳君悦酒店举行,由AspenCore主办。极海作为特邀嘉宾在主论坛进行演讲,并展出新技术和产品,包括搭载Arm Cortex M52内核且采用Helium技术的G32R5系列实时控制MCU和针对电机市场的栅极驱动器与APM32M3514系列SoC等新品。

2024-07-29 -  原厂动态 代理服务 技术支持 采购服务

【应用】国产工业级高性能MCU APM32F407VGT6用于PLC工控板,主频168MHz,通信外设丰富

某客户主要做各种工业自动控制系统装置,其中一款国产PLC工控板主控要更换成国产物料,推荐极海工业级高性能MCU APM32F407系列,主频高达168MHz、通信外设资源丰富,工作温度范围-40℃到+85℃。

2023-03-14 -  应用方案 代理服务 技术支持 采购服务

极海半导体APM32F407系列MCU支持国密算法,助力国产安全可控,适用于新能源等领域

极海推出的APM32F407系列MCU,结合当前环境要求,设计出了支持国密算法(SM2,SM3,SM4)的IP, 符合国家密码管理局认定和公布的密码算法标准及其应用规范,并凭借显著的性能优势,已应用至新能源、工业控制、医疗设备等众多领域。

2023-01-07 -  原厂动态 代理服务 技术支持 采购服务

Mbed OS适配极海APM32F407IG TinyBoard,灵活便捷、简单易用

Mbed OS是一款基于Arm® Cortex®-M架构设计的免费开源物联网操作系统,由Arm及其技术伙伴协作开发,具有连接性、易用性、安全性、模块化、支持设备管理和机器学习等特点,同时可提供软件库、开发硬件、教程和代码示例等资源,帮助开发人员轻松构建、测试和部署物联网设备。适配极海APM32F407IG TinyBoard。

2024-06-29 -  产品 代理服务 技术支持 采购服务

极海半导体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位车规级芯片设计企业,极海积极布局以服务汽车智能化、电动化、网联化的快速融合。

2023-11-30 -  原厂动态 代理服务 技术支持 采购服务

APM32F411 高性能高适配型 MCU

描述- 该资料介绍了APM32F411高性能高适配型MCU的特点和应用。这款MCU采用55nm先进工艺制程,基于Arm® Cortex®-M4F内核,具备高速运算能力和丰富的外设接口。它适用于多种工业和消费电子领域。

型号- APM32F4,APM32F411

Apr-2024  - 极海半导体  - 数据手册 代理服务 技术支持 采购服务
展开更多

电子商城

查看更多

品牌:极海半导体

品类:MCU

价格:

现货: 0

品牌:极海半导体

品类:MCU

价格:¥1.6200

现货: 100

品牌:极海半导体

品类:MCU

价格:¥14.9850

现货: 60

品牌:极海半导体

品类:MCU

价格:¥14.8500

现货: 51

品牌:极海半导体

品类:MCU

价格:¥13.5000

现货: 50

品牌:极海半导体

品类:MCU

价格:¥9.7200

现货: 50

品牌:极海半导体

品类:MCU

价格:¥12.1500

现货: 50

品牌:极海半导体

品类:MCU

价格:¥14.1750

现货: 50

品牌:极海半导体

品类:MCU

价格:¥12.4200

现货: 50

品牌:极海半导体

品类:MCU

价格:¥15.7950

现货: 50

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:RENESAS

品类:16-BIT MCU

价格:¥5.5190

现货:910,635

品牌:RENESAS

品类:MCU

价格:¥5.1500

现货:200,000

品牌:恒烁

品类:MCU

价格:¥1.0800

现货:154,600

品牌:Microchip

品类:MCU

价格:¥6.6000

现货:100,000

品牌:RENESAS

品类:MCU

价格:¥5.8041

现货:86,925

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥7.3800

现货:76,715

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥15.3000

现货:75,000

品牌:Microchip

品类:MCU

价格:¥9.0000

现货:64,841

品牌:ST

品类:MCU

价格:¥15.5600

现货:58,800

品牌:RENESAS

品类:32-BIT GENERAL MCU

价格:¥257.6400

现货:58,799

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

TFT LCD液晶显示屏/模组定制

可定制显示屏的尺寸0.96”~15.6”,分辨率80*160~3840*2160,TN/IPS视角,支持RGB、MCU、SPI、MIPI、LVDS、HDMI接口,配套定制玻璃、背光、FPCA/PCBA。

最小起订量: 1000 提交需求>

IC烧录代工及IC自动化烧录

拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。

最小起订量: 1 提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面