Перейти к содержанию
    

Там нет FRAM, счётчик обычный, рабоче-крестьянский без блэк-джека. Механический.

Поставленный недавно?? Не думал что их ещё ставят. Может где-о в деревне? :rolleyes:

У нас в доме ещё несколько лет назад все счётчики заменили на электронные. Централизованно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В '11 был заменён эл.счётчик '74-го, ни в нём, ни в новом никакой "флэши" нет. Аргумент - не аргумент (;
При чем тут это. ещй раз... был вопрос

" покажите устройство, реально отслужившее 20 лет" - я показал.

 

не было вопроса "покажите устройство с флеш памятью, реально отслужившее 20 лет"

 

Вот эл. счетчик.... какогонить года 60-го выпуска... его в сталинские дома поставили и он до сих пор работает. Теперь 21-ый век.... разрабатываем новый, современный эл. счетчик. сунули туда микропроцессор. а он всего на 20 лет. А почему? а потому что там флеш 20 лет..... ((( Просто новые устройства делают, взамен старым. Везде суют МК. Старые устройства работают по 20 лет. и дольше.... Новые устройства, должны быть не хуже старых.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При чем тут это. ещй раз... был вопрос

" покажите устройство, реально отслужившее 20 лет" - я показал.

 

не было вопроса "покажите устройство с флеш памятью, реально отслужившее 20 лет"

 

Вот эл. счетчик.... какогонить года 60-го выпуска... его в сталинские дома поставили и он до сих пор работает. Теперь 21-ый век.... разрабатываем новый, современный эл. счетчик. сунули туда микропроцессор. а он всего на 20 лет. А почему? а потому что там флеш 20 лет..... ((( Просто новые устройства делают, взамен старым. Везде суют МК. Старые устройства работают по 20 лет. и дольше.... Новые устройства, должны быть не хуже старых.

Ну ёлы-палы, ну "флэш" же обсуждали и её "срок" годности. Технологии и 30-ти лет нету (Атмел же первыми сделали контроллер с "флэшом" в '94 - я не путаю?).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кому это может понадобиться?
в смысле кому? работала железка на скорости 19200, теперь нужно перестроить на 9600. Полно таких устройств.

 

Индусу заплатили, он пишет. Какая ему разница, что смысла в этой писанине нет?
Ещё раз... при чем тут индус? вы говорите, что программисты у ST - иниоты. Именно у СТ!!! Можно подумать в других компаниях другой подход. Я и спрашиваю, а программисты не СТ? Программисты ТИ и Атмела - так какой подход? тьретий раз спрашиваю - нет ответа на конкретный вопрос, один флуд.

 

По коду моего сниппета все видно, а по коду вызова библиотечной функции — нет.

пока что кода вашего снипета вообще не видно ))

а по коду библиотечной функции ВАМ не понятно как настраивается уарт???

      UART1_Init(19200,
                 UART1_WORDLENGTH_8D,
                 UART1_STOPBITS_1,
                 UART1_PARITY_NO,
                 UART1_SYNCMODE_CLOCK_DISABLE,
                 UART1_MODE_TXRX_ENABLE);

вам не понятно какой битрейт? сколько стоп, паритетность, длинна 8 бит? ВАМ реально не понятно это из этого кода..... тогда смысла с вами дальнейшей дискуссии нет. И всё остальное, что вы пишете, простите, но просто бред.

Такой код не понятен либо глупцу, либо это троллинг. При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит).

 

"cppinit.o" - откажитесь от статических инициализированных классов/структур с конструкторами - и не будет его.

Уберите из программы все статические объекты инициализированные не нулями - и тоже не будет каких-то секций или будут меньше.

Ну уже float убрал.... исчезло float.o. Когда станет не в моготу, уберу с++..... "и ещё ещё ещё ещё чего-нибудь". )) спс за совет.

 

Такому коду место на помойке. "Без библиотек" совсем не означает что нужно писать такое.

Почему нельзя написать "без библиотек" и при этом вполне прилично? Как-то так:

Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию RATE_DIV(19200)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию RATE_DIV(19200)?

В помойном нет выбора скорости, в моём есть - поэтому и больше. Если без выбора скорости - то ровно столько же.

RATE_DIV - это просто макрос:

#define RATE_DIV_TRA(div) {div & 15 | div >> 8 & 0xF0, div >> 4 & 255}
#define RATE_DIV_TST(div) \
  RATE_DIV_TRA(assert_static(div >= 16 && div < 65536) * div)
#define RATE_DIV(rate) RATE_DIV_TST(SYSCLK_MH * 2 / (rate) + 1 >> 1)

где: SYSCLK_MH - тактовая частота МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит).

Для особо слепых: ссылка у меня в подписи.

Вот, например:

    // Configure UART
    // 9 bit, no parity, 1 stop (UART_CR3 = 0 - reset value)
    // 57600 on 16MHz: BRR1=0x11, BRR2=0x06
    UART2_BRR1 = 0x11; UART2_BRR2 = 0x06;
    UART2_CR1  = UART_CR1_M; // M = 1 -- 9bits
UART2_CR2 = UART_CR2_REN | UART_CR2_RIEN; // Allow RX, generate ints on rx

Изменено пользователем Эдди

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    UART2_BRR1 = 0x11; UART2_BRR2 = 0x06;

Это и есть снипер? Так я такой код и заюзал, чтоб сэкономить флешь. По мнению некоторых - это помойный код. ))) Это во первых, во вторых - что такое выстрел в ногу? Это например когда руками посчитал что-то и и в расчетах ошибся. Допусим нужны 0х11 и 0х6 в регистрах брр1 и брр2, а вы ошиблись и насчитали 4 и 8. Пишете свой "не уродливый", понятный код.... аля..

