Jump to content

    

Вячик13

Участник
  • Content Count

    73
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Вячик13

  • Rank
    Участник

Recent Profile Visitors

1107 profile views
  1. Исключено. При старте происходит проверка контрольных сумм каждой из копий таблицы на соответствие. При несовпадении контрольной суммы одной из копий она автоматически восстанавливается из второй целой копии. При несовпадении контрольных сумм обеих копий таблицы они прописываются по умолчанию, естественно с защитой каждой контрольной суммой. Текст настройки IWDG чистая формальность, поскольку я записываю в регистры настройки величины которые там и так устанавливаются по умолчанию после включения питания. Запись в регистр IWDG_KR согласно документации производится исключительно в виде байта, а не отдельных бит.
  2. Имеется кристалл low_density STM8S003F3PB, проект под IAR EW for STM8 3.11.1. В проекте имеется подпрограмма записи в EEPROM: __no_init union Parameter ParameterArray[PARAMETER_NUMBER+1]; //Массив для хранения параметров __no_init unsigned char FirstEEPROMBlock[0x40] @ 0x004000; __no_init unsigned char SecondEEPROMBlock[0x40] @ 0x004040; if(WriteEEPROMTables==true) { //Запись нового параметра в EEPROM EEPROM_WriteParam((unsigned char *)&FirstEEPROMBlock); //Запись первого блока параметров EEPROM_WriteParam((unsigned char *)&SecondEEPROMBlock); //Запись второго блока параметров } WriteEEPROMTables=false; void EEPROM_WriteParam(unsigned char *EEPROMBlockAddress) { unsigned char Index; unsigned char *Sorces; __disable_interrupt(); if(FLASH_IAPSR_bit.DUL==0) { FLASH_DUKR=0xAE; //Разблокирование EEPROM для записи FLASH_DUKR=0x56; } while(FLASH_IAPSR_bit.DUL==0); for(Index=0,Sorces=(unsigned char *)&ParameterArray;Index<PARAMETER_NUMBER*4+2;Index++) *EEPROMBlockAddress++=*Sorces++; FLASH_IAPSR_bit.DUL=0; //Блокирование EEPROM __enable_interrupt(); } Странности: 1. Пока есть питание, всё работает. В EEPROM пишется, в отладчике видно. При "горячем" сбросе программы всё сохраняется. После выключения и включения питания по адресу EEPROM произвольные значения. Такое впечатление, что на этом месте обычное ОЗУ. Кстати, проверять бит EOP пробовал - не помогает. 2. Запись в EEPROM нормально выполняется только при отключенном IWDG. При включенном, несмотря на то, что сбрасывал IWDG после записи каждого байта в цикле записи в EEPROM, несмотря на то, что пытался выставить период на максимум (2 секунды), запись не выполняется. Вынужден был устанавливать специальный бит и "заклинить" IWDG для принудительного программного сброса для записи в EEPROM до включения IWDG. Настройка IWDG и его сброс ниже. /* Определения для независимого WDT */ #define IWDG_KEY_ACCESS 0x55 #define IWDG_KEY_RELOAD 0xAA #define IWDG_KEY_ENABLE 0xCC IWDG_KR=IWDG_KEY_ACCESS; //Установка предделителя IWDG IWDG_PR_bit.PR=1; IWDG_KR=IWDG_KEY_ACCESS; //Установка регистра загрузки IWDG IWDG_RLR=0xFF; //Время срабатывания IWDG от 31,9 мс при 128 кГц IWDG_KR=IWDG_KEY_ENABLE; __enable_interrupt(); for(;;) { //Главный бесконечный цикл ... IWDG_KR=IWDG_KEY_RELOAD; //Рестарт WDT } Заранее благодарю за любые подсказки.
  3. Спасибо, за поздравление. Наконец то оценили. А то с 1983 года, когда я сделал свой первый проект на К1-20 никто ни одного доброго словечка!
  4. Нет, не лень. И могу читать даже в оригинале. Но, знаете, как в известном анекдоте про немого мальчика: "А раньше я не разговаривал, потому что всё было в порядке". Представьте себе, за 20 проектов у меня не возникало даже потребности в каких-либо ловушках, поскольку всё работало нормально.
  5. Тогда проконсультируйте, пожалуйста, как. Я в Keile этого никогда не делал. Где это находится?
  6. Спасибо, но вряд ли. Если это аппаратный сброс, то в любом случае должна была сработать подпрограмма тестирования индикаторов. А она гоняет по индикатору "палочки", а затем отображает дату и версию программы. я бы это увидел. В период наблюдения явления на площадке ещё шли монтажные работы и ничего такого не включалось
  7. Проверил. Самое подозрительное: memset(Display->Code,'\0',strlen((char *)Display->Code)); //Очистка кодовой строки где Display->Code указатель на массив байт (unsigned char *). Остальные memset все просты и явны. Может быть функция strlen(), а тем более с аргументом-указателем на член структуры может глючить? Хотя в аналогичных проектах всё это работает безукоризненно.
  8. Нет. Во-первых в данной системе нет интенсивных прерываний: 1) системные часы (каждую миллисекунду); 2) АЦП - 1 раз в 10 миллисекунд; 3) КПДП передатчика SPI (каждую миллисекунду); 4) 2 прерывания UART (не работали, поскольку не было компьютера верхнего уровня). Во-вторых, как я уже писал, аналогичная система и в других проектах (даже есть более нагруженные).
  9. Обнуляются все статические переменные (по крайней мере я проверил 7-8 разного типа). А какая может быть ошибка чтобы выйти на инициализирующий сброс статических переменных?
  10. Имеется устройство на базе микроконтроллера STM32F100RC. Для него разработано программное обеспечение под Keil 4.22a: Total RO Size (Code + RO Data) 76796 ( 75.00kB) Total RW Size (RW Data + ZI Data) 7776 ( 7.59kB) Total ROM Size (Code + RO Data + RW Data) 76944 ( 75.14kB) Устройство (весовой терминал ротационных промышленных весов) установлено на промышленном объекте у заказчика в количестве 3 штук. Наблюдается следующий эффект. Через произвольное время (от 3 до 30 минут) происходит сброс программы. Причём сброс странный. Статические переменные обнуляются, но сброс не "ловится" при отладке (установка breakpoint как в в начале SystemInit(), так и в начале main()). Мало того, при рестарте программы должно производиться тестирование дисплеев из 7-сегментных индикаторов (в начале main()), но оно не происходит. В программе используется WDT IWDG, но это не его рук дело. Эти явления происходят на всех 3 устройствах. До этого я разработал более 20 аналогичных проектов на этом же устройстве с аналогичной структурой программы, но подобного никогда не наблюдал. Буду благодарен за любой совет.
  11. Плата 8-канального АЦП на базе ADS1258-EP. Схема подключения внешнего кварца реализована точно как в описании. Ранее точно такие же платы изготавливались и работали безукоризненно. Не запускается тактовый генератор АЦП при подаче питания. Запускается только после того, как проведёшь пальцем по плате в месте подключения кварца. Что это может быть?
  12. Имеется IAR 6.50 для ARM. Проект для STM32F103VCT6 с использованием scmRTOS V4. Работает связка ADC1 и DMA. Все другие прерывания блокированы. Запуск работы связки происходит в функции main() перед запуском операционной системы: ADC1_CR2_bit.SWSTART=true; //Старт преобразования АЦП OS::run(); Тело прерывания DMA (преобразовывается 9 каналов ADC1): extern "C" void DMA1_Channel1_IRQHandler(void) { OS::TISRW(); DMA_CCR1_bit.EN=false; //Стоп канала DMA DMA_IFCR_bit.CTCIF1=true; //Сброс флага прерывания конца приёма первого канала DMA ADC1_SR_bit.STRT=false; //Сброс флага старта регулярных каналов ADCChannelArray[0]+=ADCChannel.ADCResult[15]; //Перепись результатов очередного преобразования ADCChannelArray[1]+=ADCChannel.ADCResult[14]; ADCChannelArray[2]+=ADCChannel.ADCResult[7]; ADCChannelArray[3]+=ADCChannel.ADCResult[6]; ADCChannelArray[4]+=ADCChannel.ADCResult[3]; ADCChannelArray[5]+=ADCChannel.ADCResult[2]; ADCChannelArray[6]+=ADCChannel.ADCResult[1]; ADCChannelArray[7]+=ADCChannel.ADCResult[0]; ADCChannelArray[8]+=ADCChannel.ADCResult[8];*/ DMA_CCR1_bit.EN=true; //Старт канала DMA ADC1_CR2_bit.SWSTART=true; //Старт преобразования АЦП DMA1Counter++; //Отладочный счётчик прерываний } Проблема в следующем. Ставлю точку остановки для отладчика на вторую строку обработчика прерывания. После каждого запуска происходит чёткая остановка на точке. Убираю точку остановки и пускаю программу, затем через некоторое время останавливаю. Отладочный счётчик показывает два захода в прерывание, а затем, сколько бы я ни запускал и останавливал программу, больше заходов в прерывание не наблюдается. В чём дело?
  13. Спасибо всем. Проблема решилась. Оказывается, действительно, нужно добавлять "extern "C", если обработчик находится в другом файле, который имеет расширение ".с", а не ".cpp".
  14. Нет, в настройках компилятора опция "Lenguage" стоит в "C++", а опция "C++ dialect" в "Extended Embedded C++".