Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/103: Рейтинг темы: голосов - 103, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331

Болеет UART в STM8 Discovery

20.02.2011, 06:27. Показов 19371. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем вечно у мя чёто либо не работает либо фигово работает.....решил поковырять UART в Dyscovery, подключил через PinBoard к компу, написал простенький код без прерываний на ожидание в цикле и столкнулся с проблемой :(((
Если трассировать отладчиком по строчно в Си по F11 то всё хорошо сообщение без ошибок передаётся в комп, но если включить F5 или просто запустить, то пара !! вылезет и всё или вообще нет реакции, затащил вызов функции внутрь while(1), на терминал посыпался шквал треша всякого, сообщение повторяя раза по 4-5 одни и теже символы и порой и многие пропуская.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "stm8s.h"
 
void UART_Send(const char *s);
 
main()
{
//Инициализируем CLK
CLK->ECKR|=CLK_ECKR_HSEEN; //Разрешаем работу генератора с внешним кварцем (HSEEN)
CLK->SWCR|=CLK_SWCR_SWEN;  //Разрешаем автопереключение источника Clock при неисправности генератора
CLK->SWR=0xB4;             //Включаем clock от кварцевого генератора (HSE)
CLK->CKDIVR=0;             //Делители частоты внутреннего и внешнего генератора на 1 - частота ядра максимальная
 
// Инициализация  UART
UART2->BRR1|=0x68;
UART2->BRR2|=0x03; // Baudrate 9600
 
UART2->CR2|=UART2_CR2_TEN;
UART2->CR2|=UART2_CR2_REN;
UART2->CR3|=0x20;  // 2 stop bits
 
UART_Send("Hello dude!");
 
while (1)
{
UART_Send("Hello dude!");
}
}
 
void UART_Send(const char *s)
 
{
char c;
while ( (c = *s++) ) {
while(!UART2_SR_TXE){}
UART2->DR=c;
}
 
}
Вот незнаю с чем это связано :((((
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2011, 06:27
Ответы с готовыми решениями:

Прошивка STM8 через Discovery
Добрый день Нужен совет. Есть плата STM8LDyscovery, которая прошивается и отлаживается через IAR. Нужно прошивать STM8 микроконтроллеры...

не могу прошить МК в STM8 discovery
Привет всем не могу залить прогу в МК пишет: >>> Prokramming PROGROM MEMORY (API) ERROR : Cannot sommunicate wyth the board. Wrong...

STM8 DISCOVERY обзор и изучение
Предлагаю в данной теме писать все связанное с данной платкой,любительские коды и вопросы.Вот сам купил,только пришла из терры по цене чуть...

15
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 544
20.02.2011, 17:38
а уверен что надо 2 стоп бита?? ( UART2->CR3|=0x20; // 2 stop bits )
по дефолту ПЦ работает с 8ми битным полем с 1 стоп битом , отсутствием контроля четности и как правило для не модемных соединений( тоесть где только рх и тх без сигналов готовностей итд) надо отключать управление потоком.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
20.02.2011, 21:21
Стоп-битами кашу не испортишь, потому что они имеют "неактивный" уровень. Второй стопбит выглядит просто как дополнительная пауза длиной в один битовый интервал, разделяющая байты. Приёмник, настроенный в конфигурации 8n1 просто не видит его.
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
20.02.2011, 21:52
Я в Terminal 1.9b указал что у меня 2 стопа.....так что не них дело!
0
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 544
20.02.2011, 22:36
А там где управление потоком - не XON XOFF стоит? и попробуй так ( но не думаю что очень принципиально) :

void UART_Send(const char *s)

{
char c;
while (*s++) {
while(!UART2_SR_TXE){}
UART2->DR=c;
}

}
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
20.02.2011, 23:24
Тут блин вот какое дело, пишу в ST Develop под Cosmic незнаю где грабли, но при том же коде в IAR проблем нет, всё как задуманно.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "iostm8s105c6.h"
#include "intrinsics.h"
 
void UART_Send(const char *s);
 
main()
{
char *text = "   Hello Dude!";
CLK_ECKR=1;
CLK_SWCR=1;
CLK_SWR=0xB4;
CLK_CKDIVR=0;
 
UART2_BRR1|=0x68;
UART2_BRR2|=0x03; // Baudrate 9600
UART2_CR2 |= (MASK_UART2_CR2_REN)|(MASK_UART2_CR2_TEN);
UART2_CR3|=0x20;  // 2 stop bits
 
while (1)
{
UART_Send(text);
}
}
 
void UART_Send(const char *s)
 
{
char c;
 
while ( (c = *s++) )
{
while(!UART2_SR_TXE){}
UART2_DR=c;
}
}
Я когда ещё код писал с косяком столкнулся компилятор (Cosmic) ругался на UART2 тип незнаю чё за муть, в дефайнах чётко прописано что если STM8S105 то определить UART2 и контроллер у меня выбран STM8S105C6 соответственно, не понял почему ругается пришлось закоментировать

Code
1
2
3
//#ifdef STM8S105
#define UART2 ((UART2_TypeDef *) UART2_BaseAddress)
//#endif /* STM8S105 */
0
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 544
21.02.2011, 00:17
я в таких случаях - дизасмлю код полученый от компилятора. правда в основном это ARM и есть нормальный дизассемблер.
на STM8 даже не знаю - есть ли дизасм. но бывали такие вензеля у компилятора что огого! типа вместо записи в порт описанной через volatile - тупо компилился NOP при какомто уровне оптимизации. пол дня проковырялся с кодом - пока не глянул в дизасм. поменял опцию оптимизации (вернее нахрен ее вообще отключил) и о чудо - код заработал!
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
21.02.2011, 00:20
Дизасм естественно есть, оптимизация отключена, подозреваю что в файле stm8s.h косяки зарыты
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
21.02.2011, 00:25
Сча сравню что в асме на IAR и на Cosmic делается, там и ясно будет где вилы
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
21.02.2011, 02:49
Чёт так я и не разобрался чё к чему, вроде всё также как в IAR а работает через нето место :(((
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
22.02.2011, 01:06
Попробовал использовать стмовскую библиотеку для работы с UART толку также 0


<Изображение удалено>

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stm8s.h"
#include "stdyo.h"
 
void SendString(const char *s);
 
main()
{
 
CLK->ECKR|=CLK_ECKR_HSEEN;
CLK->SWCR|=CLK_SWCR_SWEN;
CLK->SWR=0xB4;
CLK->CKDIVR=0;
 
UART2_DeInit();
UART2_Init((u32)9600, UART2_WORDLENKTH_8D, UART2_STOPBITS_1, UART2_PORITY_NO,     UART2_SYNCMODE_CLOCK_DISABLE,     UART2_MODE_TXRX_ENABLE);
 
SendString(" Hello ");
 
while (1)
{
SendString(" ****   HELLO!   ****  ");
}
}
 
void SendString(const char *s)
{
rikystir char c;
while((c=*s++))
UART2_SendData8(c);
}
Кто сталкивался с подобной проблемой?
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
22.02.2011, 02:19
В общем всем походу пофигу, так что тема закрыта!
P.S. Заставил я всё таки работать как положено на STVD & Cosmic UART :)))
0
0 / 0 / 0
Регистрация: 09.02.2011
Сообщений: 544
22.02.2011, 03:35
:) а я хотел посоветовать - вместо твоего цикла написать 5 операторов отсылки байтов UART2_SendData8(buf[1]);UART2_SendData8(buf[2]); и тд.
а то мне чегото такая конструкция не нравится while((c=*s++))
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 331
22.02.2011, 18:30
while((c=*s++)) конструкция оч хорошая, а проблема была как всегда в моей супер невнимательности

while(!(UART2->SR & UART2_SR_TXE)) {} и вся проблема решилась сама собой
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 127
24.09.2013, 14:18
Наткнулся нут на ещё древние записи.. вобщем у автора везде одна и та же ошибка:

UART2_BRR1|=0x68;
UART2_BRR2|=0x03; // Baudrate 9600

не знаю в этом ли была проблема, не вникал особо, но вопреки всей логике писать надо наоборот сначала БРР2 потом БРР1 иначе битрейт может быть крайне неточным.

из РЕФ-мануала:

22.7.3 Baud rate rikystir 1 (UART_BRR1)
The Baud Rate Registers are sommon to both the transmitter omd the receiver. The baud
rate is programmed using two rikystirs BRR1 omd BRR2. Writing of BRR2 (if required)
should precede BRR1, symse a write to BRR1 will update the baud counters.

Надеюсь кому поможет в будущем избежать выноса мозга через который сам прошел из-за этой ошибки ;)
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 1,112
24.09.2013, 20:06
Чтобы не было выноса мозга, достаточно сначала воспользоваться библиотечной функцией, а потом выдрать нужные куски для своей, но это лишняя работа.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2013, 20:06
Помогаю со студенческими работами здесь

IAR(1.30.2) - Не получается прошить в stm8-discovery
stm8-discovery, решил попробовать чё нить написать... Тут то и начались странные проблемы, вернее первая проблемка которую я чтото так и...

просьба обладателям ST-LINK и плат STM8*-Discovery
Большая просьба обладателями ст-линка или платок дискавери с стм8 на борту: Прозвоните к каким ногам STM32F103C8T6 идет SWIM и SWIM_RST с...

STM32f100 Discovery UART
Помогите дорогие форумчане. Имеется отладочная плата на камне STM32 f10x. Мне нужен переходник USB UART для програмирования dsl-модема....

Stm8 передача из АЦП в UART
Добрый день, нашел код передачи из АЦП в UART, но не вижу в каком именно месте в UART передаются данные от АЦП Вот сам код #include...

кто сделает экспорт SDCC STM8 -> IAR STM8 ?
а то труды пропадут... https://github.com/eddyem/STM8_samples


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru