Ejemplo n.º 1
0
/**
 * @brief	main routine for timer example
 * @return	Function should not exit.
 */
int main(void)
{
	uint32_t timerBaseClock;

	SystemCoreClockUpdate();
	Board_Init();
	Board_LED_Set(0, false);
	Board_LED_Set(1, false);

	/* Initialize Timer 0 and Timer 1 */
	Chip_TIMER_Init(LPC_TIMER0);
	Chip_TIMER_Init(LPC_TIMER1);

	/* Setup prescale value on Timer 0 to PCLK */
	Chip_TIMER_PrescaleSet(LPC_TIMER0, 0);
	/* Setup prescale value on Timer 1 for lower resolution */
	Chip_TIMER_PrescaleSet(LPC_TIMER1, PRESCALE_HZ2);

	/* Reset timers */
	Chip_TIMER_Reset(LPC_TIMER0);
	Chip_TIMER_Reset(LPC_TIMER1);

	/* Enable both timers to generate interrupts when time matches */
	Chip_TIMER_MatchEnableInt(LPC_TIMER0, 1);
	Chip_TIMER_MatchEnableInt(LPC_TIMER1, 1);

	/* Get rate of timer base clock */
	timerBaseClock = Chip_Clock_GetAsyncSyscon_ClockRate();

	/* Setup Timer 0 for a match every 1s */
	Chip_TIMER_SetMatch(LPC_TIMER0, 1, (timerBaseClock / TICKRATE_HZ1));

	/* Setup Timer 1 for a match twice in a second */
	Chip_TIMER_SetMatch(LPC_TIMER1, 1, (timerBaseClock / ((PRESCALE_HZ2 + 1) * TICKRATE_HZ2)) );

	/* Setup both timers to restart when match occurs */
	Chip_TIMER_ResetOnMatchEnable(LPC_TIMER0, 1);
	Chip_TIMER_ResetOnMatchEnable(LPC_TIMER1, 1);

	/* Start both timers */
	Chip_TIMER_Enable(LPC_TIMER0);
	Chip_TIMER_Enable(LPC_TIMER1);

	/* Clear both timers of any pending interrupts */
	NVIC_ClearPendingIRQ(CT32B0_IRQn);
	NVIC_ClearPendingIRQ(CT32B1_IRQn);

	/* Enable both timer interrupts */
	NVIC_EnableIRQ(CT32B0_IRQn);
	NVIC_EnableIRQ(CT32B1_IRQn);

	/* Wait for timers to generate interrupts (LEDs toggle in interrupt handlers) */
	while (1) {
		__WFI();
	}

	return 0;
}
Ejemplo n.º 2
0
/* Initialize stopwatch */
void StopWatch_Init(void)
{
	/* Set prescaler to divide by 8 */
	const uint32_t prescaleDivisor = 8;
	Chip_TIMER_Init(LPC_TIMER32_1);
	Chip_TIMER_PrescaleSet(LPC_TIMER32_1, prescaleDivisor - 1);
	Chip_TIMER_Enable(LPC_TIMER32_1);

	/* Pre-compute tick rate. */
	ticksPerSecond = Chip_Clock_GetAsyncSyscon_ClockRate() / prescaleDivisor;
	ticksPerMs = ticksPerSecond / 1000;
	ticksPerUs = ticksPerSecond / 1000000;
}
Ejemplo n.º 3
0
static rt_err_t lpc_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
{
    struct lpc_uart *uart;

    UART_BAUD_T baud;
    UART_CFG_T UART_cfg;

    RT_ASSERT(serial != RT_NULL);
    uart = (struct lpc_uart *)serial->parent.user_data;

    /* Initialize UART Configuration parameter structure to default state:
     * Baudrate = 115200 b
     * 8 data bit
     * 1 Stop bit
     * None parity
     */

    /* Set up baudrate parameters */
    baud.clk = Chip_Clock_GetAsyncSyscon_ClockRate();   /* Clock frequency */
    baud.baud = cfg->baud_rate; /* Required baud rate */
    baud.ovr = 0;   /* Set the oversampling to the recommended rate */
    baud.mul = baud.div = 0;

    if(!baud.mul)
    {
        _UART_CalcMul(&baud);
    }
    _UART_CalcDiv(&baud);

    /* Set fractional control register */
    LPC_ASYNC_SYSCON->FRGCTRL = ((uint32_t) baud.mul << 8) | 0xFF;

    /* Configure the UART */
    UART_cfg.cfg = UART_CFG_8BIT;
    UART_cfg.div = baud.div;    /* Use the calculated div value */
    UART_cfg.ovr = baud.ovr;    /* Use oversampling rate from baud */
    UART_cfg.res = UART_BIT_DLY(cfg->baud_rate);

    /* P254,255,246 */
    uart->UART->OSR = (UART_cfg.ovr - 1) & 0x0F;
    uart->UART->BRG = (UART_cfg.div - 1) & 0xFFFF;
    uart->UART->CFG = UART_CFG_ENABLE | (UART_cfg.cfg & ~UART_CFG_RES);

    return RT_EOK;
}
Ejemplo n.º 4
0
/* Get UART base rate */
uint32_t Chip_Clock_GetFRGClockRate(void)
{
	uint64_t inclk;

	/* Get clock rate into FRG */
	inclk = (uint64_t) Chip_Clock_GetAsyncSyscon_ClockRate();

	if (inclk != 0) {
		uint32_t mult, divmult;

		divmult = LPC_SYSCON->FRGCTRL;
		if ((divmult & 0xFF) == 0xFF) {
			/* Fractional part is enabled, get multiplier */
			mult = (divmult >> 8) & 0xFF;

			/* Get fractional error */
			inclk = (inclk * 256) / (uint64_t) (256 + mult);
		}
Ejemplo n.º 5
0
/* Setup a timer for a periodic (repeat mode) rate */
static void setupMRT(uint8_t ch, MRT_MODE_T mode, uint32_t rate)
{
	LPC_MRT_CH_T *pMRT;

	/* Get pointer to timer selected by ch */
	pMRT = Chip_MRT_GetRegPtr(ch);

	/* Setup timer with rate based on MRT clock */
	Chip_MRT_SetInterval(pMRT, (Chip_Clock_GetAsyncSyscon_ClockRate() / rate) |
						 MRT_INTVAL_LOAD);

	/* Timer mode */
	Chip_MRT_SetMode(pMRT, mode);

	/* Clear pending interrupt and enable timer */
	Chip_MRT_IntClear(pMRT);
	Chip_MRT_SetEnabled(pMRT);
}
Ejemplo n.º 6
0
/* Configure UART ROM Driver and pripheral */
static int uartrom_config(void)
{
	UART_CFG_T cfg;
	UART_BAUD_T baud;

	/* Set up baudrate parameters */
	baud.clk = Chip_Clock_GetAsyncSyscon_ClockRate();	/* Clock frequency */
	baud.baud = UART_BAUD_RATE;	/* Required baud rate */
	baud.ovr = 0;	/* Set the oversampling to the recommended rate */
	baud.mul = baud.div = 0;

	if (ROM_UART_CalBaud(&baud) != LPC_OK) {
		/* Unable to calculate the baud rate parameters */
		while (1) {}
	}

	/* Set fractional control register */
	Chip_SYSCON_SetUSARTFRGCtrl(baud.mul, 255);

	/* See if the calculated baud is < +/- UART_BUAD_ERR% of the required baud */
	if (ABS(baud.baud - UART_BAUD_RATE) > (UART_BAUD_RATE * UART_BUAD_ERR) / 100) {
		/* WARNING: Baud rate is has more than UART_BUAD_ERR percentage */
		/* Try to auto-detect the Oversampling rate by setting baud.ovr to 0 */
		while (1) {}
	}

	/* Configure the UART */
	cfg.cfg = UART_CFG_8BIT | UART_CFG_BRKRX;
	cfg.div = baud.div;	/* Use the calculated div value */
	cfg.ovr = baud.ovr;	/* Use oversampling rate from baud */
	cfg.res = UART_BIT_DLY(UART_BAUD_RATE);

	/* Configure the UART */
	ROM_UART_Configure(hUART, &cfg);
	NVIC_ClearPendingIRQ(UART0_IRQn);
	NVIC_EnableIRQ(UART0_IRQn);

	return 0;
}
/****************************************************************************************************
 * @fn      i2cs_setup_slave
 *          Helper routine to set up slave
 *
 ***************************************************************************************************/
static void i2cs_setup_slave(i2cs_slave_t *pSlaveSetup)
{
    uint32_t optimalDev;
    /* Limit usable slave address indexes to the maximum the controller can support */
    if (pSlaveSetup->SlaveIndex <= I2C_SLV_ADDR_NUM) {
        Chip_I2CS_SetSlaveAddr(I2C_HOSTIF, pSlaveSetup->SlaveIndex, (pSlaveSetup->slaveAddr & I2C_SLV_ADDR_MSK));
        /* Clear interrupt status */
        Chip_I2CS_ClearStatus(I2C_HOSTIF, I2C_STAT_SLVDESEL);

        if (pSlaveSetup->EnableSlave == 0) {
            Chip_I2CS_DisableSlaveAddr(I2C_HOSTIF, pSlaveSetup->SlaveIndex);
        }
        else {
            Chip_I2C_EnableInt(I2C_HOSTIF, I2C_INTENSET_SLVPENDING | I2C_INTENSET_SLVDESEL);
        }
    }

    optimalDev = Chip_Clock_GetAsyncSyscon_ClockRate()/I2C_SLV_PCLK_FREQ;
    Chip_I2C_SetClockDiv( I2C_HOSTIF, optimalDev );
    /* Enable I2C slave interface */
    Chip_I2CS_Enable(I2C_HOSTIF);
}
Ejemplo n.º 8
0
/**
 * @brief	Main routine for I2C example
 * @return	Function should not exit
 */
int main(void)
{
	uint32_t memSize, *devMem, optimalDev;
	ROM_I2CS_INIT_T i2csInit;
	ROM_I2CS_SLAVE_T slaveSetup;
	int i;

	/* Generic Initialization */
	SystemCoreClockUpdate();
	Board_Init();

	/* Setup I2C pin muxing, enable I2C clock and reset I2C peripheral */
	Init_I2C_PinMux();
	Chip_Clock_EnablePeriphClock(LPC_I2CS_CLOCK);
	Chip_SYSCON_PeriphReset(LPC_I2CS_RESET);

	/* Get needed size for driver context memory */
	memSize = ROM_I2CS_GetMemSize();
	if (memSize > sizeof(drvData)) {
		errorOut("Can't allocate memory for I2C driver context\r\n");
	}
	devMem = drvData;	/* Or just use malloc(memSize) */

	/* Initialize driver */
	i2csInit.pUserData = (void *) &xferDone;
	i2csInit.base = (uint32_t) LPC_I2C_PORT;
	i2csHandle = ROM_I2CS_Init(devMem, &i2csInit);
	if (i2csHandle == NULL) {
		/* Error initializing I2C */
		errorOut("Error initializing ROM\r\n");
	}

	/* Register slave start and completion callbacks */
	ROM_I2CS_RegisterCallback(i2csHandle, ROM_I2CS_DONE_CB, (void *) i2cSlaveCompleteFunc);
	ROM_I2CS_RegisterCallback(i2csHandle, ROM_I2CS_START_CB, (void *) i2cSlaveStartFunc);

	/* Setup slave address to respond to */
	slaveSetup.slaveAddr = I2C_ADDR_7BIT;
	slaveSetup.SlaveIndex = 0;
	slaveSetup.EnableSlave = 1;
	ROM_I2CS_SetupSlave(i2csHandle, &slaveSetup);

	/* Setup clock rate for I2C - this must be done for master or slave modes.
	   This function is not set by the ROM API code. */
	optimalDev = Chip_Clock_GetAsyncSyscon_ClockRate() / 4000000;	/* 250nS */
	LPC_I2C_PORT->CLKDIV = optimalDev;

	/* Enable the interrupt for the I2C */
	NVIC_EnableIRQ(LPC_I2CS_INT);

	while (1) {
		/* Populate some TX data and clear RX data */
		for (i = 0; i < sizeof(slaveTx); i++) {
			slaveTx[i] = 0x70 + i;
			slaveRx[i] = 0;
		}
		sXfer.txBuff = slaveTx;
		sXfer.rxBuff = slaveRx;
		sXfer.txSz = sizeof(slaveTx);
		sXfer.rxSz = sizeof(slaveRx);

		/* Wait for a transfer from the master */
		xferDone = false;
		ROM_I2CS_Transfer(i2csHandle, &sXfer);	/* Never blocks, always returns LPC_OK */
		DEBUGOUT("Waiting for master\r\n");

		/* Wait for transfer to complete. The slave data completion callback
		   will set xferDone when ready via it's completion callback. */
		while (xferDone == false) {
			__WFI();
		}

		/* Check status of the transfer */
		DEBUGOUT("Transfer complete (%x)\r\n", sXfer.status);
		DEBUGOUT("RX [%d]", sXfer.bytesRecv);
		for (i = 0; i < sXfer.bytesRecv; i++) {
			DEBUGOUT(" : %02x", slaveRx[i]);
		}
		DEBUGOUT("\r\n");
		DEBUGOUT("TX [%d]", sXfer.bytesSent);
		for (i = 0; i < sXfer.bytesSent; i++) {
			DEBUGOUT(" : %02x", slaveTx[i]);
		}
		DEBUGOUT("\r\n");
	}

	/* Code never reaches here. Only used to satisfy standard main() */
	return 0;
}
// Magicoe OSStatus platform_spi_init( const platform_spi_t* spi, const platform_spi_config_t* config )
OSStatus platform_spi_init( platform_spi_driver_t* driver, const platform_spi_t* peripheral, const platform_spi_config_t* config )
{
//  SPI_InitTypeDef   spi_init;
  OSStatus          err = kNoErr;
  platform_mcu_powersave_disable();
	uint32_t t1;	//general var
  require_action_quiet( ( peripheral != NULL ) && ( config != NULL ), exit, err = kParamErr);

  require_action_quiet( ( peripheral->port == LPC_SPI0 ), exit, err = kParamErr);


	driver->isRxDone = driver->isTxDone = 0;
	#ifndef NO_MICO_RTOS
	if (driver->sem_xfer_done == 0)
		mico_rtos_init_semaphore(&driver->sem_xfer_done, 1);
	#endif

   // >>> Init Pin mux
  	t1 = IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF;

	if (peripheral->port == LPC_SPI0)
	{
	  	if (config->speed >= 24000000)
	  		t1 |= 1UL<<9;	// enable fast slew
		g_pIO->PIO[0][11] = IOCON_FUNC1 | t1;/* SPI0_SCK */
		g_pIO->PIO[0][12] = IOCON_FUNC1 | t1;	/* SPI0_MOSI */
		g_pIO->PIO[0][13] = IOCON_FUNC1 | t1;	/* SPI0_MISO */
		// config CS pin as GPIO
		g_pIO->PIO[config->chip_select->port][config->chip_select->pin_number] = IOCON_FUNC0  | IOCON_MODE_INACT | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF;
		platform_gpio_output_high(config->chip_select);
		platform_gpio_init(config->chip_select, OUTPUT_PUSH_PULL);
	}
	// <<<

	// >>>
	// initialize SPI peripheral
	{
		uint32_t bv;
		LPC_SPI_T *pSPI = peripheral->port;

		// >>>
		bv = pSPI == LPC_SPI0 ? 1UL << 9 : 1UL<<10;

		g_pASys->ASYNCAPBCLKCTRLSET = bv;	// enable clock to SPI

		g_pASys->ASYNCPRESETCTRLSET = bv;
		g_pASys->ASYNCPRESETCTRLCLR = bv;
		// <<<

		//			predly | postDly| fraDly | xferDly
		pSPI->DLY = 1UL<<0 | 1UL<<4 | 1UL<<8 | 1UL<<12;
        pSPI->DLY = 0;

		t1 = Chip_Clock_GetAsyncSyscon_ClockRate();
		t1 = (t1 + config->speed - 1) / config->speed;
		pSPI->DIV = t1 - 1;	// proper division

		pSPI->TXCTRL = (config->bits - 1) << 24;	// 8 bits per frame

		//   Enable | master | no loopback
		t1 = 1UL<<0 | 1UL<<2 | 0UL<<7;
		// determine SPI mode
		if (config->mode & SPI_CLOCK_IDLE_HIGH) {
			t1 |= 1UL<<5;	// CPOL = 1
			if (t1 & SPI_CLOCK_RISING_EDGE)
				t1 |= 1UL<<4;	// CPHA = 1
		} else {
			if (!(t1 & SPI_CLOCK_RISING_EDGE))
				t1 |= 1UL<<4;
		}
		pSPI->CFG = t1;
	}
	// <<<

	g_pDMA->DMACOMMON[0].ENABLESET = (1UL<<peripheral->dmaRxChnNdx) | (1UL<<peripheral->dmaTxChnNdx);
	g_pDMA->DMACOMMON[0].INTENSET = (1UL<<peripheral->dmaRxChnNdx) | (1UL<<peripheral->dmaTxChnNdx);

	g_pDMA->DMACH[peripheral->dmaRxChnNdx].CFG = DMA_CFG_PERIPHREQEN | DMA_CFG_TRIGBURST_SNGL | DMA_CFG_CHPRIORITY(1);
	g_pDMA->DMACH[peripheral->dmaTxChnNdx].CFG = DMA_CFG_PERIPHREQEN | DMA_CFG_TRIGBURST_SNGL | DMA_CFG_CHPRIORITY(1);

exit:
  platform_mcu_powersave_enable();
  return err;
}