Stm32 HAL_UART_传输:只发送几个字节

Stm32 HAL_UART_传输:只发送几个字节,stm32,uart,xbee,hal,Stm32,Uart,Xbee,Hal,我的STM32F407与FreeRTOS有问题。 到目前为止,发送到xbee模块的大多数消息都已发送。只有在某些情况下(5到60分钟后),发送过程才会中断 在调试会话中,我可以看到,在2个字节(约40个字节)之后,txei不再设置。UART_HandletTypeDef的TxXferCount也是42(TxXferSize:44)。 SR寄存器中的标志TXE已设置,但CR1寄存器中的标志TXIE未设置 ISR激活2次,以将其存储到数据/移位寄存器中。这我可以在逻辑分析仪上看到。 但我不知道写作任

我的STM32F407与FreeRTOS有问题。 到目前为止,发送到xbee模块的大多数消息都已发送。只有在某些情况下(5到60分钟后),发送过程才会中断

在调试会话中,我可以看到,在2个字节(约40个字节)之后,txei不再设置。UART_HandletTypeDef的TxXferCount也是42(TxXferSize:44)。 SR寄存器中的标志TXE已设置,但CR1寄存器中的标志TXIE未设置

ISR激活2次,以将其存储到数据/移位寄存器中。这我可以在逻辑分析仪上看到。 但我不知道写作任务/isr的来源

Xbee模块获取消息并发送响应消息。 谢谢你的回复

初始化:

GPIO_InitTypeDef GPIO_InitStruct;

__GPIOA_CLK_ENABLE();
__GPIOD_CLK_ENABLE();
__GPIOF_CLK_ENABLE();


/* RX-TX PIN */
GPIO_InitStruct.Pin = XBEE1_TX_PIN | XBEE1_RX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(XBEE1_TX_PORT, &GPIO_InitStruct);

/* Power*/
GPIO_InitStruct.Pin =  XBEE1_PWR_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(XBEE1_PWR_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(XBEE1_PWR_PORT, XBEE1_PWR_PIN, GPIO_PIN_SET);

/* Reset PIN */
GPIO_InitStruct.Pin = XBEE1_RESET_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(XBEE1_RESET_PORT, &GPIO_InitStruct);

/* SLEEP_RQ PIN */
GPIO_InitStruct.Pin = XBEE1_SLEEP_RQ_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(XBEE1_SLEEP_RQ_PORT, &GPIO_InitStruct);



__USART2_CLK_ENABLE();

uart.Instance = USART2;
uart.Init.BaudRate = baud;
uart.Init.WordLength = UART_WORDLENGTH_8B;
uart.Init.StopBits = UART_STOPBITS_1;
uart.Init.Parity = UART_PARITY_NONE;
uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
uart.Init.Mode = UART_MODE_TX_RX;

if (HAL_UART_Init(&uart) != HAL_OK) {
    Error_Handler(XBEE1_ERROR);
}

//clear pending IRQs
__HAL_UART_CLEAR_FLAG(&uart, UART_FLAG_RXNE);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_TC);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_ORE);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_PE);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_FE);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_NE);
__HAL_UART_CLEAR_FLAG(&uart, USART_FLAG_TXE);

