本帖最后由 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);
- }
结果,无输出,示波器接上也没有反应,想了好几天了,也没想明白
|