环境: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();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
经测试,HAL_UART_Transmit()函数在TIM更新中断、UART接收中断、EXTI中断中均可正常使用。
情况似乎是,我的某处错误导致了该函数仅可工作在中断中,但怎么会这样……
一周热门 更多>