|
|
|
Работа с EEPROM STM8 в IAR, Дописываем библиотеки для работы модификатора __eeprom |
|
|
|
Aug 2 2017, 10:03
|
Профессионал
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045
|
Цитата(Obam @ Aug 2 2017, 14:17) В '11 был заменён эл.счётчик '74-го, ни в нём, ни в новом никакой "флэши" нет. Аргумент - не аргумент (; При чем тут это. ещй раз... был вопрос " покажите устройство, реально отслужившее 20 лет" - я показал. не было вопроса "покажите устройство с флеш памятью, реально отслужившее 20 лет" Вот эл. счетчик.... какогонить года 60-го выпуска... его в сталинские дома поставили и он до сих пор работает. Теперь 21-ый век.... разрабатываем новый, современный эл. счетчик. сунули туда микропроцессор. а он всего на 20 лет. А почему? а потому что там флеш 20 лет..... ((( Просто новые устройства делают, взамен старым. Везде суют МК. Старые устройства работают по 20 лет. и дольше.... Новые устройства, должны быть не хуже старых.
|
|
|
|
|
Aug 2 2017, 11:12
|
Профессионал
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045
|
Цитата(Эдди @ Aug 2 2017, 14:20) Кому это может понадобиться? в смысле кому? работала железка на скорости 19200, теперь нужно перестроить на 9600. Полно таких устройств. Цитата Индусу заплатили, он пишет. Какая ему разница, что смысла в этой писанине нет? Ещё раз... при чем тут индус? вы говорите, что программисты у ST - иниоты. Именно у СТ!!! Можно подумать в других компаниях другой подход. Я и спрашиваю, а программисты не СТ? Программисты ТИ и Атмела - так какой подход? тьретий раз спрашиваю - нет ответа на конкретный вопрос, один флуд. Цитата По коду моего сниппета все видно, а по коду вызова библиотечной функции — нет. пока что кода вашего снипета вообще не видно )) а по коду библиотечной функции ВАМ не понятно как настраивается уарт??? Код UART1_Init(19200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); вам не понятно какой битрейт? сколько стоп, паритетность, длинна 8 бит? ВАМ реально не понятно это из этого кода..... тогда смысла с вами дальнейшей дискуссии нет. И всё остальное, что вы пишете, простите, но просто бред. Такой код не понятен либо глупцу, либо это троллинг. При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит). Цитата(jcxz @ Aug 2 2017, 14:53) "cppinit.o" - откажитесь от статических инициализированных классов/структур с конструкторами - и не будет его. Уберите из программы все статические объекты инициализированные не нулями - и тоже не будет каких-то секций или будут меньше. Ну уже float убрал.... исчезло float.o. Когда станет не в моготу, уберу с++..... " и ещё ещё ещё ещё чего-нибудь". )) спс за совет. Цитата(jcxz @ Aug 2 2017, 14:53) Такому коду место на помойке. "Без библиотек" совсем не означает что нужно писать такое. Почему нельзя написать "без библиотек" и при этом вполне прилично? Как-то так: Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию RATE_DIV(19200)?
|
|
|
|
|
Aug 2 2017, 13:08
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(juvf @ Aug 2 2017, 14:12) Потому что ваш "приличный" код всё же больше помойного. Опять же, интересно посмотреть на реализацию 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 - тактовая частота МК.
|
|
|
|
|
Aug 2 2017, 16:08
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(juvf @ Aug 2 2017, 14:12) При этом вы явно не хотите скопипастить в студию свой снипер инита, ссылаясь на гит ( и при этом даже не соизволите дать ссылку на гит). Для особо слепых: ссылка у меня в подписи. Вот, например: Код // 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
Сообщение отредактировал Эдди - Aug 2 2017, 16:10
|
|
|
|
|
Aug 2 2017, 17:08
|
Профессионал
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045
|
Цитата(Эдди @ Aug 2 2017, 21:08) Код 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 — их в любом случае подробно читать придется..... ну ну.... я вижу как вы их подробно читаете.
|
|
|
|
|
Aug 2 2017, 18:04
|
Местный
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140
|
А я бы как-то так написал: Код #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. Проверять лень, на глаз вроде так.
|
|
|
|
|
Aug 2 2017, 22:40
|
Знающий
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250
|
Цитата(juvf @ Aug 2 2017, 20:08) И в третих.... я не знаю, что за камень вы используете, но в stm8s такой код не взлетит.... Очень даже взлетит. Работает на STM8S003, S103 и S105. Не работало бы — полез бы глубже читать мануал. А название инклюда у меня так исторически сложилось — рыбу утянул с L-серии, потом туда потихоньку дописывал нужные дефайны. Понятно, почему это работало: 6 как-то не сильно много для LSB, а MSB пустой. Иначе не взлетело бы. Надо будет сниппеты в соответствие с RM привести, а то копирую этот кусок из одного в другое место, без учета требований последовательности записи регистров... В любом случае мой подход правильней SPL. А еще правильней у VladislavS.
Сообщение отредактировал Эдди - Aug 2 2017, 22:48
|
|
|
|
|
Aug 3 2017, 16:48
|
Местный
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140
|
Цитата(juvf @ Aug 3 2017, 18:35) а как uint16_t в епром разместить/писать? Весь смысл IAR-вских библиотек - сделать работу с EEPROM прозрачной. Не важно какого типа переменная, модификатор __eeprom размещает её в EEPROM и дальше забота компилятора куда её размещать, как читать и писать. Код __eeprom uint16_t x; x=0x1234;
|
|
|
|
|
Nov 14 2017, 21:22
|
Группа: Участник
Сообщений: 9
Регистрация: 14-11-17
Пользователь №: 100 189
|
Господа, товарищи, здравствуйте. Помогите разобраться можно (и нужно) с отсылкой к даташитам или мануалам, но желательно конкретное место. Проблема: пытаюсь сравнить массив в памяти с таким же массивом в еепром (по сути адресное пространство одинаковое) с помощью библиотечной процедуры 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[i], sizeof(mf_key_list[0]) == 0)) { };
Подскажите, что я делаю не так?
|
|
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|