Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Записал сброс флага в начало. Работает, но непойму почему так !
Прерывание вызывается. В нём сбрасывается флаг и продолжается выполнение обработчика прерывания. В этот момент это же прерывание вызывается ещё раз ! И что дальше ?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
When I cleared the interrupt as the last instruction in the ISR, the ISR code is called immediately upon exit half the time. Is there a possibility of race condition ?
FAQ Answer The core (Cortex-M3) generates bufferable write transfer. This mean that the CPU consider that the data is written from an AHB point of view while the APB write transfer is managed by the AHB2APB bridge and could be written later. In this case the CPU left the interrupt routine while the interrupt is not yet cleared the cpu will re-enter again on the interrupt handler. To avoid this race condition : 1) ISR routine has to clear the interrupt peripheral flag when just entering in the routine to avoid interrupt missing. 2)ISR routine has to Implement a write to the APB peripheral register ( to clear the peripheral flag) then followed by a read access to the same register/flag. This operation will force the write buffer to complete the effective write and will stall the CPU until the effective write of the bit in the register. Therefore it is independent from the AHB/APB ratio prescaler. Here an example : STR R1, [R0, #0] ; Store R1 register peripheral register ( or using bit-banding peripheral address) LDR R2, [R0, #0] ; Load the peipheral register; This will hold the CPU until the effective write of R1. Use Cortex-M3 Bit-banding feature for interrupt clearing since it is an atomic operation and NVIC pending interrupts will be ignored during this operation, however Read-Modify-Write is not.
Пытаюсь сделать как написано, но выдаёт: Error[Og005]: Unknown symbol in inline assembly: "EXTI_BASE" Error[Og005]: Unknown symbol in inline assembly: "EXTI_PR_PR0" Error[Og005]: Unknown symbol in inline assembly: "EXTI_PR_OFFSET"
Код:
// сбросим флаг прерывания (иначе никогда из него не выйдем asm ("LDR R0, =EXTI_BASE");
Пока не проверял, но думаю достаточно сделать так:
Код:
void EXTI0_IRQHandler (void) {
// очистка флага прерывания EXTI->PR |= EXTI_PR_PR0; EXTI->PR;
power_button ++;
}
Второй раз обращение к EXTI->PR чтобы инициировать буферизированную запись. Компилятор обязан вставить чтение EXTI->PR так как регистр volatile и в итоге в ассемблере должно получиться то что надо. Попробовал, получилось следующее (у меня EXTI_Line1):
Эта операция не лишняя, по крайней мере в FAQ написано чтобы инициировать отложенную буферизированную запись, надо прочитать регистр. И еще операция |= лишняя, регистр PR доступен только для чтения, запись единицы вызывает сброс флага, так что достаточно EXTI->PR = EXTI_PR_PR0;.
Эта операция не лишняя, по крайней мере в FAQ написано чтобы инициировать отложенную буферизированную запись, надо прочитать регистр.
В общем... там задержки в любом виде хватит... Вот пример из SPL... и не заморачиваются...
Код:
/** * @brief This function handles External line 0 interrupt request. * @param None * @retval None */ void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { /* Toggle LED1 */ STM_EVAL_LEDToggle(LED1);
/* Clear the EXTI line 0 pending bit */ EXTI_ClearITPendingBit(EXTI_Line0); } }
А так... при кодинге думку нужно включать... сбрасывать флаг сразу или в конце... это уже по задаче... И что толку считать такты, если оно уже не работает или потом случайно может глюкануть...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения