USART шлет на комп фигню, а прерывания на прием не работают.

Кто любит RISC в жизни, заходим, не стесняемся.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

USART шлет на комп фигню, а прерывания на прием не работают.

Сообщение TmYAG »

Всем здравствуйте! Начал изучать прием и передачу по USART на дискавери Ф4
Купил USB-UART преобразователь на FT232RL
Начал понемногу используя "кухаркины статьи" xD писать свой код)))
Сначала ни приема ни передачи на комп/с компа не было. Затем я догадался что надо на PA9 подключить альтернативную функцию.
Затем где-то вычитал, что для приема так же на PA10 надо альтернативную функцию повесить. В итоге Передача работает (Но не совсем так как я ожидал). Косяк в том. что в терминале я вижу не то что программа отсылает.
Например пробовал отсылать 1 (даже в наглую USART1->DR = 1;) в терминале вижу E0

А при приеме прерывания совсем не вызываются(((

Код: Выделить всё

#include "stm32f4xx.h"

void USART1_IRQHandler()
{
 if (USART1->SR & USART_SR_RXNE) {
  USART1->SR&=~USART_SR_RXNE;
  if(USART1->DR=='1') {
      GPIOD->ODR = 0xF000;     
    }
 }
}
int main()
{
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN; 
  
  GPIOD->MODER|= 0x55000000;
  GPIOD->OTYPER = 0;
  GPIOD->OSPEEDR = 0;
  
  
  GPIOA->MODER |= 0x80000;
  GPIOA->AFR[1] |= 0x770;
  GPIOA->OTYPER = 0;
  USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
  USART1->BRR |=0x9c4;
  USART1->CR1 |= USART_CR1_RXNEIE;
  NVIC_EnableIRQ (USART1_IRQn);
  __enable_irq ();
  while(1)
  {
    while(!(USART1->SR & USART_SR_TC));
  USART1->DR = 'H';
    for(uint32_t i = 0; i < 2000000; i++);
  }
}
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

По поводу приема. в прерывание свалился. Оказывается надо и для порта PA10 в MODER указать альтернативную функцию (я указал вход) а в AFR для него задал альтернативную ф-ю
в итоге 0х80000 меняется на 0х280000.
Но! делал проверку что я с терминала шлю на МК и заставлял его в прерывании отослать это же обратно. Это совершенно разные значения(((

Код: Выделить всё

#include "stm32f4xx.h"

void USART1_IRQHandler(void)
{
 if (USART1->SR & USART_SR_RXNE) {
  USART1->SR&=~USART_SR_RXNE;
  if(USART1->DR=='1') {     
      GPIOD->ODR = 0xF000;     
    }
  USART1->DR = USART1->DR;
 }
}
int main()
{
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIODEN; 
  
  GPIOD->MODER|= 0x55000000;
  GPIOD->OTYPER = 0;
  GPIOD->OSPEEDR = 0;
  
  
  GPIOA->MODER |= 0x280000;
  GPIOA->AFR[1] |= 0x770;
  GPIOA->OTYPER = 0;
  USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
  USART1->BRR |=0x9c4;
  USART1->CR1 |= USART_CR1_RXNEIE;
  NVIC_EnableIRQ (USART1_IRQn);
  __enable_irq ();
  while(1)
  {
    while(!(USART1->SR & USART_SR_TC));
  USART1->DR = '1';
    for(uint32_t i = 0; i < 2000000; i++);
  }
}
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Личку смотри ...


На PA9 и PA10 висят мешалки.
Перебрасывай на PB6 и PB7 :
Код:

Код: Выделить всё

                  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  //USART clock
         RCC->AHB1ENR |=RCC_AHB1ENR_GPIOBEN;    //GPIOB clock
      
    
                                    
      GPIOB->AFR[0] |= (7<<28)|(7<<24); // AF7 for  PB6 & PB7 
      
         GPIOB->MODER &=~
                  
                GPIO_MODER_MODER6 |
                GPIO_MODER_MODER7 
                                   ;
      GPIOB->MODER|= 
              
              GPIO_MODER_MODER6_1|
              GPIO_MODER_MODER7_1
                                 ;


TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

А не могли бы Вы отправить меня на нужную страницу мануала? А то я никак не могу найти на какие пины какая периферия ремапится. Хотя бы табличку какую.
Реклама
Эиком - электронные компоненты и радиодетали
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение HHIMERA »

Это не в мануале... это в даташите... Таблица сразу после таблицы пинов...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

И прием и передача работают, но криво. На выходе в терминале фигня. Не те символы, что я засылаю(

Код: Выделить всё

#include "stm32f4xx.h"
#define APB2CLK 8000000UL
#define BAUDRATE 2400UL

void USART1_IRQHandler()
{
 if (USART1->SR & USART_SR_RXNE) {
  USART1->SR&=~USART_SR_RXNE;
  uint16_t temp = USART1->DR;
  if(USART1->DR=='1') {
      
      GPIOD->ODR = 0xF000;     
    }
  USART1->DR = temp;
 }
}
int main()
{
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN|RCC_APB2ENR_SYSCFGEN;;
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN|RCC_AHB1ENR_GPIODEN; 
  
  GPIOD->MODER|= 0x55000000;
  GPIOD->OTYPER = 0;
  GPIOD->OSPEEDR = 0;
  
  
  GPIOB->MODER |= 0xA000;
  GPIOB->AFR[0] |= 0x77000000;
  GPIOB->OTYPER = 0;
  USART1->CR1 |= USART_CR1_UE|USART_CR1_RE|USART_CR1_TE;
  //uint32_t BR = (APB2CLK+BAUDRATE/2)/BAUDRATE;
  USART1->BRR |= 0x1A1C;
  USART1->CR1 |= USART_CR1_RXNEIE;
  NVIC_EnableIRQ (USART1_IRQn);
  __enable_irq ();
  while(1)
  {
    while(!(USART1->SR & USART_SR_TC));
  USART1->DR = 1;
    for(uint32_t i = 0; i < 2000000; i++);
  }
}
Полный проект. Тулзой STMовской файл сгенерил.
1.zip
(952.78 КБ) 296 скачиваний
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Танцы с бубном продолжаются ... :)))
Короче завтра исправлю, выложу .
Когда соизволишь начать читать документацию?
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

dosikus писал(а):Когда соизволишь начать читать документацию?
Ну в общем я ее читаю. Причем под конкретную задачу, которую стремлюсь выполнить)
А вот то, что я дико невнимателен, до тех пор меня моськой в косяк не ткнут, это факт(
Предполагаю, что я в BRR накосячил))
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Спрашивай что не понятно.

USART1 PB6 и PB7, скорость 115200 .
Вложения
USART1_PB6_PB7.rar
(747.54 КБ) 280 скачиваний
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

А откуда частота шины APB2 84МГц?
Или я путаю? Я же файл генерил для HSE 8MHz или эти вещи не связаны?
И если так по большому счету, что в моей проге не так было? Только Baudrate разный и вроде все? Проинициализировал верно, разрешил прерывания по приему. Порт B сконфигурировал на альт. ф-ю.
И еще ворпрос SYSCFG разве не за альтернативную ф-ю отвечает? Тогда почему когда я прерывания по нажатию на кнопку делал его надо было затактировать?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Кварц 8МГц , SYSCLK 168МГЦ , APB2 84МГЦ .
USART1 тактируется от APB2 .

Изображение
Изображение



SYSCFG - мультиплексор EXTI ремап памяти и выбор интерфейса Ethernet PHY , выбор AF в GPIOx_AFRх
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

Удивительно! Действительно косяк был в BR
И тогда уж еще один вопросик!

Код: Выделить всё

void USART_Ch(char ch)
{
  while(!(USART1->SR & USART_SR_TC));
  USART1->DR = ch;
}
Вот решил разбить программу на функции. В файле main создал функцию передачи одного символа. В главной функции в while(1) выполняю, но IAR ругается.
Error[Pe159]: declaration is incompatible with previous "USART_Ch" (declared <SRCREF line=38>at line C:\Users\Виктор\Documents\STM32\1\main.c 43
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

TmYAG, проект кидай .

Кстати кириллица в путях тебе еще много бяк наделает ...

И далее где ты это скопипастил ???? :

Код: Выделить всё

void USART_Ch(char ch)
{
  while(!(USART1->SR & USART_SR_TC));
  USART1->DR = ch;
}
В том примере что я дал уже есть передача одиночного символа с корректной проверкой TXE а не TC :

Код: Выделить всё

void Usart_Transmit(uint8_t Data)
{
  while(!(USART1->SR & USART_SR_TXE));
  USART1->DR = Data;
}
Чем он то не устраивает.
И что значит разбить на функции.
Все функции уже в модуле usart1 ...
Последний раз редактировалось dosikus Пн окт 27, 2014 19:41:05, всего редактировалось 1 раз.
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

Не обижайся! Я с планшета глядел)) Времени проверить не было))) Ща до дома доеду и кину проект. Если честно это не копипаст а мое поделие/
А в чем принципиальное отличие проверки пустого буфера и конца передачи?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Да это не обиды .
Если кажется что я громко озвучиваю - считай я пытаюсь заострить твое внимание на этом !
Дабы на грабли не попал...

