发新帖本帖赏金 20.00元(功能说明)我要提问
123下一页
返回列表
打印
[STM32L0]

hal库uart无输出 悬赏20元求解

[复制链接]
2523|54
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gsy幸运 于 2023-8-31 06:30 编辑

单片机:STM32L031G6U6
UART1:PA2 TX     PA3 RX
电路:TX直接输出
问题:TX无输出,测试输出高低电平正常
代码:
1、时钟初始化,系统时钟使用MSI,UART使用HSI
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
__HAL_RCC_LSE_CONFIG(RCC_LSE_OFF);
                        /**Configure the main internal regulator output voltage
                        */
                __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

                        /**Initializes the CPU, AHB and APB busses clocks
                        */
        //RCC_MSIRANGE_4MSI 时钟被用作系统时钟。从复位重启后,MSI 频率被置位其默认值 4 MHz
                RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
          RCC_OscInitStruct.HSIState = RCC_HSI_DIV4;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
                RCC_OscInitStruct.MSIState = RCC_MSI_ON;// **MSI时钟(100KHz-48MHz多速内部RC振荡器时钟)
                RCC_OscInitStruct.MSICalibrationValue = 0;
                RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;////配置为 MSI = 1.048 MHz
                RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
                if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
                {
                        _Error_Handler(__FILE__, __LINE__);
                }

                        /**Initializes the CPU, AHB and APB busses clocks
                        */
                //需要配置的时钟HCLK(APB1/APB2总线时钟源)、SYSCLK(系统时钟源)、PCLK1(APB1上外设时钟源)、PCLK2(APB2上外设时钟源)
                RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                                                                                                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
                RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;//配置系统时钟为MSI输入
                RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;//// AHB时钟为系统时钟1分频,1.048 MHz/1 =1.048 MHz
                RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;//APB1时钟为系统时钟1分频,1.048 MHz/1 =1.048 MHz
                RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;//APB2时钟为系统时钟1分频,1.048 MHz/1 =1.048 MHz

                if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
                {
                        _Error_Handler(__FILE__, __LINE__);
                }

                        /**Configure the Systick interrupt time
                        */
                /// 配置系统定时器中断时间,配置为HCLK的千分频
                HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

                        /**Configure the Systick
                        */
                // 配置系统定时器中断时间,配置为HCLK的千分频
                HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    // 配置系统定时器中断时间,配置为HCLK的千分频
                /* SysTick_IRQn interrupt configuration */
                HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
               
                PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;
                PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_HSI;
                if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
                {
                        Error_Handler();
                }
}

2、GPIO初始化:
#define UartTx_Pin             GPIO_PIN_2        //
#define UartTx_GPIO_Port                    GPIOA

#define UartRx_Pin             GPIO_PIN_3        //
#define UartRx_GPIO_Port                    GPIOA
GPIO_InitStruct.Pin = UartTx_Pin;                   //uart TX
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(UartTx_GPIO_Port, &GPIO_InitStruct);
3、uart初始化
static void MX_LPUART1_UART_Init(void)
{

  /* USER CODE BEGIN LPUART1_Init 0 */

  /* USER CODE END LPUART1_Init 0 */

  /* USER CODE BEGIN LPUART1_Init 1 */

  /* USER CODE END LPUART1_Init 1 */
  hlpuart1.Instance = LPUART1;
  hlpuart1.Init.BaudRate = 2400;
  hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
  hlpuart1.Init.StopBits = UART_STOPBITS_1;
  hlpuart1.Init.Parity = UART_PARITY_NONE;
  hlpuart1.Init.Mode = UART_MODE_TX_RX;
  hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT|UART_ADVFEATURE_RXINVERT_INIT;
  hlpuart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
  hlpuart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  if (HAL_UART_Init(&hlpuart1) != HAL_OK)
  {
    Error_Handler();
  }
}
4、main函数调用初始化代码
  SystemClock_Config();
                MX_GPIO_Init();
                MX_LPUART1_UART_Init();
5、主程序1S输出一次
   if(HAL_GetTick()%1000 == 0)
                        {
                                //printf("hello world");
                                uint8_t TxData[10]= "01234abcde";
                                HAL_UART_Transmit(&hlpuart1,TxData,10,0xffff);
                                //HAL_UART_Transmit_IT(&hlpuart1,TxData,10);
                        }


结果,无输出,示波器接上也没有反应,想了好几天了,也没想明白



使用特权

评论回复
沙发
zhuotuzi| | 2023-8-31 11:01 | 只看该作者
换cubeMX配置试试,我一次就搞定了。

使用特权

