1234
This commit is contained in:
parent
9989513bc6
commit
21deda595e
92
ADC
Normal file
92
ADC
Normal 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
19
GPIO_setup
Normal 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);
|
||||
}
|
@ -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
149
UART
Normal 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
54
Watchdog
Normal 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
65
debugTools.c
Normal 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
18
debugTools.h
Normal 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_ */
|
Loading…
x
Reference in New Issue
Block a user