首先我们知道正弦波的解析式为y=Asin(omiga*x+fei)+b,拓展到STM32中则会得到如下的式子:
y=2048*sin((2*pi/samples)*x)+2048.
其中形参的取值范围是(samples/2)<maxval,采样的间隔是2*pi/samples。
接下来编写我们的函数代码dac_sin.c:
#include "./BSP/DAC/dac_sin.h"
#include "math.c"
DAC_HandleTypeDef g_dac_handle;
DMA_HandleTypeDef g_dma_handle;
uint16_t g_dac_sin_buf[4096];
void dac_dma_init(void){
g_dma_handle.Instance = DMA2_Channel3;
g_dma_handle.Init.Direction = DMA_MEMORY_TO_PERIPH; //外设到内存
g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE; //因为选取的是DMA2的数据寄存器,选择不增量
g_dma_handle.Init.MemInc = DMA_MINC_ENABLE; //对于存储器需要存储多个数据,所以选择增量模式
g_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //外设数据位宽,我们选择16位半字(全字可以理解为全角中文字符)
g_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; //存储器数据位宽,我们也选择16位半字
g_dma_handle.Init.Mode = DMA_CIRCULAR; //选择循环模式
g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM; //只有1个DMA随便选
HAL_DMA_Init(&g_

最低0.47元/天 解锁文章
9587

被折叠的 条评论
为什么被折叠?



