|
|
发表于 2022-5-24 12:12:48
|
显示全部楼层
请帮忙看看:
#include "dac.h"
#include "math.h"
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
#define DACSAMPLEUMBER 300
u16 g_usWaveBuffp[DACSAMPLEUMBER];
u16 g_usWaveBuffn[DACSAMPLEUMBER];
DAC_HandleTypeDef DacHandle;//DAC
//初始化DAC
void DAC1_Init(void)
{
u16 i;
DAC_ChannelConfTypeDef sConfig;//DAC通道
/* 生成正弦波数据 */
MakeSinTable(g_usWaveBuffp, DACSAMPLEUMBER, 0, 4000);
for(i =0; i < DACSAMPLEUMBER; i++)g_usWaveBuffn[i] = g_usWaveBuffp[DACSAMPLEUMBER - 1 - i];
/*##-4- 配置DAC通道######################################*/
DacHandle.Instance=DAC1;
HAL_DAC_Init(&DacHandle);//初始化DAC
sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; /* 采用定时器6触发 */
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; /* 使能输出缓冲 */
HAL_DAC_ConfigChannel(&DacHandle,&sConfig,DAC_CHANNEL_1); /*DAC通道1配置*/
DAC_WaveConfig();
}
//初始化DMA
void DAC_WaveConfig(void)
{
DMA_HandleTypeDef hdma_dac1;/*DMA0*/
DMA_HandleTypeDef hdma_dac2;/*DMA1*/
__HAL_RCC_DMA2_CLK_ENABLE();
/*##-5- 配置通道1的DMA ##########################################*/
hdma_dac1.Instance = DMA2_Stream2; /*使用的DAM1 Stream2*/
hdma_dac1.Init.Request = DMA_REQUEST_DAC1; /*DAC触发DMA传输*/
hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;/*存储器到外设*/
hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE; /*外设地址禁止自增*/
hdma_dac1.Init.MemInc = DMA_MINC_ENABLE; /*存储器地址自增*/
hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /*外输操作数据宽度,半字*/
hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /*存储器操作数据宽度,半字*/
hdma_dac1.Init.Mode = DMA_CIRCULAR; /*循环模式*/
hdma_dac1.Init.Priority = DMA_PRIORITY_HIGH; /*优先级高*/
HAL_DMA_Init(&hdma_dac1);
/* 关联DMA句柄到DAC句柄下 */
__HAL_LINKDMA(&DacHandle, DMA_Handle1, hdma_dac1);
/* 启动DAC DMA */
HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_1, (u32 *)g_usWaveBuffn, DACSAMPLEUMBER, DAC_ALIGN_12B_R);
}
//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdac AC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_DAC12_CLK_ENABLE(); //使能DAC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
//配置引脚
GPIO_Initure.Pin=GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
//定时器6触发DAC输出
void TIM6_Config(void)
{
TIM_HandleTypeDef htim;//定时器
TIM_MasterConfigTypeDef sMasterConfig;
/* TIM6 时钟使能 */
__HAL_RCC_TIM6_CLK_ENABLE();
/* 配置定时器外设 */
htim.Instance = TIM6;
htim.Init.Period = 49;
htim.Init.Prescaler = 0;
htim.Init.ClockDivision = 0;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim);
/* TIM6 TRGO 选择 */
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);
/* 使能定时器 */
HAL_TIM_Base_Start(&htim);
}
//功能说明: 计算产生正弦波数组
static void MakeSinTable(u16 *_pBuf, u16 _usSamples, u16 _usBottom, u16 _usTop)
{
u16 i;
u16 mid; /* 中值 */
u16 att; /* 幅度 */
mid = (_usBottom + _usTop) / 2; /* 0位的值 */
att = (_usTop - _usBottom) / 2; /* 正弦波幅度,峰峰值除以2 */
for (i = 0; i < _usSamples; i++)
{
_pBuf[i] = mid + (s32)(att * sin((i * 2 * 3.1415926f) / _usSamples));
}
} |
|