#include "bat32g137.h"
#include "EventRecorder.h" // Keil.ARM Compiler::Compiler:Event Recorder
#include "dac.h"
#include "math.h"
#include "stdio.h"
#include "tim4.h"
#include "elc.h"
#define PI 3.1415f
static char buff[256];
#define DAC_REAL_TIME
// 分辨率为8位
int main(void)
{
// 调试模式
SystemCoreClockUpdate();
EventRecorderInitialize(0,0);
EventRecorderStart();
#ifdef DAC_NORMAL
// 初始化通道
DAC_Init(DAC_CHANNEL_0); // P22
// 启动通道
DAC_Start(DAC_CHANNEL_0);
// 计算测试值
for(unsigned short i = 0;i < 180;i++){
buff[i] = 256*sin(i*PI/180);
printf("buff[%d] = %d\r\n",i,buff[i]);
}
while(1)
{
// 输出DAC波形
for(unsigned short i = 0;i < 180;i++){
DAC_Set_Value(DAC_CHANNEL_0,buff[i]);
}
}
#endif
#ifdef DAC_REAL_TIME
TM4_IntervalTimer(TM4_CHANNEL_0,48000);
INTC_EnableIRQ(TM00_IRQn);
CGC->PER1 |= CGC_PER1_DACEN_Msk; /* enables input clock supply */
DAC->DAM = 0x00U;
// 配置为实时模式
DAC->DAM |= _01_DA0_TIME_OUTPUT_MODE;
DAC->DACS0 = _00_DA0_COUVERSION_VALUE;
/* Set ANO0 pin */
PORT->PMC2 |= 0x04U;
PORT->PM2 |= 0x04U;
// 启动通道
DAC_Start(DAC_CHANNEL_0);
// 计算测试值
for(unsigned short i = 0;i < 180;i++){
buff[i] = 256*sin(i*PI/180);
printf("buff[%d] = %d\r\n",i,buff[i]);
}
// 使用timer4 通道0 链接到DAC 通道0 上。
ELC_Start(_10_ELC_EVENT_INTTM00,_08_ELC_EVENT_LINK_DA0);
while(1)
{
}
#endif
}
void IRQ17_Handler(void) __attribute__((alias("tim4_channel0_interrupt")));
static void tim4_channel0_interrupt(void)
{
INTC_ClearPendingIRQ(TM00_IRQn); /* clear INTTM00 interrupt flag */
/* Start user code. Do not edit comment generated here */
static uint16_t count = 0;
DAC_Set_Value(DAC_CHANNEL_0,buff[count]);
if(count < 180){
count++;
}else{
count = 0;
}
/* End user code. Do not edit comment generated here */
}
定时器触发DAC转换,1ms一次,产生正弦波,实际测试如图结果和预期吻合。