Программирование STM8
- GARMIN
- Держит паяльник хвостом
- Сообщения: 952
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Программирование STM8
Я экспериментировал с таким методом.
Вот здесь:
http://forum.easyelectronics.ru/viewtopic.php?f=33&t=20021
Вот здесь:
http://forum.easyelectronics.ru/viewtopic.php?f=33&t=20021
Re: Программирование STM8
UART с буферами и прерываниями разобрался
Еще такой вопрос
Когда велючен RX receiver можно ли считывать значение этого пина обычным образом? Т.е. Можно ли знать ноль там сейчас или единица?
Еще такой вопрос
Когда велючен RX receiver можно ли считывать значение этого пина обычным образом? Т.е. Можно ли знать ноль там сейчас или единица?
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Программирование STM8
Всем привет. В чем разница между функциями GPIO_ReadOutputData() и GPIO_ReadInputData()? Взято из библиотечного файла:
* @brief Reads the specified GPIO output data port.
* @note The port must be configured in input mode.
* @param GPIOx : Select the GPIO peripheral number (x = A to I).
* @retval GPIO output data port value.
*/
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
{
return ((uint8_t)GPIOx->ODR);
}
/**
* @brief Reads the specified GPIO input data port.
* @note The port must be configured in input mode.
* @param GPIOx : Select the GPIO peripheral number (x = A to I).
* @retval GPIO input data port value.
*/
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
return ((uint8_t)GPIOx->IDR);
}
Спойлер
/*** @brief Reads the specified GPIO output data port.
* @note The port must be configured in input mode.
* @param GPIOx : Select the GPIO peripheral number (x = A to I).
* @retval GPIO output data port value.
*/
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
{
return ((uint8_t)GPIOx->ODR);
}
/**
* @brief Reads the specified GPIO input data port.
* @note The port must be configured in input mode.
* @param GPIOx : Select the GPIO peripheral number (x = A to I).
* @retval GPIO input data port value.
*/
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
return ((uint8_t)GPIOx->IDR);
}
Re: Программирование STM8
FireProoF, читать RM на тему портов, Там и найдете различия регистров ODR и IDR ...
- FireProoF
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Чт май 14, 2015 15:11:39
- Откуда: Саратов
Re: Программирование STM8
Всем привет. В stm8s103 UART1 имеет пины: D4 - UART_CK, D5 - UART_TX, D6- UART_RX. Мне нужен D4 для других целей. Можно ли сделать так, чтоб UART не пользовался им?
- GARMIN
- Держит паяльник хвостом
- Сообщения: 952
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Программирование STM8
Control register 3 (UART_CR3)
Bit 3 CLKEN: Clock enable
This bit allows the user to enable the SCLK pin.
0: SLK pin disabled
1: SLK pin enabled
Bit 3 CLKEN: Clock enable
This bit allows the user to enable the SCLK pin.
0: SLK pin disabled
1: SLK pin enabled
Re: Программирование STM8
Здравствуйте. Хочу использовать в своем проекте STM8f003. C STM никогда не работал. И не могу найти описание регистров и их назначения. Необходимо UART и SPI. Какие даташиты смотреть? У ATMEL даташиты мне очень понравились, а у STM ничего подобного найти не могу. Все разбросано. Подскажите, дайте пожалуйста ссылки)) И еще такой вопрос, как лучше, проще работать с STM на прямую с регистрами или использовать библиотеки SPL?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Программирование STM8
Casper17 писал(а): а у STM ничего подобного найти не могу. Все разбросано. Подскажите, дайте пожалуйста ссылки)) И еще такой вопрос, как лучше, проще работать с STM на прямую с регистрами или использовать библиотеки SPL?
http://www2.st.com/content/st_com/en/pr ... 003f3.html
качать Datasheet, Reference Manual RM0016, Errata Sheet ES0102
в Datasheet информация о конкретном микроконтроллере, типа распиновка, количество флэша, памяти и пр.
В Reference Manual информация о внутренностях (периферия и пр.) на всю линейку микроконтроллеров, потому что периферия у всех представителей линейки однообразна, в отличии от тех же AVR.
В Errata Sheet понятно.
Работать имхо лучше напрямую с регистрами, руководствуясь Reference Manual.
Re: Программирование STM8
Casper17 STM8 не сложнее AVR, нужно только перестроиться на другую логику документации
Про документы вам уже написали
RM0016 описывает все многообразие переферии в линейке STM8S, а даташит на конкретный МК описывает корпуса, пины и то, какая конкретно переферия из всей имеющейся в линейке есть в данном конкретном МК
SPL это уровень абстракции, програмирование на нем не сильно приблизит к пониманию того как работает сам МК. Выбор за вами, но выбрав SPL будьте готовы к тому, что в итоге все равно придете к програмированию регистров, только позже, когда поймете, что с SPL ничего не понимаете) у меня было именно так, правда от SPL я отказался почти сразу
Про документы вам уже написали
RM0016 описывает все многообразие переферии в линейке STM8S, а даташит на конкретный МК описывает корпуса, пины и то, какая конкретно переферия из всей имеющейся в линейке есть в данном конкретном МК
SPL это уровень абстракции, програмирование на нем не сильно приблизит к пониманию того как работает сам МК. Выбор за вами, но выбрав SPL будьте готовы к тому, что в итоге все равно придете к програмированию регистров, только позже, когда поймете, что с SPL ничего не понимаете) у меня было именно так, правда от SPL я отказался почти сразу
Re: Программирование STM8
пытаюсь запустить 2й канал TIM1 с PWM
затер RM до дыр, но почему-то не получается
что я упускаю?
upd. кажется я понял... надо AFR0 поменять для TIM1_CH2 так? как это в IAR делается?
upd. заработало!
затер RM до дыр, но почему-то не получается
что я упускаю?
Спойлер
Код: Выделить всё
// PC4
PC_DDR_bit.DDR4 = 1;
PC_CR1 |= MASK_PC_CR1_C14;
// TIM1
TIM1_CR1 = MASK_TIM1_CR1_ARPE;
TIM1_CR1_bit.CMS = 0; // 00 - edge aligned, 01 - center aligned1
TIM1_CR2 = 0;
TIM1_IER = 0;
//TIM1_EGR = 0;
TIM1_CCMR1 = 0;
TIM1_CCMR2 = MASK_TIM1_CCMR2_OC2PE | MASK_TIM1_CCMR2_OC2FE;
TIM1_CCMR2_bit.OC2M = 6; // 0b110 - PWM mode 1, 0b111 - PWM mode 2
TIM1_CCMR3 = 0;
TIM1_CNTRH = 0;
TIM1_CNTRL = 0;
TIM1_CCER1 = MASK_TIM1_CCER1_CC2NE;
TIM1_CCER2 = 0;
TIM1_PSCRH = 0;
TIM1_PSCRL = 0;
TIM1_ARRH = 4; // pwm frequency
TIM1_ARRL = 0;
TIM1_CCR2H = 1; // pwm duty
TIM1_CCR2L = 0;
TIM1_BKR = MASK_TIM1_BKR_MOE | MASK_TIM1_BKR_OSSR;
TIM1_CR1 |= MASK_TIM1_CR1_CEN;
TIM1_EGR |= MASK_TIM1_EGR_UG;upd. кажется я понял... надо AFR0 поменять для TIM1_CH2 так? как это в IAR делается?
upd. заработало!
Re: Программирование STM8
Добрый день. Подскажите, правильно ли я понимаю, что в STM8 не все пины можно переключать в push-pull или open-drain режим, так как у некоторых из них он жестко задаётся соответствующей периферией в обход регистра CR1 (нельзя, например, I2C-пины переключить в push-pull даже при отключенном I2C)? В ref. manual на схеме GPIO есть некий сигнал «alternate enable», о котором вообще нигде ничего не поясняется.
upd. Вопрос снят. Всё просто. Оказывается, просто не все пины поддерживают Push-Pull.
upd. Вопрос снят. Всё просто. Оказывается, просто не все пины поддерживают Push-Pull.
Re: Программирование STM8
смотрите табличку в разделе Pinouts and pin description в даташите на сам МК
там все четко указано какой пин можно в какой режим переключать
так же часто можно это понять по мнемонике на символическом обозначении
например пины I2C обозначаются как (T) - true open drain, что означает:
там все четко указано какой пин можно в какой режим переключать
так же часто можно это понять по мнемонике на символическом обозначении
например пины I2C обозначаются как (T) - true open drain, что означает:
In the open-drain output column, "T" defines a true open-drain I/O (P-buffer, weak pull-up, and protection diode to VDD are
not implemented).
Re: Программирование STM8
Пытаюсь теперь закодить на том же STM8L обмен данными с датчиком по I2C1. Вопрос: по какой причине может возникать Arbitration Lost (флаг I2C1_SR2_bit.ARLO), если на шине по определению нет других мастеров? Причём возникнуть он может даже на пустой линии (к портам подключены только подтягивающие резисторы) (иногда, как и должен, выскакивает AF, а иногда - ARLO). Линии SDA и SCL в нуле никто не удерживает (если судить по значениям в регистре IDR в отладчике).
Ещё вопрос: как пользоваться флагом I2C1_CR2_bit.SWRST (software reset)? В документации нигде про него не расписано.
Также неясно, а может ли I2C контроллер вообще работать от fsysclock, «запитанного» от LSI? Ref manual гласит:
То есть при работе контроллера от LSI 38 кГц I2C корректно завести вообще нельзя?
Ещё вопрос: как пользоваться флагом I2C1_CR2_bit.SWRST (software reset)? В документации нигде про него не расписано.
Также неясно, а может ли I2C контроллер вообще работать от fsysclock, «запитанного» от LSI? Ref manual гласит:
The peripheral input clock frequency must be at least: 1 MHz in Standard mode, 4 MHz in Fast mode
То есть при работе контроллера от LSI 38 кГц I2C корректно завести вообще нельзя?
Re: Программирование STM8
Standard mode имеет частоту I2C равную 100кГц, а fast -- 400кГц. Умножать тактовую STM8 не умеют, т.ч. способа из 38кГц тактовой получить 100кГц I2C просто не существует в природе.
Re: Программирование STM8
Что мещает на время обмена по I2C менять источник тактирования?
Re: Программирование STM8
Извиняюсь, что не отписался. Проблема оказалась не в I2C контроллере (всё нормально работает от LSI), а в неправильном использовании датчика Am2321. Оказалось, что чтобы его корректно разбудить, нужно обратиться к нему, получить NACK и… перед отправкой стопового бита уронить всю линию (и SDA, и SCL) в 0 на 0.8 мсек. Как вам такое?
Естественно I2C контроллер не даёт просто так порулить пином SDA, наплевав на стандарты шины I2C. Остаётся вручную портами дрыгать, имитируя вышеперечисленные действия. А датчик пробуждать нужно каждый раз, перед каждым считыванием показаний - после чтения он опять засыпает.
Иными словами, мне подумалось, что, быть может, этот «must» - своего рода «absolute maximum (в данном случае minimum) ratings».
В любом случае, вопрос снят.
Впрочем, было бы всё-таки интересно для общего развития узнать, как пользоваться флагом I2C1_CR2_bit.SWRST (software reset).
Просто по документации не совсем было понятно, что в том контексте означает это «must». Означало ли это, что при меньшей частоте sysclock просто шину нельзя будет разогнать до 100 и 400 кГц, или же что (вдруг) имеется некая нигде не описанная аппаратная защита, которая при недостаточной частоте весь контроллер сбрасывает/вырубает (multimaster ведь…).a5021 писал(а):Standard mode имеет частоту I2C равную 100кГц, а fast -- 400кГц. Умножать тактовую STM8 не умеют, т.ч. способа из 38кГц тактовой получить 100кГц I2C просто не существует в природе.
Иными словами, мне подумалось, что, быть может, этот «must» - своего рода «absolute maximum (в данном случае minimum) ratings».
В любом случае, вопрос снят.
Впрочем, было бы всё-таки интересно для общего развития узнать, как пользоваться флагом I2C1_CR2_bit.SWRST (software reset).
Re: Программирование STM8
А есть ли смысл работать от LSI в этом случае? Я понимаю, что чем ниже частота, тем меньше потребление. Но все операции становятся весьма долгими и в это время процессор потребляет больше, чем если бы он уже давно находился во сне, отработав по-быстрому на высокой частоте.
Re: Программирование STM8
Для сброса:
//и настраиваем модуль заново
Код: Выделить всё
I2C_CR2_SWRST=1;
I2C_CR2_SWRST=0;//и настраиваем модуль заново
Код: Выделить всё
I2C_FREQR_FREQ = 16;
I2C_CR1_PE = 0;
I2C_CCRH_F_S = 0;
ccr = 80;
I2C_TRISER_TRISE = 16+1;
I2C_CCRL = ccr & 0xFF;
I2C_CCRH_CCR = (ccr >> 8) & 0x0F;
I2C_CR1_PE = 1;
I2C_CR2_ACK = 1;-
Rpetrovich
- Родился
- Сообщения: 4
- Зарегистрирован: Вт янв 06, 2015 14:12:15
Re: Программирование STM8
Знатоки STM проясните ремонтнику, можно ли STM8S прошить также легко и бесплатно
как скажем atmega32 понипрогом через RS232.
Если да то какая прога нужна, и какая схема подключения?
Если да то какая прога нужна, и какая схема подключения?
