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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="YS",url="/forum/viewtopic.php?p=3131817#p3131817"]Только где найти документацию на обработанную версию?[/uquote]
из исходников собрать) на всякий случай, в аттаче

[uquote="YS",url="/forum/viewtopic.php?p=3131817#p3131817"]Кстати интересно, они таки допилили возможность передавать/возвращать структуры по значению[/uquote]
нет. Насколько помню, это принципиальная позиция.
[uquote="YS",url="/forum/viewtopic.php?p=3131817#p3131817"]и объявлять обработчики прерываний где угодно, а не только в файле, содержащем точку входа (main)?[/uquote]
If you have multiple source files in your project, interrupt service routines can be present in any of them, but a prototype of the isr MUST be present or included in the file that contains the function main.
линкер не очень умный)
Вложения
sdccman.zip
(562.68 КБ) 325 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3090161#p3090161"]У меня такое чувство, что если возникло событие внешнего прерывания в момент когда прерывание запрещено (вернее текущий уровень приоритета не перебивается этим событием), то это событие будет потеряно.[/uquote]Это вряд ли... в документации вроде ясно описано что прерывание таки произойдет после завершения более приоритетного прерывания...

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3090161#p3090161"]Кроме того, флагов событий внешних прерываний то нет (по крайней мере для пользователя).[/uquote]Это можно решить тем что на один порт будет не более одного внешнего прерывания... если например используется 2 внешних прерывания то распихать их по разным портам...
Если же необходимо использовать еще больше внешних прерываний, то наверное все таки придется пересмотреть приоритеты прерываний так чтобы внешние прерывания не задерживались...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

shads писал(а):Это вряд ли...
Надеюсь. Я так тестовую прогу так и не делал. Надо заставить себя. Проверить то просто. Установить для основного тела программы высший приоритет (т.е. запретить прерывания), дать событие, и разрешить прерывание.
Для чистоты эксперимента, можно ввалится в обработчик высшего приоритета, потупить в нем и в это время дать внешнее событие. Хотя по логике STM8 - это вроде как одно и тоже.

У меня одно внешнее прерывание, низшего уровня. Несколько прерываний теряются. Но это для проекта не критично и я пока отложил этот вопрос в сторону. А разобраться конечно надо будет, где собака порылась.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Сообщения: 1355
Зарегистрирован: Вт май 20, 2014 18:14:20
Откуда: Белгород

Сообщение ССтанислав »

День добрый, господа.
Возник вопрос. Сначала что сделал и в чем проблема:
Настроил TIM2_CH1 вывод PWM, "поддяжка" к 1. Запускаю таймер, все работает, ШИМ такой как и подсчитал.
А вот когда ОСТАНАВЛИВАЮ таймер возник затык, таймер останавливается в том положении (0 или 1), в котором его застиг момент останова.
Это у меня руки кривые или так и задумано?
Собственно вопрос - как сделать так, чтобы при остановке таймера на выходе была ВСЕГДА 1.
Дорогу осилит идущий.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Таймер можно не останавливать по-моему.
В регистре TIMx_CCMR1 биты OC1M[2:0] переводите из режима ШИМ на режим 001 и обратно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Это не хвост, это антенна
Сообщения: 1355
Зарегистрирован: Вт май 20, 2014 18:14:20
Откуда: Белгород

Сообщение ССтанислав »

Спасибо. Попробую.

Попробовал. Все получилось. Таймер останавливать не надо. Еще раз спасибо.
Дорогу осилит идущий.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Набыдлокодил тут с аппаратным i2c( :shock: ). Все как бы работает, но удивляет некий момент:
По даташиту флаг SB должен очищаться после чтения регистра I2C_SR1, но он зараза очищается только после записи адреса слева в I2C_DR.


void i2c_start(void)
{
while(I2C_SR3_BUSY);
I2C_CR2_START=1;
while(!(I2C_SR1_SB)); <---тут он не очищается
volatile char z=I2C_SR1; <---и тут он не очищается
}

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

Сообщение Z_h_e »

EV5:SB=1, cleared by reading SR1 register followed by writing DR register with Address.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Ах еклмн. Английский мануал надо читать)))
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

вопрос
есть строка кода:

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

 if( ++data->byte_index >= data->bytes ) data->state = encoding_state_tx_busy_lb;
где data->byte_index и data->bytes оба volatile
IAR дает варнинг:
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
как правильно избавиться от этого варнинга?
если сделать локальную переменную, в нее присвоить значение одной из volatile и затем в сравнении использовать ее то варнинг уйдет
так надо?
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

[uquote="axillent",url="/forum/viewtopic.php?p=3138323#p3138323"]вопрос
IAR дает варнинг:
как правильно избавиться от этого варнинга?[/uquote]
Используй скобки, а то непонятно, что инкрементируешь, data или byte index:

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

 if( ++(data->byte_index) >= data->bytes ) data->state = encoding_state_tx_busy_lb;
Контактная информация:
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

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

Сообщение Z_h_e »

Компильнул в IAR вот такой код.

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

 typedef struct {
     char byte_index;
     char bytes;
     char state;
   } data_t;
   data_t *data;
   
   data=0;
   
   if( ++data->byte_index >= data->bytes ) data->state = 1;
Ни одного варнига.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

вариант:

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

unsigned char a;
data->byte_index++;
a =  data->byte_index;
if( a >= data->bytes ) data->state = encoding_state_tx_busy_lb;
почитать тут:
http://microsin.ru/content/view/1172/44/
https://electronix.ru/forum/lofiversion ... 13226.html
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Спасибо, значит описанный мной способ правильный

