Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART1 на плате ST32VLDiscovery не работает
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
h0rr0rr_drag0n
Всем привет. Я пилю небольшую программку под 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 есть — проверял.

Перелопатил выдачу гугла — у всех такой же код и у всех он работает. У меня же — почему-то тишина в последовательном канале.
Возможно, у меня к вечеру уже замылился глаз. Почему эта штука не работает и что делать?
AHTOXA
Перед передачей надо проверять флаг USART_SR_TXE, а не USART_SR_TXC.
Остальное вроде нормально всё.
h0rr0rr_drag0n
Цитата(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)) {}

Не поменялось ровным счетом ничего(. Все симптомы, какие были - такие и остались...
h0rr0rr_drag0n
Всем спасибо. Проблема была решена.
Во-первых, я перепутал местами пару присваиваний в структуре 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. Поменял местами - все заработало.

Действительно, утро вечера мудренее).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.