Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32F0 и USART

Пн дек 02, 2013 15:27:58

STM32F0 Discovery + своя плата с FT232BL подключенная к Discovery.
Вложения
STM32 USART.rar
(304.19 KiB) Скачиваний: 519

Re: STM32F0 и USART

Пн дек 02, 2013 15:41:41

Код:
 // Включить тактирование порта А
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;

Предоставляю возможность найти самому (очепятку?) или невнимательность . :)))

Re: STM32F0 и USART

Пн дек 02, 2013 16:12:18

Было
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
, а надо
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
Балбес — я, балбес. :? А я мучаюсь. :))) Ладно дома попробую исправить. Завтра отпишусь.
Dosikus, спасибо Вам за помощь. :beer:

Re: STM32F0 и USART

Вт дек 03, 2013 10:03:15

УРА!!! :)) Все заработало. Спасибо Вам Dosikus за помощь. Желаю Вам на STM-ке Терминатора собрать для работы на огороде, ну или хотя бы Бигдога. :beer: :music:

Re: STM32F0 и USART

Пт дек 06, 2013 09:29:26

Вот и пришло время осваивать прием. Решил через прерывание. Но вот блин, ... опять не хочет орбайтн. Прерывание срабатывает и виснит намертво. Что я опять делаю не так не пойму :dont_know: . Вот код:

Код:
#include "stm32f0xx.h"

#define APBCLK   8000000UL
#define BAUDRATE 9600UL

int flag = 0;

void Init_usart(void)
{
  // Включить тактирование порта А
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
  // Включаем тактирование USART1
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;  //Включаем тактирование USART1
 
  GPIOA->MODER   |= GPIO_MODER_MODER10_1;         // PA10 (RX) - Alternate function mode
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10;      // PA10 (RX) - High speed
  GPIOA->AFR[1]    |= 0x0110;  //
 
  RCC->CFGR3     &= ~RCC_CFGR3_USART1SW;
  RCC->CFGR3     |=  RCC_CFGR3_USART1SW_0;  //System clock (SYSCLK) selected as USART1 clock
 
 
  USART1->CR1 |= USART_CR1_UE; //Включаем USART1
  USART1->CR1 &= ~USART_CR1_M; //Данные - 8 бит
  USART1->CR2 &= ~USART_CR2_STOP; //1 стоп-бит
  USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE; //скорость usart
  USART1->CR1 |= USART_CR1_TE; //Включаем передатчик USART1
  USART1->CR1 |= USART_CR1_RE; //Включаем приемник USART1
  USART1->CR1 |= USART_CR1_RXNEIE; //Разрешаем прерывание по приему USART1 в самом модуле USART1
  //NVIC_SetPriority(USART1_IRQn, 15); // Как я понял, это функция, которая позволяет изменить приоритет прерывания
  //(вот только, что происходит с тем прерыванием, которое имело этот приоритет по умолчанию я не знаю)
  NVIC_EnableIRQ(USART1_IRQn); // А эта функция, как я понял, разрешает прерывание от USART1
}

...

void USART1_DAC_IRQHandler(void) // Обработчик прерывания по приему символа USART
{
  USART1->ISR &= ~USART_ISR_RXNE; // Сбрасываем флаг (RDR не пуст, принят символ)
  flag = 1;
}

// Главный цикл
int main(void)
{
 
  Init_GPIO();
  Init_usart();
  while(1)
    {
      // Моргание ножкой pc9!
      led_On9();
      delay(1000000UL);
      led_Off9();
      if (flag)
      {
        led_On8();
        delay(1000000UL);
        led_Off8();
        flag = 0;
      }
      delay(1000000UL);
    }
}


Здесь просто проверяется светодиодиком наличие приема. То есть я не беру из RDR данных. Может дело в этом (читал в даташыте, что есть там такае фишка как ошибка перезаписи)?
Еще попутный вопрос: Что делают функции NVIC_SetPriority и NVIC_EnableIRQ. Как я понял, первая меняет приоритет прерывания (круто, такого в AVR-ках не было), но тогда, что случается с прерыванием, которое имело приоритет, который мы хотим задать для нашего прерывания. А вторая разрешает прерывание от аппаратного модуля USART (при этом USART1->CR1 |= USART_CR1_RXNEIE - Разрешаем прерывание по приему USART1 в самом модуле USART1). Хочу сказать, что вход в прерывание происходит точно, это видно и по отладчику (которым я пока плохо умею пользоваться) и, когда я размещаю функцию зажигания диода в теле обработчика прерывания, по загорающемуся синему светику.
Ну и на последок, чем отличаются обработчики USART1_DAC_IRQHandler и USART1_IRQHandler, пробовал и тот и другой :roll: .
Вложения
STM32 USART прием.rar
(308.89 KiB) Скачиваний: 355

