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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение 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
Реклама
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

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

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

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

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

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

Сообщение axillent »

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

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

Сообщение Merlin »

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

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

Сообщение axillent »

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

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

Сообщение RusikOk »

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

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

Сообщение axillent »

подскажите, как настроить IAR 3.10 на то, чтобы при компиляции выводиласт статистика по занятым ресурсам?
в 2.20 выводилось по умолчанию, в 3.10 по умолчанию нет ничего
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

в окошке вывода Build нажать правую кнопку мышы -> птичка All
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

спасибо! заработало
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

есть ли какие то опции компилятора повысить стандарт С++?
в частности хотелось бы, чтобы принимался nullptr
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

что может быть причиной того, что МК зависает внутри вектора прерываний ADC?

переписываю библиотеки на С++
всю инициализацию и все настройки регистров беру из рабочего варианта на Си
но при активации ADC судя по отладчику МК бесконечно отрабатывает только прерывания ADC, в основную программу не возвращается
флаги сбрасываю

внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
при этом по отладке сам выхов отрабатывает так как надо, МК не виснат полностью, а хацикливается на векторе прерываний ADC

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

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

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

Сообщение RusikOk »

может переполнение стека?
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

[uquote="RusikOk",url="/forum/viewtopic.php?p=3179377#p3179377"]переполнение стека?[/uquote]
с чего оно возникнет?
опять же если бы было переполнение через какое то время МК просто ушел бы в никуда
а он упорно отрабатываепт вектор и весь мой код внутри вектора
Аватара пользователя
RusikOk
Нашел транзистор. Понюхал.
Сообщения: 197
Зарегистрирован: Пн янв 24, 2011 01:51:48
Откуда: Украина, Киев
Контактная информация:

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

Сообщение RusikOk »

[uquote="axillent",url="/forum/viewtopic.php?p=3179383#p3179383"]с чего оно возникнет?[/uquote]
от недостаточного размера стека[uquote="axillent",url="/forum/viewtopic.php?p=3179383#p3179383"]а он упорно отрабатываепт вектор и весь мой код внутри вектора[/uquote]ну так адрес возврата затертый
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

[uquote="RusikOk",url="/forum/viewtopic.php?p=3179385#p3179385"]ну так адрес возврата затертый[/uquote]

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

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

Сообщение RusikOk »

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

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

Сообщение Z_h_e »

axillent писал(а): внутри обработчика иедт вызов функции по адресу и если этот вызов закоментарить, то зависания прекращаются
Возможно эта функция выполняется так долго, что АЦП успевает сделать следующее преобразование. Если это так, то можно уменьшить приоритет прерывания или выключать АЦП пока находишься в обработчике прерывания, сбрасывать флаг перед выходом из прерывания.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

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

Сообщение axillent »

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

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

Сообщение Z_h_e »

Наверное без кода тогда Вам не помочь. Ищите что вносит закоментная функция. Вы ее по адресу вызываете, возможно RusikOk в правильном направлении наколку дал.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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