硬汉嵌入式论坛

 找回密码
 立即注册
查看: 875|回复: 3
收起左侧

[UART] STM32H7 串口发送问题,1.9的HAL 移植串口例程,串口没输出程序会跑一会儿会卡死

[复制链接]

14

主题

34

回帖

76

积分

初级会员

积分
76
发表于 2021-12-31 00:04:23 | 显示全部楼层 |阅读模式
移植硬汉的串口例程,STM32H7 串口发送无输出问题,1.9的HAL初始化后, 移植硬汉串口例程,串口没输出程序会跑一会儿会卡死
现象,串口无输出printf,RTT printf有输出,运行一会儿会导致程序卡死,表现为按键无反应,RTT printf也会卡死掉,按键什么都没反应。
按照H7 MX 1.9版本自动生成的初始化配置,串口打印正常。跟踪程序卡死在如截图位置,是啥问题头大,之前F407移植也卡在串口这里.
主函数
int main(void)
{
  /* USER CODE BEGIN 1 */
        uint8_t ucKeyCode;                /* 按键代码 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  //HAL_Init();

  /* USER CODE BEGIN Init */
        button_init(&btn1, read_button1_GPIO, 0);
  /* USER CODE END Init */

  /* Configure the system clock */
  //SystemClock_Config();

  /* USER CODE BEGIN SysInit */
        bsp_Init();
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  //MX_USART1_UART_Init();
  //MX_ADC3_Init();
  //MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
        bsp_StartAutoTimer(0, 300);         /* 启动1个100ms的自动重装的定时器,软件定时器0 */
        bsp_StartAutoTimer(1, 1000);         /* 启动1个100ms的自动重装的定时器,软件定时器1 */
       
        printf("\r\n This is a STM32H743VI DEMO Test! \r\n");
        SEGGER_RTT_printf(0,"This is a STM32H743VI DEMO Test!\r\n");
       
        button_attach(&btn1, PRESS_DOWN,       button_callback);
        button_attach(&btn1, PRESS_UP,         button_callback);
        button_attach(&btn1, PRESS_REPEAT,     button_callback);
        button_attach(&btn1, SINGLE_CLICK,     button_callback);
        button_attach(&btn1, DOUBLE_CLICK,     button_callback);
        button_attach(&btn1, LONG_RRESS_START, button_callback);
        button_attach(&btn1, LONG_PRESS_HOLD,  button_callback);
       
        button_start(&btn1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                if (bsp_CheckTimer(1))       
                {
                        /* 每隔1000ms 进来一次 */  
                        bsp_LedToggle(1);
                        SEGGER_RTT_printf(0, "bsp_CheckTimer(1)** SEGGER RTT **\r\n");
                        printf("\r\n This is a STM32H743VI DEMO Test! \r\n");       
                        comSendChar(COM1, 'A');                       
                }
                                /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
                ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
                if (ucKeyCode != KEY_NONE)
                {
                        switch (ucKeyCode)
                        {
                                case KEY_DOWN_K1:                       
                                        printf("KEY_DOWN_K1\r\n");
                                        SEGGER_RTT_printf(0,"KEY_DOWN_K1\r\n");
                                        break;

                                case KEY_UP_K1:                               
                                        printf("KEY_UP_K1---\r\n");
                                        SEGGER_RTT_printf(0,"KEY_UP_K1\r\n");
                                        break;
                               
                                case KEY_LONG_DOWN_K1:                       
                                        printf("KEY_LONG_DOWN_K1\r\n");
                                        SEGGER_RTT_printf(0,"KEY_LONG_DOWN_K1\r\n");
                                        break;

                                case KEY_LONG_UP_K1:                               
                                        printf("KEY_LONG_UP_K1\r\n");
                                        SEGGER_RTT_printf(0,"KEY_LONG_UP_K1\r\n");
                                        break;

                                case KEY_AUTO_K1:                               
                                        printf("KEY_AUTO_K1\r\n");
                                        SEGGER_RTT_printf(0,"KEY_AUTO_K1\r\n");
                                        break;
                               
                                case KEY_DB_K1:                               
                                        printf("KEY_DB_K1***\r\n");
                                        SEGGER_RTT_printf(0,"KEY_DB_K1\r\n");
                                        break;

                                default:
                                        /* 其它的键值不处理 */
                                        break;
                        }
                }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


串口初始化函数
static void InitHardUart(void)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
       
        /*
       下面这个配置可以注释掉,预留下来是为了方便以后选择其它时钟使用
       默认情况下,USART1和USART6选择的PCLK2,时钟100MHz。
       USART2,USART3,UART4,UART5,UART6,UART7和UART8选择的时钟是PLCK1,时钟100MHz。
    */
        RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
        RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
        HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);       

#if UART1_FIFO_EN == 1                /* 串口1 */
        /* 使能 GPIO TX/RX 时钟 */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();       

        GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
               
        HAL_GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStruct);

        /* 配置NVIC the NVIC for UART */   
        HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART1_IRQn);

        /* 配置波特率、奇偶校验 */
        bsp_SetUartParam(USART1,  UART1_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);

        SET_BIT(USART1->ICR, USART_ICR_TCCF);        /* 清除TC发送完成标志 */
        SET_BIT(USART1->RQR, USART_RQR_RXFRQ);  /* 清除RXNE接收标志 */
        // USART_CR1_PEIE | USART_CR1_RXNEIE
        SET_BIT(USART1->CR1, USART_CR1_RXNEIE);        /* 使能PE. RX接受中断 */
