STM32有关USART的问题

为什么利用串口发送和接受字符串时,会是这样一个过程?

img

下面是相关代码

UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void){
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

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

    HAL_UART_Receive_IT(&huart1, (uint8_t*)receive_buffer, 3);
}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle){
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if(uartHandle->Instance == USART1){
        __HAL_RCC_USART1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        GPIO_InitStruct.Pin = GPIO_PIN_9;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);
    }
}

void USART1_IRQHandler(void){
    HAL_UART_IRQHandler(&huart1);
    HAL_UART_Receive_IT(&huart1, (uint8_t*)receive_buffer, 3);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    if(huart->Instance == USART1){
        uart_flag = 1;
    }
}

int main(void){
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    while (1)
    {
        if(uart_flag == 1){
            HAL_UART_Transmit(&huart1, (uint8_t*)receive_buffer, 3, 10);
            while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != 1);
            num1 = receive_buffer[0] - 48;
            num2 = receive_buffer[2] - 48;
            printf("\n");
            for(int i = 0; i < 10; i++){
                printf("%d ", receive_buffer[i]);
            }
            printf("\n");
            if(receive_buffer[1] == 43){
                printf("result: %d\n", num1 + num2);
            }
            else if(receive_buffer[1] == 45){
                printf("result: %d\n", num1 - num2);
            }
            else if(receive_buffer[1] == 42){
                printf("result: %d\n", num1 * num2);
            }
            else{
                printf("Error!\n");
            }
            uart_flag = 0;
        }
        else{
            HAL_Delay(10);
        }
    }
}

中断服务函数怎么没有呢?这是用软件生成的?

【以下回答由 GPT 生成】

1. STM32 USART发送和接收字符串的过程是怎样的?

在上述代码中,USART1被配置为同时发送和接收数据。发送字符串的过程是,将要发送的字符串放入发送缓冲区(send_buffer),然后使用HAL_UART_Transmit函数发送数据。接收字符串的过程是,当USART1接收到数据时,数据将存储在接收缓冲区(receive_buffer)中。当完成接收的数据长度达到指定长度(在代码中是3)时,将触发USART1接收完成的回调函数HAL_UART_RxCpltCallback。

2. 上述代码中的关键部分解释

2.1 void MX_USART1_UART_Init(void)

该函数用于初始化USART1串口的配置。配置包括波特率、字长、停止位、校验位、工作模式和硬件流控制等。在上述代码中,波特率为115200,字长为8位,停止位为1位,无校验位,工作模式为同时发送和接收数据,无硬件流控制。

2.2 void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)

该函数用于初始化USART1引脚的配置和中断。在上述代码中,首先使能USART1的时钟。然后配置GPIO引脚,将UART的Tx引脚配置为复用推挽输出模式,速度为高频率;将Rx引脚配置为输入模式,上拉模式。接着,设置USART1的中断优先级为0,并使能USART1的中断。

2.3 USART1_IRQHandler()

该函数处理USART1接收中断并重新启动接收过程。在上述代码中,首先调用HAL_UART_IRQHandler函数来处理USART1的中断。然后再次调用HAL_UART_Receive_IT函数来启动接收过程,这样可以连续不断地接收串口数据。

2.4 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

该函数是USART1接收完成时的回调函数。在上述代码中,当USART1接收完成时,将触发此回调函数。在回调函数中,设置uart_flag为1,表示接收完成。

2.5 在main函数中

在main函数中,通过while循环来处理串口数据的发送。当uart_flag等于1时,表示接收完成,可以调用HAL_UART_Transmit函数将send_buffer中的数据发送出去。发送完成之后,将uart_flag重置为0。

修改后的问题:

请参考以下代码来说明发送和接收字符串的过程: - void MX_USART1_UART_Init(void)函数初始化USART1串口的配置。 - void HAL_UART_MspInit(UART_HandleTypeDef uartHandle)函数初始化USART1引脚的配置和中断。 - USART1_IRQHandler()函数处理USART1接收中断并重新启动接收过程。 - HAL_UART_RxCpltCallback(UART_HandleTypeDef huart)函数处理USART1接收完成时的回调。 - 在main函数中,当uart_flag等于1时,调用HAL_UART_Transmit函数发送数据。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^