STM32F0 и USART
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
- Реклама
Мой рабочий код – проверен на GCC+
- Вложения
-
- usart_stm32f051.c
- (1.93 КБ) 1184 скачивания
Последний раз редактировалось wss60 Сб дек 07, 2013 00:32:32, всего редактировалось 1 раз.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
wss60, Да чуть не забыл.
корректней было обозвать сей дефайн USARTCLK с соответствующей правкой вычислялки...
Так как ты переключаешь тактирование USART на HSI,#define APBCLK 8000000UL // частота мк
корректней было обозвать сей дефайн USARTCLK с соответствующей правкой вычислялки...
wss60, благодарю за пример.
Я пока никак не разберусь с NVIC. Я вижу, что в начале устанавливается таблица прерываний по одному вектору на устройство.
Но затем у нас есть, например в USART ещё 13 маскируемых запросов на прерывания. Как их различать? В AVR для этого были свои векторы, а здесь есть NVIC, который для меня пока чёрный ящик.
Если программа переходит по вектору прерываний, значит прерывание отрабатывается, а если из вектора не возвращается, значит проблема или со стеком, или с адресом возврата, то есть с настройками NVIC.
Как стек настраивается, сколько стеков в СТМ?
Курю даташит, уши горят.
Я пока никак не разберусь с NVIC. Я вижу, что в начале устанавливается таблица прерываний по одному вектору на устройство.
Но затем у нас есть, например в USART ещё 13 маскируемых запросов на прерывания. Как их различать? В AVR для этого были свои векторы, а здесь есть NVIC, который для меня пока чёрный ящик.
Если программа переходит по вектору прерываний, значит прерывание отрабатывается, а если из вектора не возвращается, значит проблема или со стеком, или с адресом возврата, то есть с настройками NVIC.
Как стек настраивается, сколько стеков в СТМ?
Курю даташит, уши горят.
- Реклама
Я правильно думаю?
Вначале в USART разрешаются прерывания по определённому событию:
Затем в NVIC разрешается прерывание USART
Затем в прерывании анализируется источник прерывания:
и принимается решение что-то делать.
так?
Вначале в USART разрешаются прерывания по определённому событию:
Код: Выделить всё
USART1->CR1 |= USART_CR1_RXNEIE; //прерывание по приему данныхКод: Выделить всё
NVIC_EnableIRQ (USART1_IRQn); //разрешить прерывания от USART1Код: Выделить всё
if((USART1->ISR & USART_ISR_RXNE)!=0)так?
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
В дебри лезете, NVIC здесь не причем . А вот непонимание работы прерываний с FreeRTOS скорей всего имеет место .GARMIN писал(а):здесь есть NVIC, который для меня пока чёрный ящик.
Если программа переходит по вектору прерываний, значит прерывание отрабатывается, а если из вектора не возвращается, значит проблема или со стеком, или с адресом возврата, то есть с настройками NVIC.
Всем добрый день. У меня все заработало. Как и говорил уважаемый Dosikus (еще раз этому великому кошану спасибо
), читаешь данные из регистра RDR и все работает, как часы. Спасибо еще раз за помощь. Вот только забыл принесть код. Постараюсь завтра выложить. Но сразу хочу сказать, что там кардинально ни чего не поменялось, кроме вычетки регистра RDR в теле прерывания. Вот и все. Дальше буду пробовать наверное с АЦП. НО ТАМ … ВОЩПЕ ОХРИНЕТЬ НАЩАЛЬНИКА
. Нда, это тебе не AVR-ка или PIC. ARM ешкин кот
. Наверное новую тему придется заводить. Кстати по поводу ИДЕ-шки. Я пользуюсь IAR-ом. Пока доволен.
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Ничего ТАМ сложного нет, все элементарно и просто. Главное читать и не пользовать SPL.Kvasshtain писал(а):Дальше буду пробовать наверное с АЦП. НО ТАМ … ВОЩПЕ ОХРИНЕТЬ НАЩАЛЬНИКА
Будем наедятся, что все пройдет гладко. Но немного почитав (с моим «офигенным» знанием английского) про АЦП, я немного прибалдел. Там только один алгоритм включения чего стоит. ШЕДЕБР. Шаг влево, шаг вправо — расстрел, нафиг.

Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Большое спасибо vss60 и dosikus за подсказки.
За это время я портировал код под IAR и немного разобрался с прерываниями.
Что получается:
Поскольку прерывания общие для всего устройства, то в прерывании необходимо анализировать все возможные источники их возникновения и вручную снимать флаги возникновения прерывания.
В данном случае прерывание возникает не только по заполнению приёмного буфера, но и по его переполнению. Например, в процессе отладки.
Это причина зацикливания прерывания.
Поправленный код:
Тут ни кокос ни причём, ни IAR.
И пару размышлений.
Первое.
Почему вы не советуете использовать CMSIS (он же SPL)?
Неужели код
более понятен и более безопасен, чем код:
Второй вопрос связан с FreeRTOS 7.5.3.
К сожалению, и в IAR, и в CooCox после настроек портирования она сваливается в Hard Fault.
Надо бы мне ещё поразбираться в особенностях настройки на STM32F051
За это время я портировал код под IAR и немного разобрался с прерываниями.
Что получается:
Поскольку прерывания общие для всего устройства, то в прерывании необходимо анализировать все возможные источники их возникновения и вручную снимать флаги возникновения прерывания.
В данном случае прерывание возникает не только по заполнению приёмного буфера, но и по его переполнению. Например, в процессе отладки.
Это причина зацикливания прерывания.
Поправленный код:
Код: Выделить всё
void USART1_IRQHandler(void)
{
if((USART1->ISR & USART_ISR_RXNE)!=0)
{
usart_temp = USART1->RDR;
}
if (USART1->ISR & USART_ISR_ORE)
{
USART1->ICR |= USART_ICR_ORECF;
}
}И пару размышлений.
Первое.
Почему вы не советуете использовать CMSIS (он же SPL)?
Неужели код
Код: Выделить всё
GPIOC->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0;
GPIOC->OTYPER &= ~GPIO_OTYPER_OT_8 & ~GPIO_OTYPER_OT_9;
GPIOC->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR8 & ~GPIO_OSPEEDER_OSPEEDR9;
GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR8 & ~GPIO_PUPDR_PUPDR9;
Код: Выделить всё
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init ((GPIO_TypeDef *) GPIOC, (GPIO_InitTypeDef *) &GPIO_InitStruct);
К сожалению, и в IAR, и в CooCox после настроек портирования она сваливается в Hard Fault.
Надо бы мне ещё поразбираться в особенностях настройки на STM32F051
Жмакнул не ту пуколку, шлепнул не по той свистелке не тогда, когда надо, дернул не за ту шморгалку какую нужно не в том месте и … ман-ц пацаны. Контроллер откажется от оцифровки и уйдет к лесным братьям — партизанам. 
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Для начала не путай мягкое с теплым .GARMIN писал(а): И пару размышлений.
Первое.
Почему вы не советуете использовать CMSIS (он же SPL)?
Неужели код
более понятен и более безопасен, чем код:
CMSIS никакой ж к SPL не относится .
А код не только более понятен, он же и эффективней и безопасней .
Осознать сие ты сможешь только с опытом ,
но сейчас для тебя кажущая легкость главней . А это беда всех новичков ...
Дело не в лёгкости. Например, установка приоритетов прерываний в совмещённых полях 32-битного слова.
Или регистры альтернативных функций портов ВВ.
Тут довольно легко ошибиться с определением нужного бита. Намного понятнее использовать структуру управления и функцию установки.
Но это не предмет разговора.
Сейчас скачал последнюю версию FreeRTOS 7.6.0 с депозитария, в архиве не было файла startup_stm32f0xx.s под GCC.
Я применил его от предыдущей версии.
Проект собрался, мигает. Буду пробовать прерывание и USART.
Курю приоритеты прерываний.
Есть разные абстракции.
1) приоритеты прерываний в процессоре. Маскируемые и немаскируемые. В STM32F051 они могут быть в диапазоне -4 ... 255 (или 127, если там применимы signed char)
2) приоритеты прерываний, используемые RTOS. Есть прерывания, маскируемые OS в критических секциях, есть прерывания, немаскируемые OS. Как это выглядит для STM32F051, я пока не знаю.
3) софтовые приоритеты задач в самой RTOS. Тут понятно, задаются при создании задач, могут меняться внутри задач.
Что же у меня было с кучей? Почему памяти не хватало при минимальных настройках?
Или регистры альтернативных функций портов ВВ.
Тут довольно легко ошибиться с определением нужного бита. Намного понятнее использовать структуру управления и функцию установки.
Но это не предмет разговора.
Сейчас скачал последнюю версию FreeRTOS 7.6.0 с депозитария, в архиве не было файла startup_stm32f0xx.s под GCC.
Я применил его от предыдущей версии.
Проект собрался, мигает. Буду пробовать прерывание и USART.
Курю приоритеты прерываний.
Есть разные абстракции.
1) приоритеты прерываний в процессоре. Маскируемые и немаскируемые. В STM32F051 они могут быть в диапазоне -4 ... 255 (или 127, если там применимы signed char)
2) приоритеты прерываний, используемые RTOS. Есть прерывания, маскируемые OS в критических секциях, есть прерывания, немаскируемые OS. Как это выглядит для STM32F051, я пока не знаю.
3) софтовые приоритеты задач в самой RTOS. Тут понятно, задаются при создании задач, могут меняться внутри задач.
Что же у меня было с кучей? Почему памяти не хватало при минимальных настройках?
Пока USART не сваливается. Отдаёт эхо на терминал. Попробую буфер и очередь.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Глупости все это . В SPL прослойка между юзер кодом и CMSIS .GARMIN писал(а):Дело не в лёгкости. Например, установка приоритетов прерываний в совмещённых полях 32-битного слова.
Или регистры альтернативных функций портов ВВ.
Тут довольно легко ошибиться с определением нужного бита. Намного понятнее использовать структуру управления и функцию установки.
Вот пример инита прерывания .
Код: Выделить всё
NVIC_SetPriority(TIM3_IRQn, 15);
NVIC_EnableIRQ(TIM3_IRQn);Так что неправда ваша...
Тогда, будь добр, подскажи правильную последовательность действий, что после чего нужно делать:
1) установить альтернативные функции порта
2) включить тактирование порта
3) установить режим USART
4) установить разрешение прерывания в USART
5) разрешить работу USART
6) установить приоритет прерывания в NVIC
7) разрешить прерывание USART в NVIC
У меня после разрешения прерывания сразу один цикл срабатывает, хотя я сбрасываю флаги после разрешения USART
1) установить альтернативные функции порта
2) включить тактирование порта
3) установить режим USART
4) установить разрешение прерывания в USART
5) разрешить работу USART
6) установить приоритет прерывания в NVIC
7) разрешить прерывание USART в NVIC
У меня после разрешения прерывания сразу один цикл срабатывает, хотя я сбрасываю флаги после разрешения USART
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
У меня не совсем такая последовательность, но все равно работает. В следующий раз учту совет уважаемого Dosikus-а. Как и обещал выкладываю наковырянное. Криво конечно, но может быть кому поможет.
- Вложения
-
- STM32 USART прием.rar
- (308.87 КБ) 599 скачиваний
Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.


