下面的代码使用软件触发的方式,组模式,不用选择时钟源,时钟源默认为PCLK
void DAC_Init()
{
/* 使能 DAC 时钟 */
CLK->APBCLK |= CLK_APBCLK_DAC_EN_Msk;
/* 配置多功能引脚 PC.6 和 PC.7 用作 DAC */
SYS->PC_L_MFP &= ~(SYS_PC_L_MFP_PC6_MFP_Msk | SYS_PC_L_MFP_PC7_MFP_Msk);
SYS->PC_L_MFP |= SYS_PC_L_MFP_PC6_MFP_DA_OUT0 | SYS_PC_L_MFP_PC7_MFP_DA_OUT1;
/* 关闭PC.6 and PC.7引脚的数字通路 */
GPIO_DISABLE_DIGITAL_PATH(PC, (1 << 6) | (1 << 7));
/* 软件触发 */
DAC_Open(DAC, 0, DAC_WRITE_DAT_TRIGGER);
DAC_Open(DAC, 1, DAC_WRITE_DAT_TRIGGER);
/* 使能 DAC 组模式 */
DAC_ENABLE_GROUP_MODE(DAC);
// 使能 DAC0 中断. 组模式中使能一个通道就可以了 .
DAC_ENABLE_INT(DAC, 0);
NVIC_EnableIRQ(DAC_IRQn);
// 等待两个通道ready
while(DAC_IS_BUSY(DAC, 0) == 1);
while(DAC_IS_BUSY(DAC, 1) == 1);
/* 写第一笔数据到DATA寄存器 */
DAC_WRITE_DATA(DAC, 0, a16Sine[index0]);
DAC_WRITE_DATA(DAC, 1, a16Sine[index1]); // 写通道1将触发 DAC 开始转换
}
/*中断处理函数*/
void DAC_IRQHandler(void)
{
// 清除中断标志
DAC_CLR_INT_FLAG(DAC, 0);
/*写下一笔数据*/
DAC_WRITE_DATA(DAC, 0, a16Sine[index0]);
DAC_WRITE_DATA(DAC, 1, a16Sine[index1]); // 写通道1将触发 DAC 开始转换
index0 = (index0 + 1) % SINE_ARRAY_SIZE;
index1 = (index1 + 1) % SINE_ARRAY_SIZE;
return;
}
|