/* NVIC */
HAL_NVIC_SetPriority(USART2_IRQn, 6, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
传输

HAL_StatusTypeDef UART_Xbee1::send( uint8_t* pdata, size_t sz ) {
    return HAL_UART_Transmit_IT(&uart, pdata, sz);
}
ISR

extern“C”void USART2\u IRQHandler(void){
testpin1.on();
UART_HandleTypeDef*UART_c=&(Argos::xbee1->UART);
uint32_t tmp1=0;
uint32_t tmp2=0;
tmp1=uuuuHAl\uUART\uGET\u标志(UART\uC,UART\uFLAG\uRxNE);
tmp2=uuuuHAl_UART_GET_IT_SOURCE(UART_c,UART_IT_RXNE);
如果((tmp1!=重置)和&(tmp2!=重置)){
uint8_t in=(uint8_t)(uart_c->Instance->DR&(uint8_t)0x00FF);
*uart_c->pRxBuffPtr++=in;
//当已知数据包大小时,覆盖预期字节
如果(xbee1->inApiRecMode){
如果((uart\U c->RxXferSize-uart\U c->RxXferCount)==1){
xbee1->apiSize=0;
xbee1->apiSize=在RxXferSize-uart_c->RxXferCount中==2){
xbee1->apiSize |=英寸;
uart_c->RxXferCount=xbee1->apiSize+2;
}
}
如果((uart_c->RxXferCount)-1)=0){
(uart_c->RxXferCount)--;
__HAL_UART_禁用它(UART_c,UART_IT_RXNE);
/*检查传输过程是否正在进行*/
如果(uart\U c->State==HAL\U uart\U State\U BUSY\U TX\U RX){
uart\U c->State=HAL\u uart\u State\u BUSY\u TX;
}否则{
/*禁用UART奇偶校验错误中断*/
__HAL_UART_禁用_IT(UART_c,UART_IT_PE);
/*禁用UART错误中断:(帧错误、噪声错误、溢出错误)*/
__HAL_UART_禁用它(UART_c,UART_IT_ERR);
uart\u c->State=HAL\u uart\u State\u READY;
}
消息*msg=&(xbee1->msg\u回调);
msg->code=(uint8_t)XbeeContext::MessageType::RECEIVE_事件;
msg->value=0;
xbee1->rcvCallback->sendMsg(msg);
}如果((uart_c->RxXferCount)==0,则为else{
错误处理程序(XBEE1错误);
}否则{
(uart_c->RxXferCount)--;
}
}否则{
//其他情况
HAL_UART_IRQHandler(UART_c);
}
testpin1.off();
}

此isr处理程序代码来自何处? 它看起来与stm32f4 HAL 1.8中的内容没有任何相似之处

如果您使用hal,最好只链接您的irq处理程序 定义对托管错误和完成的回调

HAL_UART_TxCpltCallback HAL_UART_RxCpltCallback
HAL_UART_ErrorCallback

我们必须使用这种方式,因为在第三个输入字节之前,输入是未知的。但我们解决了这个问题:Task1正在对RX缓冲区执行一个memset。该线程将被1ms调度程序中断。Task2也对同一RX缓冲区执行一个memset。然后RX缓冲区后的一些变量将被覆盖。
extern "C" void USART2_IRQHandler(void){
    testpin1.on();
    UART_HandleTypeDef* uart_c = &(Argos::xbee1->uart);
    uint32_t tmp1 = 0;
    uint32_t tmp2 = 0;
    tmp1 = __HAL_UART_GET_FLAG(uart_c, UART_FLAG_RXNE);
    tmp2 = __HAL_UART_GET_IT_SOURCE(uart_c, UART_IT_RXNE);
    if((tmp1 != RESET) && (tmp2 != RESET)){
        uint8_t in = (uint8_t)(uart_c->Instance->DR & (uint8_t)0x00FF);
        *uart_c->pRxBuffPtr++ = in;

        //overwrite expected bytes, when packet size is known
        if(xbee1->inApiRecMode){
            if( (uart_c->RxXferSize-uart_c->RxXferCount) == 1 ){
                xbee1->apiSize = 0;
                xbee1->apiSize = in << 8;
            }else if( (uart_c->RxXferSize-uart_c->RxXferCount) == 2 ){
                xbee1->apiSize |= in;
                uart_c->RxXferCount = xbee1->apiSize + 2;
            }
        }

        if( ((uart_c->RxXferCount)-1) == 0){
            (uart_c->RxXferCount)--;
              __HAL_UART_DISABLE_IT(uart_c, UART_IT_RXNE);

              /* Check if a transmit process is ongoing or not */
              if(uart_c->State == HAL_UART_STATE_BUSY_TX_RX){
                  uart_c->State   = HAL_UART_STATE_BUSY_TX;
              }else{
                /* Disable the UART Parity Error Interrupt */
                __HAL_UART_DISABLE_IT(uart_c, UART_IT_PE);

                /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
                __HAL_UART_DISABLE_IT(uart_c, UART_IT_ERR);

                uart_c->State = HAL_UART_STATE_READY;
              }

              Message* msg = &(xbee1->msg_callBack);
              msg->code = (uint8_t) XbeeContext::MessageType::RECEIVE_EVENT;
              msg->value = 0;
              xbee1->rcvCallback->sendMsg(msg);
            }else if( (uart_c->RxXferCount) == 0){
                Error_Handler(XBEE1_ERROR);
            }else{
                (uart_c->RxXferCount)--;
            }
    }else{

        //other cases
        HAL_UART_IRQHandler( uart_c );
    }
    testpin1.off();
}