реклама на сайте
подробности

 
 
> теряются символы UART STM32F030, "плавающая" проблема
greenhorn
сообщение Jul 27 2014, 14:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 18-01-12
Пользователь №: 69 728



Привет!

Использую UART как консоль - вывожу одной строкой нужные мне данные с интервалом в секунду. Проблема в том, что ИНОГДА теряются символы. Выглядит это примерно так:

1556 mV | rise= | l | panel= | panel=4 | ltsw= 0 14 | pan curren0 | bat= 10 | bat= 1A | D= 10nt= -161 nt= -161 chg curre-165 mA | -165 mA | urrent= = 0 |
= 0 |
556 mV | rise64 | ltsw=64 | ltsw=2 pan curre pan curre= 28 |00 | bat= 00 | bat= mA | D= 112195 mV | chg curr current= current=8 mA | pev6 mV | ri6 mV | ri | ref= 155se= 0 |
307 | lts307 | lts w= 0 | panel= 144 mA | D=4 mA | D=rrent= -2V | chg cuV | chg cu= 12195 mev currentev current67 mA | p556 mV | r556 mV | r | ref= 1ise= 0 |
| light=anel= 2anel= 2sw= 0 | p-24 mA | D-24 mA | Drrent= = 100 | bat= 12200 -165 mA | -165 mA | urrent= mA | ref=mA | ref=nt= -167 |
|
556 mV | rise= 0 | light= 302 | ltsw= 0 |current= current= 14 | pan bat= 1220 bat= 1220 D= 100 | -165 mA current=5 mA | ref5 mA | refent= -16= 1556 mV | rise= 0 |
| ltsw= 0 | ltsw= 0 308 n currentn current 28 | pa= -24 mA | D= 100 hg currenhg curren195 mV | crrent= -rrent= -mA | pev cumV | rise=mV | rise=ef= 1556 0 |
| light= 28 28 | 28 | 0 | panel=mA | D= 10mA | D= 10t= -33 chg curre chg curre2189 mV |current= current= mA | pev -168 mA | ref= 1556 mV | rise= 0 |
light= 2 l= 28 l= 28 = 0 | pane| pan current= -3 12189 mV 12189 mV 100 | bat=66 mA | perent= -1 | ref= 15 | ref= 15 -164 mA56 mV | rise= 0 |
light= 2 l= 28 = 0 | pane| pan current= -24 12195 mV 12195 mV100 | bat= | chg current= -168 mA | pev current= -166 mA | ref= 1556 mV | rise= 0 |
| lig 14 | pan 14 | pan ltsw= 0 | panel= | D= 100 | D= 100 -26 mA hg currenthg current95 mV | c= -168 mA | pev cuef= 1556 mef= 1556 m68 mA | rV | rise= 0 |
| light= 269 | ltsw= 0 | panel= 28 | pan current= -32 mA | D= 100 | bat= 12189 mV | chg current= -162 mA | pev current= -168 mA | ref= 1556 mV | rise= 0 |
| light= 268 | ltsw= 0 | panel= 0 | pan current= -28 mA | D= 100 | bat= 12184 mV | chg current= -165 mA | pev current= -162 mA | ref= 1556 mV | rise= 0 |
| light= 269 | ltsw= 0 | panel= 28 | pan current= -30 mA | D= 100 | bat= 12184 mV | chg current= -165 mA | pev current= -165 mA | ref= 1556 mV | rise= 0 |
| light= 311 | ltsw= 0 | panel= 0 | pan current= -25 mA | D= 100 | bat= 12195 mV | chg current= -166 mA | pev current= -165 mA | ref= 1556 mV | rise= 0 |
| light= 310 | ltsw= 0 | panel= 14 | pan current= -25 mA | D= 100 | bat= 12184 mV | chg current= -157 mA | pev current= -166 mA | ref= 1556 mV | rise= 0 |
| light= 308 | ltsw= 0 | panel= 28 | pan current= -30 mA | D= 100 | bat= 12189 mV | chg current= -162 mA | pev current= -157 mA | ref= 1556 mV | rise= 0 |

Сначала видно бардак поскольку часть символов выпала, в последних 6ти строках все ок. Причем я специально скопировал тот момент когда проблема пропала, при том что девайс никто не трогал и внешние условия не менялись. Вывод осуществляется одной строкой в цикле:

printf("| light=%5d | ltsw=%2d | panel=%6d | pan current=%6d mA | D=%4d | bat=%6d mV | chg current=%6d mA | pev current=%6d mA | ref=%5d mV | rise=%2d |\n", light, ltsw, panel, paneli, d, bat, bati, bati_prev, ref, rise);

Инициализация порта с сайта кейла:

#include <stm32f0xx.h>

/*----------------------------------------------------------------------------
Initialize UART pins, Baud-rate
*----------------------------------------------------------------------------*/
void init_serial (void) {
int i;

/* Configure UART2 for 9600 baud */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; /* Enable GPIOA clock */
GPIOA->MODER |= GPIO_MODER_MODER9_1; // PA9 as alternative GP Output (USART1_TX)
GPIOA->MODER |= GPIO_MODER_MODER10_1; // PA10 as AF
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; //high speed (current?) output
GPIOA->AFR[1] |= 0x110; // PA9, PA10 Alternative function 1 (USART1) enable
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;/* Enable USART1 clock */
USART1->BRR = 0x0341; /* Configure 9600 baud, */
for (i = 0; i < 0x1000; i++) __NOP();/* avoid unwanted output */
USART1->CR1 |= (USART_CR1_UE | USART_CR1_RE | USART_CR1_TE); // Enable USART, Receive and Transmit
}


/*----------------------------------------------------------------------------
Write character to Serial Port
*----------------------------------------------------------------------------*/
int sendchar (int c) {

while(!(USART1->ISR & USART_ISR_TXE));
USART1->TDR = (c & 0x1FF);
return ©;
}


/*----------------------------------------------------------------------------
Read character from Serial Port (blocking read)
*----------------------------------------------------------------------------*/
int getkey (void) {

while (!(USART1->ISR & USART_ISR_RXNE));
return (USART1->RDR);
}

Сначала грешил на пролификовский адаптер, подкючил к машине с аппаратным компортом - таже фигня.
Причем проблема проявляется на 2х разных контроллерах (STM32F030F4P6 b STM32F030C8T6) в разных устройствах с разной фирмварью но одинаковым кодом инициализации порта и и вывода (все приведено выше). Во втором устройстве параметров вдвое меньше в printf, соответственно отображаемая строка короче но проблема абсолютно та же. Компы тоже разные. Пробовал с ноутом работающим от батареи и устройством питающимся от другой батареи - эффект аналогичный.

Обычно вывод нормализуется через час-два работы устройства (заметил случайно раза 3, уже не совпадение) но не всегда и сколько-нибудь заметного нагрева нигде нет. Форма сигнала ТХ выглядит нормально как на ноге контроллера так и на ноге ком порта (после преобразователя уровня) и одинакова при корректном выводе и "побитом".

Код инициализации вроде бы понятен но непонятно зачем 0x1FF в строке USART1->TDR = (c & 0x1FF);
Пробовал USART1->TDR = c; разницы никакой не обнаружил. Объясните пожалуйста зачем это нужно.

Ну и главный вопрос - в чем может быть проблема с выводом.

Сообщение отредактировал greenhorn - Jul 27 2014, 14:23
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 18:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0229 секунд с 7
ELECTRONIX ©2004-2016