Hi,
I want to receive data in interrupt Mode in UART, Send is working well withought TX Interrupt, When data sent by another device or terminal software from PC, Rather than executing ISR , MCU crashes.
Code is attached.
/*
* Author : - KHODIDAS DOMADIYA\
* Organization: - Optimzed Solutions Ltd.
* Department: -Product ENgineering services.
*
* Date:- 12-05-2021
*
*LED4 PH3 //INDICATION LED
*LED5 PF1 //ETHERNET LED
*LED6 PF4 //ETHERNET LED
*If PSFLT =1 Then powersupply OK,
*Indicate TO MAIN as PSFLT
*
* If FROM MAIN =1 then Start Monitoring,
* If LOCKING/TRIPPING =1 then Condition/Health OK
* IF ARC,IDSLW,TEMP,MAIN_IN =1 Then Signals are OK
*
*
**UPDATED ON 22-06-2021
* =>AS per Discussion, After poweron and start command,PSFLT must be monitored, it indicates the powersupply fault signal, ifit is low then powersupply is faulty
* so do not start monitoring, control and data transfer and generate LOCKING/ TRIPPING as well as TO MAIN (indication to Mainboard,)
*
*=>according to discussion that On REEAD command, read and send data to ethernet ,erase and reset entire device.ERASE or RESET command is not to be given.
*=> Add DIAGNOSTIC Mode, in that during runtime, thresholds can be changeable. and in RUN/NORMAL Mode it is to be set before START command
*=>
*=> IP ADDRESS USED IS STATIC
*
* RF_FORWARD_VAL= ADC_OUT_1[2]; //PE3
* RF_REVERSE_VAL= ADC_OUT_1[3]; //PE2
* TEMPERATURE_VAL=ADC_OUT_1[4]; //PK0
* VDS_VAL =ADC_OUT_1[5]; //PK1
* ID_VAL =ADC_OUT_1[0]; //PK2
* VGS_VAL =ADC_OUT_1[1]; //PK3
*
*This firmware has been implementaed for the IPMS interlock system for BARC project
*It has adc sampling rate per channel is 200KSPS and datalogging rate as per Anexure to PO.
*1000 Data points are stored in flash memory
*
*Initially on Power on it will check and wait for the Ethernet connection from server as this device works as a client.
*It has been assigned with static IP , for dynamic IP do the changes in tcpecho.cfg file
*
*command from server============================================
*For the start of monitoring, control and data transfer use "start"
*For halting monitoring, control and data transfer use "stopd"
*For reading data from flash storage use "flash" ,this will work only when device is halted.
*For erasing flash content use "erase". If flahs was not erased than it will retain last data, hence during next read it may have old data.
*For system reset like power on reset use "reset". this command will reset the device like power on reset and hence, it will close ethernet connection,----
* -----and request new connection from server, as connection established, it will wait for start command to run again.
*
*
* Implementation Pending ============================================================
* start and stop using FROM MAIN signal
* Staus signal using TO MAIN Signal
*
* Indication OF leds - For ethernet , default LEDs used
*
*
*/
/*
* ======== tcpEcho.c ========
*/
/* XDCtools Header files */
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <ti/sysbios/hal/Hwi.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/Memory.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Task.h>
/* NDK Header files */
#include <ti/ndk/inc/netmain.h>
#include <ti/ndk/inc/_stack.h>
/* TI-RTOS Header files */
#include <ti/drivers/GPIO.h>
#include <ti/sysbios/knl/Semaphore.h>
/* Example/Board Header files */
#include "Board.h"
#include <time.h>
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include "driverlib/pin_map.h"
#include "driverlib/adc.h"
//#include "driverlib/rom.h"
//#include "driverlib/rom_map.h"
#include "inc/hw_i2c.h"
#include "driverlib/i2c.h"
#include "driverlib/ssi.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "inc/hw_flash.h"
#include "driverlib/flash.h"
#include <ti/sysbios/hal/Timer.h>
//#define dma false
//#define flash_en true
#include <lcd.h>
//============================Ethernet ========================//
#define TCPPACKETSIZE 1024
#define TCPPORT 8080
#define NUMTCPWORKERS 3
#define BUF_SIZE 12412
#define FLASH_BASE_ADDR_RFF ((uint32_t *)0x00020000)
#define TASKSTACKSIZE 512
Int resource = 0;
Int finishCount = 0;
UInt32 sleepTickCount;
char thbuffer[10];
SOCKET lSocket;
struct sockaddr_in sLocalAddr;
uint32_t timecounter;
//============================SYSTEM CLOCK========================//
uint32_t g_ui32SysClock;
uint32_t ui32Period;
//============================================================//
int checkLinkState(void)
{
return EMAC_isLinkUp(0);
}
void timerIntHandler(void)
{
TimerIntClear(TIMER2_BASE, TIMER_TIMA_TIMEOUT); // must clear timer flag FROM timer
timecounter++;
}
// Timer start
//void Timer_Start(void)
//{
// Timer_start(myTimer);
//}
//
//// Timer stop
//void Timer_Stop(void)
//{
// Timer_stop(myTimer);
//}
//=======================================================================//
// Timer configuration as RTOS base
void timer_init(void)
{
//Set CPU Clock to 40MHz. 400MHz PLL/2 = 200 DIV 5 = 40MHz
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
// Timer 2 setup code
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); // enable Timer 2 periph clks
TimerConfigure(TIMER2_BASE, TIMER_CFG_PERIODIC); // cfg Timer 2 mode - periodic
//ui32Period = (SysCtlClockGet() /1000);
ui32Period=g_ui32SysClock/1;
TimerLoadSet(TIMER2_BASE, TIMER_A, ui32Period); // set Timer 2 period
IntEnable(INT_TIMER2A);
TimerIntRegister(TIMER2_BASE, TIMER_A, timerIntHandler);
IntRegister(INT_TIMER2A, timerIntHandler);
TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT); // enables Timer 2 to interrupt CPU
TimerEnable(TIMER2_BASE, TIMER_A); // enable Timer 2
IntMasterEnable();
}
//void Timer_init()
//{
// timer_init();
// Timer_Params_init(&Timer2);
// Timer2.arg=0;
// Timer2.period= 500; // 20us
// //Timer2.period= 1000; //1 ms (Milliseconds)
// //Timer2.period= 800; //800 us (Microseconds)
// Timer2.periodType=Timer_PeriodType_MICROSECS;
// myTimer=Timer_create(2,(Timer_FuncPtr)timerIntHandler,&Timer2,NULL);
// Timer_start(myTimer);
//
// //Timer_stop(myTimer);
//
//}
//*****************************************************************************
//
// The UART interrupt handler.
//
//*****************************************************************************
void
UARTIntHandler(void)
{
uint32_t ui32Status;
//
// Get the interrrupt status.
//
ui32Status = UARTIntStatus(UART0_BASE, true);
//
// Clear the asserted interrupts.
//
UARTIntClear(UART0_BASE, ui32Status);
//
// Loop while there are characters in the receive FIFO.
//
if(UARTCharsAvail(UART0_BASE))
{
//
// Read the next character from the UART and write it back to the UART.
//
//UARTCharPutNonBlocking(UART0_BASE, UARTCharGetNonBlocking(UART0_BASE));
finishCount= UARTCharGetNonBlocking(UART0_BASE);
}
}
void UARTSend(const uint8_t *pui8Buffer, uint32_t ui32Count)
{
//
// Loop while there are more characters to send.
//
while(ui32Count--)
{
//
// Write the next character to the UART.
//
UARTCharPutNonBlocking(UART0_BASE, *pui8Buffer++);
}
}
void UART_Init()
{
//
// Enable the peripherals used by this example.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//
// Set GPIO A0 and A1 as UART pins.
//
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Configure the UART for 115,200, 8-N-1 operation.
//
UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
// //
// Enable processor interrupts.
//
// /IntMasterEnable();
// Enable the UART interrupt.
//
UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
IntEnable(INT_UART0);
//
// Prompt for text to be entered.
//
UARTSend((uint8_t *)"\033[2JEnter text: ", 16);
}
/*
* ======== tcpHandler ========
* Creates new Task to handle new TCP connections.
*/
Void tcpHandler(UArg arg0, UArg arg1)
{
fdOpenSession(TaskSelf());
lSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (lSocket < 0)
{
// System_printf("tcpHandler: socket failed\n");
Task_exit();
return;
}
memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
sLocalAddr.sin_family = AF_INET;
sLocalAddr.sin_addr.s_addr = inet_addr("192.168.1.130");//htonl(INADDR_ANY);
sLocalAddr.sin_port = htons(arg0);
while(connect(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0)
{
SysCtlDelay(400000);
}
}
/*
* ======== main ========
*/
int main(void)
{
// Task_Handle taskHandle;
// Task_Params taskParams;
// Error_Block eb;
g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480), 120000000);
/* Call board init functions */
Board_initGeneral();
Board_initGPIO();
Board_initEMAC();
/***********************GPIO FOR LEDs*************************/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
GPIODirModeSet(GPIO_PORTK_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTQ_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x00);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
GPIODirModeSet(GPIO_PORTE_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2,GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, 0x00);
/***********************GPIO FOR SNAP1 & 2*************************/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTL_BASE,GPIO_PIN_4|GPIO_PIN_5);
GPIODirModeSet(GPIO_PORTL_BASE,GPIO_PIN_4|GPIO_PIN_5,GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTL_BASE, GPIO_PIN_4|GPIO_PIN_5, 0x00);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
GPIOPinTypeGPIOOutput(GPIO_PORTM_BASE,GPIO_PIN_0);
GPIODirModeSet(GPIO_PORTM_BASE,GPIO_PIN_0,GPIO_DIR_MODE_OUT);
GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_0, 0x00);
// timer_init();
UART_Init();
while(1)
{
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_2, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0, GPIO_PIN_0);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, GPIO_PIN_1);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0, GPIO_PIN_0);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1, GPIO_PIN_1);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTL_BASE, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_4|GPIO_PIN_5);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTL_BASE, GPIO_PIN_4|GPIO_PIN_5, 0x00);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_0, GPIO_PIN_0);
SysCtlDelay(g_ui32SysClock/3);
GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_0, 0x00);
SysCtlDelay(g_ui32SysClock/3);
}
/* Start BIOS */
BIOS_start();
return (0);
}
Regards
Khodidas