Пытаюсь сделать прошивку для приема и обработки DMX посылок, а также обработку RDM-команд. Адаптировал библиотеку под CH32V, пытаюсь отловить баги с помощью wch-linke. Замечаю, что некоторые точки останова отладчик пропускает, что бы я ни делал: перекомпиляция проекта, перезаливка, установка/снятие наживую, перезапуск mounriver studio - ничего из этого не помогало. И есть подозрение, что CH32V пропускает некоторые из команд.
// Вот эту функцию вызывает и точка останова работает void dmx_rdm_usart_disable_tx_interrupts() { USART2->STATR = 0x00C0; USART_ITConfig(DMX_RDM_USART_USED, USART_IT_TC, DISABLE); }
void dmx_rdm_usart_enable_rx_interrupts() { USART2->STATR = 0x00C0; USART_ITConfig(DMX_RDM_USART_USED, USART_IT_RXNE | USART_IT_FE, ENABLE); // <-- А вот здесь точка останова не работает }
void set_dmx_rdm_mode(uint8_t is_rdm, uint16_t usart_rx_tx_mode) { // In RDM mode set SERIAL_8E1 mode with 45500 baud if (is_rdm == true) { USART_SetBaudRate(_USARTx, BREAKSPEED); USART_SetCommunicationProperties(_USARTx, USART_Mode_Tx, USART_WordLength_8b, USART_StopBits_1, USART_HardwareFlowControl_None, USART_Parity_Even); } // Otherwise set in into SERIAL_8N2 mode with 250000 baud else { USART_SetBaudRate(_USARTx, DMXSPEED); USART_SetCommunicationProperties(_USARTx, USART_Mode_Tx, USART_WordLength_8b, USART_StopBits_2, USART_HardwareFlowControl_None, USART_Parity_No); } }
void set_usart_tx(uint8_t is_rdm) { if (disable_usart) disable_usart(); if (disable_usart_rx_interrupts) disable_usart_rx_interrupts(); if (enable_usart_tx_interrupts) enable_usart_tx_interrupts(); set_dmx_rdm_mode(is_rdm, USART_Mode_Tx); if (enable_usart) enable_usart(); }
void set_usart_rx(uint8_t is_rdm) { if (disable_usart) disable_usart(); if (disable_usart_tx_interrupts) disable_usart_tx_interrupts(); if (enable_usart_rx_interrupts) enable_usart_rx_interrupts(); set_dmx_rdm_mode(is_rdm, USART_Mode_Rx); if (enable_usart) enable_usart(); }
Соответственно, во время приема не вызывается (по крайней мере, не отрабатывает точка останова) в обработчике прерывания
if (USART_GetITStatus(DMX_RDM_USART_USED, USART_IT_TC) != RESET) { dmx_rdm_on_usart_tx_interrupt(); } } ...
Добавлено after 11 minutes 40 seconds: Заметил такое явление, что в MounRiver есть глюк, когда точка останова становится "фальшивой", то есть, если до начала отладки выставлять точку останова, то она показывается как бы сдвоенной, и если "убрать", то остается одиночная точка, как будто она выставлена, но в процессе отладки там нет галочки, и точка не отрабатывает
странно. обычно, среды вопят, если бряк не может быть обработан (выкинут оптимизатором, например) я бы проверил выключением оптимизатора и собственно отработки прерывания (светодиодиком моргнуть на порту) а так-то у них Эклипсе, эта MounRiver ... не в восторге я от нее И вроде, ИАР поддерживает RISC-V WCH?
И тут такая странность: 1) Когда только залил прошивку и перезагрузил, светодиод не моргает даже на приходящие данные 2) Когда начинаю отладку, то светодиод моргает (не HardFault), отладчик проходит по точкам останова 3) Когда завершаю отладку командой Terminate, контроллер сваливается в HardFault, моргает светик быстро, но видимо на глаз Код обработчика HardFault:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения