Argon (25.08.2014 13:39 - 13:43, просмотров: 10889)
пытаюсь принимать сообщения 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);
}
}