О TC и TXE
Bit 7TXE: Transmit data register empty
This bit is set by hardware when the content of the TDR register has been transferred into
the shift register. An interrupt is generated if the TXEIE bit =1 in the USART_CR1 register. It
is cleared by a write to the USART_DR register.
0: Data is not transferred to the shift register
1: Data is transferred to the shift register)
Note: This bit is used during single buffer transmission.

Bit 6TC: Transmission complete
This bit is set by hardware if the transmission of a frame containing data is complete and if
TXE is set. An interrupt is generated if TCIE=1in the USART_CR1 register. It is cleared by
a software sequence (a read from the USART_SR register followed by a write to the
USART_DR register). The TC bit can also be cleared by writing a '0' to it. This clearing
sequence is recommended only for multibuffer communication.

0: Transmission is not complete
1: Transmission is complete

Перевести ?
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

Собственно вот проект)))
У меня на работе и на домашней машине они разные) код туды-сюды гоняю только)))
Вылезает ошибка Error[Pe159]: declaration is incompatible with previous "USART_SendCh" (declared at line 36) D:\Programming Lessons\STM32\IAR\Lesson 3. USART\main.c 41
Lesson 3. USART.zip
(834 КБ) 282 скачивания
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Во первых у тебя снова абсолютные пути к хэдерам .
А нужно было прописать всего один относительный к папке inc .

