EIS/examples/sequencer/main.c

144 lines
4.9 KiB
C

/*
Copyright (c) 2017-2019 Analog Devices, Inc. All Rights Reserved.
This software is proprietary to Analog Devices, Inc. and its licensors.
By using this software you agree to the terms of the associated
Analog Devices Software License Agreement.
*/
#include "stdio.h"
#include "ADuCM3029.h"
#include "AD5940.h"
/* Functions that used to initialize MCU platform */
uint32_t MCUPlatformInit(void *pCfg);
int main(void)
{
void AD5940_Main(void);
MCUPlatformInit(0);
AD5940_MCUResourceInit(0);
printf("Hello AD5940-Build Time:%s\n",__TIME__);
AD5940_Main();
}
/* Below functions are used to initialize MCU Platform */
uint32_t MCUPlatformInit(void *pCfg)
{
int UrtCfg(int iBaud);
/*Stop watch dog timer(ADuCM3029)*/
pADI_WDT0->CTL = 0xC9;
/* Clock Configure */
pADI_CLKG0_OSC->KEY = 0xCB14; // Select HFOSC as system clock.
pADI_CLKG0_OSC->CTL = // Int 32khz LFOSC selected in LFMUX
BITM_CLKG_OSC_CTL_HFOSCEN|BITM_CLKG_OSC_CTL_HFXTALEN;
while((pADI_CLKG0_OSC->CTL&BITM_CLKG_OSC_CTL_HFXTALOK) == 0);
pADI_CLKG0_OSC->KEY = 0xCB14;
pADI_CLKG0_CLK->CTL0 = 0x201; /* Select XTAL as system clock */
pADI_CLKG0_CLK->CTL1 = 0; // ACLK,PCLK,HCLK divided by 1
pADI_CLKG0_CLK->CTL5 = 0x00; // Enable clock to all peripherals - no clock gating
UrtCfg(230400);/*Baud rate: 230400*/
return 1;
}
/**
@brief int UrtCfg(int iBaud, int iBits, int iFormat)
==========Configure the UART.
@param iBaud :{B1200,B2200,B2400,B4800,B9600,B19200,B38400,B57600,B115200,B230400,B430800} \n
Set iBaud to the baudrate required:
Values usually: 1200, 2200 (for HART), 2400, 4800, 9600,
19200, 38400, 57600, 115200, 230400, 430800, or type in baud-rate directly
@note
- Powers up UART if not powered up.
- Standard baudrates are accurate to better than 0.1% plus clock error.\n
- Non standard baudrates are accurate to better than 1% plus clock error.
@warning - If an external clock is used for the system the ullRtClk must be modified with \n
the speed of the clock used.
**/
int UrtCfg(int iBaud)
{
int iBits = 3;//8bits,
int iFormat = 0;//, int iBits, int iFormat
int i1;
int iDiv;
int iRtC;
int iOSR;
int iPllMulValue;
unsigned long long ullRtClk = 16000000; // The root clock speed
/*Setup P0[11:10] as UART pins*/
pADI_GPIO0->CFG = (1<<22)|(1<<20)|(pADI_GPIO0->CFG&(~((3<<22)|(3<<20))));
iDiv = (pADI_CLKG0_CLK->CTL1& BITM_CLKG_CLK_CTL1_PCLKDIVCNT); // Read UART clock as set by CLKCON1[10:8]
iDiv = iDiv>>8;
if (iDiv == 0)
iDiv = 1;
iRtC = (pADI_CLKG0_CLK->CTL0& BITM_CLKG_CLK_CTL0_CLKMUX); // Check what is the root clock
switch (iRtC)
{
case 0: // HFOSC selected
ullRtClk = 26000000;
break;
case 1: // HFXTAL selected
if ((pADI_CLKG0_CLK->CTL0 & 0x200)==0x200) // 26Mhz XTAL used
ullRtClk = 26000000;
else
ullRtClk = 16000000; // Assume 16MHz XTAL
break;
case 2: // SPLL output
iPllMulValue = (pADI_CLKG0_CLK->CTL3 & // Check muliplication factor in PLL settings
BITM_CLKG_CLK_CTL3_SPLLNSEL); // bits[4:0]. Assume div value of 0xD in bits [14:11]
ullRtClk = (iPllMulValue *1000000); // Assume straight multiplication by pADI_CLKG0_CLK->CTL3[4:0]
break;
case 3:
ullRtClk = 26000000; //External clock is assumed to be 26MhZ, if different
break; //clock speed is used, this should be changed
default:
break;
}
// iOSR = (pADI_UART0->COMLCR2 & 0x3);
// iOSR = 2^(2+iOSR);
pADI_UART0->COMLCR2 = 0x3;
iOSR = 32;
//i1 = (ullRtClk/(iOSR*iDiv))/iBaud; // UART baud rate clock source is PCLK divided by OSR
i1 = (ullRtClk/(iOSR*iDiv))/iBaud-1; //for bigger M and N value
pADI_UART0->COMDIV = i1;
pADI_UART0->COMFBR = 0x8800|(((((2048/(iOSR*iDiv))*ullRtClk)/i1)/iBaud)-2048);
pADI_UART0->COMIEN = 0;
pADI_UART0->COMLCR = (iFormat&0x3c)|(iBits&3);
pADI_UART0->COMFCR = (BITM_UART_COMFCR_RFTRIG & 0/*RX_FIFO_1BYTE*/ ) |BITM_UART_COMFCR_FIFOEN;
pADI_UART0->COMFCR |= BITM_UART_COMFCR_RFCLR|BITM_UART_COMFCR_TFCLR; // Clear the UART FIFOs
pADI_UART0->COMFCR &= ~(BITM_UART_COMFCR_RFCLR|BITM_UART_COMFCR_TFCLR); // Disable clearing mechanism
NVIC_EnableIRQ(UART_EVT_IRQn); // Enable UART interrupt source in NVIC
pADI_UART0->COMIEN = BITM_UART_COMIEN_ERBFI|BITM_UART_COMIEN_ELSI; /* Rx Interrupt */
return pADI_UART0->COMLSR;
}
#include "stdio.h"
#ifdef __ICCARM__
int putchar(int c)
#else
int fputc(int c, FILE *f)
#endif
{
pADI_UART0->COMTX = c;
while((pADI_UART0->COMLSR&0x20) == 0);// tx fifo empty
return c;
}