Hello everybody,
I'm new here and I'm trying to compile a example program that a member of this forum posted here.
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_adc.h"
#include "inc/hw_types.h"
#include "inc/hw_udma.h"
#include "inc/hw_emac.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/adc.h"
#include "driverlib/udma.h"
#include "driverlib/emac.h"
//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void __error__(char *pcFilename, uint32_t ui32Line)
{
}
#endif
void UARTsend(char * str)
{
while (*str) {
ROM_UARTCharPut(UART0_BASE, *str++);
}
}
void UART0IntHandler()
{
uint32_t status = ROM_UARTIntStatus(UART0_BASE, true);
ROM_UARTIntClear(UART0_BASE, status);
while (ROM_UARTCharsAvail(UART0_BASE)) {
char c = (char) ROM_UARTCharGetNonBlocking(UART0_BASE);
ROM_UARTCharPutNonBlocking(UART0_BASE, c);
}
}
const uint8_t lookup_hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
void u32tohex(char * out, uint32_t n)
{
out[0] = lookup_hex[n >> 28]; out[1] = lookup_hex[(n >> 24) & 15]; out[2] = lookup_hex[(n >> 20) & 15]; out[3] = lookup_hex[(n >> 16) & 15];
out[4] = lookup_hex[(n >> 12) & 15]; out[5] = lookup_hex[(n >> 8) & 15]; out[6] = lookup_hex[(n >> 4) & 15]; out[7] = lookup_hex[n & 15];
}
void u16tohex(char * out, uint32_t n)
{
out[0] = lookup_hex[(n >> 12) & 15]; out[1] = lookup_hex[(n >> 8) & 15]; out[2] = lookup_hex[(n >> 4) & 15]; out[3] = lookup_hex[n & 15];
}
#define TXDESC_SIZE (4)
#define RXDESC_SIZE (4)
#define EMAC_BUF_SIZE (1536)
#define EMAC_INSIDE_BUF_OFS (14)
typedef uint16_t adc_sample_t;
#define ADC_SAMPLE_BUF_SIZE (1024/sizeof(adc_sample_t))
tEMACDMADescriptor emacDescRx[TXDESC_SIZE] __attribute__(( aligned(4) ));
tEMACDMADescriptor emacDescTx[RXDESC_SIZE] __attribute__(( aligned(4) ));
uint8_t emacBufTx[EMAC_BUF_SIZE * TXDESC_SIZE] __attribute__(( aligned(4) ));
uint32_t txdesc_index = 0, rxdesc_index = 0;
uint32_t tx_adc_index = 0;
// feed buffer pointers to the ADC uDMA descriptors in order
//
// the ADC data is transferred by DMA directly into the EMAC buffers
// when the ADC interrupt fires, it calls tx_EMAC() to have the EMAC immediately send the data out
//
// get_ADC_buf() uses tx_adc_index which stores the position of the ADC uDMA descriptor
uint8_t * get_ADC_buf()
{
uint32_t i = tx_adc_index;
tx_adc_index = (i + 1) & (TXDESC_SIZE - 1);
return &emacBufTx[i * EMAC_BUF_SIZE + EMAC_INSIDE_BUF_OFS];
}
void EthernetIntHandler()
{
// NOTE: the ethernet interrupt is never enabled since the TX completion interrupt is not needed and currently no packets are received
// the TX completion interrupt might be useful if the CPU were limited only by how fast the packets could be sent
uint32_t status = ROM_EMACIntStatus(EMAC0_BASE, true);
ROM_EMACIntClear(EMAC0_BASE, status);
// this 'e' should never appear on the serial console
ROM_UARTCharPutNonBlocking(UART0_BASE, 'e');
}
void init_EMAC(uint32_t sysclock)
{
uint32_t user[2];
ROM_FlashUserGet(&user[0], &user[1]);
char macstr[64], * p = macstr;
// low 24 bits of each uint32_t have mac address in big endian order (network byte order)
unsigned v = ((user[0] & 0xff) << 8) | ((user[0] >> 8) & 0xff);
u16tohex(p, v); p += 4; *(p++) = ':';
v = ((user[0] >> 8) & 0xff00) | (user[1] & 0xff);
u16tohex(p, v); p += 4; *(p++) = ':';
v = ((user[1] >> 16) & 0xff) | (user[1] & 0xff00);
u16tohex(p, v); p += 4;
UARTsend(macstr);
// create an ethernet header in emacBufTx[0], then copy it to all buffers
emacBufTx[ 0] = 0xff; // destination mac address: broadcast address (ff:ff:ff:ff:ff:ff)
emacBufTx[ 1] = 0xff; // feel free to change this to suit your specific needs
emacBufTx[ 2] = 0xff;
emacBufTx[ 3] = 0xff;
emacBufTx[ 4] = 0xff;
emacBufTx[ 5] = 0xff;
emacBufTx[ 6] = (uint8_t) user[0]; // source mac address: this device
emacBufTx[ 7] = (uint8_t) (user[0] >> 8);
emacBufTx[ 8] = (uint8_t) (user[0] >> 16);
emacBufTx[ 9] = (uint8_t) user[1];
emacBufTx[10] = (uint8_t) (user[1] >> 8);
emacBufTx[11] = (uint8_t) (user[1] >> 16);
// EtherType field en.wikipedia.org/.../EtherType
// choose a type such that nobody using this will have conflicting uses of the EtherType
// this is always dangerous, so if your network responds to Veritas Low Latency Transport (LLT) for Veritas Cluster Server, choose a different type
emacBufTx[12] = 0xca;
emacBufTx[13] = 0xfe;
// EMAC_INSIDE_BUF_OFS points here in emacBufTx[]
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EMAC0);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_EPHY0);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EMAC0);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_EPHY0);
while (!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_EMAC0)) ;
ROM_EMACPHYConfigSet(EMAC0_BASE, EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | EMAC_PHY_AN_100B_T_FULL_DUPLEX);
ROM_EMACReset(EMAC0_BASE);
ROM_EMACInit(EMAC0_BASE, sysclock, EMAC_BCONFIG_MIXED_BURST | EMAC_BCONFIG_PRIORITY_FIXED, 4 /*RxBurst*/, 4 /*TxBurst*/, 0 /*DescSkipSize*/);
ROM_EMACConfigSet(EMAC0_BASE,
EMAC_CONFIG_FULL_DUPLEX | EMAC_CONFIG_CHECKSUM_OFFLOAD | EMAC_CONFIG_7BYTE_PREAMBLE | EMAC_CONFIG_IF_GAP_96BITS |
EMAC_CONFIG_USE_MACADDR0 | EMAC_CONFIG_SA_FROM_DESCRIPTOR | EMAC_CONFIG_BO_LIMIT_1024,
EMAC_MODE_RX_STORE_FORWARD | EMAC_MODE_TX_STORE_FORWARD | EMAC_MODE_TX_THRESHOLD_64_BYTES | EMAC_MODE_RX_THRESHOLD_64_BYTES,
0 /*RxMaxFrameSize*/);
// TODO: change EMAC_CONFIG_SA_FROM_DESCRIPTOR to EMAC_CONFIG_SA_INSERT to reduce DMA utilization
unsigned i;
// fill in TX descriptors
for (i = 0; i < TXDESC_SIZE; i++) {
emacDescTx[i].ui32Count = DES1_TX_CTRL_SADDR_INSERT | (EMAC_BUF_SIZE << DES1_TX_CTRL_BUFF1_SIZE_S);
emacDescTx[i].pvBuffer1 = &emacBufTx[i * EMAC_BUF_SIZE];
emacDescTx[i].DES3.pLink = &emacDescTx[(i + 1) & (TXDESC_SIZE - 1)];
emacDescTx[i].ui32CtrlStatus = DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG | DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_CHAINED | DES0_TX_CTRL_IP_ALL_CKHSUMS;
unsigned j;
if (i) {
for (j = 0; j < EMAC_INSIDE_BUF_OFS; j++) emacBufTx[i * EMAC_BUF_SIZE + j] = emacBufTx[j];
}
}
// fill in RX descriptors
for (i = 0; i < RXDESC_SIZE; i++) {
emacDescRx[i].ui32CtrlStatus = 0;
emacDescRx[i].ui32Count = DES1_RX_CTRL_CHAINED | (EMAC_BUF_SIZE << DES1_RX_CTRL_BUFF1_SIZE_S);
emacDescRx[i].pvBuffer1 = &emacBufTx[0]; // FIXME: if any RX is done it needs to point to a different buffer where DMA can write
emacDescRx[i].DES3.pLink = &emacDescRx[(i + 1) & (RXDESC_SIZE - 1)];
}
ROM_EMACRxDMADescriptorListSet(EMAC0_BASE, emacDescRx);
ROM_EMACTxDMADescriptorListSet(EMAC0_BASE, emacDescTx);
// note: ROM_EMACAddrSet does not need to see a real ethernet header,
// it just needs a byte array with the mac address to set up the hardware mac address filter
ROM_EMACAddrSet(EMAC0_BASE, 0 /*index*/, &emacBufTx[6]);
ROM_EMACFrameFilterSet(EMAC0_BASE, EMAC_FRMFILTER_SADDR | EMAC_FRMFILTER_PASS_MULTICAST | EMAC_FRMFILTER_PASS_NO_CTRL);
ROM_EMACIntClear(EMAC0_BASE, ROM_EMACIntStatus(EMAC0_BASE, false));
ROM_EMACTxEnable(EMAC0_BASE);
//ROM_EMACRxEnable(EMAC0_BASE); // currently no need to RX anything
//ROM_IntEnable(INT_EMAC0); // currently no need to RX anything
p = macstr;
*(p++) = ' '; *(p++) = 'o'; *(p++) = 'k';
*(p++) = '\r'; *(p++) = '\n'; *(p++) = 0;
UARTsend(macstr);
}
// feed ethernet frames to the EMAC
//
// tx_EMAC() uses txdesc_index which stores the position of the EMAC DMA descriptor
void tx_EMAC()
{
uint32_t i = txdesc_index;
// if the current TX descriptor is still marked OWN by the hardware, it is still in use by the EMAC
// this means the ADC interrupt is creating packets too fast for the EMAC
// this is considered a fatal error, even though theoretically it could wait for the flag to be cleared
// (if the ethernet link is faster than 10 Mbps it should be impossible for the ADC to out pace the EMAC, 1 MSps is 16 Mbps plus overhead)
if (emacDescTx[i].ui32CtrlStatus & DES0_TX_CTRL_OWN) {
UARTsend("TX_CTRL_OWN: buf overflow\r\n");
ROM_IntMasterDisable();
for (;;) ; // spin forever here until a debugger is attached
}
// set up descriptor and turn on DES0_TX_CTRL_OWN
emacDescTx[i].ui32Count = EMAC_INSIDE_BUF_OFS + ADC_SAMPLE_BUF_SIZE*sizeof(adc_sample_t);
emacDescTx[i].ui32CtrlStatus = DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG | DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_IP_ALL_CKHSUMS |
DES0_TX_CTRL_CHAINED | DES0_TX_CTRL_OWN;
// tell EMAC to re-read emacDescTx
ROM_EMACTxDMAPollDemand(EMAC0_BASE);
i++;
i &= TXDESC_SIZE - 1;
txdesc_index = i;
}
uint32_t adc_complete_count = 0;
// uDMA descriptors used by the hardware are stored in this table
// ROM_uDMAChannel* functions write to this table
uint32_t udmaCtrlTable[1024/sizeof(uint32_t)] __attribute__(( aligned(1024) ));
void uDMAErrorHandler()
{
ROM_UARTCharPutNonBlocking(UART0_BASE, 'u');
}
void ADCprocess(uint32_t ch)
{
if ((((tDMAControlTable *) udmaCtrlTable)[ch].ui32Control & UDMA_CHCTL_XFERMODE_M) != UDMA_MODE_STOP) return;
// store the next buffer in the uDMA transfer descriptor
// the ADC is read directly into the correct emacBufTx to be transmitted
ROM_uDMAChannelTransferSet(ch, UDMA_MODE_PINGPONG, (void *)(ADC0_BASE + ADC_O_SSFIFO0), get_ADC_buf(), ADC_SAMPLE_BUF_SIZE);
adc_complete_count++;
tx_EMAC();
}
void ADCseq0Handler()
{
// this interrupt handler is optimized to use as few CPU cycles as possible
// it must handle ADC_SAMPLE_BUF_SIZE samples in 1/125000 seconds
//
// optimizations include:
// 1. choosing ADC_SAMPLE_BUF_SIZE to minimize overhead
// 2. replacing calls to ROM_* functions with raw memory accesses (less portable)
*(uint32_t *) (ADC0_BASE + ADC_O_ISC) = ADC_INT_DMA_SS0; // optimized form of ROM_ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS0);
ADCprocess(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT);
ADCprocess(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT);
}
void init_ADC(uint32_t sysclock)
{
// set ADC clock to ADC_CLOCK_SRC_PLL (ROM_ADCClockConfigSet() is not defined)
// for ADC_TARGET 30 MHz / 1.875 MSps, min sysclock of 120 MHz is required (div = 4) or uDMA cannot keep up with ADC samples
// for ADC_TARGET 16 MHz / 1 MSps, min sysclock of 64 MHz is required (div = 4) note: changes to ADC_TARGET will require adjusting ADC_SAMPLE_BUF_SIZE
// for ADC_TARGET 8 MHz / 500 kSps, min sysclock of 48 MHz is required (div = 6) to get the right balance for the ADC interrupt rate
// for ADC_TARGET 4 MHz / 250 kSps, min sysclock of 32 MHz is required (div = 8)
// for ADC_TARGET 2 MHz / 125 kSps, min sysclock of 22 MHz is required (div = 11)
//#define ADC_TARGET (18*1000*1000) // 120 MHz/7 = about 17 MHz = 1.07143 MSps
#define ADC_TARGET (8*1000*1000) // 120 MHz/7 = about 17 MHz = 1.07143 MSps
uint32_t div;
if (sysclock < 2*ADC_TARGET) {
div = ADC_CLOCK_SRC_PLL;
} else {
div = ADC_CLOCK_SRC_PLL | (((sysclock + ADC_TARGET - 1) / ADC_TARGET - 1) << 4);
}
#undef ADC_TARGET
*(uint32_t *) (ADC0_BASE + ADC_O_CC) = div;
ROM_ADCSequenceConfigure(ADC0_BASE, 0 /*SS0*/, ADC_TRIGGER_PROCESSOR, 3 /*priority*/); // SS0-SS3 priorities must always be different
ROM_ADCSequenceConfigure(ADC0_BASE, 3 /*SS3*/, ADC_TRIGGER_PROCESSOR, 0 /*priority*/); // so change SS3 to prio0 when SS0 gets set to prio3
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 0, ADC_CTL_TS); // ADC_CTL_TS = read temp sensor
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 1, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 2, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 3, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 4, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 5, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 6, ADC_CTL_TS);
ROM_ADCSequenceStepConfigure(ADC0_BASE, 0 /*SS0*/, 7, ADC_CTL_TS | ADC_CTL_END | ADC_CTL_IE); // ADC_CTL_IE fires every 8 samples
ROM_ADCSequenceEnable(ADC0_BASE, 0);
ROM_uDMAEnable();
ROM_uDMAControlBaseSet(udmaCtrlTable);
ROM_ADCSequenceDMAEnable(ADC0_BASE, 0);
// disable some bits
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC0, UDMA_ATTR_ALTSELECT /*start with ping-pong PRI side*/ |
UDMA_ATTR_HIGH_PRIORITY /*low priority*/ | UDMA_ATTR_REQMASK /*unmask*/);
// enable some bits
ROM_uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC0, UDMA_ATTR_USEBURST /*only allow burst transfers*/);
// set dma params on PRI_ and ALT_SELECT
ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_128);
ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT, UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_128);
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT, UDMA_MODE_PINGPONG, (void *)(ADC0_BASE + ADC_O_SSFIFO0), get_ADC_buf(), ADC_SAMPLE_BUF_SIZE);
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)(ADC0_BASE + ADC_O_SSFIFO0), get_ADC_buf(), ADC_SAMPLE_BUF_SIZE);
ROM_IntEnable(INT_ADC0SS0);
ROM_ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS0);
ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC0);
}
int main(void)
{
uint32_t sysclock;
do {
sysclock = ROM_SysCtlClockFreqSet(SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480, 120*1000*1000);
} while (!sysclock);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
ROM_SysCtlDelay(1);
// configure PORTF for GPIO
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4);
// configure PORTF PIN_0 and PIN_4 as Ethernet link and activity LEDs
ROM_GPIOPinConfigure(GPIO_PF0_EN0LED0);
ROM_GPIOPinConfigure(GPIO_PF4_EN0LED1);
// ROM_GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4) - not in ROM
ROM_GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, GPIO_DIR_MODE_HW);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_0);
ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
ROM_UARTConfigSetExpClk(UART0_BASE, sysclock, 115200, UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
ROM_IntMasterEnable();
ROM_IntEnable(INT_UART0);
ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
init_ADC(sysclock);
init_EMAC(sysclock);
// tell PHY what to do with EN0LED0 and EN0LED1
// PHY addr: CPU datasheet section 20.5.2.5 says just use 0
ROM_EMACPHYWrite(EMAC0_BASE, 0 /*PHY addr*/, EPHY_CTL,
ROM_EMACPHYRead(EMAC0_BASE, 0 /*PHY addr*/, EPHY_CTL) & ~EPHY_CTL_BYPLEDSTRCH); // make sure LED stretching is on
ROM_EMACPHYWrite(EMAC0_BASE, 0 /*PHY addr*/, EPHY_LEDCR,
(ROM_EMACPHYRead(EMAC0_BASE, 0 /*PHY addr*/, EPHY_LEDCR) & ~EPHY_LEDCR_BLINKRATE_M) |
EPHY_LEDCR_BLINKRATE_20HZ);
ROM_EMACPHYWrite(EMAC0_BASE, 0 /*PHY addr*/, EPHY_LEDCFG,
(ROM_EMACPHYRead(EMAC0_BASE, 0 /*PHY addr*/, EPHY_LEDCFG) & ~(EPHY_LEDCFG_LED0_M | EPHY_LEDCFG_LED1_M | EPHY_LEDCFG_LED2_M)) |
EPHY_LEDCFG_LED0_LINKTXRX |
EPHY_LEDCFG_LED1_100BT |
EPHY_LEDCFG_LED2_100BT);
// set ADC_TRIGGER_ALWAYS to start ADC
uint8_t have_link = 1;
uint32_t count = 0;
for (;;) {
char str[64], * p;
if (!(ROM_EMACPHYRead(EMAC0_BASE, 0, EPHY_BMSR) & EPHY_BMSR_LINKSTAT)) {
if (have_link) {
p = str;
*(p++) = 'l'; *(p++) = 'i'; *(p++) = 'n'; *(p++) = 'k';
*(p++) = ' '; *(p++) = 'd'; *(p++) = 'n';
*(p++) = '\r'; *(p++) = '\n'; *(p++) = 0;
UARTsend(str);
}
have_link = 0;
ROM_ADCSequenceConfigure(ADC0_BASE, 0 /*SS0*/, ADC_TRIGGER_PROCESSOR, 3 /*priority*/);
count = 0;
continue;
}
ROM_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_1);
if (!have_link) {
p = str;
*(p++) = 'l'; *(p++) = 'i'; *(p++) = 'n'; *(p++) = 'k';
*(p++) = ' '; *(p++) = 'u'; *(p++) = 'p';
*(p++) = '\r'; *(p++) = '\n'; *(p++) = 0;
UARTsend(str);
have_link = 1;
ROM_ADCSequenceConfigure(ADC0_BASE, 0 /*SS0*/, ADC_TRIGGER_ALWAYS, 3 /*priority*/);
}
count++;
ROM_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1, 0);
if (count < 0x7fff) continue;
count = 0;
uint32_t c = adc_complete_count;
adc_complete_count = 0;
u16tohex(str, c);
p = str + 4;
UARTsend(str);
}
}
And when I try to execute the code, I get the link error:
**** Build of configuration Debug for project s **** "C:\\ti\\ccsv6\\utils\\bin\\gmake" -k all 'Building file: ../main.c' 'Invoking: ARM Compiler' "C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --include_path="C:/ti/TivaWare_C_Series-2.1.1.71" -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="main.pp" "../main.c" "../main.c", line 36: warning #225-D: function "ROM_UARTCharPut" declared implicitly "../main.c", line 42: warning #225-D: function "ROM_UARTIntStatus" declared implicitly "../main.c", line 43: warning #225-D: function "ROM_UARTIntClear" declared implicitly "../main.c", line 44: warning #225-D: function "ROM_UARTCharsAvail" declared implicitly "../main.c", line 45: warning #225-D: function "ROM_UARTCharGetNonBlocking" declared implicitly "../main.c", line 46: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly "../main.c", line 100: warning #225-D: function "ROM_EMACIntStatus" declared implicitly "../main.c", line 101: warning #225-D: function "ROM_EMACIntClear" declared implicitly "../main.c", line 104: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly "../main.c", line 110: warning #225-D: function "ROM_FlashUserGet" declared implicitly "../main.c", line 146: warning #225-D: function "ROM_SysCtlPeripheralEnable" declared implicitly "../main.c", line 148: warning #225-D: function "ROM_SysCtlPeripheralReset" declared implicitly "../main.c", line 151: warning #225-D: function "ROM_SysCtlPeripheralReady" declared implicitly "../main.c", line 153: warning #225-D: function "ROM_EMACPHYConfigSet" declared implicitly "../main.c", line 154: warning #225-D: function "ROM_EMACReset" declared implicitly "../main.c", line 155: warning #225-D: function "ROM_EMACInit" declared implicitly "../main.c", line 156: warning #225-D: function "ROM_EMACConfigSet" declared implicitly "../main.c", line 184: warning #225-D: function "ROM_EMACRxDMADescriptorListSet" declared implicitly "../main.c", line 185: warning #225-D: function "ROM_EMACTxDMADescriptorListSet" declared implicitly "../main.c", line 188: warning #225-D: function "ROM_EMACAddrSet" declared implicitly "../main.c", line 189: warning #225-D: function "ROM_EMACFrameFilterSet" declared implicitly "../main.c", line 190: warning #225-D: function "ROM_EMACIntClear" declared implicitly "../main.c", line 190: warning #225-D: function "ROM_EMACIntStatus" declared implicitly "../main.c", line 191: warning #225-D: function "ROM_EMACTxEnable" declared implicitly "../main.c", line 214: warning #225-D: function "ROM_IntMasterDisable" declared implicitly "../main.c", line 224: warning #225-D: function "ROM_EMACTxDMAPollDemand" declared implicitly "../main.c", line 241: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly "../main.c", line 250: warning #225-D: function "ROM_uDMAChannelTransferSet" declared implicitly "../main.c", line 291: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly "../main.c", line 293: warning #225-D: function "ROM_ADCSequenceStepConfigure" declared implicitly "../main.c", line 301: warning #225-D: function "ROM_ADCSequenceEnable" declared implicitly "../main.c", line 303: warning #225-D: function "ROM_uDMAEnable" declared implicitly "../main.c", line 304: warning #225-D: function "ROM_uDMAControlBaseSet" declared implicitly "../main.c", line 305: warning #225-D: function "ROM_ADCSequenceDMAEnable" declared implicitly "../main.c", line 308: warning #225-D: function "ROM_uDMAChannelAttributeDisable" declared implicitly "../main.c", line 311: warning #225-D: function "ROM_uDMAChannelAttributeEnable" declared implicitly "../main.c", line 314: warning #225-D: function "ROM_uDMAChannelControlSet" declared implicitly "../main.c", line 316: warning #225-D: function "ROM_uDMAChannelTransferSet" declared implicitly "../main.c", line 318: warning #225-D: function "ROM_IntEnable" declared implicitly "../main.c", line 320: warning #225-D: function "ROM_ADCIntEnableEx" declared implicitly "../main.c", line 321: warning #225-D: function "ROM_uDMAChannelEnable" declared implicitly "../main.c", line 331: warning #225-D: function "ROM_SysCtlClockFreqSet" declared implicitly "../main.c", line 334: warning #225-D: function "ROM_SysCtlPeripheralEnable" declared implicitly "../main.c", line 340: warning #225-D: function "ROM_SysCtlDelay" declared implicitly "../main.c", line 343: warning #225-D: function "ROM_GPIOPinTypeGPIOOutput" declared implicitly "../main.c", line 345: warning #225-D: function "ROM_GPIOPinConfigure" declared implicitly "../main.c", line 348: warning #225-D: function "ROM_GPIODirModeSet" declared implicitly "../main.c", line 351: warning #225-D: function "ROM_GPIOPinWrite" declared implicitly "../main.c", line 355: warning #225-D: function "ROM_GPIOPinTypeUART" declared implicitly "../main.c", line 356: warning #225-D: function "ROM_UARTConfigSetExpClk" declared implicitly "../main.c", line 358: warning #225-D: function "ROM_IntMasterEnable" declared implicitly "../main.c", line 359: warning #225-D: function "ROM_IntEnable" declared implicitly "../main.c", line 360: warning #225-D: function "ROM_UARTIntEnable" declared implicitly "../main.c", line 368: warning #225-D: function "ROM_EMACPHYWrite" declared implicitly "../main.c", line 369: warning #225-D: function "ROM_EMACPHYRead" declared implicitly "../main.c", line 394: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly "../main.c", line 406: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly 'Finished building: ../main.c' ' ' 'Building file: ../tm4c1294ncpdt_startup_ccs.c' 'Invoking: ARM Compiler' "C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --include_path="C:/ti/TivaWare_C_Series-2.1.1.71" -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="tm4c1294ncpdt_startup_ccs.pp" "../tm4c1294ncpdt_startup_ccs.c" 'Finished building: ../tm4c1294ncpdt_startup_ccs.c' ' ' 'Building target: s.out' 'Invoking: ARM Linker' "C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number -z -m"s.map" --heap_size=0 --stack_size=512 -i"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/lib" -i"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --reread_libs --display_error_number --diag_wrap=off --warn_sections --xml_link_info="s_linkInfo.xml" --rom_model -o "s.out" "./main.obj" "./tm4c1294ncpdt_startup_ccs.obj" "./uartstdio.obj" "../tm4c1294ncpdt.cmd" -l"libc.a" -l"C:\ti\TivaWare_C_Series-2.1.1.71\driverlib\ccs\Debug\driverlib.lib" <Linking> undefined first referenced symbol in file --------- ---------------- ROM_ADCIntEnableEx ./main.obj ROM_ADCSequenceConfigure ./main.obj ROM_ADCSequenceDMAEnable ./main.obj ROM_ADCSequenceEnable ./main.obj ROM_ADCSequenceStepConfigure ./main.obj ROM_EMACAddrSet ./main.obj ROM_EMACConfigSet ./main.obj ROM_EMACFrameFilterSet ./main.obj ROM_EMACInit ./main.obj ROM_EMACIntClear ./main.obj ROM_EMACIntStatus ./main.obj ROM_EMACPHYConfigSet ./main.obj ROM_EMACPHYRead ./main.obj ROM_EMACPHYWrite ./main.obj ROM_EMACReset ./main.obj ROM_EMACRxDMADescriptorListSet ./main.obj ROM_EMACTxDMADescriptorListSet ./main.obj ROM_EMACTxDMAPollDemand ./main.obj ROM_EMACTxEnable ./main.obj ROM_FlashUserGet ./main.obj ROM_GPIODirModeSet ./main.obj ROM_GPIOPinConfigure ./main.obj ROM_GPIOPinTypeGPIOOutput ./main.obj ROM_GPIOPinTypeUART ./main.obj ROM_GPIOPinWrite ./main.obj ROM_IntEnable ./main.obj ROM_IntMasterDisable ./main.obj ROM_IntMasterEnable ./main.obj ROM_SysCtlClockFreqSet ./main.obj ROM_SysCtlDelay ./main.obj ROM_SysCtlPeripheralEnable ./main.obj ROM_SysCtlPeripheralReady ./main.obj ROM_SysCtlPeripheralReset ./main.obj ROM_UARTCharGetNonBlocking ./main.obj ROM_UARTCharPut ./main.obj ROM_UARTCharPutNonBlocking ./main.obj ROM_UARTCharsAvail ./main.obj ROM_UARTConfigSetExpClk ./main.obj ROM_UARTIntClear ./main.obj ROM_UARTIntEnable ./main.obj ROM_UARTIntStatus ./main.obj ROM_uDMAChannelAttributeDisable ./main.obj ROM_uDMAChannelAttributeEnable ./main.obj ROM_uDMAChannelControlSet ./main.obj ROM_uDMAChannelEnable ./main.obj ROM_uDMAChannelTransferSet ./main.obj ROM_uDMAControlBaseSet ./main.obj ROM_uDMAEnable ./main.obj error #10234-D: unresolved symbols remain >> Compilation failure error #10010: errors encountered during linking; "s.out" not built gmake: *** [s.out] Error 1 gmake: Target `all' not remade because of errors. **** Build Finished ****
I've read some people who had the same problem, but I could find any verified answer that solved the problem. That's for sure a link error, but I have no idea how to fix it.
That's a beginner question, so sorry if its too stupid.
Thanks J.
"C:\\ti\\ccsv6\\utils\\bin\\gmake" -k all
'Building file: ../main.c'
'Invoking: ARM Compiler'
"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --include_path="C:/ti/TivaWare_C_Series-2.1.1.71" -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="main.pp" "../main.c"
"../main.c", line 36: warning #225-D: function "ROM_UARTCharPut" declared implicitly
"../main.c", line 42: warning #225-D: function "ROM_UARTIntStatus" declared implicitly
"../main.c", line 43: warning #225-D: function "ROM_UARTIntClear" declared implicitly
"../main.c", line 44: warning #225-D: function "ROM_UARTCharsAvail" declared implicitly
"../main.c", line 45: warning #225-D: function "ROM_UARTCharGetNonBlocking" declared implicitly
"../main.c", line 46: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly
"../main.c", line 100: warning #225-D: function "ROM_EMACIntStatus" declared implicitly
"../main.c", line 101: warning #225-D: function "ROM_EMACIntClear" declared implicitly
"../main.c", line 104: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly
"../main.c", line 110: warning #225-D: function "ROM_FlashUserGet" declared implicitly
"../main.c", line 146: warning #225-D: function "ROM_SysCtlPeripheralEnable" declared implicitly
"../main.c", line 148: warning #225-D: function "ROM_SysCtlPeripheralReset" declared implicitly
"../main.c", line 151: warning #225-D: function "ROM_SysCtlPeripheralReady" declared implicitly
"../main.c", line 153: warning #225-D: function "ROM_EMACPHYConfigSet" declared implicitly
"../main.c", line 154: warning #225-D: function "ROM_EMACReset" declared implicitly
"../main.c", line 155: warning #225-D: function "ROM_EMACInit" declared implicitly
"../main.c", line 156: warning #225-D: function "ROM_EMACConfigSet" declared implicitly
"../main.c", line 184: warning #225-D: function "ROM_EMACRxDMADescriptorListSet" declared implicitly
"../main.c", line 185: warning #225-D: function "ROM_EMACTxDMADescriptorListSet" declared implicitly
"../main.c", line 188: warning #225-D: function "ROM_EMACAddrSet" declared implicitly
"../main.c", line 189: warning #225-D: function "ROM_EMACFrameFilterSet" declared implicitly
"../main.c", line 190: warning #225-D: function "ROM_EMACIntClear" declared implicitly
"../main.c", line 190: warning #225-D: function "ROM_EMACIntStatus" declared implicitly
"../main.c", line 191: warning #225-D: function "ROM_EMACTxEnable" declared implicitly
"../main.c", line 214: warning #225-D: function "ROM_IntMasterDisable" declared implicitly
"../main.c", line 224: warning #225-D: function "ROM_EMACTxDMAPollDemand" declared implicitly
"../main.c", line 241: warning #225-D: function "ROM_UARTCharPutNonBlocking" declared implicitly
"../main.c", line 250: warning #225-D: function "ROM_uDMAChannelTransferSet" declared implicitly
"../main.c", line 291: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly
"../main.c", line 293: warning #225-D: function "ROM_ADCSequenceStepConfigure" declared implicitly
"../main.c", line 301: warning #225-D: function "ROM_ADCSequenceEnable" declared implicitly
"../main.c", line 303: warning #225-D: function "ROM_uDMAEnable" declared implicitly
"../main.c", line 304: warning #225-D: function "ROM_uDMAControlBaseSet" declared implicitly
"../main.c", line 305: warning #225-D: function "ROM_ADCSequenceDMAEnable" declared implicitly
"../main.c", line 308: warning #225-D: function "ROM_uDMAChannelAttributeDisable" declared implicitly
"../main.c", line 311: warning #225-D: function "ROM_uDMAChannelAttributeEnable" declared implicitly
"../main.c", line 314: warning #225-D: function "ROM_uDMAChannelControlSet" declared implicitly
"../main.c", line 316: warning #225-D: function "ROM_uDMAChannelTransferSet" declared implicitly
"../main.c", line 318: warning #225-D: function "ROM_IntEnable" declared implicitly
"../main.c", line 320: warning #225-D: function "ROM_ADCIntEnableEx" declared implicitly
"../main.c", line 321: warning #225-D: function "ROM_uDMAChannelEnable" declared implicitly
"../main.c", line 331: warning #225-D: function "ROM_SysCtlClockFreqSet" declared implicitly
"../main.c", line 334: warning #225-D: function "ROM_SysCtlPeripheralEnable" declared implicitly
"../main.c", line 340: warning #225-D: function "ROM_SysCtlDelay" declared implicitly
"../main.c", line 343: warning #225-D: function "ROM_GPIOPinTypeGPIOOutput" declared implicitly
"../main.c", line 345: warning #225-D: function "ROM_GPIOPinConfigure" declared implicitly
"../main.c", line 348: warning #225-D: function "ROM_GPIODirModeSet" declared implicitly
"../main.c", line 351: warning #225-D: function "ROM_GPIOPinWrite" declared implicitly
"../main.c", line 355: warning #225-D: function "ROM_GPIOPinTypeUART" declared implicitly
"../main.c", line 356: warning #225-D: function "ROM_UARTConfigSetExpClk" declared implicitly
"../main.c", line 358: warning #225-D: function "ROM_IntMasterEnable" declared implicitly
"../main.c", line 359: warning #225-D: function "ROM_IntEnable" declared implicitly
"../main.c", line 360: warning #225-D: function "ROM_UARTIntEnable" declared implicitly
"../main.c", line 368: warning #225-D: function "ROM_EMACPHYWrite" declared implicitly
"../main.c", line 369: warning #225-D: function "ROM_EMACPHYRead" declared implicitly
"../main.c", line 394: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly
"../main.c", line 406: warning #225-D: function "ROM_ADCSequenceConfigure" declared implicitly
'Finished building: ../main.c'
' '
'Building file: ../tm4c1294ncpdt_startup_ccs.c'
'Invoking: ARM Compiler'
"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --include_path="C:/ti/TivaWare_C_Series-2.1.1.71" -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number --preproc_with_compile --preproc_dependency="tm4c1294ncpdt_startup_ccs.pp" "../tm4c1294ncpdt_startup_ccs.c"
'Finished building: ../tm4c1294ncpdt_startup_ccs.c'
' '
'Building target: s.out'
'Invoking: ARM Linker'
"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/bin/armcl" -mv7M4 --code_state=16 --float_support=FPv4SPD16 --abi=eabi -me -g --gcc --define=ccs="ccs" --define=PART_TM4C1294NCPDT --diag_wrap=off --diag_warning=225 --display_error_number -z -m"s.map" --heap_size=0 --stack_size=512 -i"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/lib" -i"C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include" --reread_libs --display_error_number --diag_wrap=off --warn_sections --xml_link_info="s_linkInfo.xml" --rom_model -o "s.out" "./main.obj" "./tm4c1294ncpdt_startup_ccs.obj" "./uartstdio.obj" "../tm4c1294ncpdt.cmd" -l"libc.a" -l"C:\ti\TivaWare_C_Series-2.1.1.71\driverlib\ccs\Debug\driverlib.lib"
<Linking>
undefined first referenced
symbol in file
--------- ----------------
ROM_ADCIntEnableEx ./main.obj
ROM_ADCSequenceConfigure ./main.obj
ROM_ADCSequenceDMAEnable ./main.obj
ROM_ADCSequenceEnable ./main.obj
ROM_ADCSequenceStepConfigure ./main.obj
ROM_EMACAddrSet ./main.obj
ROM_EMACConfigSet ./main.obj
ROM_EMACFrameFilterSet ./main.obj
ROM_EMACInit ./main.obj
ROM_EMACIntClear ./main.obj
ROM_EMACIntStatus ./main.obj
ROM_EMACPHYConfigSet ./main.obj
ROM_EMACPHYRead ./main.obj
ROM_EMACPHYWrite ./main.obj
ROM_EMACReset ./main.obj
ROM_EMACRxDMADescriptorListSet ./main.obj
ROM_EMACTxDMADescriptorListSet ./main.obj
ROM_EMACTxDMAPollDemand ./main.obj
ROM_EMACTxEnable ./main.obj
ROM_FlashUserGet ./main.obj
ROM_GPIODirModeSet ./main.obj
ROM_GPIOPinConfigure ./main.obj
ROM_GPIOPinTypeGPIOOutput ./main.obj
ROM_GPIOPinTypeUART ./main.obj
ROM_GPIOPinWrite ./main.obj
ROM_IntEnable ./main.obj
ROM_IntMasterDisable ./main.obj
ROM_IntMasterEnable ./main.obj
ROM_SysCtlClockFreqSet ./main.obj
ROM_SysCtlDelay ./main.obj
ROM_SysCtlPeripheralEnable ./main.obj
ROM_SysCtlPeripheralReady ./main.obj
ROM_SysCtlPeripheralReset ./main.obj
ROM_UARTCharGetNonBlocking ./main.obj
ROM_UARTCharPut ./main.obj
ROM_UARTCharPutNonBlocking ./main.obj
ROM_UARTCharsAvail ./main.obj
ROM_UARTConfigSetExpClk ./main.obj
ROM_UARTIntClear ./main.obj
ROM_UARTIntEnable ./main.obj
ROM_UARTIntStatus ./main.obj
ROM_uDMAChannelAttributeDisable ./main.obj
ROM_uDMAChannelAttributeEnable ./main.obj
ROM_uDMAChannelControlSet ./main.obj
ROM_uDMAChannelEnable ./main.obj
ROM_uDMAChannelTransferSet ./main.obj
ROM_uDMAControlBaseSet ./main.obj
ROM_uDMAEnable ./main.obj
error #10234-D: unresolved symbols remain
>> Compilation failure
error #10010: errors encountered during linking; "s.out" not built
gmake: *** [s.out] Error 1
gmake: Target `all' not remade because of errors.
**** Build Finished ****