Пытаюсь сделать прошивку для приема и обработки DMX посылок, а также обработку RDM-команд.
Адаптировал библиотеку под CH32V, пытаюсь отловить баги с помощью wch-linke.
Замечаю, что некоторые точки останова отладчик пропускает, что бы я ни делал: перекомпиляция проекта, перезаливка, установка/снятие наживую, перезапуск mounriver studio - ничего из этого не помогало. И есть подозрение, что CH32V пропускает некоторые из команд.
Прошу помощи
Код под спойлером
Спойлер
main.cКод: Выделить всё
...
void dmx_rdm_usart_enable_tx_interrupts() {
USART2->STATR = 0x00C0;
USART_ITConfig(DMX_RDM_USART_USED, USART_IT_TC, ENABLE);
}
// Вот эту функцию вызывает и точка останова работает
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 dmx_rdm_usart_disable_rx_interrupts() {
USART2->STATR = 0x00C0;
USART_ITConfig(DMX_RDM_USART_USED, USART_IT_RXNE | USART_IT_FE, DISABLE);
}
...
set_disable_usart_tx_interrupts_cb(dmx_rdm_usart_disable_tx_interrupts);
set_disable_usart_rx_interrupts_cb(dmx_rdm_usart_disable_rx_interrupts);
set_enable_usart_tx_interrupts_cb(dmx_rdm_usart_enable_tx_interrupts);
set_enable_usart_rx_interrupts_cb(dmx_rdm_usart_enable_rx_interrupts);
set_enable_usart_cb(DMX2PWM_RS485_Enable);
set_disable_usart_cb(DMX2PWM_RS485_Disable);
set_save_dmx_start_address_cb((void *)dmx_rdm_save_device_label);
set_save_device_label_cb((void *)dmx_rdm_save_dmx_start_address);
DMX2PWM_RS485_Interrupts_Init();
dmx_rdm_init(&rdmInit, processCommand, NULL, DMX_RDM_USART_USED, DMX_RDM_DIRECTION_GPIO_PORT, DMX_RDM_DIRECTION_GPIO_PIN, 0, 1);
...
Код: Выделить всё
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 defined(DMX_USART1)
void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
#elif defined(DMX_USART2)
void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
#elif defined(DMX_USART3)
void USART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
#endif
...
#ifdef DMX_USART1
void USART1_IRQHandler(void)
#elif defined(DMX_USART2)
void USART2_IRQHandler(void)
#elif defined(DMX_USART3)
void USART3_IRQHandler(void)
#endif
{
if(USART_GetITStatus(DMX_RDM_USART_USED, USART_IT_RXNE | USART_IT_FE) != RESET)
{
dmx_rdm_on_usart_rx_interrupt();
symbols++;
}
if (USART_GetITStatus(DMX_RDM_USART_USED, USART_IT_TC) != RESET) {
dmx_rdm_on_usart_tx_interrupt();
}
}
...
Заметил такое явление, что в MounRiver есть глюк, когда точка останова становится "фальшивой", то есть, если до начала отладки выставлять точку останова, то она показывается как бы сдвоенной, и если "убрать", то остается одиночная точка, как будто она выставлена, но в процессе отладки там нет галочки, и точка не отрабатывает


