_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Было RCC->AHBENR |= RCC_AHBENR_GPIOBEN; , а надо RCC->AHBENR |= RCC_AHBENR_GPIOAEN; Балбес — я, балбес. А я мучаюсь. Ладно дома попробую исправить. Завтра отпишусь. Dosikus, спасибо Вам за помощь.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
УРА!!! Все заработало. Спасибо Вам Dosikus за помощь. Желаю Вам на STM-ке Терминатора собрать для работы на огороде, ну или хотя бы Бигдога.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Вот и пришло время осваивать прием. Решил через прерывание. Но вот блин, ... опять не хочет орбайтн. Прерывание срабатывает и виснит намертво. Что я опять делаю не так не пойму . Вот код:
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; }
Здесь просто проверяется светодиодиком наличие приема. То есть я не беру из RDR данных. Может дело в этом (читал в даташыте, что есть там такае фишка как ошибка перезаписи)? Еще попутный вопрос: Что делают функции NVIC_SetPriority и NVIC_EnableIRQ. Как я понял, первая меняет приоритет прерывания (круто, такого в AVR-ках не было), но тогда, что случается с прерыванием, которое имело приоритет, который мы хотим задать для нашего прерывания. А вторая разрешает прерывание от аппаратного модуля USART (при этом USART1->CR1 |= USART_CR1_RXNEIE - Разрешаем прерывание по приему USART1 в самом модуле USART1). Хочу сказать, что вход в прерывание происходит точно, это видно и по отладчику (которым я пока плохо умею пользоваться) и, когда я размещаю функцию зажигания диода в теле обработчика прерывания, по загорающемуся синему светику. Ну и на последок, чем отличаются обработчики USART1_DAC_IRQHandler и USART1_IRQHandler, пробовал и тот и другой .
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
То есть я не беру из 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, пробовал и тот и другой .
В STM32F051 нет USART1_DAC_IRQHandler , где ты его выцепил ? Да и обработчики как таковые ты пишешь сам. Изначально их нет, есть только вектора .
Здравствуйте уважаемый 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 – это что такое, вроде на АЦП не похоже).
А задержку я на скорую руку сделал, мне-ж просто разобраться пока надо, хрен с ним, что это пока быдлокод и полное отсутствие оптимизации.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
А обозвать обработчик ты можешь как угодно, вот только если он не будет совпадать с именем вектора то и не попадешь ты в него никогда.. В добавок будешь улетать в Handler fault при обработке прерывания.
Н-да... по поводу того, что с USART1_DAC_IRQHandler работает, это я погорячился. Прерывание у меня срабатывало и уходило на обработчик по умолчанию, который, как я знаю, представляет из себя пустой бесконечный цикл, который все на фиг вешает, если я конечно не наврал. А вот в USART1_IRQHandler светодиодик загорался если зажигать его из самого прерывания.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Да я же говорил уже, что дома и-нета нет, а на работу я такие вещи не ношу. Так что сегодня вечером попробую, завтра отпишусь.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Карма: 16
Рейтинг сообщений: 166
Зарегистрирован: Вс дек 02, 2012 16:58:33 Сообщений: 826 Откуда: Уже не город Белых гор
Рейтинг сообщения:0
Влезу со своим вопросом. У меня такая же проблема. Плата STM32F0Discovery. Процессор STM32F051R8 Настраиваю USART1 Передача работает прекрасно. Приём делаю по прерыванию. Пока на приёмник не подаю данные, передача работает по таймеру. Как только принимается символ в USART, взводится прерывание и не сбрасывается флаг прерывания - процессор всё время находится в прерывании. Сбрасывание флага RXFRQ в теле прерывания не помогает. Прошу помочь более опытных котов. FreeRTOS работает, передача в очередях тоже, прикрепляю периферию. Проект пишу в CooCox,
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); // здесь запись флага не помогает сбросить
Где установка приоритета прерывания и разрешение самого прерывания ? С чего сделаны выводы что прерывание обрабатывается ? В самом прерывании не лишней будет проверка флагов . Доведет вас кактус и SPL до ручки...
В прервание я отладчиком попадаю, но впрерывании значение регистра USART_CR1 0000002d, то есть флаг RXNEIE установлен и не сбрасывается при выходе из прерывания. Где копать?
В прервание я отладчиком попадаю, но впрерывании значение регистра USART_CR1 0000002d, то есть флаг RXNEIE установлен и не сбрасывается при выходе из прерывания. Где копать?
Пока не поздно бросайте SPL вместе с кактусом, послушайте доброго совета.
Вот при чем здесь CR1 и RXNEIE ? RXNEIE - это бит разрешения прерывания . А флаг прерывания от приема USART - это RXNE и находится он в ISR .
ЗЫ. Сейчас последует реплика -" в AVR было проще" ...
Карма: 16
Рейтинг сообщений: 166
Зарегистрирован: Вс дек 02, 2012 16:58:33 Сообщений: 826 Откуда: Уже не город Белых гор
Рейтинг сообщения:0
Я, наверное, не тот даташит смотрел. У меня есть RM0091 STM32F05 reference manual, а мне нужен STM32F0x1 На сайте STM я его быстро не нашёл. Гугл не подсказывает. Кто знает ссылку? В кокосе отображаются не те регистры, которые я вижу в даташите.
Это происходит во время приёма второго символа. То есть в буфере приёмника после передачи строки "45" оказываются символы "455555555555" И я не совсем понимаю, при чём тут IDE. Компилятор то GCC, я смотрю выполнение программы компилятора.
Спасибо, хоть успокаиваешь. Я так понял, что прерывание зацикливается. После выполнения прерывания процессор тупо переходит на его начало
Значится флаг все таки сбрасывается ? Ты просто не можешь проверить ибо кактус тебе его не покажет. Предполагаю, что обработчик прерывания чрезмерно затянут и нагружен . Выкинуть все оставив вычитку . Это не IDE это ж..па .
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения