Обновить сборку прошивки 166, TESTLAMP и кодировку исходников
Перенести настройки выпуска в JSON, добавить переносимый сценарий сборки и проверки BIN. Обновить конфигурации CCS, исходники в UTF-8, обработку TESTLAMP, образы прошивки и регрессионные проверки.
This commit is contained in:
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Windows cmd.exe должен получать BAT с CRLF: русские комментарии в UTF-8 при одних LF могут нарушать разбор строк команд.
|
||||
*.bat text eol=crlf
|
||||
Binary file not shown.
@@ -2,7 +2,7 @@
|
||||
TMS320C2000 Hex Converter v22.6.0
|
||||
********************************************************************************
|
||||
|
||||
INPUT FILE NAME: <K:\git_project\Balsam_167_periph\Bin\UKSSTMS320F28335.out>
|
||||
INPUT FILE NAME: <K:\git_project\28335_periph\Bin\UKSSTMS320F28335.out>
|
||||
OUTPUT FORMAT: Intel
|
||||
|
||||
PHYSICAL MEMORY PARAMETERS
|
||||
@@ -12,18 +12,18 @@ PHYSICAL MEMORY PARAMETERS
|
||||
|
||||
BOOT LOADER PARAMETERS
|
||||
Table Type: SERIAL PORT (SCI 8 bit Mode)
|
||||
Entry Point: 0x0000b581
|
||||
Entry Point: 0x0000b7bc
|
||||
|
||||
|
||||
OUTPUT TRANSLATION MAP
|
||||
--------------------------------------------------------------------------------
|
||||
00000000..ffffffff Page=0 Memory Width=8 ROM Width=8
|
||||
--------------------------------------------------------------------------------
|
||||
OUTPUT FILES: K:\git_project\Balsam_167_periph\UKSSTMS320F28335\Debug\.identity-release-cem4nfa7\.firmware-hb6330et\UKSSTMS320F28335.hex [b0..b7]
|
||||
OUTPUT FILES: K:\git_project\28335_periph\UKSSTMS320F28335\Debug\.identity-release-018w5cqu\.firmware-7iwzourf\UKSSTMS320F28335.hex [b0..b7]
|
||||
|
||||
CONTENTS: 00000000..00007627 BOOT TABLE
|
||||
.cinit : dest=0000b72f size=0x267 width=00000002
|
||||
.text : dest=00008000 size=0x372f width=00000002
|
||||
CONTENTS: 00000000..00007aa3 BOOT TABLE
|
||||
.cinit : dest=0000b969 size=0x26b width=00000002
|
||||
.text : dest=00008000 size=0x3969 width=00000002
|
||||
.econst : dest=0000c000 size=0x11e width=00000002
|
||||
.switch : dest=0000c11e size=0x48 width=00000002
|
||||
|
||||
|
||||
Binary file not shown.
@@ -1,8 +1,8 @@
|
||||
/* Íàñòðîéêà ÀÖÏ è îáðàáîòêà àíàëîãîâûõ âûáîðîê. adc_isr îáíîâëÿåò
|
||||
* adc_table_lem[0..3] èç ADCRESULT2..5 >> 4 è âûçûâàåò ðàñ÷¸ò èçìåðåíèé.
|
||||
* READY â 166 ÿâëÿåòñÿ ñ÷¸ò÷èêîì äî íóëÿ, íå ôëàãîì ãîòîâíîñòè.
|
||||
* WAKE çàäà¸ò îòäåëüíîå âðåìÿ óñòàíîâëåíèÿ èçìåðèòåëüíûõ öåïåé.
|
||||
* Íå äîáàâëÿòü îæèäàíèÿ EEPROM/UART â îáðàáîò÷èê âûáîðîê.
|
||||
/* Настройка АЦП и обработка аналоговых выборок. adc_isr обновляет
|
||||
* adc_table_lem[0..3] из ADCRESULT2..5 >> 4 и вызывает расчёт измерений.
|
||||
* READY в 166 является счётчиком до нуля, не флагом готовности.
|
||||
* WAKE задаёт отдельное время установления измерительных цепей.
|
||||
* Не добавлять ожидания EEPROM/UART в обработчик выборок.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP281x Examples Include File
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "peripher.h"
|
||||
|
||||
Uint16 adc_table_lem[4];
|
||||
Uint16 adc_table_tpl[28]; // Ïîòîìó ÷òî +4 êàëèáð
|
||||
Uint16 adc_table_tpl[28]; // Потому что +4 калибр
|
||||
|
||||
unsigned long COUNT_WAIT_ONE_CANAL;
|
||||
|
||||
@@ -63,12 +63,12 @@ void setup_adc()
|
||||
{
|
||||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0005; // Setup 2 conv's on SEQ1
|
||||
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // òåìïåðàòóðà (êîòîðîé íåò)
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // îìåãà
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x5; // íàïðóãà 1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x4; // íàïðóãà 2
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x7; // òîê 1
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x2; // òîê 2
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // температура (которой нет)
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // омега
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x5; // напруга 1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x4; // напруга 2
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x7; // ток 1
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x2; // ток 2
|
||||
}
|
||||
|
||||
if(Desk==dsk_BKST)
|
||||
@@ -82,7 +82,7 @@ void setup_adc()
|
||||
if(Desk==dsk_COMM)
|
||||
{
|
||||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0006; // Setup 2 conv's on SEQ1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // ñíà÷àëà òîæå áóäóò òåìïåðàòóðû
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // сначала тоже будут температуры
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x7; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
|
||||
@@ -100,23 +100,23 @@ void setup_adc()
|
||||
if(Desk==dsk_SHKF)
|
||||
{
|
||||
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x000F; // Setup 2 conv's on SEQ1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2; // 380Â Ô1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3; // 380Â Ô2
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x6; // 31Â Ô1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; // 31Â Ô2 ?
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0xA; // 31Â UC1
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0xB; // 31Â UC2
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x7; // 24Â ÏÓ
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x4; // 24Â ÏÓ
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2; // 380В Ф1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3; // 380В Ф2
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x6; // 31В Ф1
|
||||
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; // 31В Ф2 ?
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0xA; // 31В UC1
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0xB; // 31В UC2
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x7; // 24В ПУ
|
||||
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x4; // 24В ПУ
|
||||
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x5; // 24Â ÏÊ áûëî 5
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x1; // 15Â Äð
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xE; // +24Â Äò
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0; // +24Â Äò
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x8; // -24Â Äò áûëî 8
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x5; // 24В ПК было 5
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x1; // 15В Др
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xE; // +24В Дт
|
||||
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0; // +24В Дт
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x8; // -24В Дт было 8
|
||||
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ÄÒ° 1
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ÄÒ° 2
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ДТ° 1
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ДТ° 2
|
||||
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x9;//0x9;
|
||||
}
|
||||
|
||||
@@ -206,7 +206,7 @@ interrupt void adc_isr(void)
|
||||
{
|
||||
if (++cownt_cans>=tpl_cans) cownt_cans=0;
|
||||
|
||||
// Èìåííî çäåñü íåò äûð
|
||||
// Именно здесь нет дыр
|
||||
// if(sens_type[cownt_cans])
|
||||
{
|
||||
i++;
|
||||
@@ -244,7 +244,7 @@ interrupt void adc_isr(void)
|
||||
if(TermoAD)
|
||||
{
|
||||
if(cownt_cans == TPL_CANS ) code_tpl_canal = TERMOPAIR-1;
|
||||
if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; // ïîòîìó ÷òî 300 è 400 íàîáîðîò
|
||||
if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; // потому что 300 и 400 наоборот
|
||||
}
|
||||
|
||||
select_tpl_canal(code_tpl_canal);
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/* ЦАП нагрузки и аппаратная обёртка импульсов СИФУ. Load_runner
|
||||
* вызывается таймером 1 кГц, расчёт ЦАП делится до DAC_FREQ.
|
||||
* Формула 166 задаёт фиксированный разгон 6..16 мА. DAC_min/max
|
||||
* переводят положение в код, cCalibrDac выбирает ручной код.
|
||||
* WAKEpowse относится к ЦАП, не является разрешением дискрета запуска.
|
||||
* Автомат СИФУ подключён в конце файла через ump_control_impl.h.
|
||||
/* ЦАП нагрузки и аппаратная обёртка импульсов СИФУ. Load_runner
|
||||
* вызывается таймером 1 кГц, расчёт ЦАП делится до DAC_FREQ.
|
||||
* Формула 166 задаёт фиксированный разгон 6..16 мА. DAC_min/max
|
||||
* переводят положение в код, cCalibrDac выбирает ручной код.
|
||||
* WAKEpowse относится к ЦАП, не является разрешением дискрета запуска.
|
||||
* Автомат СИФУ подключён в конце файла через ump_control_impl.h.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
@@ -29,8 +29,8 @@ unsigned long WAKEpowse;
|
||||
volatile unsigned long IMPowse;
|
||||
unsigned int period_dac, time_dac;
|
||||
|
||||
/* Инициализация, не обработка каждого START. 601 отсчёт при 200 Гц
|
||||
* дают около 3 секунд до рабочего расчёта ЦАП после включения.
|
||||
/* Инициализация, не обработка каждого START. 601 отсчёт при 200 Гц
|
||||
* дают около 3 секунд до рабочего расчёта ЦАП после включения.
|
||||
*/
|
||||
void Setup_DAC_time(void)
|
||||
{
|
||||
@@ -76,9 +76,9 @@ void Init_DAC(void)
|
||||
dSEND(0x9002|0x0000); toggle_RES_OUT_1();
|
||||
}
|
||||
|
||||
/* vrot/maxx — доля диапазона между кодами 4 и 20 мА. Маска 0xFFF
|
||||
* сохраняет 12 бит, но не является насыщением. modbus[0x1C] содержит
|
||||
* расчётное задание, не измеренный ток на выходных клеммах.
|
||||
/* vrot/maxx — доля диапазона между кодами 4 и 20 мА. Маска 0xFFF
|
||||
* сохраняет 12 бит, но не является насыщением. modbus[0x1C] содержит
|
||||
* расчётное задание, не измеренный ток на выходных клеммах.
|
||||
*/
|
||||
void Anal_output(long vrot, long maxx)
|
||||
{
|
||||
@@ -87,7 +87,7 @@ void Anal_output(long vrot, long maxx)
|
||||
|
||||
out = DAC_min() + vrot * DAC_max() / maxx - vrot * DAC_min() / maxx ;
|
||||
|
||||
x=0;// !x; тщетно бытие
|
||||
x=0;// !x; тщетно бытие
|
||||
|
||||
if(cCalibrDac) out=DAC_cal();
|
||||
|
||||
@@ -116,9 +116,9 @@ Log_to_mem(modbus[0x1D]);
|
||||
|
||||
}
|
||||
|
||||
/* После половины time_dac счётчик растёт дважды за вызов. Поэтому
|
||||
* LOAD_TIME=30 даёт примерно 22.5 с до конца разгона при 200 Гц.
|
||||
* Существующий профиль 166 исправление импульса СИФУ не меняет.
|
||||
/* После половины time_dac счётчик растёт дважды за вызов. Поэтому
|
||||
* LOAD_TIME=30 даёт примерно 22.5 с до конца разгона при 200 Гц.
|
||||
* Существующий профиль 166 исправление импульса СИФУ не меняет.
|
||||
*/
|
||||
void Load_runner()
|
||||
{
|
||||
@@ -126,7 +126,7 @@ void Load_runner()
|
||||
float sinus=0;
|
||||
int kod;
|
||||
|
||||
/* IMPowse обновляется UMP_pulse_tick(), а не алгоритмом ЦАП. */
|
||||
/* IMPowse обновляется UMP_pulse_tick(), а не алгоритмом ЦАП. */
|
||||
if(++count_dac >= period_dac)
|
||||
{
|
||||
count_dac=0;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Таблицы выборок обновляет ADC ISR. Согласованный снимок нескольких
|
||||
* каналов требует защиты копирования, одного указателя недостаточно.
|
||||
/* Таблицы выборок обновляет ADC ISR. Согласованный снимок нескольких
|
||||
* каналов требует защиты копирования, одного указателя недостаточно.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/* Интерфейс ЦАП и СИФУ. Входящие команды — UMP_commands_write,
|
||||
* окончание импульса — UMP_pulse_tick. IMPowse только для диагностики.
|
||||
/* Интерфейс ЦАП и СИФУ. Входящие команды — UMP_commands_write,
|
||||
* окончание импульса — UMP_pulse_tick. IMPowse только для диагностики.
|
||||
*/
|
||||
void Load_runner(void);
|
||||
void Anal_output(long vrot, long maxx);
|
||||
void Init_DAC(void);
|
||||
void Setup_DAC_time(void);
|
||||
|
||||
/* Счётчик пускового импульса и выдержки инициализации доступны логгеру. */
|
||||
/* Счётчик пускового импульса и выдержки инициализации доступны логгеру. */
|
||||
extern volatile unsigned long IMPowse;
|
||||
extern unsigned long WAKEpowse;
|
||||
extern unsigned int period_dac, time_dac;
|
||||
|
||||
/* Все операции безопасны для вызова из main и обработчиков IRQ. */
|
||||
/* Все операции безопасны для вызова из main и обработчиков IRQ. */
|
||||
void UMP_pulse_init(void);
|
||||
void UMP_commands_write(unsigned int commands);
|
||||
void UMP_pulse_tick(void);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Íàïðàâëåíèÿ GPIO äëÿ àïïàðàòíûõ èñïîëíåíèé. Åäèíèöà îçíà÷àåò
|
||||
* âûõîä; àêòèâíóþ ïîëÿðíîñòü çàäàþò peripher.h è ñõåìà ïëàòû.
|
||||
/* Направления GPIO для аппаратных исполнений. Единица означает
|
||||
* выход; активную полярность задают peripher.h и схема платы.
|
||||
*/
|
||||
#define COMM_gpio00_dir 0L
|
||||
#define COMM_gpio01_dir 0L
|
||||
@@ -14,7 +14,7 @@
|
||||
#define COMM_gpio10_dir 0L
|
||||
#define COMM_gpio11_dir 0L
|
||||
|
||||
#define COMM_gpio19_dir 1L // 63 — SPI
|
||||
#define COMM_gpio19_dir 1L // 63 — SPI
|
||||
#define COMM_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define COMM_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define COMM_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
#define COMM_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define COMM_gpio33_dir 0L
|
||||
#define COMM_gpio34_dir 1L // 142 — SCI
|
||||
#define COMM_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define COMM_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define COMM_gpio49_dir 1L // 89 2:14B select
|
||||
@@ -57,7 +57,7 @@
|
||||
#define BKSD_gpio10_dir 0L // 19 2:6C oil
|
||||
#define BKSD_gpio11_dir 1L // 20 2:3C select
|
||||
|
||||
#define BKSD_gpio19_dir 1L // 63 — SPI
|
||||
#define BKSD_gpio19_dir 1L // 63 — SPI
|
||||
#define BKSD_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define BKSD_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define BKSD_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
#define BKSD_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define BKSD_gpio33_dir 0L
|
||||
#define BKSD_gpio34_dir 1L // 142 — SCI
|
||||
#define BKSD_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define BKSD_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define BKSD_gpio49_dir 0L // 89 2:14B input 2
|
||||
@@ -100,7 +100,7 @@
|
||||
#define BKST_gpio10_dir 0L
|
||||
#define BKST_gpio11_dir 1L // 20 2:3C select
|
||||
|
||||
#define BKST_gpio19_dir 1L // 63 — SPI
|
||||
#define BKST_gpio19_dir 1L // 63 — SPI
|
||||
#define BKST_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define BKST_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define BKST_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
#define BKST_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define BKST_gpio33_dir 0L
|
||||
#define BKST_gpio34_dir 1L // 142 — SCI
|
||||
#define BKST_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define BKST_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define BKST_gpio49_dir 0L
|
||||
@@ -143,7 +143,7 @@
|
||||
#define PULT_gpio10_dir 0L
|
||||
#define PULT_gpio11_dir 0L
|
||||
|
||||
#define PULT_gpio19_dir 1L // 63 — SPI
|
||||
#define PULT_gpio19_dir 1L // 63 — SPI
|
||||
#define PULT_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define PULT_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define PULT_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -155,7 +155,7 @@
|
||||
|
||||
#define PULT_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define PULT_gpio33_dir 0L
|
||||
#define PULT_gpio34_dir 1L // 142 — SCI
|
||||
#define PULT_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define PULT_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define PULT_gpio49_dir 0L // 89 2:14B button
|
||||
@@ -186,7 +186,7 @@
|
||||
#define PLT2_gpio10_dir 0L
|
||||
#define PLT2_gpio11_dir 0L
|
||||
|
||||
#define PLT2_gpio19_dir 1L // 63 × SPI
|
||||
#define PLT2_gpio19_dir 1L // 63 Ч SPI
|
||||
#define PLT2_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define PLT2_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define PLT2_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -198,7 +198,7 @@
|
||||
|
||||
#define PLT2_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define PLT2_gpio33_dir 0L // 75 2:10C button
|
||||
#define PLT2_gpio34_dir 1L // 142 × SCI
|
||||
#define PLT2_gpio34_dir 1L // 142 Ч SCI
|
||||
|
||||
#define PLT2_gpio48_dir 0L // 88 2:14C button
|
||||
#define PLT2_gpio49_dir 0L // 89 2:14B button
|
||||
@@ -229,7 +229,7 @@
|
||||
#define SHKF_gpio10_dir 0L // 19 2:6C input
|
||||
#define SHKF_gpio11_dir 0L // 20 2:3C input
|
||||
|
||||
#define SHKF_gpio19_dir 1L // 63 — SPI
|
||||
#define SHKF_gpio19_dir 1L // 63 — SPI
|
||||
#define SHKF_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define SHKF_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define SHKF_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -241,7 +241,7 @@
|
||||
|
||||
#define SHKF_gpio32_dir 0L // 74 2:10B input
|
||||
#define SHKF_gpio33_dir 0L // 75 2:10C input
|
||||
#define SHKF_gpio34_dir 1L // 142 — SCI
|
||||
#define SHKF_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define SHKF_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define SHKF_gpio49_dir 0L // 89 2:14B input
|
||||
@@ -272,7 +272,7 @@
|
||||
#define LOAD_gpio10_dir 0L
|
||||
#define LOAD_gpio11_dir 0L // 20 2:3C res_in 0
|
||||
|
||||
#define LOAD_gpio19_dir 1L // 63 — SPI
|
||||
#define LOAD_gpio19_dir 1L // 63 — SPI
|
||||
#define LOAD_gpio20_dir 0L // 64 2:9B mode 2
|
||||
#define LOAD_gpio21_dir 0L // 65 2:9A mode 4
|
||||
#define LOAD_gpio22_dir 0L // 66 2:12C mode 1
|
||||
@@ -284,7 +284,7 @@
|
||||
|
||||
#define LOAD_gpio32_dir 1L // 74 2:10B DIOD green
|
||||
#define LOAD_gpio33_dir 0L
|
||||
#define LOAD_gpio34_dir 1L // 142 — SCI
|
||||
#define LOAD_gpio34_dir 1L // 142 — SCI
|
||||
|
||||
#define LOAD_gpio48_dir 1L // 88 2:14C DIOD red
|
||||
#define LOAD_gpio49_dir 0L
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Буферы UART разделяются ISR и main. main обрабатывает
|
||||
* законченный RS_Header. Размеры сверять с 16-битной ABI DSP.
|
||||
/* Буферы UART разделяются ISR и main. main обрабатывает
|
||||
* законченный RS_Header. Размеры сверять с 16-битной ABI DSP.
|
||||
*/
|
||||
#ifndef _RS485
|
||||
#define _RS485
|
||||
@@ -32,30 +32,30 @@ typedef struct
|
||||
{
|
||||
volatile struct SCI_REGS *SciRegs;
|
||||
|
||||
unsigned int commnumber; // Номер порта
|
||||
unsigned long RS_Length; // Длина пакета
|
||||
unsigned int commnumber; // Номер порта
|
||||
unsigned long RS_Length; // Длина пакета
|
||||
|
||||
unsigned int *pRS_RecvPtr; // Буфер приема
|
||||
unsigned int *pRS_SendPtr; // Буфер посылки
|
||||
unsigned int *pRS_RecvPtr; // Буфер приема
|
||||
unsigned int *pRS_SendPtr; // Буфер посылки
|
||||
unsigned int *pRecvPtr;
|
||||
|
||||
unsigned int RS_PrevCmd; // Предыдущаа комманда
|
||||
unsigned int RS_Cmd; // Текущаа комманда
|
||||
unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок
|
||||
unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку
|
||||
unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием
|
||||
unsigned int RS_DataReady; // Флаг готовности RS данных
|
||||
unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS
|
||||
unsigned int RS_PrevCmd; // Предыдущаа комманда
|
||||
unsigned int RS_Cmd; // Текущаа комманда
|
||||
unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок
|
||||
unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку
|
||||
unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием
|
||||
unsigned int RS_DataReady; // Флаг готовности RS данных
|
||||
unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS
|
||||
|
||||
unsigned int addr_answer; // адрес куда отвечать в режиме ведущего
|
||||
unsigned int addr_recive; // адрес по которому нас запросили
|
||||
unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый)
|
||||
unsigned int addr_answer; // адрес куда отвечать в режиме ведущего
|
||||
unsigned int addr_recive; // адрес по которому нас запросили
|
||||
unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый)
|
||||
unsigned long RS_RecvLen;
|
||||
unsigned long RS_SLength; // Длина пакета дла посылки
|
||||
unsigned long RS_SendLen; // Количество байт уже передали
|
||||
char RS_SendBlockMode; // Режим передачи
|
||||
char RS_Flag9bit; // дла RS485????????
|
||||
int BS_LoadOK; // Флаг успешности приема блока
|
||||
unsigned long RS_SLength; // Длина пакета дла посылки
|
||||
unsigned long RS_SendLen; // Количество байт уже передали
|
||||
char RS_SendBlockMode; // Режим передачи
|
||||
char RS_Flag9bit; // дла RS485????????
|
||||
int BS_LoadOK; // Флаг успешности приема блока
|
||||
int RS_FlagBegin;
|
||||
int RS_HeaderCnt;
|
||||
int RS_FlagSkiping;
|
||||
@@ -67,39 +67,39 @@ typedef struct
|
||||
extern RS_DATA rs_a,rs_b;
|
||||
|
||||
extern unsigned int
|
||||
RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */
|
||||
RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */
|
||||
|
||||
interrupt void RSA_RX_Handler(void);
|
||||
interrupt void RSA_TX_Handler(void);
|
||||
interrupt void RSB_RX_Handler(void);
|
||||
interrupt void RSB_TX_Handler(void);
|
||||
|
||||
/* иницилизациа переменных rs_a,rs_b*/
|
||||
/* иницилизациа переменных rs_a,rs_b*/
|
||||
void create_uart_vars(char size_cmd15);
|
||||
|
||||
/** Повторнаа инициализациа последовательного порта, используетса после подвиса */
|
||||
/** Настройка режима приема/передачи */
|
||||
/** Повторнаа инициализациа последовательного порта, используетса после подвиса */
|
||||
/** Настройка режима приема/передачи */
|
||||
void RS_SetBitMode(RS_DATA *rs_arr, int n);
|
||||
|
||||
/** Посылка блока байтов.
|
||||
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество байт
|
||||
/** Посылка блока байтов.
|
||||
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество байт
|
||||
@see RS_BSend, RS_TRANSMIT_INTR
|
||||
*/
|
||||
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);
|
||||
|
||||
/** Посылка блока упакованных байтов.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество 8-битных байт
|
||||
/** Посылка блока упакованных байтов.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество 8-битных байт
|
||||
@see RS_Send, RS_TRANSMIT_INTR
|
||||
*/
|
||||
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);
|
||||
|
||||
/** Инициализациа последовательного порта */
|
||||
void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */
|
||||
/** Инициализациа последовательного порта */
|
||||
void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */
|
||||
|
||||
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop);
|
||||
void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed);
|
||||
@@ -107,17 +107,17 @@ void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed);
|
||||
// Transmit a character from the SCI'
|
||||
#define SCI_send(x,y) x->SciRegs->SCITXBUF=(unsigned char)(y)
|
||||
|
||||
// Ожидание завершениа передачи UART
|
||||
// Ожидание завершениа передачи UART
|
||||
// wait for TRDY =1 for empty state
|
||||
#define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY))
|
||||
|
||||
/** Переключение линии на прием */
|
||||
/** Переключение линии на прием */
|
||||
#define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;
|
||||
|
||||
/** Переключение линии на передачу */
|
||||
/** Переключение линии на передачу */
|
||||
#define RS_Line_to_send(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0;
|
||||
|
||||
/** Разрешение прерываний по получению символа и ошибкам от UART */
|
||||
/** Разрешение прерываний по получению символа и ошибкам от UART */
|
||||
#define enableUARTInt(x) x->SciRegs->SCICTL2.all=2
|
||||
#define enableUARTIntW(x) x->SciRegs->SCICTL2.all=1
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Коды CMD_* являются частью формата обмена с ПК. Новые команды
|
||||
* добавляются без перенумерации существующих значений.
|
||||
/* Коды CMD_* являются частью формата обмена с ПК. Новые команды
|
||||
* добавляются без перенумерации существующих значений.
|
||||
*/
|
||||
#ifndef _BIOS_DSP
|
||||
#define _BIOS_DSP
|
||||
@@ -36,67 +36,67 @@ enum {
|
||||
|
||||
CMD_VECTOR=61,
|
||||
CMD_IMPULSE,
|
||||
/* стандартные команды */
|
||||
/* стандартные команды */
|
||||
CMD_STD=65, CMD_STD_ANS
|
||||
};
|
||||
|
||||
enum {false=0, true};
|
||||
|
||||
|
||||
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
|
||||
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
|
||||
int get_command(RS_DATA *rs_arr);
|
||||
|
||||
/** Стандартный ответ, без параметров */
|
||||
/** Стандартный ответ, без параметров */
|
||||
void Answer(RS_DATA *rs_arr,int n);
|
||||
|
||||
/* начальные установки (не работает)*/
|
||||
/* начальные установки (не работает)*/
|
||||
void init(RS_DATA *rs_arr);
|
||||
|
||||
/**@name Комманды
|
||||
* Комманды, вызываемые через последовательный канал*/
|
||||
/**@name Комманды
|
||||
* Комманды, вызываемые через последовательный канал*/
|
||||
//@{
|
||||
|
||||
/** Инициировать загрузку блока.
|
||||
Настраивает прием блока данных */
|
||||
/** Инициировать загрузку блока.
|
||||
Настраивает прием блока данных */
|
||||
void initload(RS_DATA *rs_arr);
|
||||
|
||||
/** Загрузка блока.
|
||||
Вызываетса после загрузки блока через RS */
|
||||
/** Загрузка блока.
|
||||
Вызываетса после загрузки блока через RS */
|
||||
void load(RS_DATA *rs_arr);
|
||||
|
||||
/** Выполнить программу в формате Serial Boot.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес программы беретса из заголовка и
|
||||
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
|
||||
/** Выполнить программу в формате Serial Boot.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес программы беретса из заголовка и
|
||||
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
|
||||
@see load */
|
||||
void run (RS_DATA *rs_arr);
|
||||
|
||||
/** Прочитать ачейку памати */
|
||||
/** Прочитать ачейку памати */
|
||||
void peek(RS_DATA *rs_arr);
|
||||
|
||||
/** Записать в ачейку памати */
|
||||
/** Записать в ачейку памати */
|
||||
void poke(RS_DATA *rs_arr);
|
||||
|
||||
/** Передать блок памати */
|
||||
/** Передать блок памати */
|
||||
void upload(RS_DATA *rs_arr);
|
||||
|
||||
/** Прошить XILINX.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
|
||||
так же смотрит магическое слово в начале прошивки
|
||||
/** Прошить XILINX.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
|
||||
так же смотрит магическое слово в начале прошивки
|
||||
@see load */
|
||||
void xflash(RS_DATA *rs_arr);
|
||||
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
@see load */
|
||||
void tflash(RS_DATA *rs_arr);
|
||||
|
||||
|
||||
/* расширенные команды дла биоса */
|
||||
/* расширенные команды дла биоса */
|
||||
void extendbios(RS_DATA *rs_arr);
|
||||
|
||||
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
/* Заводские калибровки по версии BALSAM и типу платы. Здесь
|
||||
* определяются массивы, а не только extern; не дублировать подключение.
|
||||
/* Заводские калибровки по версии BALSAM и типу платы. Здесь
|
||||
* определяются массивы, а не только extern; не дублировать подключение.
|
||||
*/
|
||||
#if BALSAM == 166 //-------------------------------------------------------------
|
||||
int def_cal[][8] = {
|
||||
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
4936, 4877, 4972, 4857, 1960, 1920, 2610, 2570, // Борт 0
|
||||
4876, 5005, 4876, 4847, 1950, 1965, 2600, 2615, // Борт 1
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
4936, 4877, 4972, 4857, 1960, 1920, 2610, 2570, // Борт 0
|
||||
4876, 5005, 4876, 4847, 1950, 1965, 2600, 2615, // Борт 1
|
||||
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3820, 3790, 3505, 3380, 1718, 673, 854, 14, // Борт 0
|
||||
3835, 3785, 3522, 3332, 1697, 653, 860, 17, // Борт 1
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3820, 3790, 3505, 3380, 1718, 673, 854, 14, // Борт 0
|
||||
3835, 3785, 3522, 3332, 1697, 653, 860, 17, // Борт 1
|
||||
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
1281, 1272, 0, 0, 2049, 2050, 2749, 2750 };
|
||||
#endif //---------------------------------------------------------------------
|
||||
|
||||
#if BALSAM == 165 //-------------------------------------------------------------
|
||||
int def_cal[][8] = {
|
||||
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
5130, 4960, 4925, 5070, 1881, 1881, 2506, 2516, // Борт 0
|
||||
5020, 5040, 4950, 5030, 1871, 1879, 2507, 2514, // Борт 1
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
5130, 4960, 4925, 5070, 1881, 1881, 2506, 2516, // Борт 0
|
||||
5020, 5040, 4950, 5030, 1871, 1879, 2507, 2514, // Борт 1
|
||||
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3890, 3865, 5100, 4850, 1730, 675, 854, 14, // Борт 0
|
||||
3845, 3800, 3250, 3100, 1044, 0, 860, 17, // Борт 1
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3890, 3865, 5100, 4850, 1730, 675, 854, 14, // Борт 0
|
||||
3845, 3800, 3250, 3100, 1044, 0, 860, 17, // Борт 1
|
||||
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
1289, 1280, 0, 0, 2073, 2071, 2773, 2771 };
|
||||
#endif //---------------------------------------------------------------------
|
||||
|
||||
#if BALSAM == 164 //-------------------------------------------------------------
|
||||
int def_cal[][8] = {
|
||||
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
7573, 7573, 7573, 7573, 1979, 1888, 2592, 2513, // Борт 0
|
||||
7573, 7573, 7573, 7573, 1970, 1907, 2584, 2558, // Борт 1
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
7573, 7573, 7573, 7573, 1979, 1888, 2592, 2513, // Борт 0
|
||||
7573, 7573, 7573, 7573, 1970, 1907, 2584, 2558, // Борт 1
|
||||
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3920, 3905, 3300, 3220, 1015, 0, 854, 14, // Борт 0
|
||||
3835, 3785, 5100, 4600, 1750, 680, 860, 17, // Борт 1
|
||||
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
|
||||
3920, 3905, 3300, 3220, 1015, 0, 854, 14, // Борт 0
|
||||
3835, 3785, 5100, 4600, 1750, 680, 860, 17, // Борт 1
|
||||
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
1266, 1267, 0, 0, 2063, 2040, 2678, 2655 };
|
||||
#endif //---------------------------------------------------------------------
|
||||
|
||||
@@ -51,15 +51,15 @@
|
||||
#if PXXXXX == 1 //-------------------------------------------------------------
|
||||
int def_cal[][6] = {
|
||||
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 0
|
||||
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 1
|
||||
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
|
||||
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 0
|
||||
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 1
|
||||
|
||||
// УМП UA UC IA IC 20mA 4mA
|
||||
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 0
|
||||
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 1
|
||||
// УМП UA UC IA IC 20mA 4mA
|
||||
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 0
|
||||
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 1
|
||||
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
|
||||
1270, 1270, 0, 0, 1950, 1950, 2600, 2600 };
|
||||
#endif //---------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Собственный, общий и специальные адреса последовательного обмена.
|
||||
* main задаёт адреса через set_cntrl_addr до начала обмена.
|
||||
/* Собственный, общий и специальные адреса последовательного обмена.
|
||||
* main задаёт адреса через set_cntrl_addr до начала обмена.
|
||||
*/
|
||||
#ifndef _CNTRL_ADR
|
||||
#define _CNTRL_ADR
|
||||
@@ -8,22 +8,22 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** адрес контроллера дла посылки всем АИНам */
|
||||
/** адрес контроллера дла посылки всем АИНам */
|
||||
extern int ADDR_FOR_ALL;
|
||||
|
||||
/** адрес контроллера дла посылки ответа */
|
||||
/** адрес контроллера дла посылки ответа */
|
||||
extern const int ADDR_ANSWER;
|
||||
|
||||
/** адреса терминала дла посылки ответа */
|
||||
/** адреса терминала дла посылки ответа */
|
||||
extern const int ADDR_TERMINAL;
|
||||
|
||||
/* Адрес контроллера */
|
||||
/* Адрес контроллера */
|
||||
extern int CNTRL_ADDR;
|
||||
|
||||
/* Универсальный адрес контроллера */
|
||||
/* Универсальный адрес контроллера */
|
||||
extern const int CNTRL_ADDR_UNIVERSAL;
|
||||
|
||||
/** Установка адреса контроллера дла прошивки */
|
||||
/** Установка адреса контроллера дла прошивки */
|
||||
void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all);
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Интерфейсы CRC. Различать буфер кадра и массив слов EEPROM;
|
||||
* результат зависит от порядка обработки байтов.
|
||||
/* Интерфейсы CRC. Различать буфер кадра и массив слов EEPROM;
|
||||
* результат зависит от порядка обработки байтов.
|
||||
*/
|
||||
typedef unsigned short WORD;
|
||||
typedef unsigned char byte;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Коэффициенты и изменяемая история фильтра. Каждый независимый
|
||||
* канал должен иметь отдельный экземпляр FILTERBAT.
|
||||
/* Коэффициенты и изменяемая история фильтра. Каждый независимый
|
||||
* канал должен иметь отдельный экземпляр FILTERBAT.
|
||||
*/
|
||||
#ifndef _FILTER_BAT2
|
||||
#define _FILTER_BAT2
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Интерфейс канала индикации. Он не формирует START_DPTB
|
||||
* и не должен использоваться вместо функций управления нагрузкой.
|
||||
/* Интерфейс канала индикации. Он не формирует START_DPTB
|
||||
* и не должен использоваться вместо функций управления нагрузкой.
|
||||
*/
|
||||
void kanal_Send(int adr, long dat, int dot);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* ×àñòîòû è ñîñòîÿíèÿ èçìåðåíèé. READY â 166 — ñ÷¸ò÷èê äî íóëÿ.
|
||||
* READY_FREQ çàäà¸ò òàéìåð ÑÈÔÓ, DAC_FREQ — ðàñ÷¸ò ÖÀÏ.
|
||||
/* Частоты и состояния измерений. READY в 166 — счётчик до нуля.
|
||||
* READY_FREQ задаёт таймер СИФУ, DAC_FREQ — расчёт ЦАП.
|
||||
*/
|
||||
#ifndef _MEASURE
|
||||
#define _MEASURE
|
||||
@@ -65,14 +65,14 @@ typedef union
|
||||
#define NOER 0xE000//C
|
||||
#define EROR 0x01FF
|
||||
|
||||
#define READY_FREQ (500.0 * 2)// Ãö
|
||||
#define BLINK_FREQ 2 // Ãö
|
||||
#define READY_FREQ (500.0 * 2)// Гц
|
||||
#define BLINK_FREQ 2 // Гц
|
||||
#define BLINK_TIME (READY_FREQ / BLINK_FREQ)
|
||||
|
||||
#define CANPOWSE 20
|
||||
|
||||
#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Ãö (777*5)
|
||||
#define DAC_FREQ 200//5 // Ãö
|
||||
#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Гц (777*5)
|
||||
#define DAC_FREQ 200//5 // Гц
|
||||
|
||||
#define LOAD_TIME 30//15 // sec
|
||||
|
||||
@@ -87,23 +87,23 @@ extern unsigned int Caliber_time;
|
||||
|
||||
#define ZERO 27
|
||||
|
||||
#define Cooling 5 // (°Ñ) Ãèñòåðåçèñ ïî ñíàòèþ ïåðåãðåâà
|
||||
#define Cooling 5 // (°С) Гистерезис по снатию перегрева
|
||||
|
||||
#define COSPi6 0.86602540378443864676372317075294
|
||||
|
||||
#define RADIX2 1.4142135623730950488016887242097
|
||||
|
||||
#define POWER_380 0 // ïèòàíèå 380Â
|
||||
#define POWER_38O 1 // ïèòàíèå 380Â
|
||||
#define POWER_380 0 // питание 380В
|
||||
#define POWER_38O 1 // питание 380В
|
||||
|
||||
#define CURRENT 2 // òîê
|
||||
#define VOLTAGE 3 // íàïðàæåíèå
|
||||
#define CURRENT 2 // ток
|
||||
#define VOLTAGE 3 // напражение
|
||||
|
||||
#define POWER_31 4 // ïèòàíèå 31Â
|
||||
#define POWER_27 5 // ïèòàíèå 24Â
|
||||
#define POWER_24 6 // ïèòàíèå 24Â
|
||||
#define POWER_15 7 // ïèòàíèå 15Â
|
||||
#define TERMO_AD 8 // òåðìîäàò÷èê ìåëêîñõåìà
|
||||
#define POWER_31 4 // питание 31В
|
||||
#define POWER_27 5 // питание 24В
|
||||
#define POWER_24 6 // питание 24В
|
||||
#define POWER_15 7 // питание 15В
|
||||
#define TERMO_AD 8 // термодатчик мелкосхема
|
||||
|
||||
extern int TPL_CANS,tpl_cans;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Технологические регистры и Modbus. ANSWER_LEN ограничивает
|
||||
* массив modbus; адресом логгера 0x1000 индексировать его нельзя.
|
||||
/* Технологические регистры и Modbus. ANSWER_LEN ограничивает
|
||||
* массив modbus; адресом логгера 0x1000 индексировать его нельзя.
|
||||
*/
|
||||
#ifndef MESSAGE_H
|
||||
#define MESSAGE_H
|
||||
@@ -14,8 +14,8 @@ typedef unsigned char CHAR;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char Address; // Адрес контроллера
|
||||
unsigned char Number; // Номер команды
|
||||
unsigned char Address; // Адрес контроллера
|
||||
unsigned char Number; // Номер команды
|
||||
|
||||
BAITE byte0;
|
||||
BAITE byte1;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#define REVERSE 1
|
||||
|
||||
/* Выбирает исполнение 166: соответствующие калибровки и обратный порядок индикаторов задаются условными блоками ниже. */
|
||||
#define BALSAM 166
|
||||
#define BALSAM 165
|
||||
|
||||
#if BALSAM == 166
|
||||
#define OBOROT REVERSE
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* Физические GPIO с учётом режима и полярности. set означает
|
||||
* активировать функцию, не всегда выставить 1. START/STOP нагрузки
|
||||
* активны единицей, RES_OUT_2 нулём. Дискретами владеет автомат СИФУ.
|
||||
/* Физические GPIO с учётом режима и полярности. set означает
|
||||
* активировать функцию, не всегда выставить 1. START/STOP нагрузки
|
||||
* активны единицей, RES_OUT_2 нулём. Дискретами владеет автомат СИФУ.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Состояния пульта dsk_EPLT. Обработчик таймера нагрузки
|
||||
* определён отдельно в measure.c.
|
||||
/* Состояния пульта dsk_EPLT. Обработчик таймера нагрузки
|
||||
* определён отдельно в measure.c.
|
||||
*/
|
||||
//void what_is(void);
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/* Автомат SPI EEPROM продвигает таймер 2. Синхронное ожидание
|
||||
* требует разрешённых IRQ. PAGE_LEN/WORD_LEN задают адресацию страниц.
|
||||
/* Автомат SPI EEPROM продвигает таймер 2. Синхронное ожидание
|
||||
* требует разрешённых IRQ. PAGE_LEN/WORD_LEN задают адресацию страниц.
|
||||
*/
|
||||
#ifndef __SPISE2P_H__
|
||||
|
||||
#define __SPISE2P_H__
|
||||
|
||||
// Ёмкость памати в байтах
|
||||
// Ёмкость памати в байтах
|
||||
#define SEEPROM_LEN 0x10000
|
||||
|
||||
#define NULL 0
|
||||
@@ -97,25 +97,25 @@ void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *data);
|
||||
#define WORD_LEN 1
|
||||
#endif
|
||||
|
||||
/* Установка драйвера сериальной EEPROM. **
|
||||
** Инициализациа SPI и проч. Также настройка таймера. **
|
||||
** Драйвер работает на прерываниах от таймера 2! */
|
||||
/* Установка драйвера сериальной EEPROM. **
|
||||
** Инициализациа SPI и проч. Также настройка таймера. **
|
||||
** Драйвер работает на прерываниах от таймера 2! */
|
||||
void InitSeeprom(void);
|
||||
|
||||
/* Запись блока в SEEPROM. Параметры таковы: **
|
||||
** adres - адрес в епромке, куда писать. **
|
||||
** adres = 0..0x8000, если длина слова 8 бит **
|
||||
** adres = 0..0x4000, если длина слова 16 бит **
|
||||
** buf - указатель на памать, откуда писать. **
|
||||
** size - длина блока в байтах. По-любому в байтах! */
|
||||
/* Запись блока в SEEPROM. Параметры таковы: **
|
||||
** adres - адрес в епромке, куда писать. **
|
||||
** adres = 0..0x8000, если длина слова 8 бит **
|
||||
** adres = 0..0x4000, если длина слова 16 бит **
|
||||
** buf - указатель на памать, откуда писать. **
|
||||
** size - длина блока в байтах. По-любому в байтах! */
|
||||
void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int size);
|
||||
|
||||
/* Чтение блока из SEEPROM. Параметры таковы: **
|
||||
** adres - адрес в епромке, откуда читать. **
|
||||
** adres = 0..0x8000, если длина слова 8 бит **
|
||||
** adres = 0..0x4000, если длина слова 16 бит **
|
||||
** buf - указатель на памать, куда читать. **
|
||||
** size - длина блока в байтах. По-любому в байтах! */
|
||||
/* Чтение блока из SEEPROM. Параметры таковы: **
|
||||
** adres - адрес в епромке, откуда читать. **
|
||||
** adres = 0..0x8000, если длина слова 8 бит **
|
||||
** adres = 0..0x4000, если длина слова 16 бит **
|
||||
** buf - указатель на памать, куда читать. **
|
||||
** size - длина блока в байтах. По-любому в байтах! */
|
||||
void Seeprom_read(unsigned int adres, unsigned int buf[], unsigned int size);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Инициализация памяти и задержки. pause_us не использовать
|
||||
* для длительности дискретов; их отсчитывает аппаратный таймер.
|
||||
/* Инициализация памяти и задержки. pause_us не использовать
|
||||
* для длительности дискретов; их отсчитывает аппаратный таймер.
|
||||
*/
|
||||
#ifndef TOOLS_H
|
||||
#define TOOLS_H
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/* Подключается только из DAC.c; в host-тесте — с подменой GPIO/IRQ. */
|
||||
/* Подключается только из DAC.c; в host-тесте — с подменой GPIO/IRQ. */
|
||||
#ifndef UMP_CONTROL_IMPL_H
|
||||
#define UMP_CONTROL_IMPL_H
|
||||
/* Аппаратная обёртка автомата. Храним её в существующем DAC.c, чтобы
|
||||
* старый проект CCS и новый CCS12 собирали одинаковый набор исходников.
|
||||
* Все входы ниже сохраняют прежнюю маску IRQ; нельзя просто делать EINT
|
||||
* при выходе, поскольку вызов возможен из уже защищённого обработчика. */
|
||||
/* Аппаратная обёртка автомата. Храним её в существующем DAC.c, чтобы
|
||||
* старый проект CCS и новый CCS12 собирали одинаковый набор исходников.
|
||||
* Все входы ниже сохраняют прежнюю маску IRQ; нельзя просто делать EINT
|
||||
* при выходе, поскольку вызов возможен из уже защищённого обработчика. */
|
||||
static volatile UMP_PULSE_STATE ump_pulse;
|
||||
static volatile unsigned int ump_pulse_enabled;
|
||||
|
||||
static void UMP_apply_outputs(unsigned int previous_output, unsigned int previous_relay)
|
||||
{
|
||||
if (previous_output != ump_pulse.output) {
|
||||
/* Сначала снимаем старый сигнал, затем выставляем новый.
|
||||
* Промежуточное состояние — оба выключены, а не оба включены. */
|
||||
/* Сначала снимаем старый сигнал, затем выставляем новый.
|
||||
* Промежуточное состояние — оба выключены, а не оба включены. */
|
||||
clear_START_DPTB();
|
||||
clear_STOP_DPTB();
|
||||
if (ump_pulse.output == UMP_PULSE_START) set_START_DPTB();
|
||||
@@ -22,8 +22,8 @@ static void UMP_apply_outputs(unsigned int previous_output, unsigned int previou
|
||||
if (ump_pulse.relay) set_RES_OUT_2();
|
||||
else clear_RES_OUT_2();
|
||||
}
|
||||
/* Старое имя оставлено для протокола логгера. Это теперь отражение
|
||||
* таймера автомата, а не переменная, которую одновременно правит main. */
|
||||
/* Старое имя оставлено для протокола логгера. Это теперь отражение
|
||||
* таймера автомата, а не переменная, которую одновременно правит main. */
|
||||
IMPowse = ump_pulse.remaining;
|
||||
}
|
||||
|
||||
@@ -34,8 +34,8 @@ void UMP_pulse_init(void)
|
||||
ump_pulse_init(&ump_pulse, Commands);
|
||||
clear_START_DPTB(); clear_STOP_DPTB(); clear_RES_OUT_2();
|
||||
IMPowse = 0;
|
||||
/* Разрешаем обработку только после загрузки параметров и настройки
|
||||
* ЦАП. Команды до этой точки не исполняются задним числом. */
|
||||
/* Разрешаем обработку только после загрузки параметров и настройки
|
||||
* ЦАП. Команды до этой точки не исполняются задним числом. */
|
||||
ump_pulse_enabled = 1;
|
||||
}
|
||||
__restore_interrupts(saved);
|
||||
@@ -47,9 +47,9 @@ void UMP_commands_write(unsigned int commands)
|
||||
unsigned int output = ump_pulse.output, relay = ump_pulse.relay;
|
||||
Commands = commands;
|
||||
if (Desk == dsk_LOAD && ump_pulse_enabled) {
|
||||
/* Выполняем фронт в момент принятия слова. Нет очереди, которую
|
||||
* main должен опросить после длительного обращения к EEPROM.
|
||||
* Здесь только несколько операций с памятью/GPIO, без ожиданий. */
|
||||
/* Выполняем фронт в момент принятия слова. Нет очереди, которую
|
||||
* main должен опросить после длительного обращения к EEPROM.
|
||||
* Здесь только несколько операций с памятью/GPIO, без ожиданий. */
|
||||
ump_pulse_accept(&ump_pulse, commands, (unsigned int)READY_FREQ);
|
||||
UMP_apply_outputs(output, relay);
|
||||
}
|
||||
@@ -70,11 +70,11 @@ void UMP_pulse_tick(void)
|
||||
void UMP_reset_parameter_commands(void)
|
||||
{
|
||||
unsigned int saved = __disable_interrupts();
|
||||
/* EEPROM содержит параметры, но не является источником команд пуска.
|
||||
* Сохраняем последние принятые START/STOP и историю фронтов автомата.
|
||||
* Нельзя обнулить их при Load/Default: таймер ЦАП читает тот же уровень,
|
||||
* а следующий повтор пакета с единицей не должен стать ложным фронтом.
|
||||
* Другие режимы платы сохраняют прежнее поведение полного сброса. */
|
||||
/* EEPROM содержит параметры, но не является источником команд пуска.
|
||||
* Сохраняем последние принятые START/STOP и историю фронтов автомата.
|
||||
* Нельзя обнулить их при Load/Default: таймер ЦАП читает тот же уровень,
|
||||
* а следующий повтор пакета с единицей не должен стать ложным фронтом.
|
||||
* Другие режимы платы сохраняют прежнее поведение полного сброса. */
|
||||
if (Desk == dsk_LOAD) Commands &= UMP_START_MASK | UMP_STOP_MASK;
|
||||
else Commands = 0;
|
||||
__restore_interrupts(saved);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* Управление импульсами СИФУ. Чистый автомат без доступа к GPIO.
|
||||
* Один и тот же код используется прошивкой и host-тестом.
|
||||
* ВАЖНО: вызывающая сторона сериализует init/accept/tick запретом IRQ.
|
||||
* volatile обеспечивает обращения к общему состоянию, но не заменяет
|
||||
* критическую секцию: обновление нескольких полей не является атомарным.
|
||||
/* Управление импульсами СИФУ. Чистый автомат без доступа к GPIO.
|
||||
* Один и тот же код используется прошивкой и host-тестом.
|
||||
* ВАЖНО: вызывающая сторона сериализует init/accept/tick запретом IRQ.
|
||||
* volatile обеспечивает обращения к общему состоянию, но не заменяет
|
||||
* критическую секцию: обновление нескольких полей не является атомарным.
|
||||
*/
|
||||
#ifndef UMP_PULSE_H
|
||||
#define UMP_PULSE_H
|
||||
@@ -21,10 +21,10 @@ typedef struct {
|
||||
|
||||
static void ump_pulse_init(volatile UMP_PULSE_STATE *s, unsigned int commands)
|
||||
{
|
||||
/* Уже активная команда при окончании загрузки не является новым пуском.
|
||||
* Снимаем физические выходы отдельно в аппаратной обёртке.
|
||||
* Если начальное слово нулевое, первая свежая единица будет принята:
|
||||
* больше не нужен случайный проход main, успевший прочитать ноль. */
|
||||
/* Уже активная команда при окончании загрузки не является новым пуском.
|
||||
* Снимаем физические выходы отдельно в аппаратной обёртке.
|
||||
* Если начальное слово нулевое, первая свежая единица будет принята:
|
||||
* больше не нужен случайный проход main, успевший прочитать ноль. */
|
||||
s->previous = commands;
|
||||
s->remaining = 0;
|
||||
s->output = UMP_PULSE_NONE;
|
||||
@@ -35,23 +35,23 @@ static void ump_pulse_accept(volatile UMP_PULSE_STATE *s,
|
||||
unsigned int commands, unsigned int ticks)
|
||||
{
|
||||
unsigned int rising = commands & ~s->previous;
|
||||
/* История относится к каждому принятому слову CAN/RS, а не к редким
|
||||
* снимкам main. Поэтому даже 1->0->1 между проходами main замечается.
|
||||
* Повторные пакеты с удерживаемой единицей не продлевают импульс. */
|
||||
/* История относится к каждому принятому слову CAN/RS, а не к редким
|
||||
* снимкам main. Поэтому даже 1->0->1 между проходами main замечается.
|
||||
* Повторные пакеты с удерживаемой единицей не продлевают импульс. */
|
||||
s->previous = commands;
|
||||
if (commands & UMP_STOP_MASK) {
|
||||
/* STOP имеет приоритет даже при одновременном фронте START.
|
||||
* Его удержание запрещает новый START. Запрещённый пуск не ставим
|
||||
* в очередь: снятие STOP не должно неожиданно запускать СИФУ. */
|
||||
/* STOP имеет приоритет даже при одновременном фронте START.
|
||||
* Его удержание запрещает новый START. Запрещённый пуск не ставим
|
||||
* в очередь: снятие STOP не должно неожиданно запускать СИФУ. */
|
||||
if (rising & UMP_STOP_MASK) {
|
||||
s->output = UMP_PULSE_STOP;
|
||||
s->remaining = ticks;
|
||||
s->relay = 0;
|
||||
}
|
||||
} else if (rising & UMP_START_MASK) {
|
||||
/* Новый START после снятия команды STOP переключает выходы.
|
||||
* Новый фронт во время START продлевает существующий импульс,
|
||||
* как раньше; отдельный электрический фронт здесь не обещается. */
|
||||
/* Новый START после снятия команды STOP переключает выходы.
|
||||
* Новый фронт во время START продлевает существующий импульс,
|
||||
* как раньше; отдельный электрический фронт здесь не обещается. */
|
||||
s->output = UMP_PULSE_START;
|
||||
s->remaining = ticks;
|
||||
s->relay = 1;
|
||||
@@ -60,9 +60,9 @@ static void ump_pulse_accept(volatile UMP_PULSE_STATE *s,
|
||||
|
||||
static void ump_pulse_tick(volatile UMP_PULSE_STATE *s)
|
||||
{
|
||||
/* Единственный владелец отсчёта — таймер 1 кГц. main не участвует
|
||||
* в завершении импульса, поэтому EEPROM не растягивает его.
|
||||
* RES_OUT_2 сохраняет последнее состояние после конца импульса. */
|
||||
/* Единственный владелец отсчёта — таймер 1 кГц. main не участвует
|
||||
* в завершении импульса, поэтому EEPROM не растягивает его.
|
||||
* RES_OUT_2 сохраняет последнее состояние после конца импульса. */
|
||||
if (s->remaining && --s->remaining == 0)
|
||||
s->output = UMP_PULSE_NONE;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* Низкоуровневый UART двух портов. RX ISR собирает RS_Header,
|
||||
* TX ISR продолжает передачу. RS_DataReady передаёт готовый кадр
|
||||
* в main для проверки CRC; приём байтов ещё не означает исполнения.
|
||||
* RS_Send содержит ожидания UART и не относится к быстрому пути СИФУ.
|
||||
* Размеры буферов нужно понимать с учётом 16-битной ABI C2000.
|
||||
/* Низкоуровневый UART двух портов. RX ISR собирает RS_Header,
|
||||
* TX ISR продолжает передачу. RS_DataReady передаёт готовый кадр
|
||||
* в main для проверки CRC; приём байтов ещё не означает исполнения.
|
||||
* RS_Send содержит ожидания UART и не относится к быстрому пути СИФУ.
|
||||
* Размеры буферов нужно понимать с учётом 16-битной ABI C2000.
|
||||
*/
|
||||
//#include "big_dsp_module.h"
|
||||
|
||||
@@ -28,7 +28,7 @@ static char size_cmd15=1;
|
||||
void RS_RX_Handler(RS_DATA *rs_arr);
|
||||
void RS_TX_Handler(RS_DATA *rs_arr);
|
||||
|
||||
/** Обработчик прерываний UART - принато */
|
||||
/** Обработчик прерываний UART - принато */
|
||||
interrupt void RSA_RX_Handler(void)
|
||||
{
|
||||
// Set interrupt priority:
|
||||
@@ -101,7 +101,7 @@ interrupt void RSB_TX_Handler(void)
|
||||
PieCtrlRegs.PIEIER9.all = TempPIEIER;
|
||||
}
|
||||
|
||||
/** Обработчик прерываний UART - принато */
|
||||
/** Обработчик прерываний UART - принато */
|
||||
void RS_RX_Handler(RS_DATA *rs_arr)
|
||||
{
|
||||
char Rc;
|
||||
@@ -109,16 +109,16 @@ void RS_RX_Handler(RS_DATA *rs_arr)
|
||||
|
||||
// led1_on();
|
||||
|
||||
for(;;) // 'goto' это не оператор азыка С
|
||||
for(;;) // 'goto' это не оператор азыка С
|
||||
{
|
||||
if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag
|
||||
{
|
||||
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
|
||||
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
|
||||
return; // кстати это единственный выход из прерываниа
|
||||
return; // кстати это единственный выход из прерываниа
|
||||
}
|
||||
|
||||
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // Читаем символ в любом случае
|
||||
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // Читаем символ в любом случае
|
||||
|
||||
if(rs_arr->SciRegs->SCIRXST.bit.RXERROR) // Receiver error flag
|
||||
{
|
||||
@@ -128,110 +128,110 @@ void RS_RX_Handler(RS_DATA *rs_arr)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(rs_arr->RS_DataReady) continue; // Не забрали данные
|
||||
if(rs_arr->RS_DataReady) continue; // Не забрали данные
|
||||
|
||||
if (rs_arr->RS_Flag9bit==1) // дла RS485????????
|
||||
if (rs_arr->RS_Flag9bit==1) // дла RS485????????
|
||||
{
|
||||
// Инициализируем переменные и флаги
|
||||
rs_arr->RS_FlagBegin = true; // Ждем заголовок
|
||||
// Инициализируем переменные и флаги
|
||||
rs_arr->RS_FlagBegin = true; // Ждем заголовок
|
||||
rs_arr->RS_RecvLen = 0;
|
||||
rs_arr->RS_FlagSkiping = false;
|
||||
rs_arr->RS_HeaderCnt = 0;
|
||||
rs_arr->RS_Cmd = 0;
|
||||
}
|
||||
|
||||
if(rs_arr->RS_FlagSkiping) continue; // Не нам
|
||||
if(rs_arr->RS_FlagSkiping) continue; // Не нам
|
||||
|
||||
if (rs_arr->RS_FlagBegin) // Заголовок
|
||||
if (rs_arr->RS_FlagBegin) // Заголовок
|
||||
{
|
||||
if (rs_arr->RS_HeaderCnt==0) // Адрес контроллера или стандартнаа команда
|
||||
if (rs_arr->RS_HeaderCnt==0) // Адрес контроллера или стандартнаа команда
|
||||
{
|
||||
if( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
|
||||
|| ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING))
|
||||
|
||||
{
|
||||
rs_arr->addr_recive=Rc; // запомнили адрес по которому нас запросили
|
||||
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Первый байт
|
||||
RS_SetBitMode(rs_arr,8); // перестроились в 8-бит режим
|
||||
rs_arr->addr_recive=Rc; // запомнили адрес по которому нас запросили
|
||||
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Первый байт
|
||||
RS_SetBitMode(rs_arr,8); // перестроились в 8-бит режим
|
||||
}
|
||||
else
|
||||
{
|
||||
rs_arr->RS_FlagSkiping = true; // Не нашему контроллеру
|
||||
rs_arr->RS_FlagBegin = false; // остались в 9-бит режиме
|
||||
rs_arr->RS_FlagSkiping = true; // Не нашему контроллеру
|
||||
rs_arr->RS_FlagBegin = false; // остались в 9-бит режиме
|
||||
// led1_off();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Второй байт и т.д.
|
||||
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Второй байт и т.д.
|
||||
|
||||
if (rs_arr->RS_HeaderCnt == 7 && rs_arr->RS_Cmd==CMD_MODBUS_16 && !rs_arr->flag_LEADING)
|
||||
{
|
||||
RS_Len[CMD_MODBUS_16] = (10+Rc);
|
||||
}
|
||||
|
||||
// если второй байт - это команда
|
||||
// если второй байт - это команда
|
||||
if (rs_arr->RS_HeaderCnt == 2)
|
||||
{
|
||||
rs_arr->RS_Cmd = Rc;
|
||||
// Проверка длины посылки
|
||||
// CMD_LOAD - младшаа на данный момент
|
||||
// CMD_STD_ANS - старшаа на данный момент
|
||||
// Проверка длины посылки
|
||||
// CMD_LOAD - младшаа на данный момент
|
||||
// CMD_STD_ANS - старшаа на данный момент
|
||||
if ((rs_arr->RS_Cmd < CMD_MODBUS_3) || (rs_arr->RS_Cmd > CMD_STD_ANS) || (RS_Len[rs_arr->RS_Cmd]<3)
|
||||
|| ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD))
|
||||
)
|
||||
{
|
||||
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
|
||||
rs_arr->RS_HeaderCnt = 0; // Потому что команда не та
|
||||
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
|
||||
rs_arr->RS_HeaderCnt = 0; // Потому что команда не та
|
||||
rs_arr->RS_FlagBegin = true;
|
||||
rs_arr->RS_FlagSkiping = false;
|
||||
rs_arr->RS_Cmd=0;
|
||||
// led1_off();
|
||||
continue;
|
||||
}
|
||||
if (rs_arr->RS_Cmd == CMD_LOAD) // Дла этой команды заголовок очень короткий
|
||||
rs_arr->RS_FlagBegin = false;// дальше идут данные
|
||||
if (rs_arr->RS_Cmd == CMD_LOAD) // Дла этой команды заголовок очень короткий
|
||||
rs_arr->RS_FlagBegin = false;// дальше идут данные
|
||||
}
|
||||
|
||||
if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) ||
|
||||
(rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header)))
|
||||
{ // Получили заголовок
|
||||
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
|
||||
{ // Получили заголовок
|
||||
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
|
||||
rs_arr->RS_FlagBegin = false;
|
||||
rs_arr->RS_FlagSkiping = true;
|
||||
rs_arr->RS_DataReady = true;
|
||||
rs_arr->RS_Cmd=0;
|
||||
// led1_off();
|
||||
} } }
|
||||
else // Поток данных
|
||||
else // Поток данных
|
||||
{
|
||||
if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin || rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End)
|
||||
{
|
||||
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
|
||||
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
|
||||
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
|
||||
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
|
||||
}
|
||||
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Мы здесь оказались по какой-то чудовищной ошибке
|
||||
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Мы здесь оказались по какой-то чудовищной ошибке
|
||||
|
||||
if(rs_arr->RS_DataReady) // Если данные в основном цикле не забраны,
|
||||
{ // то пропускаем следующую посылку
|
||||
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
|
||||
if(rs_arr->RS_DataReady) // Если данные в основном цикле не забраны,
|
||||
{ // то пропускаем следующую посылку
|
||||
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
|
||||
// led1_off();
|
||||
continue;
|
||||
}
|
||||
RS_BytePtr = rs_arr->RS_RecvLen++ % 2;
|
||||
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Получили слово
|
||||
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Получили слово
|
||||
else *rs_arr->pRS_RecvPtr = Rc<<8;
|
||||
|
||||
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // Конец посылки
|
||||
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // Конец посылки
|
||||
{
|
||||
rs_arr->RS_PrevCmd = rs_arr->RS_Header[1] = CMD_LOAD;
|
||||
RS_SetBitMode(rs_arr,9); // Получили все данные перестроились в 9-бит дла RS485?
|
||||
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
|
||||
rs_arr->RS_DataReady = true; // Флаг в основной цикл - данные получены
|
||||
RS_SetBitMode(rs_arr,9); // Получили все данные перестроились в 9-бит дла RS485?
|
||||
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
|
||||
rs_arr->RS_DataReady = true; // Флаг в основной цикл - данные получены
|
||||
// led1_off();
|
||||
} } } }
|
||||
|
||||
/** Обработчик прерываний UART - послано */
|
||||
/** Обработчик прерываний UART - послано */
|
||||
void RS_TX_Handler(RS_DATA *rs_arr)
|
||||
{
|
||||
char RS_BytePtr;
|
||||
@@ -241,19 +241,19 @@ void RS_TX_Handler(RS_DATA *rs_arr)
|
||||
{
|
||||
if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
||||
{
|
||||
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */
|
||||
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */
|
||||
}
|
||||
SCI_send(rs_arr,*(rs_arr->pRS_SendPtr++));
|
||||
|
||||
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
||||
{
|
||||
RS_Wait4OK(rs_arr);
|
||||
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
|
||||
RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
|
||||
RS_Line_to_receive(rs_arr); /* режим приема RS485 */
|
||||
RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
|
||||
RS_Line_to_receive(rs_arr); /* режим приема RS485 */
|
||||
|
||||
rs_arr->flag_TIMEOUT_to_Send=false; /* сбросили флаг ожиданиа таймаута */
|
||||
rs_arr->flag_TIMEOUT_to_Send=false; /* сбросили флаг ожиданиа таймаута */
|
||||
}
|
||||
}
|
||||
else /* BM_PACKED */
|
||||
@@ -262,7 +262,7 @@ void RS_TX_Handler(RS_DATA *rs_arr)
|
||||
RS_BytePtr = (rs_arr->RS_SendLen++) % 2;
|
||||
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
||||
{
|
||||
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */
|
||||
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */
|
||||
}
|
||||
if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) ));
|
||||
else SCI_send(rs_arr, HIBYTE( *rs_arr->pRS_SendPtr ));
|
||||
@@ -270,9 +270,9 @@ void RS_TX_Handler(RS_DATA *rs_arr)
|
||||
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
|
||||
{
|
||||
RS_Wait4OK(rs_arr);
|
||||
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
// RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
|
||||
// RS_Line_to_receive(); /* режим приема RS485 */
|
||||
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
// RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
|
||||
// RS_Line_to_receive(); /* режим приема RS485 */
|
||||
|
||||
}
|
||||
}
|
||||
@@ -281,7 +281,7 @@ void RS_TX_Handler(RS_DATA *rs_arr)
|
||||
// rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag
|
||||
}
|
||||
|
||||
/** Инициализациа массива длин команд */
|
||||
/** Инициализациа массива длин команд */
|
||||
void setup_arr_cmd_length()
|
||||
{
|
||||
int i;
|
||||
@@ -307,89 +307,89 @@ void setup_arr_cmd_length()
|
||||
RS_Len[CMD_EXTEND] = 18;
|
||||
}
|
||||
|
||||
/** Настройка режима приема/передачи */
|
||||
/** Настройка режима приема/передачи */
|
||||
void RS_SetBitMode(RS_DATA *rs_arr,int n)
|
||||
{
|
||||
if(n == 8)
|
||||
{
|
||||
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */
|
||||
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */
|
||||
rs_arr->RS_Flag9bit=0;
|
||||
}
|
||||
if(n == 9)
|
||||
{
|
||||
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */
|
||||
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */
|
||||
rs_arr->RS_Flag9bit=1;
|
||||
} }
|
||||
|
||||
/** Посылка блока байтов.
|
||||
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество байт
|
||||
/** Посылка блока байтов.
|
||||
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
|
||||
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
|
||||
@param buf адрес массива
|
||||
@param len количество байт
|
||||
@see RS_BSend, RS_TRANSMIT_INTR */
|
||||
/* Передачу продолжает TX ISR. Здесь есть старые программные паузы
|
||||
* и ожидания UART: не вызывать из CAN ISR или секции автомата СИФУ.
|
||||
/* Передачу продолжает TX ISR. Здесь есть старые программные паузы
|
||||
* и ожидания UART: не вызывать из CAN ISR или секции автомата СИФУ.
|
||||
*/
|
||||
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i=0; i <= 30000; i++){} /* Пауза дла PC */
|
||||
for (i=0; i <= 30000; i++){} /* Пауза дла PC */
|
||||
|
||||
RS_Line_to_send(rs_arr); /* режим передачи RS485 */
|
||||
RS_Line_to_send(rs_arr); /* режим передачи RS485 */
|
||||
|
||||
for (i=0; i <= 10000; i++){} /* Пауза дла PC */
|
||||
for (i=0; i <= 10000; i++){} /* Пауза дла PC */
|
||||
|
||||
rs_arr->RS_SLength = len; /* Настраиваем переменные */
|
||||
rs_arr->RS_SLength = len; /* Настраиваем переменные */
|
||||
rs_arr->pRS_SendPtr = pBuf + 1;
|
||||
|
||||
rs_arr->RS_SendBlockMode = BM_CHAR32;
|
||||
|
||||
RS_Wait4OK(rs_arr); /* Дожидаемса ухода */
|
||||
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */
|
||||
RS_Wait4OK(rs_arr); /* Дожидаемса ухода */
|
||||
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */
|
||||
|
||||
rs_arr->RS_SendLen = 1; /* Два байта уже передали */
|
||||
rs_arr->RS_SendLen = 1; /* Два байта уже передали */
|
||||
if(len > 1)
|
||||
{
|
||||
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */
|
||||
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
|
||||
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */
|
||||
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
|
||||
}
|
||||
else
|
||||
{
|
||||
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
|
||||
RS_Wait4OK(rs_arr); /* Дожидаемса ухода без прерываниа */
|
||||
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
RS_SetBitMode(rs_arr,9); /* Обратно в 9-бит режим */
|
||||
RS_Line_to_receive(rs_arr); /* режим приема RS485 */
|
||||
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
|
||||
RS_Wait4OK(rs_arr); /* Дожидаемса ухода без прерываниа */
|
||||
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
|
||||
RS_SetBitMode(rs_arr,9); /* Обратно в 9-бит режим */
|
||||
RS_Line_to_receive(rs_arr); /* режим приема RS485 */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Посылка блока упакованных байтов
|
||||
// Посылка блока упакованных байтов
|
||||
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
|
||||
{
|
||||
|
||||
RS_Line_to_send(rs_arr); // режим передачи RS485
|
||||
RS_Line_to_send(rs_arr); // режим передачи RS485
|
||||
|
||||
rs_arr->RS_SLength = len; // Настраиваем переменные
|
||||
rs_arr->RS_SLength = len; // Настраиваем переменные
|
||||
rs_arr->pRS_SendPtr = pBuf;
|
||||
rs_arr->RS_SendBlockMode = BM_PACKED;
|
||||
|
||||
RS_Wait4OK(rs_arr); // Ожидаем очистки и ухода последнего байта
|
||||
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */
|
||||
RS_Wait4OK(rs_arr); // Ожидаем очистки и ухода последнего байта
|
||||
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */
|
||||
|
||||
rs_arr->RS_SendLen = 1; // Один байт уже передали
|
||||
rs_arr->RS_SendLen = 1; // Один байт уже передали
|
||||
|
||||
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */
|
||||
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */
|
||||
|
||||
SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт
|
||||
SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Устанавливает скорость обмена.
|
||||
@param speed скорость RS в бод */
|
||||
/** Устанавливает скорость обмена.
|
||||
@param speed скорость RS в бод */
|
||||
/** Устанавливает скорость обмена.
|
||||
@param speed скорость RS в бод */
|
||||
/** Устанавливает скорость обмена.
|
||||
@param speed скорость RS в бод */
|
||||
void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
|
||||
{
|
||||
long SciBaud;
|
||||
@@ -403,7 +403,7 @@ void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
|
||||
}
|
||||
|
||||
|
||||
/** Инициализациа последовательного порта */
|
||||
/** Инициализациа последовательного порта */
|
||||
void create_uart_vars(char size_cmd15_set)
|
||||
{
|
||||
size_cmd15=size_cmd15_set;
|
||||
@@ -413,7 +413,7 @@ void create_uart_vars(char size_cmd15_set)
|
||||
|
||||
|
||||
|
||||
/** Инициализациа последовательного порта */
|
||||
/** Инициализациа последовательного порта */
|
||||
|
||||
void setup_uart(char commnumber, unsigned long speed_baud)
|
||||
{
|
||||
@@ -478,14 +478,14 @@ void setup_uart(char commnumber, unsigned long speed_baud)
|
||||
SciRegs->SCICTL1.bit.RXENA=1;
|
||||
|
||||
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
|
||||
SciRegs->SCIFFRX.bit.RXFFIL=1; // Длина наименьшей команды
|
||||
SciRegs->SCIFFRX.bit.RXFFIL=1; // Длина наименьшей команды
|
||||
|
||||
setup_arr_cmd_length();
|
||||
RS_SetLineSpeed(rs_arr,speed_baud); // скорость линии
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
enableUARTInt(rs_arr); // разрешение прерываний UART
|
||||
RS_SetLineSpeed(rs_arr,speed_baud); // скорость линии
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
enableUARTInt(rs_arr); // разрешение прерываний UART
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
rs_arr->RS_PrevCmd = 0; // не было никаких команд
|
||||
rs_arr->RS_PrevCmd = 0; // не было никаких команд
|
||||
rs_arr->flag_TIMEOUT_to_Send = 0;
|
||||
rs_arr->flag_LEADING = 0;
|
||||
|
||||
@@ -493,10 +493,10 @@ void setup_uart(char commnumber, unsigned long speed_baud)
|
||||
SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
|
||||
}
|
||||
|
||||
/** Настройка режима линии.
|
||||
@param bit количество бит данных
|
||||
@param parity режим четности (N,O,E,M,S)
|
||||
@param stop количество стоповых бит */
|
||||
/** Настройка режима линии.
|
||||
@param bit количество бит данных
|
||||
@param parity режим четности (N,O,E,M,S)
|
||||
@param stop количество стоповых бит */
|
||||
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop)
|
||||
{
|
||||
volatile struct SCI_REGS *SciRegs;
|
||||
@@ -539,7 +539,7 @@ void clear_timer_rs_live(RS_DATA *rs_arr)
|
||||
rs_arr->time_wait_rs_out=0;
|
||||
}
|
||||
|
||||
/* проверка на живучесть RS */
|
||||
/* проверка на живучесть RS */
|
||||
void test_rs_live(RS_DATA *rs_arr)
|
||||
{
|
||||
/* if (rs_arr->time_wait_rs_out < RS_TIME_OUT)
|
||||
@@ -547,6 +547,6 @@ void test_rs_live(RS_DATA *rs_arr)
|
||||
else
|
||||
{
|
||||
rs_arr->time_wait_rs_out=0;
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
}*/ }
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* Служебные команды доступа к памяти и загрузки. get_command
|
||||
* проверяет завершённый RS-кадр и CRC перед диспетчеризацией в main.
|
||||
* Произвольная запись памяти сервисной командой не проходит
|
||||
* автомат фронтов СИФУ. Формат CMD_* согласован с загрузчиком ПК;
|
||||
* нельзя перенумеровывать команды при расширении протокола.
|
||||
/* Служебные команды доступа к памяти и загрузки. get_command
|
||||
* проверяет завершённый RS-кадр и CRC перед диспетчеризацией в main.
|
||||
* Произвольная запись памяти сервисной командой не проходит
|
||||
* автомат фронтов СИФУ. Формат CMD_* согласован с загрузчиком ПК;
|
||||
* нельзя перенумеровывать команды при расширении протокола.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "RS485.h"
|
||||
@@ -14,14 +14,14 @@
|
||||
//#include "spartan_tools.h"
|
||||
//#include "big_dsp_module.h"
|
||||
|
||||
int flag_DEBUG = false; /* Флаг отладочного режима */
|
||||
int flag_DEBUG = false; /* Флаг отладочного режима */
|
||||
|
||||
|
||||
//static unsigned int *RecvPtr;
|
||||
//static int BS_LoadOK = false; /** Флаг успешности приема блока */
|
||||
//static int BS_LoadOK = false; /** Флаг успешности приема блока */
|
||||
|
||||
/**********************************************************/
|
||||
/* Прототипы функций, используемых и определенных в файле */
|
||||
/* Прототипы функций, используемых и определенных в файле */
|
||||
/**********************************************************/
|
||||
//static int _getbyte(int *addr, int offs);
|
||||
|
||||
@@ -36,60 +36,60 @@ void write_memory(unsigned long addr, unsigned int data)
|
||||
}
|
||||
|
||||
|
||||
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
|
||||
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
|
||||
int get_command(RS_DATA *rs_arr)
|
||||
{
|
||||
int cmd;
|
||||
unsigned int crc, rcrc;
|
||||
|
||||
if(rs_arr->RS_DataReady) // Данные по RS пришли
|
||||
if(rs_arr->RS_DataReady) // Данные по RS пришли
|
||||
{
|
||||
rs_arr->RS_DataReady = false;
|
||||
cmd = rs_arr->RS_Header[1]; // Прочитали номер команды
|
||||
cmd = rs_arr->RS_Header[1]; // Прочитали номер команды
|
||||
|
||||
// Провераем длину команды дла считываниа CRC
|
||||
// Провераем длину команды дла считываниа CRC
|
||||
if((RS_Len[cmd]<3) || (RS_Len[cmd]>MAX_RECEIVE_LENGTH))
|
||||
{
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(cmd == CMD_LOAD) // Если команда загрузки
|
||||
if(cmd == CMD_LOAD) // Если команда загрузки
|
||||
{
|
||||
rs_arr->RS_PrevCmd = cmd;
|
||||
return cmd; // Нет проверки crc
|
||||
return cmd; // Нет проверки crc
|
||||
}
|
||||
else // Все остальные команды
|
||||
else // Все остальные команды
|
||||
{
|
||||
// Считываем crc из посылки
|
||||
// Считываем crc из посылки
|
||||
crc = (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |
|
||||
(rs_arr->RS_Header[RS_Len[cmd]-2]) ;
|
||||
}
|
||||
// Рассчитываем crc из посылки
|
||||
// Рассчитываем crc из посылки
|
||||
rcrc = 0xffff;
|
||||
rcrc = get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) );
|
||||
|
||||
if(crc == rcrc) // Провераем crc
|
||||
if(crc == rcrc) // Провераем crc
|
||||
{
|
||||
rs_arr->RS_PrevCmd = cmd;
|
||||
return cmd;
|
||||
}
|
||||
else
|
||||
{
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
} }
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** Стандартный ответ, без параметров */
|
||||
/** Стандартный ответ, без параметров */
|
||||
void Answer(RS_DATA *rs_arr,int n)
|
||||
{
|
||||
int crc;
|
||||
|
||||
flag_DEBUG = true; // Флаг отладочного режима
|
||||
flag_DEBUG = true; // Флаг отладочного режима
|
||||
|
||||
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
|
||||
rs_arr->buffer[1] = n;
|
||||
@@ -105,7 +105,7 @@ void Answer(RS_DATA *rs_arr,int n)
|
||||
RS_Send(rs_arr,rs_arr->buffer, 6);
|
||||
}
|
||||
|
||||
/* Внутреннаа ф-циа */
|
||||
/* Внутреннаа ф-циа */
|
||||
static char _getbyte(unsigned int *addr, int32 offs)
|
||||
{
|
||||
unsigned int *address;
|
||||
@@ -118,7 +118,7 @@ static char _getbyte(unsigned int *addr, int32 offs)
|
||||
}
|
||||
|
||||
|
||||
/* начальные установки (не работает)*/
|
||||
/* начальные установки (не работает)*/
|
||||
void init(RS_DATA *rs_arr)
|
||||
{
|
||||
/*
|
||||
@@ -141,13 +141,13 @@ void init(RS_DATA *rs_arr)
|
||||
*/
|
||||
}
|
||||
|
||||
/**@name Комманды
|
||||
* Комманды, вызываемые через последовательный канал
|
||||
/**@name Комманды
|
||||
* Комманды, вызываемые через последовательный канал
|
||||
*/
|
||||
//@{
|
||||
|
||||
/** Инициировать загрузку блока.
|
||||
Настраивает прием блока данных */
|
||||
/** Инициировать загрузку блока.
|
||||
Настраивает прием блока данных */
|
||||
void initload(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned long Address;
|
||||
@@ -171,8 +171,8 @@ void initload(RS_DATA *rs_arr)
|
||||
Answer(rs_arr,CMD_INITLOAD);
|
||||
}
|
||||
|
||||
/** Загрузка блока.
|
||||
Вызываетса после загрузки блока через RS */
|
||||
/** Загрузка блока.
|
||||
Вызываетса после загрузки блока через RS */
|
||||
void load(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned int rcrc, crc;
|
||||
@@ -197,27 +197,27 @@ void load(RS_DATA *rs_arr)
|
||||
else
|
||||
{
|
||||
rs_arr->BS_LoadOK = false;
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
} }
|
||||
|
||||
/** Выполнить программу в формате Serial Boot.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес программы беретса из заголовка и
|
||||
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
|
||||
/** Выполнить программу в формате Serial Boot.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес программы беретса из заголовка и
|
||||
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
|
||||
@see load */
|
||||
void run (RS_DATA *rs_arr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/** Прочитать ачейку памати */
|
||||
/** Прочитать ачейку памати */
|
||||
void peek(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned long Address;
|
||||
unsigned int Data, crc;
|
||||
|
||||
flag_DEBUG = true; // Флаг отладочного режима
|
||||
flag_DEBUG = true; // Флаг отладочного режима
|
||||
|
||||
Address = rs_arr->RS_Header[5] & 0xFF;
|
||||
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
|
||||
@@ -250,7 +250,7 @@ void peek(RS_DATA *rs_arr)
|
||||
|
||||
}
|
||||
|
||||
/** Записать в ачейку памати */
|
||||
/** Записать в ачейку памати */
|
||||
void poke(RS_DATA *rs_arr)
|
||||
{
|
||||
unsigned long Address;
|
||||
@@ -272,12 +272,12 @@ void poke(RS_DATA *rs_arr)
|
||||
Answer(rs_arr,CMD_POKE);
|
||||
}
|
||||
|
||||
/** Передать блок памати */
|
||||
/** Передать блок памати */
|
||||
void upload(RS_DATA *rs_arr)
|
||||
{
|
||||
int32 Address, Length, crc;
|
||||
|
||||
no_write = 1; // Флаг отладочного режима
|
||||
no_write = 1; // Флаг отладочного режима
|
||||
// stopp=1;
|
||||
|
||||
Address = rs_arr->RS_Header[5] & 0xFF;
|
||||
@@ -297,10 +297,10 @@ void upload(RS_DATA *rs_arr)
|
||||
crc = get_crc_16( crc, rs_arr->buffer, 2);
|
||||
crc = get_crc_16b( crc, (unsigned int *)Address, Length);
|
||||
|
||||
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
|
||||
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
|
||||
|
||||
rs_arr->buffer[0] = CMD_UPLOAD;
|
||||
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
|
||||
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
|
||||
|
||||
RS_Wait4OK(rs_arr);
|
||||
RS_BSend(rs_arr,(unsigned int*)Address, Length);
|
||||
@@ -314,21 +314,21 @@ void upload(RS_DATA *rs_arr)
|
||||
|
||||
}
|
||||
|
||||
/** Прошить XILINX.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
|
||||
так же смотрит магическое слово в начале прошивки
|
||||
/** Прошить XILINX.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
|
||||
так же смотрит магическое слово в начале прошивки
|
||||
@see load */
|
||||
void xflash(RS_DATA *rs_arr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
@see load */
|
||||
void tflash(RS_DATA *rs_arr)
|
||||
{
|
||||
@@ -337,7 +337,7 @@ void tflash(RS_DATA *rs_arr)
|
||||
/*
|
||||
if(!rs_arr->BS_LoadOK)
|
||||
{
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
return;
|
||||
}
|
||||
@@ -362,7 +362,7 @@ void tflash(RS_DATA *rs_arr)
|
||||
|
||||
if( (Address2 < 0x100000) || (Address2 > 0x180000) || ((Address2+LengthW) > 0x180000) )
|
||||
{
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_Line_to_receive(rs_arr); // режим приема RS485
|
||||
RS_SetBitMode(rs_arr,9);
|
||||
return;
|
||||
}
|
||||
@@ -374,10 +374,10 @@ void tflash(RS_DATA *rs_arr)
|
||||
return;
|
||||
}
|
||||
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
/** Прошить TMS.
|
||||
@precondition Должна быть произведена загрузка блока
|
||||
Адрес и длина прошивки беретса из заголовка и
|
||||
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
|
||||
@see load */
|
||||
void extendbios(RS_DATA *rs_arr)
|
||||
{
|
||||
@@ -403,10 +403,10 @@ void extendbios(RS_DATA *rs_arr)
|
||||
|
||||
switch ( code )
|
||||
{
|
||||
// Прошиваем EPROM Из RAM
|
||||
// Прошиваем EPROM Из RAM
|
||||
case 4: Seeprom_write(Address1,(unsigned int*)Address2,Length);
|
||||
break;
|
||||
// Читаем из EPROM в RAM
|
||||
// Читаем из EPROM в RAM
|
||||
case 5: Seeprom_read(Address1,(unsigned int*)Address2,Length);
|
||||
break;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Адресация последовательного протокола. set_cntrl_addr задаёт
|
||||
* собственный и общий адрес. CAN ID вычисляется отдельно из Mode.
|
||||
* Общий RS-адрес не заменяет собственный во всех ответах: для
|
||||
* логгера SetGUI использовать собственный адрес платы (обычно 5/6).
|
||||
/* Адресация последовательного протокола. set_cntrl_addr задаёт
|
||||
* собственный и общий адрес. CAN ID вычисляется отдельно из Mode.
|
||||
* Общий RS-адрес не заменяет собственный во всех ответах: для
|
||||
* логгера SetGUI использовать собственный адрес платы (обычно 5/6).
|
||||
*/
|
||||
#include "cntrl_adr.h"
|
||||
|
||||
@@ -11,25 +11,25 @@
|
||||
#define ADDR_UNIVERSAL_DEF 10
|
||||
|
||||
|
||||
/** Установка адреса контроллера дла посылки всем АИНам */
|
||||
/** Установка адреса контроллера дла посылки всем АИНам */
|
||||
int ADDR_FOR_ALL = ADDR_FOR_ALL_DEF;
|
||||
|
||||
/** Установка адреса контроллера дла посылки ответа */
|
||||
/** Установка адреса контроллера дла посылки ответа */
|
||||
const int ADDR_ANSWER = ADDR_ANSWER_DEF;
|
||||
|
||||
/** Установка адреса терминала дла посылки ответа */
|
||||
/** Установка адреса терминала дла посылки ответа */
|
||||
const int ADDR_TERMINAL = ADDR_TERMINAL_DEF;
|
||||
|
||||
/* Универсальный адрес контроллера */
|
||||
/* Универсальный адрес контроллера */
|
||||
const int CNTRL_ADDR_UNIVERSAL=ADDR_UNIVERSAL_DEF;
|
||||
|
||||
/* Адрес контроллера */
|
||||
/* Адрес контроллера */
|
||||
int CNTRL_ADDR=1;
|
||||
|
||||
int cntr_addr_c;
|
||||
int cntr_addr_c_all;
|
||||
|
||||
/** Установка адреса контроллера дла прошивки */
|
||||
/** Установка адреса контроллера дла прошивки */
|
||||
void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all)
|
||||
{
|
||||
CNTRL_ADDR = cntrl_addr;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* CRC кадров обмена и параметров EEPROM. get_crc_16 работает
|
||||
* с представлением буфера протокола, get_crc16 обрабатывает оба
|
||||
* байта каждого слова параметров. Порядок байтов существенен.
|
||||
* Нельзя заменять эти функции реализацией для ПК без проверки
|
||||
* представления данных и особенностей 16-битной ABI C2000.
|
||||
/* CRC кадров обмена и параметров EEPROM. get_crc_16 работает
|
||||
* с представлением буфера протокола, get_crc16 обрабатывает оба
|
||||
* байта каждого слова параметров. Порядок байтов существенен.
|
||||
* Нельзя заменять эти функции реализацией для ПК без проверки
|
||||
* представления данных и особенностей 16-битной ABI C2000.
|
||||
*/
|
||||
#include "crc16.h"
|
||||
#define MAKE_TABS 0 /* Builds tables below */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Рекурсивный фильтр. FILTERBAT хранит коэффициенты и историю
|
||||
* двух входов/выходов; каждый вызов изменяет переданный экземпляр.
|
||||
* Независимым каналам нужны отдельные состояния. Синхронизации
|
||||
* здесь нет: смену коэффициентов согласовывает вызывающий код.
|
||||
/* Рекурсивный фильтр. FILTERBAT хранит коэффициенты и историю
|
||||
* двух входов/выходов; каждый вызов изменяет переданный экземпляр.
|
||||
* Независимым каналам нужны отдельные состояния. Синхронизации
|
||||
* здесь нет: смену коэффициентов согласовывает вызывающий код.
|
||||
*/
|
||||
#include "filter_bat2.h"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Программный канал индикации. digits/readr задают символы и выбор
|
||||
* элементов, DCLK/DOUT и kanal_Send формируют последовательность GPIO.
|
||||
* Это другой интерфейс, чем dCLK/dCS в DAC.c. Похожие имена не
|
||||
* означают общий ЦАП или общий выход запуска нагрузки.
|
||||
/* Программный канал индикации. digits/readr задают символы и выбор
|
||||
* элементов, DCLK/DOUT и kanal_Send формируют последовательность GPIO.
|
||||
* Это другой интерфейс, чем dCLK/dCS в DAC.c. Похожие имена не
|
||||
* означают общий ЦАП или общий выход запуска нагрузки.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
@@ -88,7 +88,7 @@ void kanal_Send(int adr, long dat, int dot)
|
||||
long Word,data,aliq_part,dg[4];
|
||||
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
|
||||
|
||||
if(adr>1) // Лампочки
|
||||
if(adr>1) // Лампочки
|
||||
{
|
||||
Word =dat;
|
||||
}
|
||||
@@ -139,7 +139,7 @@ void kanal_Send(int adr, long dat, int dot)
|
||||
for(i=3;i>0;i--)
|
||||
{
|
||||
if((dg[i]==0)&&(i!=dot))
|
||||
dg[i]=0xF; // Это значит пусто
|
||||
dg[i]=0xF; // Это значит пусто
|
||||
else break;
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ void kanal_Send(int adr, long dat, int dot)
|
||||
{
|
||||
if( (dg[i]==0xF)||(i==3))
|
||||
{
|
||||
dg[i]=0xA; // Это значит минус
|
||||
dg[i]=0xA; // Это значит минус
|
||||
break;
|
||||
} }
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* Измерения, диагностика и периодическое обслуживание. ADC ISR
|
||||
* поставляет выборки; таймер 1 обслуживает индикацию и телеметрию.
|
||||
* Для dsk_LOAD он сначала завершает импульс СИФУ, затем вызывает
|
||||
* расчёт ЦАП и снимок логгера. Частоты находятся в measure.h;
|
||||
* при их изменении требуется пересчитать зависимые интервалы.
|
||||
/* Измерения, диагностика и периодическое обслуживание. ADC ISR
|
||||
* поставляет выборки; таймер 1 обслуживает индикацию и телеметрию.
|
||||
* Для dsk_LOAD он сначала завершает импульс СИФУ, затем вызывает
|
||||
* расчёт ЦАП и снимок логгера. Частоты находятся в measure.h;
|
||||
* при их изменении требуется пересчитать зависимые интервалы.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
@@ -20,13 +20,13 @@
|
||||
#include "message.h"
|
||||
#include "log_to_mem.h"
|
||||
|
||||
#include <math.h> // Это чтобы мерить амплитуду! sqrt без этого будет крив!!!
|
||||
#include <math.h> // Это чтобы мерить амплитуду! sqrt без этого будет крив!!!
|
||||
|
||||
unsigned int CanPowse=CANPOWSE,CanGO=0;
|
||||
|
||||
unsigned int Maska[2][8];
|
||||
|
||||
int TPL_CANS=0; // Количество температурных каналов
|
||||
int TPL_CANS=0; // Количество температурных каналов
|
||||
int tpl_cans=0;
|
||||
int cal_addr=0;
|
||||
|
||||
@@ -53,23 +53,23 @@ int Curr_Edge;
|
||||
|
||||
float powK[] =
|
||||
{
|
||||
0.127, // питание 380В
|
||||
0.127, // питание 380В
|
||||
0.127, // питание 380В
|
||||
0.127, // питание 380В
|
||||
|
||||
1.000, // ток
|
||||
1.000, // напражение
|
||||
1.000, // ток
|
||||
1.000, // напражение
|
||||
|
||||
0.0076, // питание 31В
|
||||
0.0076, // питание 24В
|
||||
0.0076, // питание 24В
|
||||
0.0076, // питание 15В
|
||||
1.0000, // термодатчик мелкосхема
|
||||
0.0076, // питание 31В
|
||||
0.0076, // питание 24В
|
||||
0.0076, // питание 24В
|
||||
0.0076, // питание 15В
|
||||
1.0000, // термодатчик мелкосхема
|
||||
};
|
||||
|
||||
FILTERBAT def_FILTERBAT = DEF_FILTERBAT;
|
||||
FILTERBAT adc_filter[20+4]; // макс.TPL*2 + 4 калибр
|
||||
FILTERBAT out_filter[20+4]; // макс.TPL*2 + 4 напраж
|
||||
FILTERBAT zer_filter[4]; // 4 напраж
|
||||
FILTERBAT adc_filter[20+4]; // макс.TPL*2 + 4 калибр
|
||||
FILTERBAT out_filter[20+4]; // макс.TPL*2 + 4 напраж
|
||||
FILTERBAT zer_filter[4]; // 4 напраж
|
||||
|
||||
long sens_count[24+4];
|
||||
|
||||
@@ -79,7 +79,7 @@ float K_T1,K_T2;
|
||||
interrupt void cpu_timer1_isr_SENS(void);
|
||||
|
||||
/********************************************************************/
|
||||
/* Расчет модула тока из показаний двух фаз */
|
||||
/* Расчет модула тока из показаний двух фаз */
|
||||
/********************************************************************/
|
||||
float im_calc(float ia,float ib)
|
||||
{
|
||||
@@ -115,8 +115,8 @@ interrupt void cpu_timer1_isr_SENS(void)
|
||||
|
||||
int TST;
|
||||
|
||||
#define err_lamp work_lamp // это дла шкапа,
|
||||
#define alm_lamp heat_lamp // чтоб было понатнее
|
||||
#define err_lamp work_lamp // это дла шкапа,
|
||||
#define alm_lamp heat_lamp // чтоб было понатнее
|
||||
|
||||
EALLOW;
|
||||
CpuTimer1.InterruptCount++;
|
||||
@@ -140,10 +140,10 @@ interrupt void cpu_timer1_isr_SENS(void)
|
||||
|
||||
if(Desk==dsk_LOAD)
|
||||
{
|
||||
/* Снять истёкший импульс до расчёта ЦАП, независимо от main. */
|
||||
/* Снять истёкший импульс до расчёта ЦАП, независимо от main. */
|
||||
UMP_pulse_tick();
|
||||
Load_runner();
|
||||
/* База времени 1 мс; снимок содержит результат текущего шага ЦАП. */
|
||||
/* База времени 1 мс; снимок содержит результат текущего шага ЦАП. */
|
||||
ump_log_tick();
|
||||
return;
|
||||
}
|
||||
@@ -156,9 +156,9 @@ interrupt void cpu_timer1_isr_SENS(void)
|
||||
((Desk==dsk_COMM) && heat_lamp) ) set_RES_OUT_1();
|
||||
else clear_RES_OUT_1();
|
||||
|
||||
if(work_lamp) set_LED_OUT_1(); // Она же err_lamp дла шкапа
|
||||
if(work_lamp) set_LED_OUT_1(); // Она же err_lamp дла шкапа
|
||||
else clear_LED_OUT_1();
|
||||
if(heat_lamp) set_LED_OUT_2(); // Она же alm_lamp дла шкапа
|
||||
if(heat_lamp) set_LED_OUT_2(); // Она же alm_lamp дла шкапа
|
||||
else clear_LED_OUT_2();
|
||||
}
|
||||
|
||||
@@ -360,37 +360,37 @@ void Init_packMask()
|
||||
switch(Desk)
|
||||
{
|
||||
case dsk_EPLT:
|
||||
Maska[m_SLOW][0]|= 0x000F; // Полученное
|
||||
Maska[m_SLOW][6]|= 0x01FC; // Яркость ламп и одиночество
|
||||
Maska[m_FAST][0]|= 0x000F; // Включает R0–R3 в быструю обратную связь VPU для ПМ67; четыре младших бита маски исключают ожидание медленного обхода параметров.
|
||||
Maska[m_SLOW][6]|= 0x01FC; // Яркость ламп и одиночество
|
||||
break;
|
||||
|
||||
default:
|
||||
for(i=0;i<can;i++)
|
||||
{
|
||||
Maska[m_FAST][ i /16]|=(1<<( i %16)); // Диагностика
|
||||
Maska[m_FAST][(i+24)/16]|=(1<<((i+24)%16)); // Показаниа
|
||||
Maska[m_FAST][ i /16]|=(1<<( i %16)); // Диагностика
|
||||
Maska[m_FAST][(i+24)/16]|=(1<<((i+24)%16)); // Показаниа
|
||||
}
|
||||
for(i=0;i<3; i++)
|
||||
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Уставки
|
||||
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Уставки
|
||||
|
||||
if(Desk==dsk_BKSD) Maska[m_SLOW][7]|= 0x0300; // Калибровка термодатчиков
|
||||
if(Desk==dsk_BKSD) Maska[m_SLOW][7]|= 0x0300; // Калибровка термодатчиков
|
||||
else
|
||||
Maska[m_SLOW][7]|= 0x0F00; // Калибровка термодатчиков
|
||||
Maska[m_SLOW][7]|= 0x0F00; // Калибровка термодатчиков
|
||||
if(Kurrent)
|
||||
{ Maska[m_SLOW][7]|= 0x000F; // Ноль датчиков напражениа
|
||||
Maska[m_SLOW][7]|= 0x00F0; // Калибровка датчиков напражениа
|
||||
Maska[m_FAST][6]|= 0x3F00; // Фазные значениа
|
||||
{ Maska[m_SLOW][7]|= 0x000F; // Ноль датчиков напражениа
|
||||
Maska[m_SLOW][7]|= 0x00F0; // Калибровка датчиков напражениа
|
||||
Maska[m_FAST][6]|= 0x3F00; // Фазные значениа
|
||||
}
|
||||
|
||||
if(Desk==dsk_LOAD)
|
||||
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
|
||||
Maska[m_FAST][7]|= 0xE000; // Дублировать команды
|
||||
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
|
||||
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
|
||||
Maska[m_FAST][7]|= 0xE000; // Дублировать команды
|
||||
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
|
||||
} }
|
||||
|
||||
Maska[m_FAST][1]|= 0x0001; // Дискретные входы
|
||||
Maska[m_SLOW][6]|= 0x0007; // Яркость ламп и периоды посылок
|
||||
Maska[m_SLOW][7]|= 0xE000; // Адрес, команды, и чтоб не вылазило
|
||||
Maska[m_FAST][1]|= 0x0001; // Дискретные входы
|
||||
Maska[m_SLOW][6]|= 0x0007; // Яркость ламп и периоды посылок
|
||||
Maska[m_SLOW][7]|= 0xE000; // Адрес, команды, и чтоб не вылазило
|
||||
}
|
||||
|
||||
int er_anal(int term, long * count, long edge, int pre)
|
||||
@@ -449,26 +449,26 @@ void Current_count(int chan)
|
||||
|
||||
modbus[0x64+chan] = Numb;
|
||||
|
||||
// Средний (он же нулевой) уровень показаний АЦП
|
||||
// Средний (он же нулевой) уровень показаний АЦП
|
||||
zer_count[chan] += (Numb-zer_count[chan])/(5.0 * ADC_FREQ);
|
||||
Zero_lev[chan] = (int)(filterbat(&zer_filter[chan],zer_count[chan]));
|
||||
|
||||
// Мгновенное значение фазы
|
||||
// Мгновенное значение фазы
|
||||
Current = (Numb - Zero_lev[chan]) * powK[chan];
|
||||
|
||||
// Действующее (среднеквадратичное) значение фазы
|
||||
// Действующее (среднеквадратичное) значение фазы
|
||||
lev_quadr[chan] += ((Current*Current)-lev_quadr[chan])/(1.0 * ADC_FREQ);
|
||||
lev_count[chan] = sqrt(lev_quadr[chan]);
|
||||
|
||||
// Запомним
|
||||
// Запомним
|
||||
if(ist)
|
||||
{
|
||||
if(Desk==dsk_COMM) aCurrent =-Current;
|
||||
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
|
||||
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
|
||||
}
|
||||
else
|
||||
{
|
||||
// Вычисление амплитуды
|
||||
// Вычисление амплитуды
|
||||
Amplitude = filterbat(&out_filter[sens], im_calc(Current,aCurrent));
|
||||
|
||||
if(sens_type[chan]==VOLTAGE)
|
||||
@@ -485,7 +485,7 @@ modbus[0x64+chan] = Numb;
|
||||
sens_data[sens-1] = Level;
|
||||
}
|
||||
|
||||
// Действующее (среднеквадратичное) значение третьей фазы
|
||||
// Действующее (среднеквадратичное) значение третьей фазы
|
||||
Numb =-Current-aCurrent;
|
||||
lev_quadr[thrd] += (Numb*Numb-lev_quadr[thrd])/(1.0 * ADC_FREQ);
|
||||
lev_count[thrd] = sqrt(lev_quadr[thrd]);
|
||||
@@ -511,12 +511,12 @@ modbus[0x68+fazz+1] = lev_count[chan];
|
||||
modbus[0x68+fazz+2] = lev_count[thrd];
|
||||
}
|
||||
|
||||
// Это максимальное
|
||||
// Это максимальное
|
||||
Numb = lev_count[chan];
|
||||
if(Numb<lev_count[pair]) Numb = lev_count[pair];
|
||||
if(Numb<lev_count[thrd]) Numb = lev_count[thrd];
|
||||
|
||||
// Зашиты!
|
||||
// Зашиты!
|
||||
error.all = 0;
|
||||
no_ignor = !sens_error[chan].bit.Ignor;
|
||||
|
||||
@@ -659,7 +659,7 @@ void Temper_count(int chan)
|
||||
|
||||
if(chan>tpl_cans) return;
|
||||
|
||||
// Kun именно чтоб скомпенсировать нечетность
|
||||
// Kun именно чтоб скомпенсировать нечетность
|
||||
if(kun&1) Numb = (Numb-K300_2)*K_T2+ZERO;
|
||||
else Numb = (Numb-K300_1)*K_T1+ZERO;
|
||||
}
|
||||
@@ -706,7 +706,7 @@ sens_data[chan+8] = adc_table_tpl[chan];
|
||||
error.all = 0;
|
||||
no_ignor = !sens_error[chan].bit.Ignor;
|
||||
|
||||
// Обрыв или неисправность
|
||||
// Обрыв или неисправность
|
||||
if(Temper==-20 || Temper==200)
|
||||
{
|
||||
error.bit.Tear = 1;
|
||||
@@ -714,7 +714,7 @@ sens_data[chan+8] = adc_table_tpl[chan];
|
||||
}
|
||||
else
|
||||
|
||||
// Перегрев
|
||||
// Перегрев
|
||||
if(((Temper>sens_hi_edge[chan]-Cooling) && (sens_error[chan].bit.Hyper)) ||
|
||||
(Temper>sens_hi_edge[chan]) )
|
||||
{
|
||||
@@ -724,7 +724,7 @@ sens_data[chan+8] = adc_table_tpl[chan];
|
||||
}
|
||||
else
|
||||
|
||||
// Предупреждение по температуре
|
||||
// Предупреждение по температуре
|
||||
if(Temper>sens_lo_edge[chan])
|
||||
{
|
||||
error.bit.Over = 1;
|
||||
@@ -796,7 +796,7 @@ void Power_count(int chan)
|
||||
error.bit.Stop = 1;
|
||||
} }
|
||||
|
||||
/* Повышенное напражение
|
||||
/* Повышенное напражение
|
||||
if(Power > sens_hi_edge[chan])
|
||||
{
|
||||
error.bit.Hyper = 1;
|
||||
|
||||
@@ -65,7 +65,7 @@ void Default_params()
|
||||
}
|
||||
else
|
||||
{
|
||||
Cancount[m_FAST] = 10; // пауза между посылками CAN
|
||||
Cancount[m_FAST] = 12; // пауза между посылками CAN
|
||||
Brightness = 8;
|
||||
}
|
||||
|
||||
|
||||
@@ -205,15 +205,14 @@ void get_Buttons()
|
||||
|
||||
if(Desk==dsk_EPLT)
|
||||
{
|
||||
/* Фильтрует TESTLAMP на GPIO26 накопителем INcount0 с порогом 1000 опросов главного цикла; прежний bTestLamp удерживает режим теста при кратких провалах входа до подтверждения нового состояния фильтром. */
|
||||
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, bTestLamp);
|
||||
/* Таймер пульта включает местный тест после непрерывного удержания TESTLAMP в течение 2 с; число проходов main не влияет на задержку. */
|
||||
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001;
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO24) butt +=0x0002;
|
||||
if(GpioDataRegs.GPBDAT.bit.GPIO53) butt +=0x0004;
|
||||
if(GpioDataRegs.GPBDAT.bit.GPIO50) butt +=0x0008;
|
||||
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010;
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010; // Передаёт исходное состояние TESTLAMP в бите 4 слова Inputs (0x10), по которому основной контроллер вызывает сброс ошибок при коротком нажатии.
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO23) butt +=0x0020;
|
||||
if(GpioDataRegs.GPBDAT.bit.GPIO52) butt +=0x0040;
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO4 ) butt +=0x0080;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Логика пульта и индикации. cpu_timer1_isr_PULT выбирается
|
||||
* только для dsk_EPLT; для нагрузки работает обработчик из measure.c.
|
||||
* Lonely относится к активности обмена, не к задержке пуска СИФУ.
|
||||
* Не смешивать функции двух режимов при изменении общего таймера.
|
||||
/* Логика пульта и индикации. cpu_timer1_isr_PULT выбирается
|
||||
* только для dsk_EPLT; для нагрузки работает обработчик из measure.c.
|
||||
* Lonely относится к активности обмена, не к задержке пуска СИФУ.
|
||||
* Не смешивать функции двух режимов при изменении общего таймера.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
@@ -43,6 +43,7 @@ interrupt void cpu_timer1_isr_PULT(void)
|
||||
static int cownt=0,count_bright;
|
||||
unsigned int light=0, i;
|
||||
unsigned int Alone = 20*READY_FREQ;
|
||||
static unsigned int test_lamp_hold_ticks = 0; // Считает длительность непрерывного нажатия GPIO26 в тиках READY_FREQ; насыщение на пороге исключает переполнение при долгом удержании.
|
||||
|
||||
EALLOW;
|
||||
CpuTimer1.InterruptCount++;
|
||||
@@ -60,8 +61,8 @@ interrupt void cpu_timer1_isr_PULT(void)
|
||||
|
||||
toggle_ONLINE();
|
||||
|
||||
toggle_RES_OUT_1(); // типа это готовность
|
||||
toggle_RES_OUT_2(); // на всакий
|
||||
toggle_RES_OUT_1(); // Формирует на резервном выходе 1 меандр с частотой READY_FREQ/2 (500 Гц) для контроля работы таймера пульта.
|
||||
toggle_RES_OUT_2(); // Дублирует переключения таймера на резервном выходе 2 с частотой READY_FREQ/2 (500 Гц) для контроля активности пульта.
|
||||
|
||||
if(++Lonely > Alone) Lonely = Alone;
|
||||
|
||||
@@ -74,6 +75,14 @@ interrupt void cpu_timer1_isr_PULT(void)
|
||||
|
||||
if(++cownt>2) cownt=0;
|
||||
|
||||
if(GpioDataRegs.GPADAT.bit.GPIO26) // Единица GPIO26 означает нажатие TESTLAMP, как и бит 4 Inputs; таймер измеряет удержание независимо от загрузки main.
|
||||
{ // Накапливает время текущего нажатия перед включением местного теста ламп.
|
||||
if(test_lamp_hold_ticks < 2U * (unsigned int)READY_FREQ) // Две секунды при частоте READY_FREQ Гц соответствуют 2000 тикам текущего таймера 1000 Гц.
|
||||
test_lamp_hold_ticks++; // Добавляет один период таймера (1 мс); после достижения порога счётчик сохраняет значение до отпускания.
|
||||
} // Завершает обработку удерживаемой кнопки.
|
||||
else test_lamp_hold_ticks = 0; // При отпускании обнуляет время, чтобы отдельные короткие нажатия не складывались в длинное.
|
||||
bTestLamp = (test_lamp_hold_ticks >= 2U * (unsigned int)READY_FREQ); // Включает местный тест после 2 с удержания и выключает при отпускании; короткое нажатие остаётся сигналом сброса для основного контроллера.
|
||||
|
||||
if(cTestLamp|bTestLamp)
|
||||
{
|
||||
what_is();
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/* SPI EEPROM. Seeprom_read/write разбивают запрос на страницы
|
||||
* и синхронно ждут spiSe2pFree. SPI-автомат продвигает таймер 2
|
||||
* каждые 100 мкс. При запрете этого IRQ ожидание не завершится.
|
||||
* Тайм-аут в старом драйвере отсутствует. Дискреты СИФУ теперь
|
||||
* не зависят от того, завершилось ли это ожидание в main.
|
||||
/* SPI EEPROM. Seeprom_read/write разбивают запрос на страницы
|
||||
* и синхронно ждут spiSe2pFree. SPI-автомат продвигает таймер 2
|
||||
* каждые 100 мкс. При запрете этого IRQ ожидание не завершится.
|
||||
* Тайм-аут в старом драйвере отсутствует. Дискреты СИФУ теперь
|
||||
* не зависят от того, завершилось ли это ожидание в main.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
|
||||
@@ -25,8 +25,8 @@ int ccc=0;
|
||||
/******* SPI bus Serial EEPROM driver Initialization routine ********/
|
||||
/********************************************************************/
|
||||
|
||||
/* Блокирует main до завершения страниц. Запрет IRQ остановит
|
||||
* SPI-автомат. CAN и таймер СИФУ должны прерывать это ожидание.
|
||||
/* Блокирует main до завершения страниц. Запрет IRQ остановит
|
||||
* SPI-автомат. CAN и таймер СИФУ должны прерывать это ожидание.
|
||||
*/
|
||||
void Seeprom_write( unsigned int adres,
|
||||
unsigned int buf[],
|
||||
@@ -59,8 +59,8 @@ void Seeprom_write( unsigned int adres,
|
||||
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
|
||||
}
|
||||
|
||||
/* Чтение также синхронное для main, тайм-аут не реализован.
|
||||
* При зависании проверить step/SPI и работу таймера 2.
|
||||
/* Чтение также синхронное для main, тайм-аут не реализован.
|
||||
* При зависании проверить step/SPI и работу таймера 2.
|
||||
*/
|
||||
void Seeprom_read( unsigned int adres,
|
||||
unsigned int buf[],
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Внешняя память и программные задержки. init_zone7 готовит XINTF
|
||||
* до первого обращения к .logg; времена шины зависят от частоты DSP
|
||||
* и аппаратной памяти. pause_us занимает CPU циклом и используется
|
||||
* при инициализации. Длительность СИФУ должна задаваться таймером.
|
||||
/* Внешняя память и программные задержки. init_zone7 готовит XINTF
|
||||
* до первого обращения к .logg; времена шины зависят от частоты DSP
|
||||
* и аппаратной памяти. pause_us занимает CPU циклом и используется
|
||||
* при инициализации. Длительность СИФУ должна задаваться таймером.
|
||||
*/
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
|
||||
|
||||
@@ -2,6 +2,4 @@
|
||||
<?ccsproject version="1.0"?>
|
||||
<projectOptions>
|
||||
<deviceFamily value="C2000"/>
|
||||
<connection value="common/targetdb/connections/SAU510USBIsoPlusV2_Connection.xml"/>
|
||||
<isTargetManual value="false"/>
|
||||
</projectOptions>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Balsam_166</name>
|
||||
<name>28335_periph</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
@@ -25,180 +25,180 @@
|
||||
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||
</natures>
|
||||
<linkedResources>
|
||||
<link> <!-- Подключает папку заголовков приложения в дерево проекта CCS. -->
|
||||
<name>Source/Internal/Include</name> <!-- Показывает заголовки рядом с исходниками приложения. -->
|
||||
<type>2</type> <!-- Тип 2 обозначает связанную папку в формате проекта Eclipse/CCS. -->
|
||||
<locationURI>SRC_ROOT1/Source/Internal/Include</locationURI> <!-- Находит существующие заголовки относительно корня репозитория. -->
|
||||
</link> <!-- Завершает описание ссылки без копирования файлов в проект. -->
|
||||
<link> <!-- Подключает общие заголовки библиотеки TI для TMS320F28335. -->
|
||||
<name>Source/External/v120/DSP2833x_common/include</name> <!-- Показывает общие заголовки TI в соответствующей ветке дерева CCS. -->
|
||||
<type>2</type> <!-- Тип 2 позволяет отобразить всё содержимое связанной папки. -->
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/include</locationURI> <!-- Использует ту же папку, которая уже указана в путях компилятора. -->
|
||||
</link> <!-- Завершает ссылку на общие заголовки TI. -->
|
||||
<link> <!-- Подключает заголовки регистров и периферии процессора TI. -->
|
||||
<name>Source/External/v120/DSP2833x_headers/include</name> <!-- Показывает аппаратные заголовки в дереве исходников CCS. -->
|
||||
<type>2</type> <!-- Тип 2 задаёт ссылку на папку, а не на отдельный файл. -->
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_headers/include</locationURI> <!-- Ссылается на существующую папку аппаратных заголовков внутри репозитория. -->
|
||||
</link> <!-- Завершает ссылку на аппаратные заголовки TI. -->
|
||||
<link>
|
||||
<name>F28335.cmd</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/F28335.cmd</locationURI>
|
||||
<locationURI>SRC_ROOT12/F28335.cmd</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>UKSSTMS320F28335.pjt</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/UKSSTMS320F28335.pjt</locationURI>
|
||||
<locationURI>SRC_ROOT12/UKSSTMS320F28335.pjt</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Debug/UKSSTMS320F28335.out</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT/Bin/UKSSTMS320F28335.out</locationURI>
|
||||
<locationURI>SRC_ROOT12/Bin/UKSSTMS320F28335.out</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Libraries/rts2800_fpu32.lib</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Libraries/rts2800_fpu32.lib</locationURI>
|
||||
<locationURI>SRC_ROOT12/Libraries/rts2800_fpu32.lib</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/ADC.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/ADC.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/ADC.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/DAC.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/DAC.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/DAC.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/Include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/Include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/RS485.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/RS485.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/RS485.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/bios.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/bios.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/bios.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/cntrl_adr.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/cntrl_adr.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/cntrl_adr.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/crc16.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/crc16.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/crc16.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/ecan.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/ecan.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/ecan.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/filter_bat2.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/filter_bat2.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/filter_bat2.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/kanal.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/kanal.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/kanal.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/log_to_mem.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/log_to_mem.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/log_to_mem.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/main.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/main.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/main.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/measure.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/measure.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/measure.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/message.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/message.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/message.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/peripher.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/peripher.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/peripher.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/pulto.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/pulto.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/pulto.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/spise2p.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/spise2p.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/spise2p.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/Internal/tools.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/Internal/tools.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/Internal/tools.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_headers/include</name>
|
||||
<type>2</type>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_headers/include</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_ADC_cal.asm</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_ADC_cal.asm</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_ADC_cal.asm</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_Adc.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_Adc.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_Adc.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_CpuTimers.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_CpuTimers.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_CpuTimers.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_PieCtrl.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_PieCtrl.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_PieCtrl.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedDefaultIsr.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedDefaultIsr.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedDefaultIsr.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedPieVect.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedPieVect.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_SWPrioritizedPieVect.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_SysCtrl.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_SysCtrl.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_SysCtrl.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_Xintf.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_Xintf.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_Xintf.c</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_common/source/DSP2833x_usDelay.asm</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_common/source/DSP2833x_usDelay.asm</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_common/source/DSP2833x_usDelay.asm</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_headers/cmd/DSP2833x_Headers_nonBIOS.cmd</locationURI>
|
||||
</link>
|
||||
<link>
|
||||
<name>Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</name>
|
||||
<type>1</type>
|
||||
<locationURI>SRC_ROOT1/Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</locationURI>
|
||||
<locationURI>SRC_ROOT12/Source/External/v120/DSP2833x_headers/source/DSP2833x_GlobalVariableDefs.c</locationURI>
|
||||
</link>
|
||||
</linkedResources>
|
||||
<variableList>
|
||||
@@ -210,5 +210,9 @@
|
||||
<name>SRC_ROOT1</name>
|
||||
<value>$%7BPARENT-1-PROJECT_LOC%7D</value>
|
||||
</variable>
|
||||
<variable>
|
||||
<name>SRC_ROOT12</name>
|
||||
<value>file:/K:/git_project/28335_periph</value>
|
||||
</variable>
|
||||
</variableList>
|
||||
</projectDescription>
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
ccsVersionValidationPolicy=warning
|
||||
compilerVersionValidationPolicy=flexible
|
||||
eclipse.preferences.version=1
|
||||
productVersionsValidationPolicy=flexible
|
||||
@@ -1,8 +1,4 @@
|
||||
eclipse.preferences.version=1
|
||||
# Показывает пояснения периода CAN и обработки параметров в сохранённой кодировке UTF-8.
|
||||
encoding//Source/Internal/message.c=UTF-8
|
||||
# Показывает русские пояснения выбора исполнения и порядка индикаторов в кодировке UTF-8.
|
||||
encoding//Source/Internal/Include/package.h=UTF-8
|
||||
encoding//Debug/Libraries/subdir_rules.mk=UTF-8
|
||||
encoding//Debug/Libraries/subdir_vars.mk=UTF-8
|
||||
encoding//Debug/Source/External/v120/DSP2833x_common/source/subdir_rules.mk=UTF-8
|
||||
@@ -108,8 +104,25 @@ encoding//Debug/optimizerAssistant/opt_for_speed__5/subdir_vars.mk=UTF-8
|
||||
encoding//Debug/sources.mk=UTF-8
|
||||
encoding//Debug/subdir_rules.mk=UTF-8
|
||||
encoding//Debug/subdir_vars.mk=UTF-8
|
||||
encoding//Release/Libraries/subdir_rules.mk=UTF-8
|
||||
encoding//Release/Libraries/subdir_vars.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_common/source/subdir_rules.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_common/source/subdir_vars.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_headers/cmd/subdir_rules.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_headers/cmd/subdir_vars.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_headers/source/subdir_rules.mk=UTF-8
|
||||
encoding//Release/Source/External/v120/DSP2833x_headers/source/subdir_vars.mk=UTF-8
|
||||
encoding//Release/Source/Internal/subdir_rules.mk=UTF-8
|
||||
encoding//Release/Source/Internal/subdir_vars.mk=UTF-8
|
||||
encoding//Release/makefile=UTF-8
|
||||
encoding//Release/objects.mk=UTF-8
|
||||
encoding//Release/sources.mk=UTF-8
|
||||
encoding//Release/subdir_rules.mk=UTF-8
|
||||
encoding//Release/subdir_vars.mk=UTF-8
|
||||
encoding//Source/Internal/Include/log_to_mem.h=UTF-8
|
||||
encoding//Source/Internal/Include/package.h=UTF-8
|
||||
encoding//Source/Internal/Include/ump_can_protocol.h=UTF-8
|
||||
encoding//Source/Internal/log_to_mem.c=UTF-8
|
||||
encoding//Source/Internal/message.c=UTF-8
|
||||
encoding//Source/Internal/peripher.c=UTF-8
|
||||
encoding/<project>=UTF-8
|
||||
|
||||
@@ -1,43 +1,188 @@
|
||||
# Проект 166 для CCS 12
|
||||
# Сборка прошивки Бальзам-166 / TMS320F28335
|
||||
|
||||
Настройки перенесены из проекта 167. Имя проекта в CCS: `Balsam_166`.
|
||||
Проект CCS называется `28335_periph`. Файл настроек проекта:
|
||||
`K:\git_project\28335_periph\UKSSTMS320F28335\.cproject`.
|
||||
Для рабочей сборки используйте конфигурацию **Debug**.
|
||||
|
||||
## Импорт и сборка
|
||||
## Реальные пути на этом компьютере
|
||||
|
||||
1. В CCS выберите **Project → Import CCS Projects** и укажите эту папку
|
||||
(`166/UKSSTMS320F28335`).
|
||||
2. Импортируйте проект без **Copy projects into workspace**: исходники и
|
||||
библиотеки подключены из родительской папки по относительным путям.
|
||||
3. Выберите конфигурацию **Debug** и выполните **Build Project**.
|
||||
| Назначение | Полный путь |
|
||||
|---|---|
|
||||
| Корень исходников, макрос CCS `${SRC_ROOT}` | `K:\git_project\28335_periph` |
|
||||
| Каталог проекта, макрос CCS `${PROJECT_LOC}` | `K:\git_project\28335_periph\UKSSTMS320F28335` |
|
||||
| Общая библиотека templates, используемая этой сборкой | `K:\git_project\newProject\templates` |
|
||||
| Компилятор, макрос CCS `${CG_TOOL_ROOT}` | `C:\ti\ccs1230\ccs\tools\compiler\ti-cgt-c2000_22.6.0.LTS` |
|
||||
| Каталог Debug, макрос CCS `${BuildDirectory}` | `K:\git_project\28335_periph\UKSSTMS320F28335\Debug` |
|
||||
| Настройки версии и путей | `K:\git_project\28335_periph\UKSSTMS320F28335\firmware_identity.json` |
|
||||
| Постоянный каталог готовых образов Debug | `K:\git_project\28335_periph\UKSSTMS320F28335\Debug\firmware` |
|
||||
| Дополнительная копия готовых файлов | `K:\git_project\28335_periph\Bin` |
|
||||
|
||||
Используется TI C2000 Compiler **22.6.1.LTS**, TMS320F28335, FPU32 и COFF ABI.
|
||||
Сохранены настройки компиляции, линковки и преобразования прошивки из 167.
|
||||
Исходники берутся из `166/Source`, linker-файл — `166/F28335.cmd`.
|
||||
Файл `28335_RAM_lnk.cmd`, как и в 167, исключён из сборки.
|
||||
## Как правильно указать templates
|
||||
|
||||
Результаты сборки находятся в `166/Bin`: `UKSSTMS320F28335.out`,
|
||||
`UKSSTMS320F28335.hex` (Intel HEX) и `UKSSTMS320F28335_<build_id>.bin`.
|
||||
Рядом с BIN создаются `<имя>.bin.manifest.json` и `<имя>.bin.sha256`.
|
||||
Build ID содержит восемь символов: восемь цифр ревизии либо семь цифр и `+`
|
||||
при изменённых исходниках или общей библиотеке. При недоступном Git общий
|
||||
контракт 167 использует `NOGIT000`; для выпуска следует проверить ревизии
|
||||
`source` и `templates` в манифесте. Время паспорта хранится в UTC.
|
||||
Откройте `K:\git_project\28335_periph\UKSSTMS320F28335\firmware_identity.json`.
|
||||
Поле `templates` уже содержит рабочее значение:
|
||||
|
||||
Prebuild `prepare_identity.py` использует тот же генератор firmware-info,
|
||||
что 167, но product равен `Balsam-166-PM35`. Единственный источник версии —
|
||||
`firmware_version.h`; первый выпуск с паспортом имеет версию **1.0.0**.
|
||||
Обязательный `generated/firmware_identity.h` создаётся до компиляции.
|
||||
Postbuild `build_identity.py` использует hex2000 из выбранного компилятора
|
||||
CCS, общий манифест и SHA-256, затем независимо проверяет наличие ровно
|
||||
одного соответствующего 12-словного паспорта в SCI8. Старый OUT без паспорта
|
||||
или BIN с чужими полями не публикуется. Превышение границы параметров EEPROM
|
||||
**32508 байт** также останавливает выпуск. Архивы сохраняются локально в
|
||||
`UKSSTMS320F28335/Debug/firmware`; записи в репозиторий GUI нет.
|
||||
`"templates": "../../newProject/templates"`
|
||||
|
||||
`build_bin.bat` сохраняет ручную точку входа для уже скомпилированного OUT,
|
||||
но теперь также требует его совпадения с паспортом соответствующего prebuild.
|
||||
Простая конверсия старой прошивки не может создать ей достоверную версию.
|
||||
Карта линковки остаётся в корне 166, карта конверсии — в `166/Bin`.
|
||||
Путь отсчитывается **от папки файла firmware_identity.json**:
|
||||
два перехода `..` приводят в `K:\git_project`, затем `newProject/templates`
|
||||
приводит в `K:\git_project\newProject\templates`.
|
||||
Рабочая папка терминала и каталог Debug на этот расчёт не влияют.
|
||||
|
||||
Для этой машины допустима и абсолютная запись того же пути:
|
||||
|
||||
`"templates": "K:/git_project/newProject/templates"`
|
||||
|
||||
В JSON удобнее использовать `/`: обратный слеш пришлось бы удваивать.
|
||||
Указывайте корень полной библиотеки templates. Внутри должны существовать:
|
||||
|
||||
| Что использует сборка | Полный путь |
|
||||
|---|---|
|
||||
| Генерация паспорта до компиляции | `K:\git_project\newProject\templates\tools\firmware-build\ccs\precompile.bat` |
|
||||
| Конверсия после компиляции | `K:\git_project\newProject\templates\tools\firmware-build\ccs\postcompile.bat` |
|
||||
| Заголовки firmware-info | `K:\git_project\newProject\templates\c\firmware-info\include` |
|
||||
| Общий протокол | `K:\git_project\newProject\templates\c\set-protocol` |
|
||||
|
||||
В CCS → **Project Properties → Build → C2000 Compiler → Include Options**
|
||||
для Debug и Release используются следующие записи:
|
||||
|
||||
| Запись в CCS | Какой каталог она открывает |
|
||||
|---|---|
|
||||
| `${SRC_ROOT}/../newProject/templates/c/firmware-info/include` | `K:\git_project\newProject\templates\c\firmware-info\include` |
|
||||
| `${SRC_ROOT}/../newProject/templates/c/set-protocol` | `K:\git_project\newProject\templates\c\set-protocol` |
|
||||
| `${BuildDirectory}/generated` | `K:\git_project\28335_periph\UKSSTMS320F28335\Debug\generated` для Debug |
|
||||
|
||||
Если перенесли templates, измените **и поле JSON, и два include path в CCS**.
|
||||
Настройка JSON управляет сборочными сценариями; include paths компилятора
|
||||
сохраняются отдельно в `.cproject`.
|
||||
|
||||
## Импорт и запуск сборки в CCS
|
||||
|
||||
1. Выберите **Project → Import CCS Projects**.
|
||||
2. Укажите `K:\git_project\28335_periph\UKSSTMS320F28335`.
|
||||
3. Оставьте **Copy projects into workspace** выключенным: исходники и
|
||||
библиотеки подключены из соседних каталогов.
|
||||
4. Проверьте компилятор TI C2000 **22.6.0.LTS**, контроллер
|
||||
**TMS320F28335**, **FPU32**, **COFF ABI**. Python должен быть доступен
|
||||
командой `python`; Git используется для определения ревизии.
|
||||
5. Включите конфигурацию **Debug** и выполните **Build Project**.
|
||||
|
||||
Исходники находятся в `K:\git_project\28335_periph\Source`, linker-файл —
|
||||
`K:\git_project\28335_periph\F28335.cmd`. `28335_RAM_lnk.cmd` исключён
|
||||
из сборки. Debug создаёт OUT в `K:\git_project\28335_periph\Bin`.
|
||||
|
||||
## Команды Build Steps
|
||||
|
||||
В **Project Properties → Build → Steps** задайте команды для Debug и
|
||||
Release. Каждую команду вставляйте в соответствующее поле одной строкой.
|
||||
Макросы `${...}` подставляет CCS; вручную в обычном cmd они не раскрываются.
|
||||
|
||||
**Pre-build** — резервирует версию и создаёт заголовок и метаданные
|
||||
в `${BuildDirectory}/generated`:
|
||||
|
||||
`cmd /c call "${PROJECT_LOC}/firmware_build.bat" prepare --build-dir "${BuildDirectory}"`
|
||||
|
||||
**Post-build** — конвертирует OUT, проверяет встроенный паспорт,
|
||||
размер образа и SHA-256, затем сохраняет готовый комплект:
|
||||
|
||||
`cmd /c call "${PROJECT_LOC}/firmware_build.bat" build --compiler "${CG_TOOL_ROOT}" --build-dir "${BuildDirectory}" --artifact "${BuildArtifactFileBaseName}"`
|
||||
|
||||
После `--artifact` должен стоять только путь к OUT **без расширения .out**.
|
||||
Дополнительный путь последним аргументом вызовет `unrecognized arguments`.
|
||||
Каталог templates и каталог копирования задаются в JSON.
|
||||
|
||||
Для отдельного JSON добавьте `--config "полный/путь/firmware_identity.json"`
|
||||
в обе команды. Тогда относительные пути будут отсчитываться от этого JSON.
|
||||
|
||||
После изменения `.cproject` вне IDE закройте и снова откройте проект в CCS,
|
||||
проверьте Build Steps и запустите сборку. Файл
|
||||
`K:\git_project\28335_periph\UKSSTMS320F28335\Debug\makefile`
|
||||
генерируется CCS; постоянные исправления вносятся в настройки проекта.
|
||||
|
||||
## Где искать готовую прошивку
|
||||
|
||||
Основной каталог:
|
||||
|
||||
`K:\git_project\28335_periph\UKSSTMS320F28335\Debug\firmware`
|
||||
|
||||
В нём находятся `UKSSTMS320F28335_<build_id>.bin`, файл
|
||||
`<имя>.bin.manifest.json`, файл `<имя>.bin.sha256`, HEX, карты конверсии
|
||||
и архивные папки с ревизией и временем сборки.
|
||||
|
||||
Например, проверенный в этой сессии файл:
|
||||
|
||||
`K:\git_project\28335_periph\UKSSTMS320F28335\Debug\firmware\UKSSTMS320F28335_13f1a2c+.bin`
|
||||
|
||||
В окне выбора прошивки можно вставить полный путь в поле **«Имя файла»**.
|
||||
Для актуальной сборки берите путь из последней строки журнала
|
||||
`[firmware-build] Verified BIN: ...`.
|
||||
|
||||
Каталоги `.identity-release-...` из промежуточных строк журнала временные:
|
||||
после проверки их содержимое переносится в `Debug\firmware`, а временная
|
||||
папка удаляется.
|
||||
|
||||
Поле `"copy_to": "../Bin"` в JSON дополнительно копирует проверенные BIN,
|
||||
manifest, SHA-256, HEX и карту конверсии в `K:\git_project\28335_periph\Bin`.
|
||||
Для другого назначения укажите в `copy_to` реальный полный путь через `/`
|
||||
или путь относительно JSON. Если дополнительная копия не нужна, удалите
|
||||
это поле. Архивные папки остаются в `Debug\firmware`.
|
||||
|
||||
## Версия и проверки перед выпуском
|
||||
|
||||
| Поле в firmware_identity.json | Назначение |
|
||||
|---|---|
|
||||
| `product` | Идентификатор изделия, сейчас `Balsam-166-PM35`. |
|
||||
| `target` | Контроллер, сейчас `TMS320F28335`. |
|
||||
| `version` | Последний занятый номер `[major, minor, patch]`. |
|
||||
| `increment_version` | `true` увеличивает версию перед компиляцией; `false` оставляет ручную версию. |
|
||||
| `templates` | Корень общей библиотеки; путь относительно JSON или абсолютный. |
|
||||
| `max_image_bytes` | Предел полного SCI8 BIN, сейчас 32508 байт. |
|
||||
| `copy_to` | Необязательный дополнительный каталог проверенных файлов. |
|
||||
|
||||
При включённом итераторе каждый pre-build занимает следующий номер,
|
||||
включая попытки, после которых компиляция завершилась ошибкой. После patch
|
||||
999 увеличивается minor, после minor 255 — major; младшие поля обнуляются.
|
||||
После 255.255.999 сценарий выдаёт ошибку. Clean номер не сбрасывает.
|
||||
Одновременные сборки с одним JSON запускать нельзя.
|
||||
|
||||
Build ID состоит из восьми символов: восемь символов ревизии либо семь
|
||||
символов и `+` при изменениях исходников или templates. При недоступном Git
|
||||
используется `NOGIT000`; ревизии `source` и `templates` проверяйте в manifest.
|
||||
Время паспорта хранится в UTC.
|
||||
|
||||
Post-build требует совпадения OUT с метаданными pre-build, ровно одного
|
||||
12-словного паспорта в SCI8, корректных manifest и SHA-256. Ограничение
|
||||
32508 байт рассчитано как `(0x3FFF - 129) * 2`: это граница области
|
||||
параметров EEPROM данной платы. Неверный комплект проверку не проходит.
|
||||
|
||||
## Повторная конверсия готового OUT без компиляции
|
||||
|
||||
Запустите следующую команду в **cmd.exe**. Она использует существующие
|
||||
OUT и generated от одной компиляции и повторно проверяет их соответствие.
|
||||
Номер версии при этом не увеличивается.
|
||||
|
||||
```bat
|
||||
rem Конвертирует готовый Debug OUT штатным hex2000 из указанного компилятора, сохраняя проверки паспорта и SHA-256.
|
||||
call "K:\git_project\28335_periph\build_bin.bat" --compiler "C:/ti/ccs1230/ccs/tools/compiler/ti-cgt-c2000_22.6.0.LTS"
|
||||
```
|
||||
|
||||
Если изменены исходники, версия или паспорт, выполните обычную сборку
|
||||
в CCS, чтобы OUT и generated соответствовали друг другу.
|
||||
|
||||
## Перенос в другой проект C2000
|
||||
|
||||
Скопируйте `firmware_build.bat`, `build_identity.py` и
|
||||
`firmware_identity.json` из
|
||||
`K:\git_project\28335_periph\UKSSTMS320F28335` в каталог нового CCS-проекта.
|
||||
В JSON задайте изделие, контроллер, версию, реальный путь к полной
|
||||
библиотеке templates, предел памяти платы и при необходимости `copy_to`.
|
||||
Добавьте Build Steps из этой инструкции и include paths к выбранной
|
||||
библиотеке и `${BuildDirectory}/generated` в обе конфигурации CCS.
|
||||
|
||||
BAT и Python менять для переноса путей не требуется. BAT хранится в UTF-8
|
||||
без BOM с окончаниями CRLF. Подключение сборочных шагов не заменяет
|
||||
интеграцию firmware-info в код устройства; для C28x нужен порт с учётом
|
||||
16-битного `char`.
|
||||
|
||||
## Проверка прошивки в SetGUI
|
||||
|
||||
@@ -57,22 +202,21 @@ EEPROM, а версия начнёт читаться после запуска
|
||||
RS/CAN, все слова паспорта, CRC, частичные чтения, границы, запрет записи,
|
||||
сохранность старой карты и логгера. Отдельно проверяются устаревшие и
|
||||
повреждённые SCI8, предел EEPROM и действующий анализатор манифеста SetGUI.
|
||||
`python tests/firmware_identity/test_build_steps.py` проверяет перенос трёх
|
||||
файлов в другое изделие, увеличение версии в JSON, перенос разрядов,
|
||||
настоящий вызов BAT и общего precompile из постороннего рабочего каталога,
|
||||
пути с пробелами, копирование и остановку до публикации при неверном BIN
|
||||
или SHA-256.
|
||||
При заданной переменной окружения `C2000_COMPILER` (корень toolchain)
|
||||
этот же тест дополнительно компилирует минимальный C28x COFF и проходит
|
||||
настоящий postbuild через BAT, `hex2000`, проверку паспорта и копирование.
|
||||
Проверка 17.10.2026: post-build готового OUT выполнен с TI C2000 22.6.0.LTS;
|
||||
проверки встроенного паспорта и SHA-256 пройдены, комплект скопирован в Bin.
|
||||
SHA-256 основной и дополнительной копий BIN совпадает. Тест подключения
|
||||
BAT в конфигурациях Debug и Release пройден. Полная компиляция и проверка
|
||||
на физической плате в рамках этой проверки не выполнялись.
|
||||
|
||||
Проверено: импорт и полная сборка **Debug** в CCS **12.7.1** с компилятором
|
||||
**22.6.1.LTS**, включая генерацию HEX/BIN, завершились без ошибок.
|
||||
Есть шесть предупреждений в существующих `peripher.c` и `measure.c`
|
||||
(преобразование знака, выход результата за диапазон и отсутствие перевода
|
||||
строки в конце файла). Проверка на устройстве не выполнялась.
|
||||
|
||||
Перенос паспорта дополнительно проверен полной пересборкой и линковкой
|
||||
TI C2000 **22.6.0.LTS** и host-тестами под GCC с оптимизацией O3. Проверенный
|
||||
SCI8 BIN занимает **30248 байт**, запас до параметров EEPROM — **2260 байт**.
|
||||
Совпадение встроенного паспорта, манифеста и результата штатного анализатора
|
||||
SetGUI проверено программно; обмен новой прошивки с физической платой
|
||||
требует её установки и перезапуска.
|
||||
|
||||
Конфигурация **Release** перенесена из 167 без изменений и не проверялась;
|
||||
для сборки прошивки используйте **Debug**.
|
||||
Для рабочей сборки используйте Debug; Release требует отдельной проверки.
|
||||
|
||||
## Телеметрия CAN: heartbeat, изменения и повтор 1,3 с
|
||||
|
||||
|
||||
@@ -1,67 +1,142 @@
|
||||
"""Выпускает BIN 166 с проверяемым паспортом и SHA-256 по той же схеме, что 167.""" # Генерация версии выполняется отдельно до компиляции.
|
||||
import argparse # Разбирает пути текущей конфигурации CCS и компилятора TI.
|
||||
from datetime import datetime # Преобразует время UTC паспорта в те же шесть компонентов, что firmware-info v1.
|
||||
import json # Читает именно паспорт завершившейся компиляции.
|
||||
from pathlib import Path # Привязывает настройки и результаты к текущему проекту.
|
||||
import shutil # Находит компилятор и копирует только полностью проверенный выпуск.
|
||||
import struct # Проверяет 16-битные слова загрузочного SCI8 без исполнения кода прошивки.
|
||||
import sys # Подключает общий postbuild вместо копии конвертера из 167.
|
||||
import tempfile # Не публикует результаты конверсии, пока встроенный паспорт не прошёл проверку.
|
||||
ROOT = Path(__file__).resolve().parents[1] # Корень 166 содержит существующие Source и Bin.
|
||||
PROJECT = Path(__file__).resolve().parent # Конфигурации Debug/Release и заголовок версии находятся рядом со сценарием.
|
||||
TEMPLATES = ROOT.parent / "newProject/templates" # Использует ту же общую библиотеку firmware-info, что проект 167.
|
||||
def verify_embedded(image, metadata): # Не позволяет выдать новый манифест за паспорт старого OUT без встроенной версии.
|
||||
data = image.read_bytes() # Проверяет точные октеты, которые будут отправлены в плату.
|
||||
if data[:2] != b"\xaa\x08" or not 24 <= len(data) <= 32508: # SCI8 имеет ключ 0x08AA; граница параметров 166 равна (0x3FFF - 129) * 2 = 32508 байт.
|
||||
raise ValueError("SCI8 is invalid or overlaps the 166 parameter area at byte 32508") # Не допускает повреждения существующих параметров EEPROM.
|
||||
stamp = datetime.fromisoformat(metadata["built_at_utc"]) # Использует исходное время prebuild без подмены временем конверсии BIN.
|
||||
build_id = metadata["build_id"] # Ровно восемь ASCII-символов совпадают с четырьмя регистрами firmware-info v1.
|
||||
words = [1, *metadata["version"], stamp.year, stamp.month * 256 + stamp.day, stamp.hour * 256 + stamp.minute, stamp.second] # Восстанавливает первые восемь регистров независимо от C-упаковщика.
|
||||
words += [ord(build_id[i]) * 256 + ord(build_id[i + 1]) for i in range(0, 8, 2)] # Восстанавливает четыре слова Build ID в сетевом порядке символов.
|
||||
expected = struct.pack("<12H", *words) # Загрузочная таблица SCI8 хранит 16-битные слова C28x младшим октетом вперёд.
|
||||
offset, found = 22, 0 # Первые 22 октета заняты ключом, настройками и аппаратной точкой входа.
|
||||
while offset + 2 <= len(data): # Каждый шаг потребляет заголовок либо завершает конечный файл; ожидания аппаратуры нет.
|
||||
count, = struct.unpack_from("<H", data, offset) # Размер очередной секции задан в 16-битных словах C28x.
|
||||
offset += 2 # Переходит к адресу секции либо концу таблицы при нулевом размере.
|
||||
if not count: break # Нулевая секция завершает SCI8 и не содержит адреса назначения.
|
||||
end = offset + 4 + count * 2 # Четыре октета адреса не входят в проверяемую полезную нагрузку секции.
|
||||
if end > len(data): raise ValueError("Truncated SCI8 section") # Останавливает выпуск при выходе секции за фактический размер файла.
|
||||
payload = data[offset + 4:end] # Рассматривает загружаемые слова, а не случайное совпадение в заголовке.
|
||||
found += sum(payload[i:i + 24] == expected for i in range(0, len(payload) - 23, 2)) # Паспорт должен присутствовать один раз на границе слова C28x.
|
||||
offset = end # Переходит к следующей непересекающейся секции таблицы.
|
||||
if offset != len(data) or count or found != 1: # Запрещает хвосты, отсутствующий терминатор и манифест от другой компиляции.
|
||||
raise ValueError(f"SCI8 does not contain exactly one matching prebuild identity: {found}") # Требует полноценную пересборку вместо фиктивного подписания старого BIN.
|
||||
def find_compiler(): # Сохраняет возможность ручного запуска build_bin.bat без жёсткой привязки к одной версии CCS.
|
||||
executable = shutil.which("cl2000") or shutil.which("cl2000.exe") # Предпочитает компилятор среды текущего проекта, а не старый hex2000 рядом с BIN.
|
||||
if executable: return Path(executable).resolve().parents[1] # Возвращает корень toolchain с каталогом bin/hex2000.exe.
|
||||
installed = sorted(Path("C:/ti").glob("ccs*/ccs/tools/compiler/ti-cgt-c2000_*")) # Для установленного CCS использует только штатные каталоги TI.
|
||||
installed = [path for path in installed if (path / "bin/hex2000.exe").is_file()] # Не принимает неполную установку за пригодный конвертер.
|
||||
if not installed: raise FileNotFoundError("Pass --compiler with the C2000 toolchain root") # Явно останавливает ручной запуск без инструментов.
|
||||
return installed[-1] # Выбирает последнюю найденную установленную цепочку только при отсутствии заданной CCS версии.
|
||||
def build(compiler, build_dir, artifact): # Выполняет общий postbuild и локальную публикацию после проверки встроенной версии.
|
||||
sys.path.insert(0, str(TEMPLATES / "c/firmware-info/tools")) # Открывает общие identity.py и c2000_postbuild.py из той же зависимости, что 167.
|
||||
from c2000_postbuild import postbuild # Не копирует формат манифеста, архивирование и вычисление SHA-256.
|
||||
metadata_path = build_dir / "generated/firmware_identity.json" # Отсутствующий prebuild должен остановить выпуск вместо использования произвольной версии.
|
||||
metadata = json.loads(metadata_path.read_text(encoding="utf-8")) # Читает JSON, по которому компилятор получил firmware_identity.h.
|
||||
if metadata.get("product") != "Balsam-166-PM35" or metadata.get("target") != "TMS320F28335": raise ValueError("Run the 166 prebuild before publishing this image") # Старый generated от ветки 167 не должен выдавать её product за паспорт 166.
|
||||
output = build_dir / "firmware" # Сохраняет прежнюю для 167 структуру локального каталога выпусков.
|
||||
with tempfile.TemporaryDirectory(prefix=".identity-release-", dir=build_dir) as directory: # Непроверенные BIN и manifest существуют только во временном каталоге текущего вызова.
|
||||
stage = Path(directory); staged_image = postbuild(compiler, build_dir, artifact, metadata_path, stage) # Общий код создаёт HEX, BIN, SHA-256 и архив, пока не доступные как готовый выпуск.
|
||||
verify_embedded(staged_image, metadata) # Не переносит в firmware или Bin результаты от старого OUT либо другой компиляции.
|
||||
output.mkdir(parents=True, exist_ok=True) # Создаёт каталог публикации только после успешной проверки.
|
||||
for item in stage.iterdir(): # Сохраняет только результаты этого вызова, не сканируя старые выпуски.
|
||||
if item.is_dir(): shutil.copytree(item, output / item.name, dirs_exist_ok=True) # Публикует полный архив проверенной сборки.
|
||||
else: shutil.copy2(item, output / item.name) # Переносит плоские HEX/BIN и контрольные файлы без подмены других исходников.
|
||||
image = output / staged_image.name # После удаления временного каталога возвращает постоянный путь проверенного BIN.
|
||||
for file in (image, image.with_suffix(".bin.manifest.json"), image.with_suffix(".bin.sha256"), image.parent / (image.stem.rsplit("_", 1)[0] + ".hex")): # Сохраняет рядом проверенный BIN, его контрольные файлы и прежний Intel HEX для CCS.
|
||||
shutil.copy2(file, ROOT / "Bin" / file.name) # Основной каталог получает только результат успешной текущей сборки.
|
||||
shutil.copy2(image.parent / (image.stem.rsplit("_", 1)[0] + ".hex.map"), ROOT / "Bin/UKSSTMS320F28335.map") # Согласовывает прежнюю основную карту конверсии с новым HEX и OUT.
|
||||
print(ROOT / "Bin" / image.name) # Показывает конкретный BIN, который нужно выбрать в SetGUI вместе с лежащим рядом манифестом.
|
||||
return image # Позволяет тестам проверить результат без поиска случайного старого файла.
|
||||
if __name__ == "__main__": # Импорт проверки SCI8 не выполняет сборку или публикацию файлов.
|
||||
parser = argparse.ArgumentParser(description=__doc__) # Описывает контракт запуска из CCS и build_bin.bat.
|
||||
parser.add_argument("--compiler", type=Path) # CCS передаёт CG_TOOL_ROOT; ручной вызов может использовать обнаружение установленного компилятора.
|
||||
parser.add_argument("--build-dir", type=Path, default=PROJECT / "Debug") # Изолирует паспорт и архив выбранной конфигурации.
|
||||
parser.add_argument("--artifact", default=str(ROOT / "Bin/UKSSTMS320F28335")) # Общий postbuild ожидает полный путь OUT без расширения.
|
||||
args = parser.parse_args() # Проверяет параметры до выполнения конверсии.
|
||||
build((args.compiler or find_compiler()).resolve(), args.build_dir.resolve(), args.artifact) # Публикует только образ, соответствующий своему встроенному паспорту.
|
||||
"""Подготавливает версию и выпускает проверенный C2000 SCI8 по настройкам JSON.""" # Один переносимый сценарий обслуживает оба шага CCS через BAT.
|
||||
import argparse # Разбирает команды prepare и build без зависимости от установленной IDE.
|
||||
from datetime import datetime # Восстанавливает регистры даты из времени UTC, зафиксированного до компиляции.
|
||||
import hashlib # Проверяет SHA-256 точных байтов BIN перед переносом в постоянные каталоги.
|
||||
import json # Хранит изделие, счётчик версии, пути и предел EEPROM в одном проектном файле.
|
||||
from pathlib import Path # Разрешает относительные пути от JSON, а не от рабочего каталога CCS.
|
||||
import shutil # Переносит только прошедшие проверку файлы текущей сборки.
|
||||
import struct # Читает загрузочные секции SCI8 как 16-битные слова C28x.
|
||||
import subprocess # Запускает публичные BAT общей библиотеки и передаёт ошибки вызывающей сборке.
|
||||
import tempfile # Изолирует конверсию и обеспечивает атомарную замену файла счётчика.
|
||||
|
||||
|
||||
def read_settings(config): # Проверяет настройки до изменения счётчика и запуска общих шагов.
|
||||
settings = json.loads(config.read_text(encoding="utf-8-sig")) # Поддерживает UTF-8 как с BOM, так и без него.
|
||||
version = settings.get("version") # Единственным сохраняемым источником версии является проектный JSON.
|
||||
if not isinstance(version, list) or len(version) != 3 or any(type(value) is not int or not 0 <= value <= limit for value, limit in zip(version, (255, 255, 999))): # Контракт firmware-info v1 допускает major/minor 0..255 и patch 0..999.
|
||||
raise ValueError("version must be [major 0..255, minor 0..255, patch 0..999]") # Не допускает неверную версию в счётчик или заголовок компилятора.
|
||||
for field in ("product", "target", "templates"): # Требует идентификацию изделия и явно выбранную общую библиотеку.
|
||||
if not isinstance(settings.get(field), str) or not settings[field].strip(): # Не принимает отсутствующее или пустое значение за пригодную настройку.
|
||||
raise ValueError(f"missing {field} in {config}") # Указывает поле, которое нужно заполнить при переносе проекта.
|
||||
if type(settings.get("increment_version", False)) is not bool: # Переключатель итератора допускает только настоящие JSON true/false.
|
||||
raise ValueError("increment_version must be true or false") # Не трактует строку false как включённый счётчик Python.
|
||||
limit = settings.get("max_image_bytes") # Предел образа задаёт плата; отсутствие поля отключает только ограничение размера.
|
||||
if limit is not None and (type(limit) is not int or limit < 24): # Минимальная таблица SCI8 занимает 22 байта заголовка и два байта терминатора.
|
||||
raise ValueError("max_image_bytes must be an integer >= 24") # Не принимает отрицательный либо дробный размер EEPROM.
|
||||
if "copy_to" in settings and (not isinstance(settings["copy_to"], str) or not settings["copy_to"].strip()): # Дополнительный каталог копирования должен быть явно задан непустым путём.
|
||||
raise ValueError("copy_to must be a nonempty path or omitted") # Для отключения копирования достаточно удалить поле из JSON.
|
||||
return settings # Возвращает проверенные настройки без скрытых значений конкретного изделия.
|
||||
|
||||
|
||||
def config_path(config, value): # Делает размещение templates и дополнительного выпуска независимым от текущего каталога.
|
||||
return (config.parent / value).resolve() # Абсолютный путь остаётся абсолютным, относительный отсчитывается от JSON.
|
||||
|
||||
|
||||
def next_version(version): # Вычисляет следующий номер по пределам общего контракта паспорта.
|
||||
result = list(version) # Не меняет исходные настройки до успешной проверки переполнения.
|
||||
for index, limit in ((2, 999), (1, 255), (0, 255)): # Переносит единицу из patch в minor, затем в major.
|
||||
if result[index] < limit: # Увеличивает первое поле, ещё не достигшее своего предела.
|
||||
result[index] += 1 # Резервирует один следующий номер для очередного запуска prebuild.
|
||||
return result # Старшие поля сохраняются, младшие уже обнулены при переносе.
|
||||
result[index] = 0 # Сбрасывает переполненное поле перед увеличением следующего.
|
||||
raise ValueError("Firmware version exhausted at 255.255.999") # Запрещает повторное использование номеров после полного переполнения.
|
||||
|
||||
|
||||
def prepare(config, build_dir): # Увеличивает сохраняемую версию и вызывает штатный precompile templates.
|
||||
settings = read_settings(config) # Сначала проверяет настройки, чтобы ошибочный JSON не занимал номер сборки.
|
||||
script = config_path(config, settings["templates"]) / "tools/firmware-build/ccs/precompile.bat" # Выбирает публичную точку входа общей зависимости из JSON.
|
||||
if not script.is_file(): raise FileNotFoundError(script) # Отсутствие templates останавливает шаг до изменения счётчика.
|
||||
if settings.get("increment_version", False): # Проект включает автоматический итератор явным флагом в JSON.
|
||||
settings["version"] = next_version(settings["version"]) # Получает следующий номер без отдельного C-заголовка.
|
||||
with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="\n", dir=config.parent, prefix=".firmware-version-", delete=False) as stream: # Создаёт UTF-8 файл на том же диске для атомарной замены настроек.
|
||||
temporary = Path(stream.name) # Запоминает только собственный временный файл для очистки при отказе.
|
||||
try: stream.write(json.dumps(settings, ensure_ascii=False, indent=2) + "\n") # Сохраняет все поля проекта вместе с новым номером версии.
|
||||
except BaseException: stream.close(); temporary.unlink(); raise # При ошибке записи сохраняет исходный JSON и удаляет незавершённый файл.
|
||||
try: temporary.replace(config) # Фиксирует занятый номер до запуска генератора и компилятора.
|
||||
finally: temporary.unlink(missing_ok=True) # Не оставляет временный файл при отказе замены конфигурации.
|
||||
output = build_dir / "generated" # Каждая конфигурация CCS получает отдельные заголовок и метаданные.
|
||||
subprocess.run(["cmd.exe", "/d", "/c", "call", str(script), "--identity", str(config.parent), str(config), str(output)], check=True) # Общий precompile создаёт заголовок, UTC и Git-метаданные; ошибка останавливает сборку.
|
||||
return json.loads((output / "firmware_identity.json").read_text(encoding="utf-8")) # Возвращает фактический паспорт без повторного вычисления времени или Build ID.
|
||||
|
||||
|
||||
def verify_embedded(image, metadata, max_image_bytes=None): # Проверяет общий паспорт firmware-info v1 независимо от имени платы и проекта.
|
||||
data = image.read_bytes() # Проверяет именно октеты транспортного BIN, предназначенного для загрузки.
|
||||
if data[:2] != b"\xaa\x08" or len(data) < 24: # Ключ загрузчика C2000 SCI8 равен 0x08AA; минимальная таблица содержит терминатор.
|
||||
raise ValueError("Invalid SCI8 header or missing terminator") # Не допускает выпуск произвольного файла под видом загрузочного BIN.
|
||||
if max_image_bytes is not None and len(data) > max_image_bytes: # Сравнивает размер в байтах с пределом из настроек конкретной платы.
|
||||
raise ValueError(f"SCI8 exceeds max_image_bytes={max_image_bytes}") # Сохраняет защиту области параметров EEPROM при переносе между изделиями.
|
||||
stamp = datetime.fromisoformat(metadata["built_at_utc"]) # Берёт время именно того prebuild, который подготовил заголовок.
|
||||
build_id = metadata["build_id"] # Восемь ASCII-символов занимают четыре регистра контракта.
|
||||
words = [1, *metadata["version"], stamp.year, stamp.month * 256 + stamp.day, stamp.hour * 256 + stamp.minute, stamp.second] # Восстанавливает первые восемь регистров; множитель 256 упаковывает два октета в слово.
|
||||
words += [ord(build_id[index]) * 256 + ord(build_id[index + 1]) for index in range(0, 8, 2)] # Упаковывает символы Build ID в том же сетевом порядке, что обработчик устройства.
|
||||
expected = struct.pack("<12H", *words) # SCI8 хранит двенадцать 16-битных регистров младшим октетом вперёд.
|
||||
offset, found = 22, 0 # Пропускает 22 байта ключа, настроек загрузчика и точки входа C2000.
|
||||
while offset + 2 <= len(data): # Обрабатывает конечную таблицу без чтения за пределами BIN.
|
||||
count, = struct.unpack_from("<H", data, offset) # Размер секции задан количеством 16-битных слов.
|
||||
offset += 2 # Пропускает поле размера перед адресом секции или терминатором.
|
||||
if not count: break # Нулевая длина завершает таблицу и не содержит адреса назначения.
|
||||
end = offset + 4 + count * 2 # После четырёх байтов адреса идут count слов полезной нагрузки.
|
||||
if end > len(data): raise ValueError("Truncated SCI8 section") # Не принимает усечённую секцию даже при совпавшем паспорте в её начале.
|
||||
payload = data[offset + 4:end] # Проверяет только загружаемые слова, исключая адресные поля.
|
||||
found += sum(payload[index:index + 24] == expected for index in range(0, len(payload) - 23, 2)) # Ищет паспорт из 24 байтов только на границе слова C28x.
|
||||
offset = end # Переходит к следующей непересекающейся секции.
|
||||
if offset != len(data) or count or found != 1: # Требует терминатор в конце файла и ровно один паспорт текущей компиляции.
|
||||
raise ValueError(f"SCI8 does not contain exactly one matching prebuild identity: {found}") # Отклоняет старый OUT, чужую версию, дубликат и лишний хвост.
|
||||
|
||||
|
||||
def verify_package(image, metadata): # Проверяет согласованность BIN и контрольных файлов до публикации.
|
||||
manifest = json.loads(image.with_suffix(".bin.manifest.json").read_text(encoding="utf-8")) # Читает manifest, созданный общим postcompile для текущего файла.
|
||||
data = image.read_bytes() # Вычисляет контрольные значения по точным байтам результата конверсии.
|
||||
digest = hashlib.sha256(data).hexdigest() # SHA-256 служит проверкой целостности конкретного транспортного файла.
|
||||
if manifest.get("file") != image.name or manifest.get("size_bytes") != len(data) or manifest.get("sha256") != digest: # Связывает имя, размер и содержимое BIN с manifest.
|
||||
raise ValueError("BIN does not match its manifest") # Не переносит повреждённый выпуск в постоянный каталог.
|
||||
if any(manifest.get(field) != metadata[field] for field in ("product", "target", "version", "build_id", "built_at_utc")): # Проверяет, что manifest относится к тому же паспорту prebuild.
|
||||
raise ValueError("Manifest does not match prebuild identity") # Запрещает контрольные файлы от другой сборки.
|
||||
if image.with_suffix(".bin.sha256").read_text(encoding="utf-8").strip() != f"{digest} {image.name}": # Общий формат SHA-256 содержит хеш и точное имя BIN через два пробела.
|
||||
raise ValueError("Invalid BIN SHA-256 sidecar") # Не допускает рассогласованный комплект файлов для загрузки.
|
||||
|
||||
|
||||
def build(compiler, build_dir, artifact, config): # Конвертирует OUT общей библиотекой и публикует только проверенную сборку.
|
||||
settings = read_settings(config) # Берёт ограничения и пути из того же JSON, что использовался перед компиляцией.
|
||||
script = config_path(config, settings["templates"]) / "tools/firmware-build/ccs/postcompile.bat" # Не содержит пути к конкретному репозиторию templates.
|
||||
metadata_path = build_dir / "generated/firmware_identity.json" # Выбирает паспорт текущей конфигурации Debug или Release.
|
||||
metadata = json.loads(metadata_path.read_text(encoding="utf-8")) # Отсутствующий prebuild останавливает выпуск до конверсии.
|
||||
if any(metadata.get(field) != settings[field] for field in ("product", "target", "version")): # Сравнивает изделие, контроллер и сохраняемую версию с текущей конфигурацией.
|
||||
raise ValueError("Configuration changed: run prebuild and rebuild before publishing") # Не выпускает старый OUT после изменения настроек или версии.
|
||||
output = build_dir / "firmware" # Сохраняет стандартную структуру templates внутри BuildDirectory.
|
||||
with tempfile.TemporaryDirectory(prefix=".identity-release-", dir=build_dir) as directory: # Все результаты до проверки остаются во временном каталоге этой сборки.
|
||||
stage = Path(directory) # Изолирует новые результаты от предыдущих архивов и каталога копирования.
|
||||
subprocess.run(["cmd.exe", "/d", "/c", "call", str(script), "--identity", str(compiler), str(build_dir), artifact, str(metadata_path), str(stage)], check=True) # Общий BAT формирует SCI8, manifest, SHA-256 и архив; ненулевой код прерывает выпуск.
|
||||
staged_image = stage / (Path(artifact).name + "_" + metadata["build_id"] + ".bin") # Находит текущий BIN без поиска по времени среди старых файлов.
|
||||
verify_embedded(staged_image, metadata, settings.get("max_image_bytes")) # Проверяет паспорт и проектный предел EEPROM перед постоянной публикацией.
|
||||
verify_package(staged_image, metadata) # Проверяет SHA-256 и соответствие сопроводительных файлов до копирования.
|
||||
output.mkdir(parents=True, exist_ok=True) # Создаёт постоянный каталог только после успешной проверки комплекта.
|
||||
for item in stage.iterdir(): # Переносит результаты только этого вызова общего postcompile.
|
||||
if item.is_dir(): shutil.copytree(item, output / item.name, dirs_exist_ok=True) # Сохраняет полный архив текущей сборки, не удаляя предыдущие.
|
||||
else: shutil.copy2(item, output / item.name) # Сохраняет плоские HEX, BIN, карты и контрольные файлы.
|
||||
image = output / staged_image.name # Возвращает постоянный путь после удаления временного каталога.
|
||||
if "copy_to" in settings: # Копирование в прежний Bin включается только настройкой конкретного проекта.
|
||||
destination = config_path(config, settings["copy_to"]) # Разрешает дополнительный каталог относительно JSON без привязки к имени репозитория.
|
||||
destination.mkdir(parents=True, exist_ok=True) # Позволяет перенести проект в ещё не созданную папку выпусков.
|
||||
for file in (image, image.with_suffix(".bin.manifest.json"), image.with_suffix(".bin.sha256"), output / (Path(artifact).name + ".hex")): # Копирует проверенный комплект, сохраняя прежние имена потребителей BIN и HEX.
|
||||
if file.resolve() != destination / file.name: shutil.copy2(file, destination / file.name) # Допускает совпадение дополнительной папки с firmware без копирования файла в себя.
|
||||
shutil.copy2(output / (Path(artifact).name + ".hex.map"), destination / (Path(artifact).name + ".map")) # Поддерживает старое имя карты конверсии без зашитого имени изделия.
|
||||
verify_package(destination / image.name, metadata) # Подтверждает целостность также скопированного BIN и его контрольных файлов.
|
||||
print(f"[firmware-build] Verified BIN: {image}") # Показывает пользователю точный файл проверенной сборки.
|
||||
return image # Даёт тестам и ручным средствам явный результат без сканирования каталогов.
|
||||
|
||||
|
||||
if __name__ == "__main__": # Импорт из тестов не запускает счётчик или конверсию.
|
||||
parser = argparse.ArgumentParser(description=__doc__) # Объясняет назначение переносимого сценария при вызове через BAT.
|
||||
commands = parser.add_subparsers(dest="command", required=True) # Разделяет prebuild и postbuild явными командами.
|
||||
for command in ("prepare", "build"): # Оба шага принимают одинаковые настройки и BuildDirectory.
|
||||
step = commands.add_parser(command) # Создаёт независимый интерфейс выбранного шага сборки.
|
||||
step.add_argument("--config", type=Path, default=Path(__file__).with_name("firmware_identity.json")) # По умолчанию читает JSON рядом со скриптом; другой путь можно передать явно.
|
||||
step.add_argument("--build-dir", type=Path, required=True) # CCS выбирает отдельную папку для каждой конфигурации.
|
||||
if command == "build": # Компилятор и имя OUT требуются только после компиляции.
|
||||
step.add_argument("--compiler", type=Path, required=True) # Получает CG_TOOL_ROOT без поиска конкретной установки CCS.
|
||||
step.add_argument("--artifact", required=True) # Получает BuildArtifactFileBaseName без расширения OUT и без изменения пути.
|
||||
args = parser.parse_args() # Проверяет обязательные параметры до изменения файлов.
|
||||
config, build_dir = args.config.resolve(), args.build_dir.resolve() # Нормализует пути до передачи BAT, независимо от текущего каталога.
|
||||
if args.command == "prepare": print(json.dumps(prepare(config, build_dir), ensure_ascii=False)) # Показывает фактическую версию и метаданные текущего prebuild.
|
||||
else: build(args.compiler.resolve(), build_dir, args.artifact, config) # Запускает конверсию и обязательные проверки готового образа.
|
||||
|
||||
8
UKSSTMS320F28335/firmware_build.bat
Normal file
8
UKSSTMS320F28335/firmware_build.bat
Normal file
@@ -0,0 +1,8 @@
|
||||
@rem Запускает переносимый Python-сценарий рядом с BAT, независимо от текущего каталога CCS.
|
||||
@echo off
|
||||
rem Ограничивает изменения окружения текущим вызовом и запрещает раскрытие восклицательных знаков в путях.
|
||||
setlocal EnableExtensions DisableDelayedExpansion
|
||||
rem Передаёт команду prepare или build и все аргументы без привязки к изделию, расположению templates или версии CCS.
|
||||
python "%~dp0build_identity.py" %*
|
||||
rem Возвращает CCS код Python: ошибка генерации или проверки BIN должна остановить сборку.
|
||||
exit /b %errorlevel%
|
||||
@@ -1,4 +1,13 @@
|
||||
{
|
||||
"product": "Balsam-166-PM35",
|
||||
"target": "TMS320F28335"
|
||||
"target": "TMS320F28335",
|
||||
"version": [
|
||||
1,
|
||||
0,
|
||||
4
|
||||
],
|
||||
"increment_version": true,
|
||||
"templates": "../../newProject/templates",
|
||||
"max_image_bytes": 32508,
|
||||
"copy_to": "../Bin"
|
||||
}
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef BALSAM_FIRMWARE_VERSION_H /* Защищает единственный источник версии продукта 166 от повторного включения. */
|
||||
#define BALSAM_FIRMWARE_VERSION_H /* Отделяет номер версии приложения от версии логгера и контракта паспорта. */
|
||||
#define FIRMWARE_VERSION_MAJOR 1U /* Первая версия 166 с читаемым паспортом; это версия продукта, а не заимствованный номер прошивки 167. */
|
||||
#define FIRMWARE_VERSION_MINOR 0U /* Нулевая минорная версия начинает самостоятельную линию выпусков Balsam-166-PM35. */
|
||||
#define FIRMWARE_VERSION_PATCH 0U /* Нулевой номер исправления меняется при следующем выпуске продукта. */
|
||||
#endif /* Генератор читает эти три определения перед компиляцией и помещает их в паспорт BIN. */
|
||||
@@ -2,7 +2,7 @@
|
||||
@echo off
|
||||
rem Сохраняет локальность настроек процесса конвертации.
|
||||
setlocal
|
||||
rem Сценарий сам находит Debug и проверяет его generated/firmware_identity.json; старые служебные аргументы CCS здесь не нужны.
|
||||
python "%~dp0build_identity.py"
|
||||
rem Совместимый ручной вызов использует build_bin.bat; --compiler указывает toolchain, создавший OUT.
|
||||
call "%~dp0..\build_bin.bat" %*
|
||||
rem Возвращает ошибку при старом OUT, отсутствующем паспорте либо превышении области параметров.
|
||||
exit /b %errorlevel%
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
"""Подготавливает паспорт 166 тем же генератором firmware-info, что используется в 167.""" # Версия, время UTC и ревизии фиксируются до компиляции.
|
||||
import argparse # Разбирает одинаковые с проектом 167 пути prebuild.
|
||||
import importlib.util # Подключает общую реализацию без копирования генератора в прошивку.
|
||||
import json # Объединяет идентификаторы продукта с версией из C-заголовка.
|
||||
from pathlib import Path # Нормализует пути независимо от рабочего каталога CCS.
|
||||
import re # Проверяет единственное допустимое целое определение каждого компонента версии.
|
||||
import tempfile # Хранит объединённые настройки только на время вызова общего генератора.
|
||||
def read_version(header): # Сохраняет правила исходного адаптера 167 и ограничения firmware-info v1.
|
||||
text = re.sub(r"/\*.*?\*/|//[^\n]*", "", header.read_text(encoding="utf-8-sig"), flags=re.S) # Не принимает комментарии или примеры за действующую версию.
|
||||
result = [] # Накапливает major, minor и patch в порядке регистров контракта.
|
||||
for part, limit in (("MAJOR", 255), ("MINOR", 255), ("PATCH", 999)): # Два первых компонента ограничены октетом, исправление допускает 0..999.
|
||||
name = "FIRMWARE_VERSION_" + part # Использует тот же интерфейс заголовка версии, что 167.
|
||||
definitions = re.findall(r"^\s*#\s*define\s+" + name + r"\b([^\n]*)", text, re.M) # Требует единственного определения без условных альтернатив.
|
||||
if len(definitions) != 1 or not re.fullmatch(r"(?:0|[1-9][0-9]*)[uU]?", definitions[0].strip()): # Не допускает выражений, шестнадцатеричных литералов и неоднозначной версии.
|
||||
raise ValueError(f"{header}: define {name} exactly once as a decimal integer") # Останавливает сборку вместо выпуска ложного паспорта.
|
||||
value = int(definitions[0].strip().rstrip("uU")) # Суффикс C не является частью десятичного числа Python.
|
||||
if value > limit: # Проверяет границы до записи какого-либо заголовка сборки.
|
||||
raise ValueError(f"{name} must be in 0..{limit}") # Сохраняет ограничения отображения и Modbus-контракта 167.
|
||||
result.append(value) # Записывает проверенную компоненту в правильное поле паспорта.
|
||||
return result # Номер версии формируется только из firmware_version.h.
|
||||
def prepare(project, templates, output): # Генерирует заголовок и JSON для одной конкретной конфигурации CCS.
|
||||
settings = json.loads((project / "firmware_identity.json").read_text(encoding="utf-8-sig")) # Сохраняет собственный product 166 и тот же target TMS320F28335.
|
||||
settings["version"] = read_version(project / "firmware_version.h") # Не дублирует SemVer в двух редактируемых файлах.
|
||||
spec = importlib.util.spec_from_file_location("shared_firmware_identity", templates / "c/firmware-info/tools/identity.py") # Берёт проверенную общую реализацию из той же зависимости, что 167.
|
||||
identity = importlib.util.module_from_spec(spec) # Создаёт изолированный модуль генератора без изменения системного Python.
|
||||
spec.loader.exec_module(identity) # Загружает формат заголовка, UTC и правила формирования Build ID.
|
||||
with tempfile.TemporaryDirectory(prefix="balsam166-identity-") as directory: # Удаляет только временные объединённые настройки этого вызова.
|
||||
config = Path(directory) / "settings.json" # Настройки не записываются в исходники и не попадают в историю Git.
|
||||
config.write_text(json.dumps(settings), encoding="utf-8") # Передаёт общему генератору проверенную версию и product.
|
||||
return identity.prepare(project, templates, config, output) # Создаёт обязательные generated/firmware_identity.h и JSON до компиляции.
|
||||
if __name__ == "__main__": # Импорт из теста не запускает изменение файлов сборки.
|
||||
parser = argparse.ArgumentParser(description=__doc__) # Объясняет назначение prebuild при ручном вызове.
|
||||
for name in ("project", "templates", "output"): parser.add_argument("--" + name, type=Path, required=True) # Совместим с параметрами prebuild исходного проекта 167.
|
||||
args = parser.parse_args() # Проверяет обязательные каталоги перед генерацией.
|
||||
print(json.dumps(prepare(args.project.resolve(), args.templates.resolve(), args.output.resolve()))) # Показывает фактическую идентичность текущей сборки.
|
||||
@@ -2,7 +2,7 @@
|
||||
@echo off
|
||||
rem Ограничивает переменные окружения этим вызовом и не меняет настройки пользователя.
|
||||
setlocal
|
||||
rem Общий проектный postbuild создаёт BIN, manifest, SHA-256 и проверяет слова паспорта до публикации.
|
||||
python "%~dp0UKSSTMS320F28335\build_identity.py" %*
|
||||
rem Использует общий BAT проекта; путь компилятора передаётся явно через --compiler, остальные аргументы можно переопределить.
|
||||
call "%~dp0UKSSTMS320F28335\firmware_build.bat" build --build-dir "%~dp0UKSSTMS320F28335\Debug" --artifact "%~dp0Bin\UKSSTMS320F28335" %*
|
||||
rem Передаёт вызывающему процессу фактическую ошибку проверки или конверсии.
|
||||
exit /b %errorlevel%
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user