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

STM32 для чайника


ART_ME

Рекомендуемые сообщения

29 минут назад, Alex сказал:

А чем этот вариант не устраивает ?

ну под F103 Он не запускается, допилил. Часто вылазит ошибка буфера.

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

void I2C_WriteBuffer(I2C_HandleTypeDef hi, uint8_t DEV_ADDR, uint8_t sizebuf) {
	while (HAL_I2C_Master_Transmit( & hi, (uint16_t)DEV_ADDR, (uint8_t * ) & aTxBuffer, (uint16_t)sizebuf, (uint32_t)1000) != HAL_OK) {
		if (HAL_I2C_GetError( & hi) != HAL_I2C_ERROR_AF) {
			sprintf(str, "Buffer error");
			LCD_SetPos(8, 0);
			LCD_String(str);
		}
	}
}

 

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Часы 3231 в виде модуля.

Еще есть одни чудеса не понятные. Вывожу отладку в SWD через printf();

По UART подключен ESP12E который получает время из сети и передает его на STM чтоб тот в случае необходимости записал  новые значения.

В общем передаю строкой 40.50.20.00.22.10.17 секунды,минуты, часы и т.д

Разбираю на лексемы и присваиваю значения.

Тут начинаются чудеса))

uint8_t aTxBuffer2[8]; 
char str[] = "40.50.20.00.22.10.17."; // строка со временем
uint8_t i;
char * pch = strtok (str,".");
uint8_t sec,min,hour,day,date,month,year;

    while (pch != NULL)
    {
        i++;
        int z;
        sscanf(pch,"%x",&z);
        aTxBuffer2[i] = (uint8_t) z;
        printf("aTxBuffer2[i] %d\n\r", aTxBuffer2[i] ); //вот тут выдает 0
        pch = strtok (NULL, ".");
    }


    sec = aTxBuffer2[1];
    printf("Sec = %d\n\r",sec);


    min = aTxBuffer2[2];
    printf("Min= %d\n\r",min);

    hour = aTxBuffer2[3];
    printf("Hour= %d\n\r",hour);

    day = aTxBuffer2[4];
    printf("Day= %d\n\r",day);

    date = aTxBuffer2[5];
    printf("Date= %d\n\r",date);

    month = aTxBuffer2[6];
    printf("Month= %d\n\r",month);

    year = aTxBuffer2[7];
    printf("Year= %d\n\r",year);

вот эта строчка выдает нули printf("aTxBuffer2 %i\n\r", aTxBuffer2 );

при том что все остальные printf-ы выдают верные значения.

 

 

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А попробуйте в printf z запихивать вместо TxBuffer2. Думаю должно прокатить. Расскажите подробнее про printf через swd. Я так делал на камне lpc1752. У него нога SWO есть, через неё и выводится, а в J-Link есть такая нога ней принимается. На stm32f103 я такой ноги не нашёл и на St-link её нет...

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

да вот результат  в кодеблок

перевожу из HEX в DEC

aTxBuffer2 64
aTxBuffer2 80
aTxBuffer2 32
aTxBuffer2 0
aTxBuffer2 34
aTxBuffer2 16
aTxBuffer2 23

Sec = 64
Min= 80
Hour= 32
Day= 0
Date= 34
Month= 16
Year= 23

Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.
 

14 минуты назад, GOR23 сказал:

А попробуйте в printf z запихивать вместо TxBuffer2. Думаю должно прокатить. Расскажите подробнее про printf через swd. Я так делал на камне lpc1752. У него нога SWO есть, через неё и выводится, а в J-Link есть такая нога ней принимается. На stm32f103 я такой ноги не нашёл и на St-link её нет...

вот видео есть на тему 

У меня такое ощущение что SWO не может выводить информацию быстро т.е в цикле она не успевает 

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

Какая-то чушь получается. 64 секунды и 80 минут.

А точно в ssanf вы хотите шестнадцатеричные числа в десятичные переводить? Может вместо %x использовать %d? :-)

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

