Например TDA7294

Форум РадиоКот • Просмотр темы - stm32f100rb проблемы с прерыванием по приёму USART1
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 28, 2025 19:04:11

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 20:22:05 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
Всем привет, осваиваю stm-ки. Пишу в IAR , камень - stm32f100rb (st32vldiscovery)
Есть такая мною написанная небольшая програмка, в ней настраивается UART1 на приём/передачу. Передает всё нормально, принимаю символ 'a'. С приёмом сложнее - пытаюсь принимать по прерыванию, но в момент приёма всё крашится, в тело обработчика прерываний программа не попадает...
Думал что мб дело в том что уровень сигнала немного превышает положенный, там больше 3.5В, но если сделать приём без прерывания в main() то всё работает нормально, в чём мб причина?
Код:
#include <stm32f10x.h>
char f=1;
char uart_data;

void initGpio()
  {
  RCC->APB2ENR|=RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_AFIOEN;;
  GPIOC->CRH|=GPIO_CRH_MODE8_1 | GPIO_CRH_MODE9_1;
  GPIOC->CRH&=~(GPIO_CRH_CNF8_0 | GPIO_CRH_CNF9_0);
  GPIOC->ODR|=GPIO_ODR_ODR8 | GPIO_ODR_ODR9;
 
  GPIOA->CRH &= !GPIO_CRH_CNF10;                // в 0
  GPIOA->CRH &= !GPIO_CRH_MODE10;               // в 0
  GPIOA->CRH  |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0;    //PA9
  GPIOA->CRH  |= GPIO_CRH_CNF10_0;                      //PA10
  USART1->BRR=0x341;                              // делитель на 9600
  USART1->CR1 |= USART_CR1_TE | USART_CR1_RE;     // вкл. приём и передача
 
  USART1->CR1 |= USART_CR1_UE;        // Запускаем модуль USART
 
  __enable_irq();                     // глобальное включение прерывания
  NVIC_EnableIRQ (USART1_IRQn);       // разрешаем прерывание по USART1
  USART1->CR1 |= USART_CR1_RXNEIE;    // разрешаем прерывание по приёму
  }

void USART1_Send(char chr) {
  while(!(USART1->SR & USART_SR_TC));
  USART1->DR = chr;
}
void USART1_IRQHandler(void)
    {
    uart_data=USART1->DR;
    GPIOC->ODR&=~GPIO_ODR_ODR8;
    }
int main()
{
initGpio();
  while(1)
  {
      for(int i=0;i<9000;i++);
      if(f==1)
          {
          GPIOC->ODR&=(~GPIO_ODR_ODR9);
          GPIOC->ODR|=GPIO_ODR_ODR8;
          USART1_Send('a');
          }
      if(f==0)
          {   
          GPIOC->ODR&=~GPIO_ODR_ODR8;
          GPIOC->ODR|=GPIO_ODR_ODR9;
          USART1_Send('b');
          }
     if(uart_data=='g')
        {   
        GPIOC->ODR&=~GPIO_ODR_ODR8;
        GPIOC->ODR|=GPIO_ODR_ODR9;
        }
  }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 22:09:13 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
volatile char uart_data;

for(int i=0;i<9000;i++);
Вот это компилятор может выкинуть если включена хоть какая-то оптимизация из-за того же volatile.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 22:13:50 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
uk8amk писал(а):
Потом с обработчиком не всё ладно.
Флажки в USART_SR ручками очищать требуется.

сейчас меня интересует больше всего почему в тело обработчика он не заходит... он просто повисает и всё, я знаю что надо очищать флаги, но у меня просто крашится всё


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 22:23:55 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 1
Краш может быть от HardFault.
Я всегда делаю на них заглушки и могу определить отладчиком что где-то накосячил. Ну камень в полный ресет по крайней мере не улетает:
Код:
void NMI_Handler( void )
{
   while(1);
}

void HardFault_Handler( void )
{
   while(1);
}

void MemManage_Handler( void )
{
   while(1);
}

void BusFault_Handler( void )
{
   while(1);
}

void UsageFault_Handler( void )
{
   while(1);
}


И еще не знаю как там в IAR, но KEIL мне постоянно пытается подсунуть свой стартап, а у него там обработчики называются не как в CMSIS. Отчего функция есть, а обработчика нет. Гарантированный хардфолт.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 22:40:01 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
да в hard_Fault попадает, будем думать почему .... спасибо


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 23:10:36 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
сделал таймер - в момент срабатывания таймера точно так же вместо обработки таймера попадаем в void HardFault_Handler( void );


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 23:29:04 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
взял чужой пример работающий с таймером - такая же фигня, при прерывании зависает в HardFault ... что это и с чем мб связано, я думал что инициилизировал что-нибудь неправильно, но если уже работающие примеры не работают, то..


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 23:36:54 
Вымогатель припоя
Аватар пользователя

Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 22:21:33
Сообщений: 535
Рейтинг сообщения: 0
Проект в студию


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Пт окт 17, 2014 23:40:56 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
menzoda писал(а):
Проект в студию

вот


Вложения:
test.rar [817.29 KiB]
Скачиваний: 160
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 00:07:47 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
проблема решена, не прикрученый стартап к проекту + дефайн не расскоменнченный в #include <stm32f10x.h>


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 07:56:42 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 1
Чем дефолтный скрипт линкера не устраивает?
Что вы вечно как под копирку перелопачиваете его?

BRR вычисляется без танцев с бубном и магических чисел:
Код:
#define USARTCLK 72000000UL
#define BAUDRATE 115200UL
 


Код:
USART1->BRR =(USARTCLK+BAUDRATE/2)/BAUDRATE;


Если внимательней читать даташит а не копировать чужой код :

Update_event = TIM_CLK/((PSC+ 1)*(ARR + 1)*(RCR + 1))

Код:
TIM2->PSC = 8000 - 1;
  TIM2->ARR = 1000 ;

Код:
TIM2->PSC = 8000 - 1;
  TIM2->ARR = 1000-1 ;


Задержки реализуются на SysTick :
Код:
static volatile uint32_t TimingDelay;


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

      
      void Delay_mS(uint32_t nTime) {
         TimingDelay = nTime;

         while (TimingDelay);
      }



Прерывания разрешаем , а где установка приоритетов?
Код:
 NVIC_EnableIRQ (USART1_IRQn);       // разрешаем прерывание по USART1
  NVIC_EnableIRQ (TIM2_IRQn);



jazz393 писал(а):
дефайн не расскоменнченный в #include <stm32f10x.h>

Достаточно добавить дефайн в опции препроцессора


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 09:47:08 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
1) да после добавления правильного дефайна частота uart'a стала другой и принимать стал всякую ересь - сейчас разбираюсь как его настроить.
Цитата:
BRR вычисляется без танцев с бубном и магических чисел:

