该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
环境:STM32H743II,HAL库,IAR编译。
错误描述:使用HAL_UART_Transmit()函数在主函数中发送数据,程序在此处卡死,上位机只能接收到第一个字符。但配置EXTI中断后,在中断回调函数中使用HAL_UART_Transmit()函数,程序能正常执行,且上位机能接收到完整数据。使用单步调试无法重现错误。
//串口初始化
void USER_UART1_Init()
{
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.Parity=UART_PARITY_NONE;
UART1_Handler.Init.StopBits=UART_STOPBITS_1;
UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;
HAL_UART_Init(&UART1_Handler);
HAL_UART_Receive_IT(&UART1_Handler,&UART_Message_RCV,1);
}
//串口MSP
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1){
__HAL_RCC_USART1_CLK_ENABLE();
__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);
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_NVIC_SetPriority(USART1_IRQn,3,3);
}
}
//主函数
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\r\n";
HAL_UART_Transmit(&UART1_Handler,transmite_buffer,9,100); //若注解此行,程序能正常执行,且进入中断后,串口能正常发送。若不注解此行,串口仅发送字符"s",程序卡死。
USER_LED_Enable(USER_LED_1);
while(1);
}
//中断回调函数,串口在此函数中工作正常
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
uint8_t transmite_buffer[]="sending\r\n";
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,9,100)
}