STM32 DAC播放音频

    普通模式CUBEMX配置:

image

    代码:HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
          HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_12B_R,sine256[i]);



    DMA模式CUBEMX配置:
    想要使用DMA,定时器6好像是和DAC1通道DMA绑定的,定时器7绑定DAC2通道DMA(测试了下,好像不影响,只要将任意定时器设置成update event就行)

image
image
image
image

    代码:在DAC的DMA中,因为DAC是12位的,所以可以设置DMA位16位或者32位,但是代价就是如果设置成16位,那么高四位是没用的,如果设置成32位,那么高20位是没用的。
    HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)dac_square_wave, 2, DAC_ALIGN_12B_R);
    这个函数的(uint32_t*)dac_square_wave只是提供一个首地址,真正的地址增加主要还是看DMA设置成16位还是32位,由此来判断每次地址+2还是+4;第四个参数就是DMA数据的个数


    采样率设置的是44100,但是频率=旋律=周期性触发的震动=采样率/构成旋律的点数(2)=22.05khz

image

    还有一个比较坑的地方,DAC两个通道的回调函数是不同的,而且不仅仅是数字不同,名字都区别挺大

image

  使用DAC播放16位的音频,需要对数据进行裁剪,将分辨率从-32768~32767映射到12位的0~4095,还有就是立体声道到单声道的转换,实测可以直接将频率从44100提高到88200,勉强能听。
posted @ 2026-05-07 17:42  青春猪头青年  阅读(6)  评论(0)    收藏  举报