2) я специально трачу время на то, чтобы всё делать не через библиотеку, которая любезно предоставляет нам ST, а через регистры напрямю, попутно врубаясь что и как и где работает, т.к. я многого не знаю, более того я работаю embedded junior'ом менее года и вот честно для меня это всё танцы с бубном на которые я потрачу час, два, три, но зато научусь


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 10:21:16 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
не понимаю...пишу так:
Код:
#define USARTCLK 8000000UL
#define BAUDRATE 9600UL

считаю так
Код:
USART1->BRR =(USARTCLK+BAUDRATE/16)/BAUDRATE;

и так(нашёл на просторах)
Код:
USART1->BRR =(USARTCLK+BAUDRATE/2)/BAUDRATE;

почему у вас 16 а там 2 не понятно, в коде разницы не нашёл

результата нет - принимается ересь


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 10:34:00 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
вроде разобрался, но принимаю всёравно не то что отправляю :?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 10:39:21 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 1
Код:
#define USARTCLK 8000000UL


Разберитесь как тактируется UART , и там явно не 8МГц . Если VL дискаверена - там 24МГц ...
И это не SPL ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 10:45:35 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
dosikus писал(а):
Код:
#define USARTCLK 8000000UL


Разберитесь как тактируется UART , и там явно не 8МГц . Если VL дискаверена - там 24МГц ...
И это не SPL ...


да я уже нашёл вот это и поменял... и всё заработало=))
Код:
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL)
 #define SYSCLK_FREQ_HSE    HSE_Value
 //#define SYSCLK_FREQ_24MHz  24000000
#else


Вообще пока не понимаю, почему там 24МГц как-то непонятно... как тогда правильно выставлять эти 8 МГц и где лучше это делать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 11:16:46 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 1
Это кому как проще и удобней. В конце концов программу вы пишете не на выставку.
Можно задефайнить в опциях проекта.

Я в main.h помимо прочего конфигурацию прописываю:
Код:
#define SYS_CLK   8000000UL // Hz


И затем использование в программе:
Код:
USART1->BRR = (SYS_CLK/9600);


Естественно здесь нет делителя шины APB, поскольку тактируется напрямую.
Ну если проект более сложный, то делители тоже прописываются.

upd.
И кстати вот так писать некорректно:
Код:
GPIOA->CRH &= !GPIO_CRH_CNF10;

Не путайте логическое отрицание с поразрядной инверсией.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 13:32:54 
Друг Кота
Аватар пользователя

Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01
Сообщений: 3604
Рейтинг сообщения: 0
jazz393 писал(а):

Вообще пока не понимаю, почему там 24МГц как-то непонятно...



Проект с VL дискавериной по дефолту настроен на максимум - 24МГц .
Если нужно что то иное - править system_init() ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
СообщениеДобавлено: Сб окт 18, 2014 19:50:44 
Встал на лапы

Зарегистрирован: Ср фев 05, 2014 18:54:39
Сообщений: 118
Рейтинг сообщения: 0
Цитата:
И кстати вот так писать некорректно:
Код:
GPIOA->CRH &= !GPIO_CRH_CNF10;
Не путайте логическое отрицание с поразрядной инверсией.

да я знаю, я так не делаю - скопированный пример, я тогда пытался прерывание запустить.
Я делаю &=~(1<<x); или с макроопределениями


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y