ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
541853
Argon (25.08.2014 13:39 - 13:43, просмотров: 10553)
пытаюсь принимать сообщения CAN в STM32 с помощью STD_Peripheral_Library через прерывание CAN_IT_FMP0. Оно как бы работает, но  работает только если CAN_Receive находится в теле прерывания. Если в теле флаг выставлять, а потом в осн. цикле ловить флаг и там CAN_Receive вызывать, то программа висит в бесконечных прерываниях. Сброс флагов прерываний не дает результата. Внутри CAN_Receive особо ничего нет - перепись данных в буфер + очистка FIFO. В чем мое непонимание? т.е. вот так работает (причем без всяких проверок флагов и их сброса) void main(void) { ... CAN1RX_Msg_Ready.wait(); //Здесь уже имеем данные ... } void CAN1_RX0_IRQHandler(void) { CAN_Receive(CAN1, CAN_FIFO0, &CAN1_RxMessage); } а вот так не работает void main(void) { ... CAN1RX_Msg_Ready.wait(); CAN_Receive(CAN1, CAN_FIFO0, &CAN1_RxMessage); ... } void CAN1_RX0_IRQHandler(void) { if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0); CAN1RX_Msg_Ready.signal_isr(); } if(CAN_GetITStatus(CAN1, CAN_IT_FF0) == SET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FF0); } if(CAN_GetITStatus(CAN1, CAN_IT_FOV0) == SET) { CAN_ClearITPendingBit(CAN1, CAN_IT_FOV0); } }