// Configure UART
    // 9 bit, no parity, 1 stop (UART_CR3 = 0 - reset value)
    // 57600 on 16MHz: BRR1=0x4, BRR2=0x08
    UART2_BRR1 = 0x04; UART2_BRR2 = 0x08;
    UART2_CR1  = UART_CR1_M; // M = 1 -- 9bits
UART2_CR2 = UART_CR2_REN | UART_CR2_RIEN; // Allow RX, generate ints on rx

Вот вам и выстрел себе в ногу. И ни какая хорошая документация кода вас от выстрела не спасет. А с спл сложнее ошибиться.

 

И в третих.... я не знаю, что за камень вы используете, но в stm8s такой код не взлетит.... судя по инклуде в вашем коде, это какойто stm8l*, открыл на вскидку RM0031 для stm8l051, стр 532

The Baud Counters will be updated with the new value of the Baud Registers after a write to BRR1. Hence the Baud Register value should not be changed during a transaction. The

BRR2 should be programmed before BRR1

Вот он вам, чистой воды самострел, без всяких спл. ))))

 

один раз потратил 2 часа на даташит — написал сниппет для USART..... А даташит с RM — их в любом случае подробно читать придется.....
ну ну.... я вижу как вы их подробно читаете. ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я бы как-то так написал:

#define F_CPU 16000000.0
#define BaudRate 57600.0
#define Divider ((uint16_t)(F_CPU/BaudRate + 0.5))
  
  USART1_BRR2 = (Divider&0x0F) | ((Divider>>8)&0xF0);
  USART1_BRR1 = (Divider>>4);

Если надо много скоростей, то много делителей бы просчитал на этапе компиляции.

 

А как сделано в SPL это "сон разума"

Мало того что 32-битные деления в рантайме, так ещё и резельтат без округления к ближайшем целому будет.

 /* Clear the LSB mantissa of USARTDIV */
  USARTx->BRR1 &= (uint8_t)(~USART_BRR1_DIVM);
  /* Clear the MSB mantissa of USARTDIV */
  USARTx->BRR2 &= (uint8_t)(~USART_BRR2_DIVM);
  /* Clear the Fraction bits of USARTDIV */
  USARTx->BRR2 &= (uint8_t)(~USART_BRR2_DIVF);
  BaudRate_Mantissa  = (uint32_t)(CLK_GetClockFreq() / BaudRate );
  /* Set the fraction of USARTDIV */
  USARTx->BRR2 = (uint8_t)((BaudRate_Mantissa >> (uint8_t)8) & (uint8_t)0xF0);
  /* Set the MSB mantissa of USARTDIV */
  USARTx->BRR2 |= (uint8_t)(BaudRate_Mantissa & (uint8_t)0x0F);
  /* Set the LSB mantissa of USARTDIV */
  USARTx->BRR1 = (uint8_t)(BaudRate_Mantissa >> (uint8_t)4);

 

Мой код 0x11 и 0x06 запишет, а индусский скорее всего 0x11 и 0x05. Проверять лень, на глаз вроде так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И в третих.... я не знаю, что за камень вы используете, но в stm8s такой код не взлетит....

Очень даже взлетит. Работает на STM8S003, S103 и S105. Не работало бы — полез бы глубже читать мануал.

А название инклюда у меня так исторически сложилось — рыбу утянул с L-серии, потом туда потихоньку дописывал нужные дефайны.

Понятно, почему это работало: 6 как-то не сильно много для LSB, а MSB пустой. Иначе не взлетело бы. Надо будет сниппеты в соответствие с RM привести, а то копирую этот кусок из одного в другое место, без учета требований последовательности записи регистров...

 

В любом случае мой подход правильней SPL. А еще правильней у VladislavS.

Изменено пользователем Эдди

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для того чтобы изменить скорость USART надо записать две правильных константы в два регистра в правильной последовательности. Как вы это сделаете - смесь вкусовщины с бесовщиной. Я стараюсь делать чтобы код максимально близко был похож на описание в документации. Так проще потом что-то менять и косяки отлавливать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А дальше как обычно определяем неинициализированные и инициализированные переменные с модификатором __eeprom и компилятор сам всё сделает.
а как uint16_t в епром разместить/писать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как uint16_t в епром разместить/писать?

 

Весь смысл IAR-вских библиотек - сделать работу с EEPROM прозрачной. Не важно какого типа переменная, модификатор __eeprom размещает её в EEPROM и дальше забота компилятора куда её размещать, как читать и писать.

__eeprom uint16_t x;
x=0x1234;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, товарищи, здравствуйте.

Помогите разобраться можно (и нужно) с отсылкой к даташитам или мануалам, но желательно конкретное место.

Проблема: пытаюсь сравнить массив в памяти с таким же массивом в еепром (по сути адресное пространство одинаковое) с помощью библиотечной процедуры memcmp, но компилятор ругается:

 

Error[Pe167]: argument of type "unsigned char __eeprom *" is incompatible with parameter of type "void const *" C:\DISTRIBUTIVES\!Develop\STM\STM8\Projects\S003F3\IAR-Robot\stm8_rc522-master\main.c 81

 

Объявление массивов:

__near unsigned char mf_key_list[4][10] = { {0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0}};

 

__eeprom unsigned char ee_key_list[4][10] = { {0x04, 0x44, 0x2C, 0x12, 0x05, 0x33, 0x82,0,0,0}, //MasterKey

{0,0,0,0,0,0,0,0,0,0}, //Key for first reader

{0,0,0,0,0,0,0,0,0,0}, //Key for second reader

{0,0,0,0,0,0,0,0,0,0}}; //Key for third reader

 

Сравнение:

if (memcmp(ee_key_list[0], mf_key_list, sizeof(mf_key_list[0]) == 0))

{

 

};

 

Подскажите, что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...