Re: STM32F0 и USART

Пт дек 06, 2013 10:13:13

Kvasshtain писал(а): То есть я не беру из RDR данных. Может дело в этом (читал в даташыте, что есть там такае фишка как ошибка перезаписи)?


Флаг RXNE сбрасывается вычиткой RDR или записью 1 в RXFRQ, софтовый сброс его невозможен .

Kvasshtain писал(а):Еще попутный вопрос: Что делают функции NVIC_SetPriority и NVIC_EnableIRQ. Как я понял, первая меняет приоритет прерывания (круто, такого в AVR-ках не было), но тогда, что случается с прерыванием, которое имело приоритет, который мы хотим задать для нашего прерывания. А вторая разрешает прерывание от аппаратного модуля USART (при этом USART1->CR1 |= USART_CR1_RXNEIE - Разрешаем прерывание по приему USART1 в самом модуле USART1). Хочу сказать, что вход в прерывание происходит точно, это видно и по отладчику (которым я пока плохо умею пользоваться) и, когда я размещаю функцию зажигания диода в теле обработчика прерывания, по загорающемуся синему светику.

Читать о NVIC а это уже ядро .


Kvasshtain писал(а):Ну и на последок, чем отличаются обработчики USART1_DAC_IRQHandler и USART1_IRQHandler, пробовал и тот и другой :roll: .



В STM32F051 нет USART1_DAC_IRQHandler , где ты его выцепил ?
Да и обработчики как таковые ты пишешь сам. Изначально их нет, есть только вектора .



Код:
delay(1000000UL);
- кошмар

SYStick не проще юзать ?

Re: STM32F0 и USART

Пт дек 06, 2013 10:31:19

Здравствуйте уважаемый Dosikus. Благодарю за ответ :)) . По поводу USART1_DAC_IRQHandler. Будете смеяться, но когда стал перебирать варианты, почему не работает заглянул вот сюда http://kazus.ru/forums/showthread.php?t=106689&page=2, и Вы там советуете сменить void TIM6_IRQHandler(void) на void TIM6_DAC_IRQHandler (void) :))) . Я сделал по образу и подобию для USART-а. Причем работает и так и так, но и виснет и так и так. Вот только чем отличается с DAC и без него, я не понял (вообще DAC – это что такое, вроде на АЦП не похоже).

А задержку я на скорую руку сделал, мне-ж просто разобраться пока надо, хрен с ним, что это пока быдлокод и полное отсутствие оптимизации.

Re: STM32F0 и USART

Пт дек 06, 2013 10:51:51

Потому что такой вектор существует, см startup_stm32f0xx.s :
Спойлер
Код:
Default_Handler PROC

                EXPORT  WWDG_IRQHandler                [WEAK]
                EXPORT  PVD_IRQHandler                 [WEAK]
                EXPORT  RTC_IRQHandler                 [WEAK]
                EXPORT  FLASH_IRQHandler               [WEAK]
                EXPORT  RCC_IRQHandler                 [WEAK]
                EXPORT  EXTI0_1_IRQHandler             [WEAK]
                EXPORT  EXTI2_3_IRQHandler             [WEAK]
                EXPORT  EXTI4_15_IRQHandler            [WEAK]
                EXPORT  TS_IRQHandler                  [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler       [WEAK]
                EXPORT  DMA1_Channel2_3_IRQHandler     [WEAK]
                EXPORT  DMA1_Channel4_5_IRQHandler     [WEAK]
                EXPORT  ADC1_COMP_IRQHandler           [WEAK]
                EXPORT  TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]
                EXPORT  TIM1_CC_IRQHandler             [WEAK]
                EXPORT  TIM2_IRQHandler                [WEAK]
                EXPORT  TIM3_IRQHandler                [WEAK]
                EXPORT  TIM6_DAC_IRQHandler            [WEAK]
                EXPORT  TIM14_IRQHandler               [WEAK]
                EXPORT  TIM15_IRQHandler               [WEAK]
                EXPORT  TIM16_IRQHandler               [WEAK]
                EXPORT  TIM17_IRQHandler               [WEAK]
                EXPORT  I2C1_IRQHandler                [WEAK]
                EXPORT  I2C2_IRQHandler                [WEAK]
                EXPORT  SPI1_IRQHandler                [WEAK]
                EXPORT  SPI2_IRQHandler                [WEAK]
                EXPORT  USART1_IRQHandler              [WEAK]
                EXPORT  USART2_IRQHandler              [WEAK]
                EXPORT  CEC_IRQHandler                 [WEAK]



