Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Настройка ножки RX
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Xeon
Всем привет!) В общем на stm32f407 (discovery) пытаюсь зависти usart вот как делаю:

Код
void UsartInit(void)
{
    // enable USART2
    RCC->APB1ENR |= RCC_APB1ENR_USART2EN;
    
    // enable GPIOA
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
    
    // configure GPIOA
    // for TX
    GPIOA->MODER |= GPIO_MODER_MODER2_1;
    GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR2_1;
    GPIOA->AFR[0] |= 0x00000700;
    // for RX
    GPIOA->MODER |= GPIO_MODER_MODER3_1;
    GPIOA->AFR[0] |= 0x00007000;
    
    // enable USART2 interrupts
    NVIC->ISER[1] |= 0x00000040;
    
    // configure usart
    USART2->BRR = 0x000002f0; // 56000 baud
    USART2->CR2 = USART_CR2_CLKEN;
    USART2->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE
        | USART_CR1_RXNEIE;
}


Результат следующий: проверял - при окончание передачи (TC) прерывание работает норм и байтики швырябтся в терминалку, эдакий спам... а вот когда с терменалки швыряю в проц, то ему пофиг, при этом я конечно отрубал прерывания по TC. Я грешу на то что както неправельно настраеваю сам порт RX... Подскажите плиз...

PS Всякие StdPeriph Driver не хочу использовать, так как на мой взгляд изучать контроллер нужно работая с регистрами напрямую, так больше граблей, а значит и пониманий... rolleyes.gif
spectral1989
Цитата
PS Всякие StdPeriph Driver не хочу использовать, так как на мой взгляд изучать контроллер нужно работая с регистрами напрямую, так больше граблей, а значит и пониманий...
нет ничего плохого в использовании инструментов. это как рубить дрова топором или кухонным ножом. результат один и тот же, а количество усилий необходимое для достижения цели разное. смысл написанного при применении таких конструкций:
Код
  /* Configure USARTy Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = USART_RxPin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

не меняется. зато экономится куча времени при написании программ и отлове багов в "магических цифрах", а так же появляется кроссплатформенность. попробуйте, вам понравитсяsm.gif

З.Ы. как вы определяете, что процу пофиг? момент ожидание - реальность не понятен. и не вижу у вас обработчика прерываний от USART
Xeon
Цитата(spectral1989 @ Oct 22 2012, 09:02) *
зато экономится куча времени при написании программ и отлове багов в "магических цифрах", а так же появляется кроссплатформенность. попробуйте, вам понравитсяsm.gif

З.Ы. как вы определяете, что процу пофиг? момент ожидание - реальность не понятен. и не вижу у вас обработчика прерываний от USART


Уверен что понравится rolleyes.gif Вот только хочется понять все стороны и нюансы при работе с данными контроллерами. Как разберусь со всеми детальками... так сразу на StdPeriph Driver радоваться жизни...
Обработчик прерывания он есть, тут я ток привел как настраиваю всё... Что ему пофиг определяю, следующим образом: у меня str32f4discovery, соответственно st-link, запускаю проект в отладчике (тут keil), внутрях прерывания для usart2 смотрю, если это прерывание по TC, то швыряться байтиками во все стороны (прерывание по TC я отключил, дабы не висеть всё время в прерывание по данному ивенту), если прерывание по RXNE, то к принятому байтеку +1 и обратно в usart. Плюс ко всему поставил breakpoin в начале прерывания. Когда шлю байтик в discovery, то по идее должно сработать прерывание, а там breakpoint и на нём остановиться, а это не происходит.
Вот ещё, что наверно следует сказать: проект у меня зашивается в SRAM (брал пример со SRAM и его изменял).
Xeon

Мдям... грешил на st-link, типа он флаг для RXNE прерывания сбрасывает... для этого зашивал во флеш, отрубал его нафиг... и ничего.
Наверно надо создать второй проект воспользоваться библиотекой StdPeriph Driver и после искать 10 отличей дабы понять в чём проблема...
spectral1989
Код
    GPIOA->MODER |= GPIO_MODER_MODER3_1;
    GPIOA->AFR[0] |= 0x00007000;
    
    // enable USART2 interrupts
    NVIC->ISER[1] |= 0x00000040;

в этих трех строчках скорее всего ошибка. проверяйте правильность номера вектора и включение порта RX. он должен находиться в режиме "Floating input"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.