diff --git a/ADC b/ADC new file mode 100644 index 0000000..5a17e3c --- /dev/null +++ b/ADC @@ -0,0 +1,92 @@ +#define iHN 9 +#define iHZ 8 +#define iVL 10 +#define LOW_U_THR 100 + +static bool sequenceComplete, thresholdCrossed; +uint32_t HZ, HN, VL; + +Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); +Chip_SWM_EnableFixedPin(SWM_FIXED_ADC8); +Chip_SWM_EnableFixedPin(SWM_FIXED_ADC9); +Chip_SWM_EnableFixedPin(SWM_FIXED_ADC10); +Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); + +/*disable adc pullups on pins 13,17,18*/ +Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON); +LPC_IOCON->PIO0[IOCON_PIO17] = 0; +LPC_IOCON->PIO0[IOCON_PIO18] = 0; +LPC_IOCON->PIO0[IOCON_PIO13] = 0; + +static void ADC_Init(void){ + Chip_ADC_Init(LPC_ADC, 0); + Chip_ADC_StartCalibration(LPC_ADC); + while (!(Chip_ADC_IsCalibrationDone(LPC_ADC))) {} + Chip_ADC_SetClockRate(LPC_ADC, 1000);//ADC_MAX_SAMPLE_RATE + + Chip_ADC_SetupSequencer(LPC_ADC, ADC_SEQA_IDX, + (ADC_SEQ_CTRL_CHANSEL(iHZ) | + ADC_SEQ_CTRL_CHANSEL(iHN) | + ADC_SEQ_CTRL_CHANSEL(iVL) | + ADC_SEQ_CTRL_MODE_EOS)); + /* Setup threshold 0 low and high values to about 25% and 75% of max */ + Chip_ADC_SetThrLowValue(LPC_ADC, 0, ((1 * 0xFFF) / 4)); + Chip_ADC_SetThrHighValue(LPC_ADC, 0, ((4 * 0xFFF) / 4)); + + Chip_ADC_ClearFlags(LPC_ADC, Chip_ADC_GetFlags(LPC_ADC));/* Clear all pending interrupts */ + Chip_ADC_EnableInt(LPC_ADC, (ADC_INTEN_SEQA_ENABLE | ADC_INTEN_OVRRUN_ENABLE));/* Enable ADC overrun and sequence A completion interrupts */ + + /* Enable ADC NVIC interrupt */ + NVIC_EnableIRQ(ADC_SEQA_IRQn); + + /* Enable sequencer */ + Chip_ADC_EnableSequencer(LPC_ADC, ADC_SEQA_IDX); +} + +void ADC_SEQA_IRQHandler(void) +{ + uint32_t pending; + + /* Get pending interrupts */ + pending = Chip_ADC_GetFlags(LPC_ADC); + + /* Sequence A completion interrupt */ + if (pending & ADC_FLAGS_SEQA_INT_MASK) { + sequenceComplete = true; + } + + /* Threshold crossing interrupt on ADC input channel */ + if (pending & ADC_FLAGS_THCMP_MASK(iHN) & ADC_FLAGS_THCMP_MASK(iHZ) & ADC_FLAGS_THCMP_MASK(iVL)) { + thresholdCrossed = true; + } + + /* Clear any pending interrupts */ + Chip_ADC_ClearFlags(LPC_ADC, pending); +} + +void SysTick_Handler(void) +{ + static uint32_t count; + + /* Every 1/2 second */ + if (count++ == 100 / 2) { + count = 0; + + /* Manual start for ADC conversion sequence A */ + Chip_ADC_StartSequencer(LPC_ADC, ADC_SEQA_IDX); + } +} + +int main(void) { + SystemCoreClockUpdate(); + ADC_Init(); + SysTick_Config(SystemCoreClock / 100); + + if (sequenceComplete) { + sequenceComplete = false; + + HZ = ADC_DR_RESULT(LPC_ADC->DR[iHZ]); + HN = ADC_DR_RESULT(LPC_ADC->DR[iHN]); + VL = ADC_DR_RESULT(LPC_ADC->DR[iVL]); + } +} \ No newline at end of file diff --git a/GPIO_setup b/GPIO_setup new file mode 100644 index 0000000..1725282 --- /dev/null +++ b/GPIO_setup @@ -0,0 +1,19 @@ +#define LED1 8 +#define LED2 9 + +static void GPIOInit(void) { + /* Enable the clock GPIO */ + Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO); + /*disable default fixed pins*/ + Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); + Chip_SWM_DisableFixedPin(SWM_FIXED_XTALIN); //pin 8 + Chip_SWM_DisableFixedPin(SWM_FIXED_XTALOUT); //pin 9 + Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); + + /* red */ + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, LED1); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, LED1, false); + /* green */ + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, LED2); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, LED2, false); +} \ No newline at end of file diff --git a/README.md b/README.md index 18e7a53..84199b2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,10 @@ # NXP_examples -Example code for NXP LPC824 MCU \ No newline at end of file +priklady pro ukontrolery od NXP + +pro vyuziti techto prikladu, je potreba mit naimportovane jednotlive example projekty, hlavne lpc_chip_XXx (lpc_chip_82x)
+import exampu je nasledovny:
+File->Open Projects from Fyle System...->Archive...->C:\nxp\MCUXpressoIDE\ide\Examples\LPCOpen\archiv k danemu procesoru
+ +projekt se vytvori nasledovne:
+File->New->C/New LPCXpresso C Project->Preinstalled MCUs(pozadovany procesor)->LPCOpen - C Project->pojmenovat projekt->LPCOpen Chip Library Project (vyprat projekt k danemu procesoru)->az se dostanes k Other options tak zaskrtnout Create 'inc' directory and add to path->Finish \ No newline at end of file diff --git a/UART b/UART new file mode 100644 index 0000000..94644b3 --- /dev/null +++ b/UART @@ -0,0 +1,149 @@ +#include "chip.h" +#include "string.h" + +#define DE 26 +#define RX 27 +#define TX 16 + +#define UART_RB_SIZE 64 +#define LPC_USART LPC_USART1 +#define LPC_IRQNUM UART1_IRQn +#define LPC_UARTHNDLR UART1_IRQHandler +#define UART_BAUDRATE 19200 + +STATIC RINGBUFF_T txring, rxring; +static uint8_t rxbuff[UART_RB_SIZE], txbuff[UART_RB_SIZE]; + +const char inst1[] = "Blocking Test\n"; +const char inst2[] = "NonBlocking Test\n"; + +static void delay(uint32_t cntr) { + /* very simply delay routine */ + while(cntr>0) { /* burn some cycles */ + cntr--; + __asm volatile("nop\n"); + } +} + +static void Init_UART_PinMux(void) +{ + Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM); + Chip_Clock_SetUARTClockDiv(1); + Chip_SWM_MovablePinAssign(SWM_U1_TXD_O, TX); //U1 = uart1, options: 0,1,2 for LPC824 + Chip_SWM_MovablePinAssign(SWM_U1_RXD_I, RX); + Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM); + + Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, DE); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false); +} + +static void UART_Init(void){ + Init_UART_PinMux(); + + Chip_UART_Init(LPC_USART); + Chip_UART_ConfigData(LPC_USART, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1); + Chip_Clock_SetUSARTNBaseClockRate((UART_BAUDRATE * 16), true); + Chip_UART_SetBaud(LPC_USART, UART_BAUDRATE); + Chip_UART_Enable(LPC_USART); + Chip_UART_TXEnable(LPC_USART); + + RingBuffer_Init(&rxring, rxbuff, 1, UART_RB_SIZE); + RingBuffer_Init(&txring, txbuff, 1, UART_RB_SIZE); + + Chip_UART_IntEnable(LPC_USART, UART_INTEN_RXRDY); + Chip_UART_IntDisable(LPC_USART, UART_INTEN_TXRDY); + + NVIC_EnableIRQ(LPC_IRQNUM); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true); + Chip_UART_SendBlocking(LPC_USART, inst1, sizeof(inst1)); + Chip_UART_SendRB(LPC_USART, &txring, inst2, sizeof(inst2)); + delay(0x800); + Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false); +} + +void LPC_UARTHNDLR(void) +{ + /* Want to handle any errors? Do it here. */ + + /* Use default ring buffer handler. Override this with your own + code if you need more capability. */ + Chip_UART_IRQRBHandler(LPC_USART, &rxring, &txring); +} + +void dbg(unsigned long n){//16.7 + char operator = '+'; + if(n > 4294967296/2){ + n = 4294967296 - n; + operator = '-'; + } + char tmp[11]; + int i = sizeof(tmp); + for(int j = 0; j 9){ + return number + 55; + } + else{ + return number + 48; + } +} + +void dbg_ASCII(uint8_t *arr, int size){ //array charu nebo char a prevede to na ascii, mysleno hlavne pro HEX + for(int i = 0; i> 4) & 0x0f; + hi = intToAscii(hi); + lo = intToAscii(lo); + Chip_UART_SendBlocking(DBG_USART, &hi, 1); + Chip_UART_SendBlocking(DBG_USART, &lo, 1); + Chip_UART_SendBlocking(DBG_USART, &" ", 1); + } + dbg_nl(); +} + +int main(void) { + SystemCoreClockUpdate(); + + UART_Init(); + + while(1) { + uint8_t byte; + uint8_t rec[UART_RB_SIZE]; + + if(RingBuffer_IsEmpty(&rxring) != 1){ + for(int i = 0; i 4294967296/2){ + n = 4294967296 - n; + operator = '-'; + } + char tmp[11]; + int i = sizeof(tmp); + for(int j = 0; j 9){ + return number + 55; + } + else{ + return number + 48; + } +} + +void dbg_ASCII(uint8_t *arr, int size){ + for(int i = 0; i> 4) & 0x0f; + hi = intToAscii(hi); + lo = intToAscii(lo); + Chip_UART_SendBlocking(DBG_USART, &hi, 1); + Chip_UART_SendBlocking(DBG_USART, &lo, 1); + Chip_UART_SendBlocking(DBG_USART, &" ", 1); + } + dbg_nl(); +} + diff --git a/debugTools.h b/debugTools.h new file mode 100644 index 0000000..5b491ea --- /dev/null +++ b/debugTools.h @@ -0,0 +1,18 @@ +/* + * debugTools.h + * + * Created on: 12. 10. 2020 + * Author: Adcis + */ + +#ifndef DEBUGTOOLS_H_ +#define DEBUGTOOLS_H_ + +#include "chip.h" + +void DebugInit(LPC_USART_T *pUART); +void dbg_nl(); +void dbg(unsigned long n); +void dbg_ASCII(uint8_t *arr, int size); + +#endif /* DEBUGTOOLS_H_ */