А обозвать обработчик ты можешь как угодно, вот только если он не будет совпадать с именем вектора то и не попадешь ты в него никогда..
В добавок будешь улетать в Handler fault при обработке прерывания.

Re: STM32F0 и USART

Пт дек 06, 2013 13:25:06

Н-да... по поводу того, что с USART1_DAC_IRQHandler работает, это я погорячился. Прерывание у меня срабатывало и уходило на обработчик по умолчанию, который, как я знаю, представляет из себя пустой бесконечный цикл, который все на фиг вешает, если я конечно не наврал. :roll: А вот в USART1_IRQHandler светодиодик загорался если зажигать его из самого прерывания.

Re: STM32F0 и USART

Пт дек 06, 2013 13:41:47

Ну так что сейчас не работает ?
Вычитывай RDR и не будет виснуть...

Re: STM32F0 и USART

Пт дек 06, 2013 13:50:33

Да я же говорил уже, что дома и-нета нет, а на работу я такие вещи не ношу. Так что сегодня вечером попробую, завтра отпишусь.

Re: STM32F0 и USART

Пт дек 06, 2013 18:08:09

Влезу со своим вопросом.
У меня такая же проблема. Плата STM32F0Discovery. Процессор STM32F051R8
Настраиваю USART1
Передача работает прекрасно.
Приём делаю по прерыванию. Пока на приёмник не подаю данные, передача работает по таймеру. Как только принимается символ в USART, взводится прерывание и не сбрасывается флаг прерывания - процессор всё время находится в прерывании. Сбрасывание флага RXFRQ в теле прерывания не помогает.
Прошу помочь более опытных котов.
FreeRTOS работает, передача в очередях тоже, прикрепляю периферию.
Проект пишу в CooCox,

Инициализация USART:
Код:
void init_usart (void)
{
   GPIO_InitTypeDef  GPIO_InitStruct;
    USART_InitTypeDef USART_InitStructure;

    // установка пинов USART
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
   GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF;
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);   // USART1_TX
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);   // USART1_RX

    // Разрешить тактирование USART
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

     USART_Init(USART1, &USART_InitStructure);

   while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
   {}
     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
     
   USART_Cmd(USART1, ENABLE);

}


Обработчик прерывания USART:
Код:
char string[20];

unsigned char counter = 0;
void USART1_IRQHandler (void)
{
   char litera = USART_ReceiveData(USART1);        // здесь читаю байт из USART
   portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
   USART_RequestCmd(USART1, USART_Request_RXFRQ, ENABLE);   // здесь запись флага не помогает сбросить

   if ( (litera == '\r') || (counter >= 19) )
   {
      counter = 0;
      xQueueSendToBackFromISR (g.xOUT_USART1_Queue, &string, &xHigherPriorityTaskWoken);
      //memcpy(out_str, string, 20);
      if (xHigherPriorityTaskWoken == pdTRUE)
         taskYIELD();
   }
   else
   {
      string[counter++] = litera;
      string[counter] = 0;
   }
}

Re: STM32F0 и USART

Пт дек 06, 2013 18:51:46

Где установка приоритета прерывания и разрешение самого прерывания ?
С чего сделаны выводы что прерывание обрабатывается ? :)))
В самом прерывании не лишней будет проверка флагов .
Доведет вас кактус и SPL до ручки... :)))

Re: STM32F0 и USART

Пт дек 06, 2013 20:07:35

Я знаю, что недоглядел какую-то ерунду, но не могу сам найти причину.

Вот в прерываниях у STM я пока не разобрался.
Векторы прерывания устанавливаются в стартапе ассемблером:
Код:
 
