Сб июн 17, 2023 17:13:29
...
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();
}
}
...
Сб июн 17, 2023 20:11:15
Сб июн 17, 2023 20:38:43
я бы проверил выключением оптимизатора и собственно отработки прерывания (светодиодиком моргнуть на порту)
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); // <-
}
Error: unable to step rtos hart
Сб июн 17, 2023 21:12:38
Сб июн 17, 2023 22:01:04
void HardFault_Handler(void)
{
while(1)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, 1);
delay_ms(20);
// Delay_Ms(100);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, 0);
delay_ms(20);
// Delay_Ms(100);
}
}
Вс июн 18, 2023 18:47:03
MEMORY
{
APP (rx) : ORIGIN = 0x00000000, LENGTH = 0x0FF00
CREDENTIALS (rx) : ORIGIN = 0x0000FF00, LENGTH = 0x00080
DATA (rwx) : ORIGIN = 0x0000FF80, LENGTH = 0x00080
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
}
USART_ITConfig(DMX_RDM_USART_USED, USART_IT_TC | USART_IT_RXNE | USART_IT_ERR, ENABLE);
DMX_RDM_USART_USED->CTLR1 |= (1<<6); // USART TCIE Transmit completed interrupt
DMX_RDM_USART_USED->CTLR1 |= (1<<5); // USART RXNEIE Receive non empty interrupt
DMX_RDM_USART_USED->CTLR3 |= (1<<0); // USART EIE Error enable interrupt