#include "board.h"
#include "chip.h"
#define GPIO_PINRXD0 //MAX: D0
#define GPIO_PINTXD19 //MAX: D2
#define UART_BAUDRATE 115200
bool flag_MRT0 = false;
bool setPowerState(int power_state){
uint32_t response;
uint32_t cmdData[3];
cmdData[0] = 12;
cmdData[1] = power_state;
cmdData[2] = 12;
Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_IRC);
SystemCoreClockUpdate();
__disable_irq();
LPC_ROM_API->pPWRD->set_power(cmdData, &response);
__enable_irq();
if(response)
return false;
return true;
}
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_GetSystemClockRate() / 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);
}
/**
* @briefHandle interrupt from MRT
* @returnNothing
*/
void MRT_IRQHandler(void)
{
uint32_t int_pend;
/* Get interrupt pending status for all timers and clear it*/
int_pend = Chip_MRT_GetIntPending();
Chip_MRT_ClearIntPending(int_pend);
/* MRT 0 */
if (int_pend & (MRTn_INTFLAG(0))) {
flag_MRT0 = true;
}
}
static void blinkLEDCount(uint32_t count)
{
volatile uint32_t index;
/* Perform the requested number of times */
for (; count; --count) {
Board_LED_Toggle(0);
for (index = 0; index < 100000; ++index) {}/* delay */
Board_LED_Toggle(0);
for (index = 0; index < 100000; ++index) {}/* delay */
}
}
void UART_config_Init(){
/* Enable the clock to the Switch Matrix */
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
// Change pin to UARTn function
Chip_SWM_MovablePinAssign(SWM_U0_TXD_O, GPIO_PINTXD);
Chip_SWM_MovablePinAssign(SWM_U0_RXD_I, GPIO_PINRXD);
/* Disable the clock to the Switch Matrix */
Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
/* Setup UARTn */
Chip_UART_Init(LPC_USART0);
Chip_UART_ConfigData(LPC_USART0, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);
Chip_Clock_SetUSARTNBaseClockRate((UART_BAUDRATE * 16), true);
Chip_UART_SetBaud(LPC_USART0, UART_BAUDRATE);
Chip_UART_Enable(LPC_USART0);
Chip_UART_TXEnable(LPC_USART0);
}
int main(void)
{
int mrtch;
/* Generic Initialization */
SystemCoreClockUpdate();
Board_Init();
/* Set power state */
/* if failure response don't proceed */
if (!setPowerState(PWR_CPU_PERFORMANCE)) {
while (1) {
blinkLEDCount(2);
}
}
/* Config and Init UART0 */
UART_config_Init();
Chip_MRT_Init();
for (mrtch = 0; mrtch < MRT_CHANNELS_NUM; mrtch++) {
Chip_MRT_SetDisabled(Chip_MRT_GetRegPtr(mrtch));
}
/* Enable the interrupt for the MRT */
NVIC_EnableIRQ(MRT_IRQn);
flag_MRT0 = false;
setupMRT(0, MRT_MODE_ONESHOT, 500);
while(!flag_MRT0) __WFI();
Chip_UART_SendBlocking(LPC_USART0, "go\r\n", 4);
while ( 1 ) {
}
}
|