Jump to content

    

ЯЛёша

Новичок
  • Content Count

    2
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Баг ли stm32

    Как транслировать псевдокод на родной язык? гугл нимуя не может. Это не ко мне а к STMicroelectronics. Вот кнопка на stm32vldiscovery: конденсатор С22 вооще не впаян, R21 не 10К а 220К, кнопка такого качества, что один клик получается через раз. Не программист. Учу С++. Математические способности малы, поэтому путь тернист Впаянный контрллер используется для разработки. Планируется изготовить в окончательном варианте одну плату. Изготовление платы технологией ЛУТ, поэтому выбрал, как мне казалось, микруху с жирными ножками. Но оказалось не так - самые жирные ножки в корпусе LQFP32. Ошибочка. Не из-за этого. Вот код,в файле, где проц тактируется кварцем 8Мгц, без всяких делителей, таймет 2 считает до 4 сек, на 1 сек сравнение канала 1 генерирует прерывание в котором USART3 толкает байт - поочерёдно 'А' либо 'Б' - на скорости 9600. Если снять отложенное прерывание сравнения почти сразу же - после инструкции отправки байта - всё ОК: Downloads.tar.gz Если вставить перед этим пару тройку инструкций - трабл: Есть же коммент ;Handler mode и процесс с именем, не допускающем двойного толкования - EXTI0_IRQ_ Согласен. Ещё лучше и до и после. А совсем хорошо как в анекдоте про гнузинского гинеколога - "Вместо" :) Никакого отношения к проблеме не имеет. Советую 82 страницу переведённой Евстифеевым книги Джозефа Ю. "Ядро CORTEX-M3 компании ARM. Полное руководство". Вот ответ с форума STM Community который работае в данной ситуации: The interrupt handler might run twice. After clearing the pending register of EXTI, it takes a few cycles internally to clear the interrupt request in NVIC. If the information does not reach the NVIC in time, the interupt handler runs again. Because EXTI runs on the APB2 clock, this depends on the APB2 prescaler. Recommended practice is to check the peripheral status register at the beginning of the interrupt handler, and return when there is no apparent reason for the interrupt. Перефразируя доктора из "Формула любви" - "NVIC дело тёмное, осмыслению не подлежит". Важная новость. Британские учёные ПРЕДСКАЗЫВАЮТ появление нового штамма вируса. Нулевой пациент зараженный новым штаммом будет обнаружен в настоящее время в восточной европе в городе Рига. Органом которому данный штамм наносит наибольшее, невосстановимое поражение является мозг. К счастью у него ничтожно малая вирулентность, практически нулевой икубационный период и, что особенно важно, полностью отсутствует безсимптомная фаза.
  2. Баг ли stm32

    Добрый день. Попал недавно в ситуацию аналогичную той, которая случилась когда я работал давным-давно автослесарем, ремонтируя крайслеры. Приехал клиент на Чероки, старом еще, похожим на кирпичь. Я спросил, что у него болит и был оочень удивлён его абсолютно нестандартным ответом. Мужик достал лист А4 весь исписанный убористым почерком и начал "констатировать симптомы". "При повороте налево при скорости от 10 до 20 км/ч дребезг в районе раздатки, при торможении на скорости 40-60 км/ч постукивание заднего моста, на неровной дороге громыхание по всему кузову и т.д. и т.п........". Через минуту, когда моё удивление прошло, и мужик уже добрался до второй трети своих недугов, я его решительно остановил, забрался под машину даже не утруждаясь поднять её на подъёмнике и двумя пластиковыми хомутами закрепил троссики стояночного тормоза. Не обращая внимание на возражения владельца машины что "Он ещё не все неисправности мне описал", отправил его на обкатку. Через пять минут вернулся клиент, ещё более удивлённый, чем до этого был я. Конечно его первый вопрос "А что было то???". А быто просто то, что пластиковые клипсы крепления двух троссов стояночного тормоза к балкам кузова развалились и троссы стучали по кузову, по рычагам. Что касается настоящего времени. Делаю я контактную сварку с управлением по току с помощью n-го кол-ва симисторов, коммутирующих первичку транса. Выбрал для этого китайскую платку с stm32f030f4 rev.A. Ног всего 20, катастрофически нехватает, но 2 я оставил для USART - в дальнейшем хочу прикрутить к сварке еще другие узлы. Программа заливается по stlink через плату stm32vldiscovery. На ней кроме stlink есть stm32f100RB rev.Z. На плате кнопка есть, светодиодиков два, и решил я с неё по USART управлять stm32f030f4 для включения транса просто отправляя байтик. Приборов особых нет, что бы визуализировать передачу на ногу TX USART1 stm32f100RB повесил светодиод, в baud rate register забил 0xFFFF, тактирование APB2 уменьшил на 8 (USART1 сидит на APB2, всё тактируется от HSI 8MHz) и ...... ничего не получил. Даже idle line. Светодиод не засветился. Налетел я на первый косяк с выбором baud rate. Дело в том, что в RM0360 про stm32f030f4, в параграфе про auto baud rate указано минимальное значение для скорости передачи - fCK/65535. Вот я и забил 0xFFFF. После недели плясок с бубном нашёл предельное значение - 0xFFF7. Оно оказалось одинаково для всех чипов которые у меня есть - stm030, stm051, stm100, stm303, stm334. Правда в отличии от stm100 у всех остальных idle line активировалось, но передачи при 0xFFFF не было. Решив этот косяк я напоролся вооще на непонятное мне поведение stm32f100RB в данном коде: movs r10,#0 movs r11,#1 ;Handler mode EXTI0_IRQ_ PROC cpsid i ldr r0,=USART1_DR movs r1,#2_11010111 strh r1,[r0] ldr r0,=GPIOC_BSRR movw r1,#0x200 str r1,[r0] mov32 r2,#0x7A1200 LEDloop subs r2,#1 BNE LEDloop lsl r1,#16 str r1,[r0] ldr r0,=a_EXTI_PR0 str r11,[r0] ;clear interrupt flag in EXTI_PR0 cpsie i BX LR ALIGN ENDP - кнопка на ноге A0 и запускает обработчик внешнего прерывания EXTI0. В нем загорается светодиод, USART1 выталкивает байт, потом цикл считает до 8000000, делая задержку в 3 сек, гаснет светодиод и наконец снимается флаг отложенного прерывания в модуле внешних прерываний и выход из EXTI0. Всё вроде просто, но ! Байт выталкивался дважды! и задержка была 6 сек. Очередные пляски с бубном и, оказывается, что это происходит, когда делитель APB2 больше чем 4. В остальных случаях всё нормально. Тут я встал на путь владелца Черокки, испытал это на разных контроллерах, с прерываниями от разных источников, с разными baud rate, на разных шинах, получил совершенно непохожие результаты и запутался окончательно. Решение было как с пластиковыми хомутами. Подказали мне его на stm community forum, но в какой странной форме "Всем хорошо известно, что необходимо сразу же после входа в обработчик прерывания, стнят флаг этого прерывания в модуле, который его вызвал". Это где же "хорошо известно"??? Я весь референс мануал прчитал и не нашёл "хорошо известных" рекрмендаций!! Ну и напоследок нашёл еще одну ж..у с внешним прерыванием. Необходимо при входе в обработчик не только сразу же снять флаг, но и маскировать это прерывание, иначе, если нет приборной компенсации дребезга контактов, произойдет ложный вызов обработчика, и включить его перед выходом. Вот так: movs r10,#0 movs r11,#1 ;Handler mode EXTI0_IRQ_ PROC cpsid i movs r10,#0 movs r11,#1 ldr r3,=a_EXTI_IMR0 str r10,[r3] ldr r0,=a_EXTI_PR0 str r11,[r0] ;clear interrupt flag in EXTI_PR0 ldr r0,=USART3_DR movs r1,#2_11010111 strh r1,[r0] ldr r0,=GPIOC_BSRR movw r1,#0x200 str r1,[r0] mov32 r2,#0x7A1200 LEDloop subs r2,#1 BNE LEDloop lsl r1,#16 str r1,[r0] str r11,[r3] cpsie i BX LR ALIGN ENDP