Ну не чушь... время в часах пишется так, младшие байты единицы, старшие десятки т.е минуты 0x23 в хексе будут читаться правильно. Я присылаю данные в HEX 40.50.20.00.22.10.17 но распарсить их в HEX не могу потому что в uint8_t массив не получается записать 0х . Мне проще перевести их в DEC . По этому и получается 64 секунды и 80мин в DEC = 40 секунд и 50мин... один фиг все станет нулями и единицами.

Вот из анализатора 

bj4A4cKaj_c.jpg

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

 MihaNN52 благодарствую за просвещение по поводу SWO, на камне я тупо не досмотрел, ну а на счёт ст линка в видео сказано. Очень удобная штука. По вашему вопросу, с z в printf  вот так:  

printf("aTxBuffer2[i] %d\n\r", (char)z); 

Тоже 0 выводит?

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

Смогу проверить вечером. 

По доработке Стлинка, я обрезал дорожку на пин RST т.к я его не использую и подпаял проводок от камня до ножки.

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

Исходная  шестнадцатеричная стока "40.50.20.00.22.10.17." правильно же переводится в десятичные числа... Где 0 получается и что там должно быть на самом деле?

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

Да у меня ст линк совсем китайский, без корпуса. Думаю что то придумаю, ну или J-Link прикручу, он мне больше нравится. Просто как обычно нет времени с ним возиться.

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

там день недели 1-7... он мне не нужен по этому там 00 или я не правильно вас понял...

где 0 должны быть значения 

если код прогоняю через кодеблок то он вполне рабочий, но в контроллере он ведет себя неоднозначно

aTxBuffer2 64 // тут 0
aTxBuffer2 80// тут 0
aTxBuffer2 32// тут 0
aTxBuffer2 0// тут 0
aTxBuffer2 34// тут 0
aTxBuffer2 16// тут 0
aTxBuffer2 23// тут 0
Sec = 64
Min= 80
Hour= 32
Day= 0
Date= 34
Month= 16
Year= 23

Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.
 

14 минуты назад, GOR23 сказал:

Да у меня ст линк совсем китайский, без корпуса. Думаю что то придумаю, ну или J-Link прикручу, он мне больше нравится. Просто как обычно нет времени с ним возиться.

а у меня все пины будут заняты в проекте не хотелось выделять для отладки UART  с USB что то тоже не особо подружился, постоянно надо передергивать разьем после перепрошивки, неудобно ппц. 

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

Да, я вот недавно тоже хотел выводить через юсб для удобства, но получилось не так то и удобно... По той же причине что и у вас - при перезагрузке нужно передёргивать разъём. Можно конечно выкрутится и повесить подтяжку D+ к плюсу через полевик. А а полевиком управлять с контроллера. Получится, что то типа принудительного реконнекта. Но мне это было не сильно нужно, потому выкрутился и юартом, он у меня свободен остался. А PB3 в текущем проекте к сожалению занят, и ремапить некуда. Но всё равно хороше, раньше думал, что на стмках SWO нет вообще. 

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

Я под это дело купил USB HUB с кнопками выключателями разьемов.... все равно не удобно

8 минут назад, Darth_Vader сказал:

@MihaNN52 я не вижу у вас начальной инициализации i :D

uint8_t i;

имеете ввиду значения нет? так там 0 встает.

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

Лучше делать так как Darth_Vader сказал. Я даже массивы memset-ом чищу.

Массив то да, но если у вас к примеру i=142, такого индекса в вашем массиве нет совсем, вы обращаетесь просто к какой то неизвестной области памяти.

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

Да сделал.И установку времени в часы тоже сделал, все работает, добавил мемсеты для вытирания буфера и все стало нормально работать. А это по пока остается загадкой. Мемсеты надо взять за правило. Как и правильную инициализацию)

 

Изменено пользователем MihaNN52
Ссылка на комментарий
Поделиться на другие сайты

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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