Форум РадиоКот • Просмотр темы - stm32f100rb проблемы с прерыванием по приёму USART1
Сообщения без ответов | Активные темы
Страница 1 из 1
[ Сообщений: 19 ]
Автор
Сообщение
jazz393
Заголовок сообщения: 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; } } }
Вернуться наверх
Реклама
uk8amk
Заголовок сообщения: 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.
Вернуться наверх
Реклама
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 22:13:50
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
uk8amk писал(а):
Потом с обработчиком не всё ладно. Флажки в USART_SR ручками очищать требуется.
сейчас меня интересует больше всего почему в тело обработчика он не заходит... он просто повисает и всё, я знаю что надо очищать флаги, но у меня просто крашится всё
Вернуться наверх
uk8amk
Заголовок сообщения: 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. Отчего функция есть, а обработчика нет. Гарантированный хардфолт.
Вернуться наверх
Реклама
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 22:40:01
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
да в hard_Fault попадает, будем думать почему .... спасибо
Вернуться наверх
Реклама
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 23:10:36
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
сделал таймер - в момент срабатывания таймера точно так же вместо обработки таймера попадаем в void HardFault_Handler( void );
Вернуться наверх
Реклама
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 23:29:04
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
взял чужой пример работающий с таймером - такая же фигня, при прерывании зависает в HardFault ... что это и с чем мб связано, я думал что инициилизировал что-нибудь неправильно, но если уже работающие примеры не работают, то..
Вернуться наверх
menzoda
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 23:36:54
Вымогатель припоя
Карма: 7
Рейтинг сообщений: 56
Зарегистрирован: Вт авг 28, 2012 22:21:33Сообщений: 535
Рейтинг сообщения: 0
Вернуться наверх
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Пт окт 17, 2014 23:40:56
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
menzoda писал(а):
Проект в студию
вот
Вложения:
test.rar [817.29 KiB]
Скачиваний: 160
Вернуться наверх
Реклама
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Сб окт 18, 2014 00:07:47
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
проблема решена, не прикрученый стартап к проекту + дефайн не расскоменнченный в #include <stm32f10x.h>
Вернуться наверх
dosikus
Заголовок сообщения: 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>
Достаточно добавить дефайн в опции препроцессора
Вернуться наверх
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Сб окт 18, 2014 09:47:08
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
1) да после добавления правильного дефайна частота uart'a стала другой и принимать стал всякую ересь - сейчас разбираюсь как его настроить.
Цитата:
BRR вычисляется без танцев с бубном и магических чисел:
2) я специально трачу время на то, чтобы всё делать не через библиотеку, которая любезно предоставляет нам ST, а через регистры напрямю, попутно врубаясь что и как и где работает, т.к. я многого не знаю, более того я работаю embedded junior'ом менее года и вот честно для меня это всё танцы с бубном на которые я потрачу час, два, три, но зато научусь
Вернуться наверх
jazz393
Заголовок сообщения: 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 не понятно, в коде разницы не нашёл
результата нет - принимается ересь
Вернуться наверх
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Сб окт 18, 2014 10:34:00
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
вроде разобрался, но принимаю всёравно не то что отправляю
Вернуться наверх
dosikus
Заголовок сообщения: 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 ...
Вернуться наверх
jazz393
Заголовок сообщения: 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 МГц и где лучше это делать?
Вернуться наверх
uk8amk
Заголовок сообщения: 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;
Не путайте логическое отрицание с поразрядной инверсией.
Вернуться наверх
dosikus
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Сб окт 18, 2014 13:32:54
Друг Кота
Карма: 30
Рейтинг сообщений: 156
Зарегистрирован: Пн июл 28, 2008 22:12:01Сообщений: 3604
Рейтинг сообщения: 0
jazz393 писал(а):
Вообще пока не понимаю, почему там 24МГц как-то непонятно...
Проект с VL дискавериной по дефолту настроен на максимум - 24МГц .
Если нужно что то иное - править
system_init() ...
Вернуться наверх
jazz393
Заголовок сообщения: Re: stm32f100rb проблемы с прерыванием по приёму USART1
Добавлено: Сб окт 18, 2014 19:50:44
Зарегистрирован: Ср фев 05, 2014 18:54:39Сообщений: 118
Рейтинг сообщения: 0
Цитата:
И кстати вот так писать некорректно: Код: GPIOA->CRH &= !GPIO_CRH_CNF10; Не путайте логическое отрицание с поразрядной инверсией.
да я знаю, я так не делаю - скопированный пример, я тогда пытался прерывание запустить.
Я делаю &=~(1<<x); или с макроопределениями
Вернуться наверх
Страница 1 из 1
[ Сообщений: 19 ]
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения