Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Кроха stm8 достаточно богат периферией и делать на задержках....
Задержка на таймере не подходит?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Хочется малой кровью переделать, библиотека для радиомодулей, много таймингов с delay, раз в IAR STM8 нету __delay_us(x), придется возможно так и сделать.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Так таймер как раз малой кровью и будет. Начнёте циклы делать, еще неизвестно как они скомпилируются, да ещё если оптимизацию менять.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Сообщение dm211 »

Ок понял. Можете накидать примерный код? Вам же это раз плюнуть, нето что нам вечно начинающим, любителям :))
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1840
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="dm211",url="/forum/viewtopic.php?p=4569415#p4569415"]Кто как делает микросекундные задержки в IAR STM8?[/uquote]Делаем, используя какой-либо таймер естественно.
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вт ноя 15, 2016 12:48:20

Сообщение john1770 »

[uquote="dm211",url="/forum/viewtopic.php?p=4569415#p4569415"]Кто как делает микросекундные задержки в IAR STM8?

Код: Выделить всё

#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)
Так не работает- __no_operation не принимает аргументов. Можно внутри for(;;) повторять __no_operation или еще как можно?[/uquote]
Задержку надо указывать константой
она расчитывается во время компиляции.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

>>> Кто как делает микросекундные задержки в IAR STM8?
>>> Используйте таймер
таймером МИКРОсекундные задержки в STM8 не сделать. там при входе в прерывание все регистры кладуться в стек, потом оттуда достаются, обработчик не успевает выполниться.
Мудрый кот
Сообщения: 1840
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="JackSmith",url="/forum/viewtopic.php?p=4569569#p4569569"]таймером МИКРОсекундные задержки в STM8 не сделать. там при входе в прерывание все регистры кладуться в стек, потом оттуда достаются, обработчик не успевает выполниться.[/uquote]Правда что-ли? А если подумать? 8)
И при чём тут прерывание вообще?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Наверное потому что я про прерывания говорил. Естественно под конкретную задачу конкретное решение нужно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Родился
Сообщения: 1
Зарегистрирован: Вс май 12, 2024 11:43:19

Сообщение vitaliy14 »

[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

Сообщение 4ygeca »

Подскажите, пожалуйста, по микроконтроллеру stm8s001j3. Выбор на него пал из-за 5В и 8 ножек, мне больше не надо в поделке. т.е. меньше места только лучше.
В спецификации к микроконтроллеру написано
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; \
}
Но возникает вопрос: МК имеет порты от A до F по 8 выводов каждый (итого 48), 16 выводов, указанные в спецификации надо настроить, как указано выше, 12 выводов выходят на реальные пины МК, что делать с остальными 20-ю выводами??? Которые не имеют физического выхода на ножки МК, и не надо специфически настраивать по спецификации??

Проблема же у меня следующего плана:
МК при включении настраивает gpio и осциллятор, затем ждет импульс на входе, после отправляет сообщение по специфическому протоколу, ждет 10с и уходит в halt, просыпается так же по прерыванию на входе, и повторяет все заново. Программа все работает, но при сборке устройства и обкатке в реальных условиях, мк стал нагреваться и переставал работать(сообщение не доходило или были искажения, не проверял), постояв какое то время без питания, работал вновь. И греется он ощутимо пальцем, хотя по идее должен быть в халт режиме.
Я вот грешу на неверную настройку ножек, т.к. я все(включая 20 не указанных в спецификации) не используемые выводы настроил на push-pull и назначил в odr на них 0.

Кто сталкивался с этими МК и как настраивал gpio выводы или может сталкивался с такой же проблемой нагрева?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

1. 4ygeca, ножки паркуют для уменьшения энергопотребления. если оно вас не волнует, оставьте все по умолчанию.
2. парковать, если делать это, следует все ножки. те что не выведены на корпус все равно есть в кристалле.
3. И греется он ощутимо пальцем коротыш. проверяйте свою схему на КЗ.
Друг Кота
Аватара пользователя
Сообщения: 3519
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Сообщение smacorp »

4ygeca, или просто бракованный экземпляр МК. У меня есть один STM32, который прекрасно работает, но греется до 60 градусов и потребляет около 200 мА даже в простое. Другой экземпляр там же работает правильно.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
Родился
Сообщения: 6
Зарегистрирован: Чт янв 16, 2020 18:04:26

Сообщение 4ygeca »

JackSmith писал(а):1.ножки паркуют для уменьшения энергопотребления. если оно вас не волнует, оставьте все по умолчанию.
2. парковать, если делать это, следует все ножки. те что не выведены на корпус все равно есть в кристалле.
3. И греется он ощутимо пальцем коротыш. проверяйте свою схему на КЗ.
2. Принял. Спасибо
3. Вот схема, честно ума не дам где в ней может быть КЗ
Изображение
платки заказывал. Питание берется с промышленной платы, которая нормально работает.

