Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f051 : не могу запустить uart.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Onkel
hi all
Нашел лишь один образец работы usart в 32f051, но он напрямую не встает, пришлось разбираться до составляющих, получилось:
CODE
void InitUsart1(void)
{
RCC->AHBENR |= (1UL<<17); // PORT A clock ON
RCC->APB2ENR |= (1UL<<14); // UART1 clock ON
GPIOA->AFR[1] &= ~(1UL<<7); // set pinA9 as UART
GPIOA->AFR[1] |= (7UL<<4); // set pinA9 as UART
GPIOA->AFR[1] &= ~(1UL<<11); // set pinA10 as UART
GPIOA->AFR[1] |= (7UL<<8); // set pinA10 as UART

GPIOA->OSPEEDR |= (3UL << 2*9) ; // 50 MHz
GPIOA->OSPEEDR |= (3UL << 2*10) ; // 50 MHz

GPIOA->MODER |= (1UL << (2*9 +1 )); //
GPIOA->MODER &= ~(1UL << (2*9 ));
GPIOA->MODER |= (1UL << (2*10 +1 )); //
GPIOA->MODER &= ~(1UL << (2*10 ));

GPIOA->OTYPER &= ~(3UL<<9); // portA9 A10 push pull
GPIOA->PUPDR &= ~(5UL << 19); // pull up
GPIOA->PUPDR |= (5UL << 18); // pull up
USART1->BRR = 0x0683;
USART1->CR1 &= ~( 1UL<<12) ; // m-bit 8 bits

USART1->CR2 &= ~ (3UL << 12 ) ; //~USART_CR2_STOP; //1 stop bit

USART1->CR1 &= ~( 1UL<<10) ; // parity none

USART1->CR3 &= ~( 1UL<<9) ; // flow control

USART1->CR1 |= (3UL <<2); //Transmit enable 0x08 0x04

USART1->CR1 |= 1UL; //usart1 enable }


вывожу раз в 10 мс по tim6
while(!(USART1->ISR & (1<<6)));
USART1->TDR = 0xAA;

На ноге тх uart1 ничего нет.

Может, кто пример работы встречал uart на f051? В даташите написано, что портировать с f1xx код нельзя.
Tahoe
Цитата(Onkel @ Mar 1 2013, 17:32) *
На ноге тх uart1 ничего нет.

Код не смотрел, но для начала, самое элементарное:
- а что есть? как минимум, на ноге Tx должен быть высокий уровень
- AF? Remap? да и вообще, у STM32 по сто ног на периферию, неплохо бы указывать номер пина, на котором смотрится сигнал

UPD
посмотрел код, с пином почти понятно, но начинать все равно надо с уровня, на выходе UART в состоянии покоя всегда высокий уровень
Onkel
Цитата(Tahoe @ Mar 1 2013, 20:24) *
Код не смотрел, но для начала, самое элементарное:
- а что есть? как минимум, на ноге Tx должен быть высокий уровень
- AF? Remap? да и вообще, у STM32 по сто ног на периферию, неплохо бы указывать номер пина, на котором смотрится сигнал

UPD
посмотрел код, с пином почти понятно, но начинать все равно надо с уровня, на выходе UART в состоянии покоя всегда высокий уровень

usart 1 tx portA9, выставлен как Push pull out
если не делать этому порту pull up, то болтается, т.е. не 1 (как обычно на uart) - а очень похоже на z (помехи ловит ...), если ставлю порту pull up то 1.
Где-то видимо путаница с назначением, в даташите указано для portA pin 9 ставить 0111 (AF7) в регистре GPIOA_FRh.

пы сы нашел эмулятор ардуины на f051, но там вывод на usart 2, не могу пока продраться через хидеры и расковырять, но там GPIOA_AFR для тх usert2 (portA.2) стоит 0001, у меня 7 (0111). Пойду вкуривать, может где erratum есть или я неправильно понял.

пы пы сы
ну один свой лох нашел - для usart нужно alternate включать не AF7, а AF1. Но не выходит ваза пока.

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