#endif



void bsp_SetUartParam(USART_TypeDef *Instance,  uint32_t BaudRate, uint32_t Parity, uint32_t Mode)
{
        UART_HandleTypeDef huart1;       
       
        /*##-1- 配置串口硬件参数 ######################################*/
        /* 异步串口模式 (UART Mode) */
        /* 配置如下:
          - 字长    = 8 位
          - 停止位  = 1 个停止位
          - 校验    = 参数Parity
          - 波特率  = 参数BaudRate
          - 硬件流控制关闭 (RTS and CTS signals) */

        huart1.Instance        = Instance;

        huart1.Init.BaudRate   = BaudRate;
        huart1.Init.WordLength = UART_WORDLENGTH_8B;
        huart1.Init.StopBits   = UART_STOPBITS_1;
        huart1.Init.Parity     = Parity;
        huart1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
        huart1.Init.Mode       = Mode;
        huart1.Init.OverSampling = UART_OVERSAMPLING_16;
        huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        huart1.Init.Mode = UART_FIFOMODE_DISABLE;
        huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    ERROR_HANDLER();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    ERROR_HANDLER();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    ERROR_HANDLER();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    ERROR_HANDLER();
  }
}


GPIO 配置
#include "bsp.h"

/* 串口1的GPIO  PB14, PB15   RS323 DB9接口 */
#define USART1_CLK_ENABLE()              __HAL_RCC_USART1_CLK_ENABLE()

#define USART1_TX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART1_TX_GPIO_PORT              GPIOB
#define USART1_TX_PIN                    GPIO_PIN_14
#define USART1_TX_AF                     GPIO_AF4_USART1

#define USART1_RX_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART1_RX_GPIO_PORT              GPIOB
#define USART1_RX_PIN                    GPIO_PIN_15
#define USART1_RX_AF                     GPIO_AF4_USART1

动画.gif
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2021-12-31 08:57:04 | 显示全部楼层
  UART_HandleTypeDef huart1;      要修改为   UART_HandleTypeDef huart1 = {0};      

别的看不出来什么问题了。
回复

使用道具 举报

2

主题

62

回帖

68

积分

初级会员

积分
68
发表于 2022-1-4 08:56:32 | 显示全部楼层
把对应的UART 状态 以及 控制 寄存器调出来对应手册进行分析吧  
回复

使用道具 举报

610

主题

3061

回帖

4911

积分

至尊会员

积分
4911
发表于 2022-1-4 09:44:35 | 显示全部楼层
把 动画里面的 1125, 1127 行 开关中断屏蔽试试看,貌似有时频繁的开关中断也是会卡死的
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 01:26 , Processed in 0.225829 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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