STM32H7串口轮询模式发送出错

2019-07-20 03:36发布

环境:STM32H743II,阿波罗开发板,IAR编译。
错误描述:使用HAL_UART_Transmit()函数在主函数中发送数据,程序在此处卡死,上位机只能接收到第一个字符。但配置EXTI中断后,在中断回调函数中使用HAL_UART_Transmit()函数,程序能正常执行,且上位机能接收到完整数据。使用单步调试无法重现错误。

[mw_shl_code=c,true]void USER_UART1_Init()
{
    __HAL_RCC_USART1_CLK_ENABLE();
    UART1_Handler.Instance=USART1;
    UART1_Handler.Init.BaudRate=9600;
    UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;
    UART1_Handler.Init.Mode=UART_MODE_TX_RX;
    UART1_Handler.Init.OverSampling=UART_OVERSAMPLING_16;
    UART1_Handler.Init.Parity=UART_PARITY_NONE;
    UART1_Handler.Init.StopBits=UART_STOPBITS_1;
    UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;
    HAL_UART_Init(&UART1_Handler);
}[/mw_shl_code]

[mw_shl_code=c,true]void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1){
        __HAL_RCC_GPIOA_CLK_ENABLE();
        GPIO_InitTypeDef GPIO_Initure;
        GPIO_Initure.Alternate=GPIO_AF7_USART1;
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;
        GPIO_Initure.Pin=GPIO_PIN_9 | GPIO_PIN_10;
        GPIO_Initure.Pull=GPIO_PULLUP;
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    }
}[/mw_shl_code]

[mw_shl_code=c,true]
int main()
{
    HAL_Init();
    USER_CLOCK_Init();
    USER_CACHE_Enable();
    USER_EXTI_Init();
    USER_UART1_Init();
    USER_LED_Enable(USER_LED_0);
    uint8_t transmite_buffer[]="sending ";
    HAL_UART_Transmit(&UART1_Handler,transmite_buffer,9,100);     //若注解此行,程序能正常执行,且进入中断后,串口能正常发送。若不注解此行,串口仅发送字符"s",程序卡死。
    USER_LED_Enable(USER_LED_1);
    while(1);
}[/mw_shl_code]

[mw_shl_code=c,true]void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    uint8_t transmite_buffer[]="sending ";
    switch(GPIO_Pin){
        case GPIO_PIN_0:     USER_LED_Toggle(USER_LED_0);    USER_LED_Toggle(USER_LED_1);    break;
        case GPIO_PIN_13:    USER_LED_Toggle(USER_LED_0);                                    break;
        case GPIO_PIN_3:    USER_LED_Toggle(USER_LED_1);                                    break;
        default:            HAL_UART_Transmit(&UART1_Handler,transmite_buffer,10,100);
    }
}
[/mw_shl_code]

void USER_CLOCK_Init()
{
    const uint32_t plln=160,pllm=5,pllp=2,pllq=4;
    HAL_StatusTypeDef ret=HAL_OK;
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
    RCC_OscInitTypeDef RCC_OscInitStruct;
  
    MODIFY_REG(PWR->CR3,PWR_CR3_SCUEN, 0);
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}
  
    RCC_OscInitStruct.OscillatorType=RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState=RCC_HSE_ON;
    RCC_OscInitStruct.HSIState=RCC_HSI_OFF;
    RCC_OscInitStruct.CSIState=RCC_CSI_OFF;
    RCC_OscInitStruct.PLL.PLLState=RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource=RCC_PLLSOURCE_HSE;

    RCC_OscInitStruct.PLL.PLLN=plln;
    RCC_OscInitStruct.PLL.PLLM=pllm;
    RCC_OscInitStruct.PLL.PLLP=pllp;
    RCC_OscInitStruct.PLL.PLLQ=pllq;

    RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
    RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
    ret=HAL_RCC_OscConfig(&RCC_OscInitStruct);
    if(ret!=HAL_OK) while(1);
  
    RCC_ClkInitStruct.ClockType=(RCC_CLOCKTYPE_SYSCLK|
                                RCC_CLOCKTYPE_HCLK |
                                RCC_CLOCKTYPE_D1PCLK1 |
                                RCC_CLOCKTYPE_PCLK1 |
                                RCC_CLOCKTYPE_PCLK2 |
                                RCC_CLOCKTYPE_D3PCLK1);

    RCC_ClkInitStruct.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.SYSCLKDivider=RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.AHBCLKDivider=RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB1CLKDivider=RCC_APB1_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider=RCC_APB2_DIV2;
    RCC_ClkInitStruct.APB3CLKDivider=RCC_APB3_DIV2;  
    RCC_ClkInitStruct.APB4CLKDivider=RCC_APB4_DIV4;
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
    if(ret!=HAL_OK) while(1);

    __HAL_RCC_CSI_ENABLE() ;
    __HAL_RCC_SYSCFG_CLK_ENABLE() ;  
    HAL_EnableCompensationCell();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。