OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3112|回复: 6

STM32H7串口轮询模式发送出错

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-9-7
在线时间
3 小时
发表于 2019-2-28 18:59:06 | 显示全部楼层 |阅读模式
10金钱
环境: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\r\n";
    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\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,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();
}

最佳答案

查看完整内容[请看2#楼]

可以参考下我们例程
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-2-28 18:59:07 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-9-7
在线时间
3 小时
 楼主| 发表于 2019-2-28 20:06:49 | 显示全部楼层
状况补充:
经测试,HAL_UART_Transmit()函数在TIM更新中断、UART接收中断、EXTI中断中均可正常使用。

情况似乎是,我的某处错误导致了该函数仅可工作在中断中,但怎么会这样……
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17769
金钱
17769
注册时间
2018-3-3
在线时间
523 小时
发表于 2019-2-28 20:21:23 | 显示全部楼层
这么刚。。仿真能看具体死在哪里了吗
/*
*
*
*
*
*
*/
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-9-7
在线时间
3 小时
 楼主| 发表于 2019-2-28 20:43:26 | 显示全部楼层
Psheng 发表于 2019-2-28 20:21
这么刚。。仿真能看具体死在哪里了吗

step into调试的话,不能重现错误。没有死循环,没有跑飞,而且串口能正常输出。
step out调试或全速运行的话,会出现错误。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-9-7
在线时间
3 小时
 楼主| 发表于 2019-2-28 20:50:56 | 显示全部楼层
在错误状态下,查询UART句柄,得到了如下结果:
2019-02-28_204948.jpg
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-9-7
在线时间
3 小时
 楼主| 发表于 2019-2-28 20:54:57 | 显示全部楼层
TxXferCount成员总停在7,但我只能收到一个字符。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 18:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表