| Форум РадиоКот https://radiokot.ru/forum/ |
|
| stm32f100rb проблемы с прерыванием по приёму USART1 https://radiokot.ru/forum/viewtopic.php?f=59&t=108796 |
Страница 1 из 1 |
| Автор: | jazz393 [ Пт окт 17, 2014 20:22:05 ] |
| Заголовок сообщения: | stm32f100rb проблемы с прерыванием по приёму USART1 |
Всем привет, осваиваю 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 [ Пт окт 17, 2014 22:09:13 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
volatile char uart_data; for(int i=0;i<9000;i++); Вот это компилятор может выкинуть если включена хоть какая-то оптимизация из-за того же volatile. |
|
| Автор: | jazz393 [ Пт окт 17, 2014 22:13:50 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
uk8amk писал(а): Потом с обработчиком не всё ладно. Флажки в USART_SR ручками очищать требуется. сейчас меня интересует больше всего почему в тело обработчика он не заходит... он просто повисает и всё, я знаю что надо очищать флаги, но у меня просто крашится всё |
|
| Автор: | uk8amk [ Пт окт 17, 2014 22:23:55 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Краш может быть от 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 [ Пт окт 17, 2014 22:40:01 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
да в hard_Fault попадает, будем думать почему .... спасибо |
|
| Автор: | jazz393 [ Пт окт 17, 2014 23:10:36 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
сделал таймер - в момент срабатывания таймера точно так же вместо обработки таймера попадаем в void HardFault_Handler( void ); |
|
| Автор: | jazz393 [ Пт окт 17, 2014 23:29:04 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
взял чужой пример работающий с таймером - такая же фигня, при прерывании зависает в HardFault ... что это и с чем мб связано, я думал что инициилизировал что-нибудь неправильно, но если уже работающие примеры не работают, то.. |
|
| Автор: | menzoda [ Пт окт 17, 2014 23:36:54 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Проект в студию |
|
| Автор: | jazz393 [ Пт окт 17, 2014 23:40:56 ] | ||
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 | ||
menzoda писал(а): Проект в студию вот
|
|||
| Автор: | jazz393 [ Сб окт 18, 2014 00:07:47 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
проблема решена, не прикрученый стартап к проекту + дефайн не расскоменнченный в #include <stm32f10x.h> |
|
| Автор: | dosikus [ Сб окт 18, 2014 07:56:42 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Чем дефолтный скрипт линкера не устраивает? Что вы вечно как под копирку перелопачиваете его? 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 [ Сб окт 18, 2014 09:47:08 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
1) да после добавления правильного дефайна частота uart'a стала другой и принимать стал всякую ересь - сейчас разбираюсь как его настроить. Цитата: BRR вычисляется без танцев с бубном и магических чисел: 2) я специально трачу время на то, чтобы всё делать не через библиотеку, которая любезно предоставляет нам ST, а через регистры напрямю, попутно врубаясь что и как и где работает, т.к. я многого не знаю, более того я работаю embedded junior'ом менее года и вот честно для меня это всё танцы с бубном на которые я потрачу час, два, три, но зато научусь |
|
| Автор: | jazz393 [ Сб окт 18, 2014 10:21:16 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
не понимаю...пишу так: Код: #define USARTCLK 8000000UL #define BAUDRATE 9600UL считаю так Код: USART1->BRR =(USARTCLK+BAUDRATE/16)/BAUDRATE; и так(нашёл на просторах) Код: USART1->BRR =(USARTCLK+BAUDRATE/2)/BAUDRATE; почему у вас 16 а там 2 не понятно, в коде разницы не нашёл результата нет - принимается ересь |
|
| Автор: | jazz393 [ Сб окт 18, 2014 10:34:00 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
вроде разобрался, но принимаю всёравно не то что отправляю |
|
| Автор: | dosikus [ Сб окт 18, 2014 10:39:21 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Код: #define USARTCLK 8000000UL Разберитесь как тактируется UART , и там явно не 8МГц . Если VL дискаверена - там 24МГц ... И это не SPL ... |
|
| Автор: | jazz393 [ Сб окт 18, 2014 10:45:35 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
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 [ Сб окт 18, 2014 11:16:46 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Это кому как проще и удобней. В конце концов программу вы пишете не на выставку. Можно задефайнить в опциях проекта. Я в main.h помимо прочего конфигурацию прописываю: Код: #define SYS_CLK 8000000UL // Hz И затем использование в программе: Код: USART1->BRR = (SYS_CLK/9600); Естественно здесь нет делителя шины APB, поскольку тактируется напрямую. Ну если проект более сложный, то делители тоже прописываются. upd. И кстати вот так писать некорректно: Код: GPIOA->CRH &= !GPIO_CRH_CNF10; Не путайте логическое отрицание с поразрядной инверсией. |
|
| Автор: | dosikus [ Сб окт 18, 2014 13:32:54 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
jazz393 писал(а): Вообще пока не понимаю, почему там 24МГц как-то непонятно... Проект с VL дискавериной по дефолту настроен на максимум - 24МГц . Если нужно что то иное - править system_init() ... |
|
| Автор: | jazz393 [ Сб окт 18, 2014 19:50:44 ] |
| Заголовок сообщения: | Re: stm32f100rb проблемы с прерыванием по приёму USART1 |
Цитата: И кстати вот так писать некорректно: Код: GPIOA->CRH &= !GPIO_CRH_CNF10; Не путайте логическое отрицание с поразрядной инверсией. да я знаю, я так не делаю - скопированный пример, я тогда пытался прерывание запустить. Я делаю &=~(1<<x); или с макроопределениями |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


