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

 
 
 
Reply to this topicStart new topic
> USART1 на плате ST32VLDiscovery не работает, Не хочет работать невзирая ни на какие ухищрения
h0rr0rr_drag0n
сообщение Apr 29 2012, 18:57
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 29-10-09
Пользователь №: 53 281



Всем привет. Я пилю небольшую программку под STM32 на плате STM32VLDiscovery и мне понадобилось выводить отладочные данные на PC через USART1. Проблема в том, что USART1 не работает. Совсем(.

Я использую стандартную библиотеку периферии от ST для STM32. USART1 инициализирую следующим кодом:
Код
void debug_init() {
    GPIO_InitTypeDef GPIO_RxTx_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    
    GPIO_RxTx_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_RxTx_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_RxTx_InitStruct.GPIO_Pin = GPIO_Pin_9; /* PA9 = TX */
    GPIO_Init(GPIOA, &GPIO_RxTx_InitStruct);

    GPIO_RxTx_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_RxTx_InitStruct.GPIO_Pin = GPIO_Pin_10; /* PA10 = RX */
    GPIO_Init(GPIOA, &GPIO_RxTx_InitStruct);

    USART_DeInit(USART1);
    USART_StructInit(&USART_InitStruct);
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_Mode = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_HardwareFlowControl = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStruct);

    USART_Cmd(USART1, ENABLE);
}


Передача данных (в моем случае я передаю один и тот же символ) производится следующим кодом:
Код
void debug_putchar(char ch) {
    while (!USART_GetFlagStatus(USART1, USART_FLAG_TC)) {}
    USART_SendData(USART1, (uint16_t) ch);
}


В функции main эти две функции используются так:
Код
debug_init();
    while (1) {
      debug_putchar('h');
    }

Вот и весь код...

C платы не выводится ни один символ. Смотрел напряжение на выводе TX — стрелка всегда на нуле. Контакт между выводами PA9, PA10 и выводами преобразователя UART<->COM есть — проверял.

Перелопатил выдачу гугла — у всех такой же код и у всех он работает. У меня же — почему-то тишина в последовательном канале.
Возможно, у меня к вечеру уже замылился глаз. Почему эта штука не работает и что делать?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 29 2012, 19:09
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Перед передачей надо проверять флаг USART_SR_TXE, а не USART_SR_TXC.
Остальное вроде нормально всё.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
h0rr0rr_drag0n
сообщение Apr 29 2012, 20:29
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 29-10-09
Пользователь №: 53 281



Цитата(AHTOXA @ Apr 29 2012, 23:09) *
Перед передачей надо проверять флаг USART_SR_TXE, а не USART_SR_TXC.
Остальное вроде нормально всё.

Хм, нет, не взлетело.
Поменял
Код
while (!USART_GetFlagStatus(USART1, USART_FLAG_TC)) {}

на строчку
Код
while (!USART_GetFlagStatus(USART1, USART_FLAG_TXE)) {}

Не поменялось ровным счетом ничего(. Все симптомы, какие были - такие и остались...
Go to the top of the page
 
+Quote Post
h0rr0rr_drag0n
сообщение Apr 30 2012, 05:36
Сообщение #4





Группа: Новичок
Сообщений: 5
Регистрация: 29-10-09
Пользователь №: 53 281



Всем спасибо. Проблема была решена.
Во-первых, я перепутал местами пару присваиваний в структуре USART_InitStruct. Нужно, чтобы было так:
Код
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

а не как у меня... Спасибо неизвестному доброжелателю, который написал мне в гуглопочту и обратил мое внимание на эту ошибку.

Во-вторых, это было очень глупо - подключать вывод Tx UART<->COM преобразователя в выводу Tx у STM32. И делать то же самое еще и с выводом Rx. Поменял местами - все заработало.

Действительно, утро вечера мудренее).
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th June 2025 - 13:15
Рейтинг@Mail.ru


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