вопрос еще
как правильно сбрасывать счетчик TIM4_CNTR ?
достаточно ли для этого присвоить регистру нулевое значение или нужно еще как то перезапускать таймер?
Открыл глаза
Аватара пользователя
Сообщения: 51
Зарегистрирован: Пн янв 18, 2010 17:52:07

Сообщение Merlin »

Добрые коты помогите!!
Не могу разобраться, не работает SPI на stm8l051f3
Инициализация проходит, порты работают. А SPI не хочет,
в режиме дебага в регистр DR нечего не шлется, соответственно никаких флагов не выставляется

Пишу в ИАР
Моя инициализация
Спойлер/* Includes ------------------------------------------------------------------*/
#include "stm8l15x.h"
#include "peripheral.h"

/* Private functions ---------------------------------------------------------*/
uint8_t SPI_ReadByte(uint8_t);

void main(void){
CLK_Init();
SPI_Init_();
Leds_Init();

uint8_t i = 0;

/* Infinite loop */
while (1) {
for (i=0; i<10; ++i){
SPI_ReadByte(i);
}
}
}
uint8_t SPI_ReadByte(uint8_t data){
/* Ждём очистки регистра DR */
while ((SPI1->SR & (uint8_t)SPI_FLAG_TXE) == RESET) { ; }

/* Послать байт */
SPI_SendData(SPI1, data);

/* Ждём приёма байта */
//while ((SPI1->SR & (uint8_t)SPI_FLAG_RXNE) == RESET) { ; }

/* Возвратить принятый байт */
return (uint8_t)SPI1->DR;
}

#ifdef USE_FULL_ASSERT
void assert_failed(u8* file, u32 line) { while (1) {}; };
#endif
Спойлер#include "peripheral.h"

//******************************************************************************
//------------------------------ CLK ------------------------------
//******************************************************************************
void CLK_Init(void) {
CLK_DeInit();
CLK_HSICmd(ENABLE);
CLK->CKDIVR = 0x00; // Fcpu = 16MHz
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
CLK_SYSCLKSourceSwitchCmd(ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
}
//******************************************************************************
//------------------------------ Leds ------------------------------
//******************************************************************************
void Leds_Init(void) {
GPIO_Init(PORT_Red_Led, PIN_Red_Led, GPIO_Mode_Out_PP_Low_Fast);
}
//******************************************************************************
//--------------------- SPI initialization --------------------
//******************************************************************************
void SPI_Init_(void) {
GPIO_Init (PORT_NSS, PIN_NSS, GPIO_Mode_Out_PP_High_Fast); // конфигурируем CS (SS)
// GPIO_Init (PORT_SPI, PIN_CE, GPIO_Mode_Out_PP_High_Fast); // конфигурируем CE
GPIO_Init (PORT_SPI, PIN_SCK, GPIO_Mode_Out_PP_High_Fast); // конфигурируем CLK
GPIO_Init (PORT_SPI, PIN_MOSI, GPIO_Mode_Out_PP_High_Fast); // конфигурируем MOSI
GPIO_Init (PORT_SPI, PIN_MISO, GPIO_Mode_In_FL_No_IT); // конфигурируем MISO
// GPIO_Init (PORT_SPI, PIN_IRQ, GPIO_Mode_In_FL_No_IT); // вывод прерывания радиомодуля

SPI_DeInit(SPI1);
SPI_CalculateCRCCmd(SPI1, DISABLE);
SPI_Init
(
SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_256, SPI_Mode_Master,
SPI_CPOL_Low, SPI_CPHA_1Edge,
SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x00
);
SPI_Cmd(SPI1, ENABLE);
}
Спойлер#ifndef _peripheral_
#define _peripheral_

#include "stm8l15x.h"

//******************************************************************************
//------------------------------ Leds ------------------------------
//******************************************************************************
#define PORT_Red_Led GPIOC
#define PIN_Red_Led GPIO_Pin_6

//***************************************************************************//
//--------------------- defines START ---------------------//
//***************************************************************************//
#define PIN_NSS GPIO_Pin_2 // connected to CSN
#define PORT_NSS GPIOB // NSS port
#define PIN_SCK GPIO_Pin_3
#define PIN_MOSI GPIO_Pin_4
#define PIN_MISO GPIO_Pin_5
#define PORT_SPI GPIOB // SPI port

//***************************************************************************//
//------------------------- function defines ------------------------//
//***************************************************************************//
void SPI_Init_(void);
void Leds_Init(void);
void CLK_Init(void);

#endif
Или ткните рабочим кодом, а лучше проэктом.
Просто в симуляторе в регистр данные идут, а в железе все молчит. Может забыл что то еще инициализировать.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

правильно понимаю, что такой адаптер https://ru.aliexpress.com/item/TSSOP28- ... st=ae803_1
можно применить для беспаявной отладки и прошивки stm8 в корпусах TSSOP20?
было бы круто
Открыл глаза
Аватара пользователя
Сообщения: 51
Зарегистрирован: Пн янв 18, 2010 17:52:07

Сообщение Merlin »

А что здесь крутого?
Что тебе мешает отлаживать запаянный контроллер?
По моему SWIM полностью его debag-ит и прошивает в плате.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

с tiny13 некоторые простые устройства требующие простоты, а иногда коимпактности отлаживаю используя похожий адаптер и потом прошитую микросхему впаиваю
не нужно место на плате под ISP, его не надо ни разводить ни паять ни выделять место
вот думаю для себя о том же с stm8s. особенно актуально если надо сделать серию одинаковых устройств
конечно все ИМХО, не всем надо
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев

Сообщение RusikOk »

на худой конец можно на время отладки подпаять провода к программатору и отлаживать себе спокойно.
Контактная информация:
Ответить

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