Задержка на таймере не подходит?
Программирование STM8
Кроха stm8 достаточно богат периферией и делать на задержках....
Задержка на таймере не подходит?
Задержка на таймере не подходит?
- Реклама
- Сообщения: 208
- Зарегистрирован: Вс дек 10, 2006 19:26:13
Хочется малой кровью переделать, библиотека для радиомодулей, много таймингов с delay, раз в IAR STM8 нету __delay_us(x), придется возможно так и сделать.
Так таймер как раз малой кровью и будет. Начнёте циклы делать, еще неизвестно как они скомпилируются, да ещё если оптимизацию менять.
- Сообщения: 208
- Зарегистрирован: Вс дек 10, 2006 19:26:13
Ок понял. Можете накидать примерный код? Вам же это раз плюнуть, нето что нам вечно начинающим, любителям 
- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="dm211",url="/forum/viewtopic.php?p=4569415#p4569415"]Кто как делает микросекундные задержки в IAR STM8?[/uquote]Делаем, используя какой-либо таймер естественно.
- Реклама
- Сообщения: 24
- Зарегистрирован: Вт ноя 15, 2016 12:48:20
[uquote="dm211",url="/forum/viewtopic.php?p=4569415#p4569415"]Кто как делает микросекундные задержки в IAR STM8?
Так не работает- __no_operation не принимает аргументов. Можно внутри for(;;) повторять __no_operation или еще как можно?[/uquote]
Задержку надо указывать константой
она расчитывается во время компиляции.
Код: Выделить всё
#include <intrinsics.h>
#ifndef DELAY_H
#define DELAY_H
#endif
#define CPU_CLK 8000000 //частота на которой работает контроллер
#define delay_us(u) __no_operation((CPU_CLK/1000000)*u)
#define delay_ms(m) __no_operation((CPU_CLK/1000)*m)
Задержку надо указывать константой
она расчитывается во время компиляции.
- Сообщения: 373
- Зарегистрирован: Ср мар 09, 2016 08:07:41
>>> Кто как делает микросекундные задержки в IAR STM8?
>>> Используйте таймер
таймером МИКРОсекундные задержки в STM8 не сделать. там при входе в прерывание все регистры кладуться в стек, потом оттуда достаются, обработчик не успевает выполниться.
>>> Используйте таймер
таймером МИКРОсекундные задержки в STM8 не сделать. там при входе в прерывание все регистры кладуться в стек, потом оттуда достаются, обработчик не успевает выполниться.
- Сообщения: 1840
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="JackSmith",url="/forum/viewtopic.php?p=4569569#p4569569"]таймером МИКРОсекундные задержки в STM8 не сделать. там при входе в прерывание все регистры кладуться в стек, потом оттуда достаются, обработчик не успевает выполниться.[/uquote]Правда что-ли? А если подумать?
И при чём тут прерывание вообще?
И при чём тут прерывание вообще?
Наверное потому что я про прерывания говорил. Естественно под конкретную задачу конкретное решение нужно.
- Сообщения: 1
- Зарегистрирован: Вс май 12, 2024 11:43:19
[uquote="Ser60",url="/forum/viewtopic.php?p=4093827#p4093827"][uquote="isorport",url="/forum/viewtopic.php?p=4091041#p4091041"]кто имел опыт программирования STM8 на ассемблере под IAR?[/uquote]Я разработал тестовый проект для STM8 на ассемблере под IAR лет 10 назад. С тех пор прошло много времени и я с этими МК дел более не имел и практически всё забыл. Однако, проект остался, если интересно, могу прислать в ЛС. Там, в частности, можно посмотреть как сегменты определены.[/uquote]
А можете мне прислать? Пожалуйста.
А можете мне прислать? Пожалуйста.
- Сообщения: 6
- Зарегистрирован: Чт янв 16, 2020 18:04:26
Подскажите, пожалуйста, по микроконтроллеру stm8s001j3. Выбор на него пал из-за 5В и 8 ножек, мне больше не надо в поделке. т.е. меньше места только лучше.
В спецификации к микроконтроллеру написано
в другом же документе an5047 приведен пример кода настройки этих ножек, но там настраивают их просто на выход без пуш-пулл (DDR=1) и никакого низкого уровня на них не назначают( ну это ладно возможно он по умолчанию такой). И пишут
Но возникает вопрос: МК имеет порты от A до F по 8 выводов каждый (итого 48), 16 выводов, указанные в спецификации надо настроить, как указано выше, 12 выводов выходят на реальные пины МК, что делать с остальными 20-ю выводами??? Которые не имеют физического выхода на ножки МК, и не надо специфически настраивать по спецификации??
Проблема же у меня следующего плана:
МК при включении настраивает gpio и осциллятор, затем ждет импульс на входе, после отправляет сообщение по специфическому протоколу, ждет 10с и уходит в halt, просыпается так же по прерыванию на входе, и повторяет все заново. Программа все работает, но при сборке устройства и обкатке в реальных условиях, мк стал нагреваться и переставал работать(сообщение не доходило или были искажения, не проверял), постояв какое то время без питания, работал вновь. И греется он ощутимо пальцем, хотя по идее должен быть в халт режиме.
Я вот грешу на неверную настройку ножек, т.к. я все(включая 20 не указанных в спецификации) не используемые выводы настроил на push-pull и назначил в odr на них 0.
Кто сталкивался с этими МК и как настраивал gpio выводы или может сталкивался с такой же проблемой нагрева?
В спецификации к микроконтроллеру написано
т.е. назначить на выход в режиме пуш-пулл эти ножки и назначить низкий уровень.The PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5 and PF4 GPIOs should be configured after device reset in output push-pull mode with output low-state to reduce the device’s consumption and to improve its EMC immunity.
в другом же документе an5047 приведен пример кода настройки этих ножек, но там настраивают их просто на выход без пуш-пулл (DDR=1) и никакого низкого уровня на них не назначают( ну это ладно возможно он по умолчанию такой). И пишут
After the device reset, those GPIOs are configured by hardware into input-floating mode. It is recommended to set them into output-mode/low-output-level state.
Код: Выделить всё
/* not connected pins as output low state (the best EMC immunity)
(PA2, PB0, PB1, PB2, PB3, PB6, PB7, PC1, PC2, PC7, PD0, PD2, PD4, PD7, PE5,
PF4) */
#define CONFIG_UNUSED_PINS_STM8S001 \
{ \
GPIOA->DDR |= GPIO_PIN_2; \
GPIOB->DDR |= GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 |
GPIO_PIN_6 | GPIO_PIN_7; \
GPIOC->DDR |= GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; \
GPIOD->DDR |= GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_7; \
GPIOE->DDR |= GPIO_PIN_5; \
GPIOF->DDR |= GPIO_PIN_4; \
}Проблема же у меня следующего плана:
МК при включении настраивает gpio и осциллятор, затем ждет импульс на входе, после отправляет сообщение по специфическому протоколу, ждет 10с и уходит в halt, просыпается так же по прерыванию на входе, и повторяет все заново. Программа все работает, но при сборке устройства и обкатке в реальных условиях, мк стал нагреваться и переставал работать(сообщение не доходило или были искажения, не проверял), постояв какое то время без питания, работал вновь. И греется он ощутимо пальцем, хотя по идее должен быть в халт режиме.
Я вот грешу на неверную настройку ножек, т.к. я все(включая 20 не указанных в спецификации) не используемые выводы настроил на push-pull и назначил в odr на них 0.
Кто сталкивался с этими МК и как настраивал gpio выводы или может сталкивался с такой же проблемой нагрева?
- Сообщения: 373
- Зарегистрирован: Ср мар 09, 2016 08:07:41
1. 4ygeca, ножки паркуют для уменьшения энергопотребления. если оно вас не волнует, оставьте все по умолчанию.
2. парковать, если делать это, следует все ножки. те что не выведены на корпус все равно есть в кристалле.
3. И греется он ощутимо пальцем коротыш. проверяйте свою схему на КЗ.
2. парковать, если делать это, следует все ножки. те что не выведены на корпус все равно есть в кристалле.
3. И греется он ощутимо пальцем коротыш. проверяйте свою схему на КЗ.
4ygeca, или просто бракованный экземпляр МК. У меня есть один STM32, который прекрасно работает, но греется до 60 градусов и потребляет около 200 мА даже в простое. Другой экземпляр там же работает правильно.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
- Сообщения: 6
- Зарегистрирован: Чт янв 16, 2020 18:04:26
2. Принял. СпасибоJackSmith писал(а):1.ножки паркуют для уменьшения энергопотребления. если оно вас не волнует, оставьте все по умолчанию.
2. парковать, если делать это, следует все ножки. те что не выведены на корпус все равно есть в кристалле.
3. И греется он ощутимо пальцем коротыш. проверяйте свою схему на КЗ.
3. Вот схема, честно ума не дам где в ней может быть КЗ
платки заказывал. Питание берется с промышленной платы, которая нормально работает.
[uquote="smacorp",url="/forum/viewtopic.php?p=4620996#p4620996"]4ygeca, или просто бракованный экземпляр МК. У меня есть один STM32, который прекрасно работает, но греется до 60 градусов и потребляет около 200 мА даже в простое. Другой экземпляр там же работает правильно.[/uquote]
Возможно, смущает тот момент, что я сделал 3 таких штуки, одна давно уехала и исправно работает, но это была самая первая прошивка, плата и схема та же. одна у меня на тестовой сборке, там такая же проблема(как оказалось) и третья, на которой выявилась такая проблема. я конечно, не отрицаю, что из 5 МК, которые я заказал 2 дохлые, но как то сомневаюсь.
Сейчас собираю обратно испытательный "стенд" буду все пробовать. Спасибо
ну так залейте эту прошивку и сравните, будет греться новый камень или нет.4ygeca писал(а):но это была самая первая прошивка,
4ygeca, сомневаетесь? А зря - смотря где брали.
Я как-то на Али взял 5 шт. STM32F103C8T6 одним лотом:
- у одного был просто КЗ по питанию;
- у второго чудеса с нагревом, о которых писал выше;
- третий работал чудесно на всех частотах, кроме как на 72 МГц, отчего USB-HID не определялся;
- и только 2 оставшихся нареканий не вызвали.
То есть, тот продавец торговал лютой отбраковкой. И таких там легион.
Я как-то на Али взял 5 шт. STM32F103C8T6 одним лотом:
- у одного был просто КЗ по питанию;
- у второго чудеса с нагревом, о которых писал выше;
- третий работал чудесно на всех частотах, кроме как на 72 МГц, отчего USB-HID не определялся;
- и только 2 оставшихся нареканий не вызвали.
То есть, тот продавец торговал лютой отбраковкой. И таких там легион.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
- Сообщения: 6
- Зарегистрирован: Чт янв 16, 2020 18:04:26
[uquote="smacorp",url="/forum/viewtopic.php?p=4621092#p4621092"]4ygeca, сомневаетесь? А зря - смотря где брали.[/uquote]
Брал в чипИдипе. Скорее всего вы оказались правы, косячная партия похоже.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=4621085#p4621085"]
Попробовал, резульатат тот же.
В общем победил я эту проблему. Кроме как косячной партии МК, у меня объяснения нет.
Когда начал разбираться обнаружил на пине 5 2.8В постоянно весящие, на 7 были 0.9В, т.е. транзисторы были открыты. Сверил с прошивкой и там да, получалось, что после отправки линии он притягивал к земле, открывая ключи, соответственно и питание на них должно быть. Но возникает вопрос почему 2.8В на одном и 0.9В на другом выводе?? И почему из-за них МК грелся??? А спустя время видимо разогревался так, что плыли частоты и сообщение уже не принималось.
В общем добавил в конце отпускание пинов в 0 и греться перестал. Хотя казалось бы нагрузка всего 2 транзистора...
Не зря на сайте ST написано не использовать эти МК для новых изделий... Очень косячные какие то, хапнул горя с ними с самого начала, когда в начале поймал ошибку в коде с неверной настройкой портов и swim слетал из-за того, что одна ножка на несколько портов. Написал предохранитель, после настройки gpio, проверял включен ли swim
Ковыряясь в коде обнаружил, что не запускал таймер на отправку в сон, после того как запустил 2 МК уснули навечно, видимо где то косякнул с настройкой таймера, что прерывание сразу срабатывало. В итоге отказался от этой затеи, до лучших времен) это больше для себя фича)
Всем спасибо, кто откликнулся и пытался помочь.
Кстати, в этом проекте я написал очень, как по мне элегантное, удобное и быстрое решение по начальной инициализации ножек STM8.
С типами данных u8 u16 u32, думаю все понятно.
Пример инициализации:
Разбираться в х-марос то еще извращение, поэтому можно просто пользоваться)
Проверял и тестировал это все на компиляторе SDCC, все отлично работает.
Код на выходе получается, как если писать константы в регистры, но читаемо и понятно.
Один раз пробежался по всем портам в начале и все быстренько настроилось.
Брал в чипИдипе. Скорее всего вы оказались правы, косячная партия похоже.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=4621085#p4621085"]
ну так залейте эту прошивку и сравните, будет греться новый камень или нет.[/uquote]4ygeca писал(а):но это была самая первая прошивка,
Попробовал, резульатат тот же.
В общем победил я эту проблему. Кроме как косячной партии МК, у меня объяснения нет.
Когда начал разбираться обнаружил на пине 5 2.8В постоянно весящие, на 7 были 0.9В, т.е. транзисторы были открыты. Сверил с прошивкой и там да, получалось, что после отправки линии он притягивал к земле, открывая ключи, соответственно и питание на них должно быть. Но возникает вопрос почему 2.8В на одном и 0.9В на другом выводе?? И почему из-за них МК грелся??? А спустя время видимо разогревался так, что плыли частоты и сообщение уже не принималось.
В общем добавил в конце отпускание пинов в 0 и греться перестал. Хотя казалось бы нагрузка всего 2 транзистора...
Не зря на сайте ST написано не использовать эти МК для новых изделий... Очень косячные какие то, хапнул горя с ними с самого начала, когда в начале поймал ошибку в коде с неверной настройкой портов и swim слетал из-за того, что одна ножка на несколько портов. Написал предохранитель, после настройки gpio, проверял включен ли swim
Спойлер
Код: Выделить всё
if (CFG->GCR & 0x1) {
gpio_reset_default();
}Всем спасибо, кто откликнулся и пытался помочь.
Кстати, в этом проекте я написал очень, как по мне элегантное, удобное и быстрое решение по начальной инициализации ножек STM8.
Спойлер
Тут мы генерируем с помощью х-маросов набор констант вида PIN*N*_*STATE*, где *N* номер вывода порта 0-7 и ALL, а *STATE* его определение IN\OUT PP OD и т.д.Код: Выделить всё
/**
* @brief: Значения по умолчанию, для инициализации неиспользуемых пинов.
*/
#define DDR_DEFAULT 0xFF
#define CR1_DEFAULT 0x00
#define CR2_DEFAULT 0x00
/*
* @brief: Макрос инициализации пинов.
*/
#define GPIO_INIT(GPIO, PIN_STATES) \
do { \
GPIO->DDR \
= (u8)(((PIN_STATES) & 0xFF0000) >> 16) \
| (u8)(DDR_DEFAULT \
& (u8)(~(((PIN_STATES) & 0xFF000000) >> 24))); \
GPIO->CR1 \
= (u8)(((PIN_STATES) & 0x00FF00) >> 8) \
| (u8)(CR1_DEFAULT \
& (u8)(~(((PIN_STATES) & 0xFF000000) >> 24))); \
GPIO->CR2 \
= (u8)(((PIN_STATES) & 0x0000FF) >> 0) \
| (u8)(CR2_DEFAULT \
& (u8)(~(((PIN_STATES) & 0xFF000000) >> 24))); \
} while (0)
/******************************************************************************/
/* X-Macros для GPIO pins */
/******************************************************************************/
// clang-format off
#define FOREACH_PIN(x, x2) \
x (0, x2) \
x (1, x2) \
x (2, x2) \
x (3, x2) \
x (4, x2) \
x (5, x2) \
x (6, x2) \
x (7, x2)
#define PIN_MASK(n, x2) PIN##n = (1 << n),
#define FOREACH_PIN_STATE(n, x2) \
x2(n, FLOAT_INPUT) \
x2(n, PULLUP_INPUT) \
x2(n, EXTI_FLOAT_INPUT) \
x2(n, EXTI_PULLUP_INPUT) \
x2(n, OPEN_DRAIN_OUTPUT) \
x2(n, PUSH_PULL_OUTPUT) \
x2(n, FAST_OPEN_DRAIN_OUTPUT) \
x2(n, FAST_PUSH_PULL_OUTPUT)
#define PIN_STATE_N(n, state) PIN##n##_##state = \
(((u32)(1 << n) << 24) | \
((u32)(state & 0b100) << (14 + n)) | \
((u32)(state & 0b010) << (7 + n)) | \
((u32)(state & 0b001) << (n))),
// clang-format on
/******************************************************************************/
/* Маски настройки GPIO */
/******************************************************************************/
/**
* @brief: Маски пинов (1<<n)
*/
typedef enum {
FOREACH_PIN (PIN_MASK, 0)
#undef PIN_MASK
PIN_ALL = 0xFF
} gpio_pin_mask_n;
/**
* @brief: Значения конфигурации порта DDRbit CR1bit CR2bit
*/
typedef enum {
FLOAT_INPUT = 0b000,
PULLUP_INPUT = 0b010,
EXTI_FLOAT_INPUT = 0b001,
EXTI_PULLUP_INPUT = 0b011,
OPEN_DRAIN_OUTPUT = 0b100,
PUSH_PULL_OUTPUT = 0b110,
FAST_OPEN_DRAIN_OUTPUT = 0b101,
FAST_PUSH_PULL_OUTPUT = 0b111
} gpio_pin_config_n;
/**
* @brief: Значения инициализации GPIO
*/
typedef enum {
FOREACH_PIN (FOREACH_PIN_STATE, PIN_STATE_N)
#undef PIN_STATE_N
PIN_ALL_PUSH_PULL_OUTPUT = 0xFFFFFF00
} gpio_pin_init_n;
#undef FOREACH_PIN
#undef FOREACH_PIN_STATE
Пример инициализации:
Код: Выделить всё
GPIO_INIT (GPIOA, PIN1_FLOAT_INPUT | PIN3_FAST_PUSH_PULL_OUTPUT);
GPIOA->ODR = RESET;
/* GPIOB */
GPIO_INIT (GPIOB, PIN5_FAST_PUSH_PULL_OUTPUT);
GPIOB->ODR = RESET;
/* GPIOC */
GPIO_INIT (GPIOC, PIN3_FAST_PUSH_PULL_OUTPUT
| PIN4_FAST_PUSH_PULL_OUTPUT
| PIN5_FAST_PUSH_PULL_OUTPUT | PIN6_PULLUP_INPUT);
GPIOC->ODR = RESET;
/* GPIOD */
GPIO_INIT (GPIOD, PIN1_PULLUP_INPUT | PIN3_PULLUP_INPUT
| PIN5_PULLUP_INPUT | PIN6_EXTI_FLOAT_INPUT);
GPIOD->ODR = RESET;
/* GPIOE */
GPIO_INIT (GPIOE, PIN_ALL_PUSH_PULL_OUTPUT);
GPIOE->ODR = RESET;
/* GPIOF */
GPIO_INIT (GPIOF, PIN_ALL_PUSH_PULL_OUTPUT);
GPIOF->ODR = RESET;Проверял и тестировал это все на компиляторе SDCC, все отлично работает.
Один раз пробежался по всем портам в начале и все быстренько настроилось.
Я всё никак не домучаю наручные часы. Попали в руки другие индикаторы и я решил переделать плату под них. Индикаторы как мне показалось АЛС314А. Развёл плату, прошил, собрал, а оно не алё. Светится, но не так как надо. Оказалось индикаторы АЛС304Г. А у них общий анод, а нужно с общим катодом. И чтоб не искать новые индикаторы и не перепаивать, а сформировать их и запаять оказалось той ещё задачей.
Возник вопрос, может кто может подправить скомпилированную (исходников нет) прошивку под индикаторы с общим +.
- Сообщения: 1454
- Зарегистрирован: Вт июн 07, 2011 08:03:18