g_pfnVectors:
  .word _eram
  .word Reset_Handler
  .word NMI_Handler
  .word HardFault_Handler
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word 0
  .word SVC_Handler         /*SVC_Handler*/
  .word 0
  .word 0
  .word PendSV_Handler      /*PendSV_Handler*/
  .word SysTick_Handler      /*SysTick_Handler*/
  .word WWDG_IRQHandler
  .word PVD_IRQHandler
  .word RTC_IRQHandler
  .word FLASH_IRQHandler
  .word RCC_IRQHandler
  .word EXTI0_1_IRQHandler
  .word EXTI2_3_IRQHandler
  .word EXTI4_15_IRQHandler
  .word TS_IRQHandler
  .word DMA1_Channel1_IRQHandler
  .word DMA1_Channel2_3_IRQHandler
  .word DMA1_Channel4_5_IRQHandler
  .word ADC1_COMP_IRQHandler
  .word TIM1_BRK_UP_TRG_COM_IRQHandler
  .word TIM1_CC_IRQHandler
  .word TIM2_IRQHandler
  .word TIM3_IRQHandler
  .word TIM6_DAC_IRQHandler
  .word 0
  .word TIM14_IRQHandler
  .word TIM15_IRQHandler
  .word TIM16_IRQHandler
  .word TIM17_IRQHandler
  .word I2C1_IRQHandler
  .word I2C2_IRQHandler
  .word SPI1_IRQHandler
  .word SPI2_IRQHandler
  .word USART1_IRQHandler
  .word USART2_IRQHandler
  .word 0
  .word CEC_IRQHandler
  .word 0
  .word BootRAM


Установка прерываний:
Код:
void init_nvic (void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

   NVIC_Init(&NVIC_InitStructure);

}


В прервание я отладчиком попадаю, но впрерывании значение регистра USART_CR1 0000002d, то есть
флаг RXNEIE установлен и не сбрасывается при выходе из прерывания.
Где копать?

Re: STM32F0 и USART

Пт дек 06, 2013 20:29:31

GARMIN писал(а):В прервание я отладчиком попадаю, но впрерывании значение регистра USART_CR1 0000002d, то есть
флаг RXNEIE установлен и не сбрасывается при выходе из прерывания.
Где копать?


Пока не поздно бросайте SPL вместе с кактусом, послушайте доброго совета.

Вот при чем здесь CR1 и RXNEIE ?
RXNEIE - это бит разрешения прерывания .
А флаг прерывания от приема USART - это RXNE и находится он в ISR .

ЗЫ. Сейчас последует реплика -" в AVR было проще" ... :)))

Re: STM32F0 и USART

Пт дек 06, 2013 21:06:30

Я, наверное, не тот даташит смотрел. У меня есть RM0091 STM32F05 reference manual,
а мне нужен STM32F0x1
На сайте STM я его быстро не нашёл. Гугл не подсказывает. Кто знает ссылку?
В кокосе отображаются не те регистры, которые я вижу в даташите.
Вложения
06.12.gif
(15.17 KiB) Скачиваний: 498

Re: STM32F0 и USART

Пт дек 06, 2013 21:15:57

GARMIN писал(а):Я, наверное, не тот даташит смотрел. У меня есть RM0091 STM32F05 reference manual,


Не надумывай , даташит именно тот .
А все беды от кактуса с SPL . :)))

Re: STM32F0 и USART

Пт дек 06, 2013 21:39:41

Спасибо, хоть успокаиваешь.
Я так понял, что прерывание зацикливается.
После выполнения прерывания процессор тупо переходит на его начало
Код:
 97             string[counter] = 0;
08002ada:   ldr r3, [pc, #20]       ; (0x8002af0 <USART1_IRQHandler+136>)
08002adc:   ldrb r3, [r3, #0]
08002ade:   ldr r2, [pc, #24]       ; (0x8002af8 <USART1_IRQHandler+144>)
08002ae0:   movs r1, #0
08002ae2:   strb r1, [r2, r3]
 99       }
08002ae4:   mov sp, r7
08002ae6:   add sp, #8
08002ae8:   pop {r7, pc}      // вот отсюда шагаю прямо в начало прерывания
 nop ; (mov r8, r8)

Это происходит во время приёма второго символа.
То есть в буфере приёмника после передачи строки "45" оказываются символы "455555555555"
И я не совсем понимаю, при чём тут IDE. Компилятор то GCC, я смотрю выполнение программы компилятора.

Re: STM32F0 и USART

Пт дек 06, 2013 21:50:27

GARMIN писал(а):Спасибо, хоть успокаиваешь.
Я так понял, что прерывание зацикливается.
После выполнения прерывания процессор тупо переходит на его начало


Значится флаг все таки сбрасывается ? :))) Ты просто не можешь проверить ибо кактус тебе его не покажет.
Предполагаю, что обработчик прерывания чрезмерно затянут и нагружен .
Выкинуть все оставив вычитку .
Это не IDE это ж..па . :)))

Re: STM32F0 и USART

Пт дек 06, 2013 22:10:21

По поводу прерывания проверю.
Чем предлагаешь пользоваться?
До этого я работал с IAR, хочу лучшего.
Ответить