Изображение

Снова подключен старый стартап , когда я тебе уже давал проект шаблон со всем необходимым.
Далее - не понимаю зачем городить все в одном файле, когда я тебе дал модульный проект .
Ну а если так приспичило ляпать все в одном - будь любезен объявить функцию до ее применения или прописать прототип .

Код: Выделить всё

#include "stm32f4xx.h"
#define APB2CLK 84000000UL
#define BAUDRATE 9600UL

void USART_SendCh(uint8_t);   <-----  

void USART1_IRQHandler(void)
{
 if (USART1->SR & USART_SR_

Такие задержки абсолютное зло .

Код: Выделить всё

for(uint32_t i = 0; i < 5000000; i++);
Вместо них .

Объявляем переменную, хэндлер и функцию.

Код: Выделить всё

static volatile uint32_t TimingDelay;
	 
	
		
/* Delay & timers */
		void SysTick_Handler(void) {
			if (TimingDelay) {
				TimingDelay--;
			}		
		}

		
		void Delay_mS(uint32_t nTime) {
			TimingDelay = nTime;

			while (TimingDelay);
		}
В main инитим SysTick :

Код: Выделить всё

SysTick_Config(SystemCoreClock /1000);
И пользуем

Код: Выделить всё

Delay_mS(100);
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

На счет стартапов! Точно же!
На счет модульности. Я ща потихонечку для себя пилю модули для работы с GPIO, USART, EXTI и т.д.
Пока на этапе освоения, приходится ляпать в один файл, чтобы исправляя не лазить по разным файлам и заголовкам.
С SysTick да и вообще таймерами я пока не разбирался. Но согласен. Если будут задачи требующие точного времени, таймеры необходимость.
Ага, стало быть нужны прототипы функций.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение dosikus »

Ок . Если что спрашивай ...

А SYSTick - просто прими как есть ,
на этапе изучения нубам всегда нужны задержки :)))))))))))))
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: USART шлет на комп фигню, а прерывания на прием не работ

Сообщение TmYAG »

А вообще спасибо тебе огромное! Я очень многое благодаря тебе понял=)
Ответить

Вернуться в «ARM»