This commit is contained in:
Angoosh Leviocki 2021-07-01 14:34:34 +02:00
parent 9989513bc6
commit 21deda595e
7 changed files with 405 additions and 1 deletions

92
ADC Normal file
View File

@ -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]);
}
}

19
GPIO_setup Normal file
View File

@ -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);
}

View File

@ -1,3 +1,10 @@
# NXP_examples
Example code for NXP LPC824 MCU
priklady pro ukontrolery od NXP
pro vyuziti techto prikladu, je potreba mit naimportovane jednotlive example projekty, hlavne lpc_chip_XXx (lpc_chip_82x)<br/>
import exampu je nasledovny:<br/>
File->Open Projects from Fyle System...->Archive...->C:\nxp\MCUXpressoIDE\ide\Examples\LPCOpen\archiv k danemu procesoru<br/>
projekt se vytvori nasledovne:<br/>
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

149
UART Normal file
View File

@ -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<i-1; j++){
tmp[j] = '0';
}
do
{
tmp[--i] = '0' + n % 10;
n /= 10;
} while (n);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true);
Chip_UART_SendBlocking(LPC_USART, &operator, 1);
Chip_UART_SendBlocking(LPC_USART, &tmp, sizeof(tmp));
delay(0x800);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
}
void dbg_nl(){
Chip_UART_SendBlocking(DBG_USART, &"\n", 1);
}
uint8_t intToAscii(uint8_t number){
if(number > 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<size; i++){
uint8_t lo,hi;
lo = arr[i] & 0x0f;
hi = (arr[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<sizeof(rxring); i++){
Chip_UART_ReadRB(LPC_USART, &rxring, &byte, 1);
rec[i] = byte;
delay(0x10);
}
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, true);
Chip_UART_SendBlocking(LPC_USART, &rec, sizeof(rec));
delay(0x800);
Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, DE, false);
RingBuffer_Flush(&rxring); //Flush must be after sending response for @Creys hardware coz RE is enabled nonstop = sent msg is received
}
}
return 0 ;
}

54
Watchdog Normal file
View File

@ -0,0 +1,54 @@
void WWDT_Init(){
/* Freq = 0.6Mhz, divided by 64. WDT_OSC should be 9.375khz */
Chip_Clock_SetWDTOSC(WDTLFO_OSC_0_60, 64);
/* Enable the power to the WDT */
Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_WDTOSC_PD);
/* The WDT divides the input frequency into it by 4 */
wdtFreq = Chip_Clock_GetWDTOSCRate() / 4;
/* Initialize WWDT (also enables WWDT clock) */
Chip_WWDT_Init(LPC_WWDT);
/* Set watchdog feed time constant to approximately 2s
Set watchdog warning time to 512 ticks after feed time constant
Set watchdog window time to 3s */
Chip_WWDT_SetTimeOut(LPC_WWDT, wdtFreq * 2);
Chip_WWDT_SetWarning(LPC_WWDT, 512);
Chip_WWDT_SetWindow(LPC_WWDT, wdtFreq * 3);
/* Configure WWDT to reset on timeout */
Chip_WWDT_SetOption(LPC_WWDT, WWDT_WDMOD_WDRESET);
/* Clear watchdog warning and timeout interrupts */
Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDTOF | WWDT_WDMOD_WDINT);
/* Clear and enable watchdog interrupt */
NVIC_ClearPendingIRQ(WDT_IRQn);
NVIC_EnableIRQ(WDT_IRQn);
/* Start watchdog */
Chip_WWDT_Start(LPC_WWDT);
}
void WDT_IRQHandler(void)
{
uint32_t wdtStatus = Chip_WWDT_GetStatus(LPC_WWDT);
/* The chip will reset before this happens, but if the WDT doesn't
have WWDT_WDMOD_WDRESET enabled, this will hit once */
if (wdtStatus & WWDT_WDMOD_WDTOF) {
/* A watchdog feed didn't occur prior to window timeout */
Chip_WWDT_UnsetOption(LPC_WWDT, WWDT_WDMOD_WDEN); /* Stop WDT */
Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDTOF);
Chip_WWDT_Start(LPC_WWDT); /* Needs restart */
}
/* Handle warning interrupt */
if (wdtStatus & WWDT_WDMOD_WDINT) {
/* A watchdog feed didn't occur prior to warning timeout */
Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDINT);
Chip_WWDT_Feed(LPC_WWDT);
}
}

65
debugTools.c Normal file
View File

@ -0,0 +1,65 @@
/*
* debugTools.c
*
* Created on: 12. 10. 2020
* Author: Adcis
*/
#include "debugTools.h"
LPC_USART_T *DBG_USART;
void DebugInit(LPC_USART_T *pUART) {
DBG_USART = pUART;
/* Disable I/O buffering for STDOUT stream, so that
* chars are sent out as soon as they are printed. */
//setvbuf(stdout, NULL, _IONBF, 0);
}
void dbg_nl(){
Chip_UART_SendBlocking(DBG_USART, &"\n", 1);
}
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<i-1; j++){
tmp[j] = '0';
}
do
{
tmp[--i] = '0' + n % 10;
n /= 10;
} while (n);
Chip_UART_SendBlocking(DBG_USART, &operator, 1);
Chip_UART_SendBlocking(DBG_USART, &tmp, sizeof(tmp));
}
uint8_t intToAscii(uint8_t number){
if(number > 9){
return number + 55;
}
else{
return number + 48;
}
}
void dbg_ASCII(uint8_t *arr, int size){
for(int i = 0; i<size; i++){
uint8_t lo,hi;
lo = arr[i] & 0x0f;
hi = (arr[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();
}

18
debugTools.h Normal file
View File

@ -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_ */