评论回复
板凳
gsy幸运|  楼主 | 2023-8-31 11:14 | 只看该作者
zhuotuzi 发表于 2023-8-31 11:01
换cubeMX配置试试,我一次就搞定了。

我这个就是用cubemx配置的,注释是我自己加的

使用特权

评论回复
地板
gsy幸运|  楼主 | 2023-8-31 11:14 | 只看该作者
zhuotuzi 发表于 2023-8-31 11:01
换cubeMX配置试试,我一次就搞定了。

你也用一样的mcu吗

使用特权

评论回复
5
香水城| | 2023-8-31 12:01 | 只看该作者
你现在用的是 LPUART1,而不是USART1;

你LPUART1的时钟选择HSI 16MHz,波特率是配置不了2400的,除非你选择LSE作为LPUART的时钟。这个地方显然你不是用CubeMx配置的;

使用特权

评论回复
6
gsy幸运|  楼主 | 2023-8-31 13:46 | 只看该作者
香水城 发表于 2023-8-31 12:01
你现在用的是 LPUART1,而不是USART1;

你LPUART1的时钟选择HSI 16MHz,波特率是配置不了2400的,除非你选择 ...

我又打开了cubemx发现配置的就是2400啊并没有报错



使用特权

评论回复
7
sheltonyu| | 2023-8-31 13:52 | 只看该作者
外设GPIO初始化要用复用模式。GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;改为GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;并且对应配置AF_NUM。

使用特权

评论回复

打赏榜单

gsy幸运 打赏了 10.00 元 2023-08-31
理由:正解一半

评论
gsy幸运 2023-8-31 22:26 回复TA
楼下和您平分赏金 
8
gyh974| | 2023-8-31 14:40 | 只看该作者
像这种低功耗芯片,各外设默认是没有开启的,你要自己ENABLE一下

使用特权

评论回复

打赏榜单

gsy幸运 打赏了 10.00 元 2023-08-31
理由:回答正确,串口外设时钟确实没开

9
ayb_ice| | 2023-8-31 15:17 | 只看该作者
GPIO配置错了,应该配置为外设口

使用特权

评论回复
10
dvacos| | 2023-8-31 16:28 | 只看该作者
本帖最后由 dvacos 于 2023-8-31 16:30 编辑

LPUART 和 USART是不一样的东西!!
LPUART 是USB 模拟串口,连接到电脑后,电脑会挂载一个串口,直接可以接数据,不用通过串口转USB模块。


USART 和 UART 是需要接串口转USB模块,电脑才能接收到数据的1

使用特权

评论回复
11
dami| | 2023-8-31 16:35 | 只看该作者
本帖最后由 dami 于 2023-8-31 16:36 编辑
sheltonyu 发表于 2023-8-31 13:52
外设GPIO初始化要用复用模式。GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;改为GPIO_InitStruct.Mode = GP ...

是啊io口要配置成串口用的。 直接可以配置。

使用特权

评论回复
12
香水城| | 2023-8-31 17:55 | 只看该作者
gsy幸运 发表于 2023-8-31 13:46
我又打开了cubemx发现配置的就是2400啊并没有报错

哦 你现在给LPUART的时钟 是HSI 4分频了。这个应该可以。 再检查下其它吧。

使用特权

评论回复
13
wangpe| | 2023-8-31 19:25 | 只看该作者
cubemx配置也不行?

使用特权

评论回复
14
gsy幸运|  楼主 | 2023-8-31 22:26 | 只看该作者
gyh974 发表于 2023-8-31 14:40
像这种低功耗芯片,各外设默认是没有开启的,你要自己ENABLE一下

楼上和您平分赏金

使用特权

评论回复
15
Stahan| | 2023-9-2 22:21 | 只看该作者
原来是这样啊

使用特权

评论回复
16
香水城| | 2023-9-3 22:05 | 只看该作者
奇怪!
你既然使用CubeMx配置,用到的外设基于图形界面配置了的话,其时钟在创建工程时应该就开启了的,一般无须手动来单独开启。

使用特权

评论回复
17
Jacquetry| | 2023-9-4 21:00 | 只看该作者
波特率问题吗?

使用特权

评论回复
18
jkl21| | 2023-9-5 10:41 | 只看该作者
检查你的初始化UART的代码,以及你在UART发送数据时的代码。这些代码段应该使用HAL库的API正确地配置和管理UART。

使用特权

评论回复
19
mmbs| | 2023-9-5 11:29 | 只看该作者
如果你的设备没有正确地接收你发送的数据,可能是因为波特率不匹配。

使用特权

评论回复
20
10299823| | 2023-9-5 12:39 | 只看该作者
打开串口设置波特率等参数后,再发送数据。

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

37

帖子

3

粉丝