📄 comms_uart.c
字号:
{ result=hex+'0'; } // convert number
else
{ result=hex+('A'-10); } // convert letter
return result;
}
//;--------------------------------------------------------------
//; This routine processes a received UART Command
void Process_UART(void)
{
int temp; // Temporary variable
static long SerialNumber; // Long temporary variable
unsigned int parm; //
unsigned int key; // key to allow flash operation
unsigned int addr;
unsigned int data;
unsigned long addrdata;
if (UART_Status & LineReceived)
{
P1OUT |= 0x02; // Turn on P1.1 to turn off User1 LED
//UARTSet
switch (UART_RX_Buffer[0])
{
case 'F':
//FLASH memory commands
_DINT(); // Disable Interrupts
LCDtext ((unsigned char *) UART_RX_Buffer, 6, 6); // Display one last message on LCD
switch (UART_RX_Buffer[1])
{
case 'T': // Set FLASH Tag
key =GetHexNumber(&UART_RX_Buffer[2]);
if ((key== LOAD_TAG) || (key== RUN_TAG))
{
flash_write_int16((int16_t*)&FlashTag, key);
// Force branch to hardware reset vector
HardReset(); //!!!ACHTUNG!!! DOES NOT RETURN.
}
break;
case 'E': // Erase FLASH
addr =GetHexNumber(&UART_RX_Buffer[2]);
if ((addr>=0x8000) && (addr < 0xFE00))
{
P1OUT &= ~0x01; // clear P1.0 (Turn on User0 LED)
flash_clr((int*)addr);
P1OUT |= 0x01; // set P1.0 (Turn off USer0 LED)
SendResult((unsigned char*)&addr, 2); // Address
SendResult((unsigned char*)addr, 2); // Data read back from flash
SendString("\r");
}
Display_Mode = display_off; // Turn off the normal scrolling display update
// so we can see the flash addresses
break;
case 'W': // Write 16 bits to FLASH
addrdata =GetLongHexNumber(&UART_RX_Buffer[2]);
addr = (addrdata>>16)& 0x0000FFFFL;
data = addrdata & 0x0000FFFFL;
flash_write_int16((int16_t*)addr, data);
SendResult((unsigned char*)&addr, 2); // Address
SendResult((unsigned char*)addr, 2); // Data read back from flash
SendString("\r");
break;
case 'R': // Read 16 bits from FLASH
addr =GetHexNumber(&UART_RX_Buffer[2]);
SendResult((unsigned char*)&addr, 2); // Address
SendResult((unsigned char*)addr, 2); // Data read back from flash
SendString("\r");
break;
case 'S': // Read FLASH Tag
SendResult((unsigned char*)&FlashTag, 2); // Data read back from flash Tag
SendString("\r");
break;
default:
break;
}
_EINT(); // Enable Interrupts
break;
#ifndef FLASH_LOADER
case 'S':
//SetClock
switch (UART_RX_Buffer[1])
{
case 'H':
HOUR = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'M':
MIN = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'S':
SEC = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'Y':
YEAR = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'O':
MONTH = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'D':
DAY = GetBCDNumber(&UART_RX_Buffer[2]);
break;
case 'V':
calVoltage = ((float)GetNumber(&UART_RX_Buffer[2]))/10.0;
SetAFEGain2(calVoltage); // Set the AFE gain for best ADC resolution without saturatoin
break;
case 'I':
calCurrent = ((float)GetNumber(&UART_RX_Buffer[2]))/100.0;
break;
case 'F':
{
int calFreqOld;
calFreqOld = calFreq;
calFreq = GetNumber(&UART_RX_Buffer[2]);
if (calFreq != calFreqOld)
{
init_esp_parameter(1); // Init. Embedded Signal Processing parameters
}
}
break;
case 'N':
SerialNumber = GetLongHexNumber(&UART_RX_Buffer[2]);
flash_replace_block( (char *)&SerialNumber_flash, (char *)&SerialNumber, sizeof(SerialNumber));// Write serial number to flash
break;
default:
break;
}
break;
#ifdef withDisplay
case 'D':
//SetDisplay_Mode
LCDtext ((unsigned char *) " ", LCD_SIZE, LCD_SIZE); // Clear the display
Display_Mode = GetNumber(&UART_RX_Buffer[1]);
ModeSwitchDelay = 60; // Stay in commanded display mode for 1 minute before auto-updating display mode
Display_Hold = 2; // Display units for 2 seconds before showing values
break;
case 'W':
// Write to LCD display
Display_Mode = display_msgin;
strcpy(msgin, (char *)&UART_RX_Buffer[1]);
ModeSwitchDelay = 60; // Stay in commanded display mode for 1 minute before auto-updating display mode
break;
#endif // withDisplay
case 'H':
//send help text
SendString(txt_help);
break;
case 'T':
//SetTX_Mode
TX_Mode = GetNumber(&UART_RX_Buffer[1]);
break;
case 'Q':
//Query
temp= TX_Mode; // Temporarily save TX_Mode
TX_Mode = GetNumber(&UART_RX_Buffer[1]);
SendData();
TX_Mode = temp; // Restore TX_Mode
break;
case 'V':
//Value
parm = GetNumber(&UART_RX_Buffer[1]);
SendValue(parm);
break;
case 'R':
WDTCTL =0; // Generate WDT violation Reset
break;
case 'M':
//SetMeasureMode
TX_Mode = 0; // ; Clear running TX_Mode
OP_Mode = request_cal;
CalCyclCnt = calFreq*GetNumber(&UART_RX_Buffer[1]); // Set Cycles
break;
case 'I':
//Init
_DINT(); // Disable Interrupts
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
// Init Digital Hardware
init_system();
// Init. FLL and clocks
init_fll(10, defSystemFreq, 32);
// Init. analog front-end (sigma-delta ADC)
init_analog_front_end();
// Init. Embedded Signal Processing parameters
init_esp_parameter(1);
// Init. event generation and start measurement
start_measurement();
_EINT(); // Enable Interrupts
break;
#ifdef withCalibration
case '+':
CalPlus(Cal_Mode);
break;
case '-':
CalMinus(Cal_Mode);
break;
case 'C':
//Set Calibration mode
{
static char strbuf[20];
_DINT(); // Disable Interrupts
Cal_Mode = GetNumber(&UART_RX_Buffer[1]);
SendString("Cal_Mode = ");
SendFloat(Cal_Mode,0);
SendString("\r");
if (Cal_Mode == 0)
{
SendString("Start Calibration : expecting ");
SendFloat((int)(calVoltage*10),1); SendString("V / ");
SendFloat((int)(calCurrent*100),2); SendString("A / cosPhi = ");
SendFloat(calCosPhi*1000,3); SendString("\r");
SendString("Old Data : \r ");
l_to_a((long) (s_parameters.VRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) (s_parameters.IRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) (s_parameters.EnergyRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) s_parameters.pSET_PHASECORR1, strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) s_parameters.pSET_PHASECORR2, strbuf); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.VRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.IRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.EnergyRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR1); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR2); SendString(strbuf); SendChar('\r');
//host_decu32((long) (s_parameters.VRatio*1000)); SendChar('\r');
//host_decu32((long) (s_parameters.IRatio*1000)); SendChar('\r');
//host_decu32((long) (s_parameters.EnergieRatio*1000)); SendChar('\r');
//host_decu32((long) s_parameters.pSET_PHASECORR1); SendChar('\r');
//host_decu32((long) s_parameters.pSET_PHASECORR2); SendChar('\r');
}
UART_Status &= ~LineReceived;
UART_RX_Bytes = 0;
_EINT(); // Enable Interrupts
CalMode(Cal_Mode);
_DINT(); // Disable Interrupts
if (Cal_Mode == 0)
{
SendString("Calibration Done\r");
SendString("New Data : \r ");
l_to_a((long) (s_parameters.VRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) (s_parameters.IRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) (s_parameters.EnergyRatio*1000), strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) s_parameters.pSET_PHASECORR1, strbuf); SendString(strbuf); SendChar('\r');
l_to_a((long) s_parameters.pSET_PHASECORR2, strbuf); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.VRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.IRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) (s_parameters.EnergyRatio*1000)); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR1); SendString(strbuf); SendChar('\r');
// sprintf(strbuf, ldfs,(long) s_parameters.pSET_PHASECORR2); SendString(strbuf); SendChar('\r');
//host_decu32((long) (s_parameters.VRatio*1000)); SendChar('\r');
//host_decu32((long) (s_parameters.IRatio*1000)); SendChar('\r');
//host_decu32((long) (s_parameters.EnergieRatio*1000)); SendChar('\r');
//host_decu32((long) s_parameters.pSET_PHASECORR1); SendChar('\r');
//host_decu32((long) s_parameters.pSET_PHASECORR2); SendChar('\r');
}
if (Cal_Mode == 9) { SendString("Parameters saved\r"); }
_EINT(); // Enable Interrupts
}
break;
#endif // withCalibration
#endif //ifndef FLASH_LOADER
}
UART_Status &= ~LineReceived;
UART_RX_Bytes = 0;
}
}
//No_Process_Uart
// ret
#endif // withUARTComm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -