mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-22 17:12:55 +08:00
339 lines
7.6 KiB
C
339 lines
7.6 KiB
C
|
/*
|
||
|
* Copyright 2021 MindMotion Microelectronics Co., Ltd.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
|
||
|
#include "hal_dac.h"
|
||
|
|
||
|
void DAC_Init(DAC_Type * DACx, uint32_t channel, DAC_Init_Type * init)
|
||
|
{
|
||
|
uint32_t cr = 0u;
|
||
|
|
||
|
cr = DACx->CR & ~(( DAC_CR_BOFF1_MASK
|
||
|
| DAC_CR_TEN1_MASK
|
||
|
) << (channel<<4u)); /* Calculate the shift and clear the indicated bit. */
|
||
|
|
||
|
/* Enable Output Buffer. */
|
||
|
if (init->EnableOutBuf == false)
|
||
|
{
|
||
|
cr |= (DAC_CR_BOFF1_MASK << (channel<<4u));
|
||
|
}
|
||
|
|
||
|
/* Trigger Source. */
|
||
|
if (init->EnableTrigger)
|
||
|
{
|
||
|
cr |= ((DAC_CR_TEN1_MASK) << (channel<<4u));
|
||
|
}
|
||
|
|
||
|
DAC->CR = cr;
|
||
|
}
|
||
|
|
||
|
void DAC_Enable(DAC_Type * DACx, uint32_t channel, bool enable)
|
||
|
{
|
||
|
if (enable)
|
||
|
{
|
||
|
DACx->CR |= (DAC_CR_EN1_MASK << (channel << 4u));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DACx->CR &= ~(DAC_CR_EN1_MASK << (channel << 4u));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DAC_EnableChannelOutput(DAC_Type * DACx, uint32_t channel, bool enable)
|
||
|
{
|
||
|
if (enable)
|
||
|
{
|
||
|
DACx->CR |= (DAC_CR_OEEN1_MASK << (channel << 4u));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DACx->CR &= ~(DAC_CR_OEEN1_MASK << (channel << 4u));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetData(DAC_Type * DACx, uint32_t channel)
|
||
|
{
|
||
|
uint32_t ret = 0u;
|
||
|
|
||
|
if(channel == DAC_CHN_1)
|
||
|
{
|
||
|
ret = (DACx->DOR1 & DAC_DOR1_DACC1DOR_MASK);
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
ret = (DACx->DOR2 & DAC_DOR2_DACC2DOR_MASK);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_PutData(DAC_Type * DACx, uint32_t channel, uint32_t value, DAC_Align_Type align)
|
||
|
{
|
||
|
uint32_t ret = 0u;
|
||
|
|
||
|
switch (align)
|
||
|
{
|
||
|
case DAC_Align_8b_Dual:
|
||
|
{
|
||
|
DAC_PutDualChannelData8bRightAlign(DACx, value);
|
||
|
ret = DAC_GetData(DACx, DAC_CHN_1) | ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_8b_Right:
|
||
|
{
|
||
|
DAC_PutData8bRightAlign(DACx, channel, value);
|
||
|
ret = DAC_GetData(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Left:
|
||
|
{
|
||
|
DAC_PutData12bLeftAlign(DACx, channel, value);
|
||
|
ret = DAC_GetData(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Right:
|
||
|
{
|
||
|
DAC_PutData12bRightAlign(DACx, channel, value);
|
||
|
ret = DAC_GetData(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Dual_Left:
|
||
|
{
|
||
|
DAC_PutDualChannelData12bLeftAlign(DACx, value);
|
||
|
ret = DAC_GetData(DACx, DAC_CHN_1)
|
||
|
| ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Dual_Right:
|
||
|
{
|
||
|
DAC_PutDualChannelData12bRightAlign(DACx, value);
|
||
|
ret = DAC_GetData(DACx, DAC_CHN_1)
|
||
|
| ( DAC_GetData(DACx, DAC_CHN_2) << 16u);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
void DAC_EnableAddNoise(DAC_Type * DACx, uint32_t channel, DAC_AddNoise_Init_Type * init)
|
||
|
{
|
||
|
if (init == NULL)
|
||
|
{
|
||
|
DAC->CR &= ~(DAC_CR_WAVE1_MASK << (channel << 4u));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DAC->CR |= (( DAC_CR_WAVE1(1u) /* Noise wave need to set WAVEx = 01. */
|
||
|
| DAC_CR_MAMP1(init->AddNoise)
|
||
|
) << (channel << 4u));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DAC_EnableAddTriangle(DAC_Type * DACx, uint32_t channel, DAC_AddTriangle_Init_Type * init)
|
||
|
{
|
||
|
if (init == NULL)
|
||
|
{
|
||
|
DAC->CR &= ~(DAC_CR_WAVE1_MASK << (channel << 4u));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DAC->CR |= (( DAC_CR_WAVE1(2u) /* Noise wave need to set WAVEx = 1x. */
|
||
|
| DAC_CR_MAMP1(init->AddTriangle)
|
||
|
) << (channel << 4u));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DAC_EnableDMA(DAC_Type * DACx, uint32_t channel, bool enable)
|
||
|
{
|
||
|
if (enable)
|
||
|
{
|
||
|
DACx->CR |= (DAC_CR_DMAEN1_MASK << (channel<<4u));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DACx->CR &= ~(DAC_CR_DMAEN1_MASK << (channel<<4u));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DAC_DoSwTrigger(DAC_Type * DACx, uint32_t channel)
|
||
|
{
|
||
|
DACx->SWTRIGR |= (DAC_SWTRIGR_SWTRIG1_MASK << channel);
|
||
|
}
|
||
|
|
||
|
void DAC_DoDualChannelSwTrigger(DAC_Type * DACx)
|
||
|
{
|
||
|
DACx->SWTRIGR |= DAC_SWTRIGR_SWTRIG1_MASK
|
||
|
| DAC_SWTRIGR_SWTRIG2_MASK
|
||
|
;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetDataRegAddr(DAC_Type * DACx, uint32_t channel, DAC_Align_Type align)
|
||
|
{
|
||
|
uint32_t ret = 0u;
|
||
|
|
||
|
switch (align)
|
||
|
{
|
||
|
case DAC_Align_8b_Dual:
|
||
|
{
|
||
|
ret = DAC_GetDualChannelData8bRegAddr(DACx);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_8b_Right:
|
||
|
{
|
||
|
ret = DAC_GetData8bRegAddr(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Left:
|
||
|
{
|
||
|
ret = DAC_GetData12bLeftRegAddr(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Right:
|
||
|
{
|
||
|
ret = DAC_GetData12bRightRegAddr(DACx, channel);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Dual_Left:
|
||
|
{
|
||
|
ret = DAC_GetDualChannelData12bLeftRegAddr(DACx);
|
||
|
break;
|
||
|
}
|
||
|
case DAC_Align_12b_Dual_Right:
|
||
|
{
|
||
|
ret = DAC_GetDualChannelData12bRightRegAddr(DACx);
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
/* input value bit[7:0]. 12b output: xxxxxxxx0000. */
|
||
|
void DAC_PutData8bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
|
||
|
{
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
DACx->DHR8R1 = value;
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
DACx->DHR8R2 = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* input value bit[15:4]. 12b output: xxxxxxxxxxxx. */
|
||
|
void DAC_PutData12bLeftAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
|
||
|
{
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
DACx->DHR12L1 = value;
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
DACx->DHR12L2 = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* input value bit[11:0], 12b output: xxxxxxxxxxxx. */
|
||
|
void DAC_PutData12bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value)
|
||
|
{
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
DACx->DHR12R1 = value;
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
DACx->DHR12R2 = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* bit[15:8] for channel 2, bit[7:0] for channel 1. */
|
||
|
void DAC_PutDualChannelData8bRightAlign(DAC_Type * DACx, uint32_t value)
|
||
|
{
|
||
|
DACx->DHR8RD = value;
|
||
|
}
|
||
|
|
||
|
/* bit[31:16] for channel 2, bit[15:0] for channel 1. */
|
||
|
void DAC_PutDualChannelData12bLeftAlign(DAC_Type * DACx, uint32_t value)
|
||
|
{
|
||
|
DACx->DHR12LD = value;
|
||
|
}
|
||
|
|
||
|
/* bit[31:16] for channel 2, bit[15:0] for channel 1. */
|
||
|
void DAC_PutDualChannelData12bRightAlign(DAC_Type * DACx, uint32_t value)
|
||
|
{
|
||
|
DACx->DHR12RD = value;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetData8bRegAddr(DAC_Type * DACx, uint32_t channel)
|
||
|
{
|
||
|
uint32_t ret = 0u;
|
||
|
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR8R1));
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR8R2));
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetData12bLeftRegAddr(DAC_Type * DACx, uint32_t channel)
|
||
|
{
|
||
|
uint32_t ret = 0u;
|
||
|
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR12L1));
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR12L2));
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetData12bRightRegAddr(DAC_Type * DACx, uint32_t channel)
|
||
|
{
|
||
|
uint32_t ret = 0;
|
||
|
|
||
|
if (channel == DAC_CHN_1)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR12R1));
|
||
|
}
|
||
|
else if (channel == DAC_CHN_2)
|
||
|
{
|
||
|
ret = (uint32_t)(&(DACx->DHR12R2));
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetDualChannelData8bRegAddr(DAC_Type * DACx)
|
||
|
{
|
||
|
return (uint32_t)(&(DACx->DHR8RD));
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetDualChannelData12bLeftRegAddr(DAC_Type * DACx)
|
||
|
{
|
||
|
return (uint32_t)(&(DACx->DHR12LD));
|
||
|
}
|
||
|
|
||
|
uint32_t DAC_GetDualChannelData12bRightRegAddr(DAC_Type * DACx)
|
||
|
{
|
||
|
return (uint32_t)(&(DACx->DHR12RD));
|
||
|
}
|
||
|
|
||
|
/* EOF. */
|
||
|
|