[uquote="smacorp",url="/forum/viewtopic.php?p=4620996#p4620996"]4ygeca, или просто бракованный экземпляр МК. У меня есть один STM32, который прекрасно работает, но греется до 60 градусов и потребляет около 200 мА даже в простое. Другой экземпляр там же работает правильно.[/uquote]
Возможно, смущает тот момент, что я сделал 3 таких штуки, одна давно уехала и исправно работает, но это была самая первая прошивка, плата и схема та же. одна у меня на тестовой сборке, там такая же проблема(как оказалось) и третья, на которой выявилась такая проблема. я конечно, не отрицаю, что из 5 МК, которые я заказал 2 дохлые, но как то сомневаюсь.
Сейчас собираю обратно испытательный "стенд" буду все пробовать. Спасибо
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

4ygeca писал(а):но это была самая первая прошивка,
ну так залейте эту прошивку и сравните, будет греться новый камень или нет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 3519
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

Сообщение smacorp »

4ygeca, сомневаетесь? А зря - смотря где брали.

Я как-то на Али взял 5 шт. STM32F103C8T6 одним лотом:

- у одного был просто КЗ по питанию;
- у второго чудеса с нагревом, о которых писал выше;
- третий работал чудесно на всех частотах, кроме как на 72 МГц, отчего USB-HID не определялся;
- и только 2 оставшихся нареканий не вызвали.

То есть, тот продавец торговал лютой отбраковкой. И таких там легион.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (4 цвета).
Родился
Сообщения: 6
Зарегистрирован: Чт янв 16, 2020 18:04:26

Сообщение 4ygeca »

[uquote="smacorp",url="/forum/viewtopic.php?p=4621092#p4621092"]4ygeca, сомневаетесь? А зря - смотря где брали.[/uquote]
Брал в чипИдипе. Скорее всего вы оказались правы, косячная партия похоже.

[uquote="Z_h_e",url="/forum/viewtopic.php?p=4621085#p4621085"]
4ygeca писал(а):но это была самая первая прошивка,
ну так залейте эту прошивку и сравните, будет греться новый камень или нет.[/uquote]
Попробовал, резульатат тот же.

В общем победил я эту проблему. Кроме как косячной партии МК, у меня объяснения нет.
Когда начал разбираться обнаружил на пине 5 2.8В постоянно весящие, на 7 были 0.9В, т.е. транзисторы были открыты. Сверил с прошивкой и там да, получалось, что после отправки линии он притягивал к земле, открывая ключи, соответственно и питание на них должно быть. Но возникает вопрос почему 2.8В на одном и 0.9В на другом выводе?? И почему из-за них МК грелся??? А спустя время видимо разогревался так, что плыли частоты и сообщение уже не принималось.
В общем добавил в конце отпускание пинов в 0 и греться перестал. Хотя казалось бы нагрузка всего 2 транзистора...
Не зря на сайте ST написано не использовать эти МК для новых изделий... Очень косячные какие то, хапнул горя с ними с самого начала, когда в начале поймал ошибку в коде с неверной настройкой портов и swim слетал из-за того, что одна ножка на несколько портов. Написал предохранитель, после настройки gpio, проверял включен ли swim
Спойлер

Код: Выделить всё

	if (CFG->GCR & 0x1) {
		gpio_reset_default();
	}
Ковыряясь в коде обнаружил, что не запускал таймер на отправку в сон, после того как запустил 2 МК уснули навечно, видимо где то косякнул с настройкой таймера, что прерывание сразу срабатывало. В итоге отказался от этой затеи, до лучших времен) это больше для себя фича)

Всем спасибо, кто откликнулся и пытался помочь.

Кстати, в этом проекте я написал очень, как по мне элегантное, удобное и быстрое решение по начальной инициализации ножек 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
С типами данных u8 u16 u32, думаю все понятно.
Пример инициализации:

Код: Выделить всё

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, все отлично работает.
Код на выходе получается, как если писать константы в регистры, но читаемо и понятно.
Один раз пробежался по всем портам в начале и все быстренько настроилось.
Прорезались зубы
Аватара пользователя
Сообщения: 200
Зарегистрирован: Пт ноя 16, 2012 20:17:41
Откуда: Беларусь

Сообщение Сирожа »

Изображение

Я всё никак не домучаю наручные часы. Попали в руки другие индикаторы и я решил переделать плату под них. Индикаторы как мне показалось АЛС314А. Развёл плату, прошил, собрал, а оно не алё. Светится, но не так как надо. Оказалось индикаторы АЛС304Г. А у них общий анод, а нужно с общим катодом. И чтоб не искать новые индикаторы и не перепаивать, а сформировать их и запаять оказалось той ещё задачей.
Возник вопрос, может кто может подправить скомпилированную (исходников нет) прошивку под индикаторы с общим +.
Clock.rar
(4.55 КБ) 170 скачиваний
OKF
Это не хвост, это антенна
Сообщения: 1454
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Сирожа, ну ты ещё тот шалун.
Родился
Сообщения: 11
Зарегистрирован: Чт янв 14, 2016 08:40:35
Откуда: Москва

Сообщение MMK1 »

Проще будет найти АЛС314А. Был бы ты в Москве, я бы тебе их подарил.
Ответить

Вернуться в «Разные вопросы по МК»