你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-C031C6】串口输出printf测试

[复制链接]
TLLED 发布时间:2024-3-16 22:48

这篇测试下串口printf输出。

一、串口硬件部分

1.1、MCU串口端口

001.jpg

1.2、串口连接到仿真器

002.jpg

二、代码

使用cubemx软件配置时钟和串口代码

2.1、配置时钟

stm32c031芯片的外接时钟晶振是48MHz,配置时钟选择外部

003.jpg

生成的代码

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
}

2.2、配置串口

004.jpg

在生成的代码上进行修改



void init_usart(uint32_t baudrate)
{
     GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_USART2_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART2 GPIO Configuration
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    g_usart2.Instance = USART2;
  g_usart2.Init.BaudRate = baudrate;
  g_usart2.Init.WordLength = UART_WORDLENGTH_8B;
  g_usart2.Init.StopBits = UART_STOPBITS_1;
  g_usart2.Init.Parity = UART_PARITY_NONE;
  g_usart2.Init.Mode = UART_MODE_TX_RX;
  g_usart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  g_usart2.Init.OverSampling = UART_OVERSAMPLING_16;
  g_usart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  g_usart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  g_usart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    HAL_UART_Init(&g_usart2);
}

2.3、添加MicoLIB

005.jpg

添加代码

#if defined (__ICCARM__) || defined (__ARMCC_VERSION)
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#elif defined(__GNUC__)
   /* With GCC, small printf (option LD Linker->Libraries->Small printf
   set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#endif /* __ICCARM__ || __ARMCC_VERSION */

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART2 and Loop until the end of transmission */
  HAL_UART_Transmit(&g_usart2, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;
}

2.4、main.c

#include "main.h"

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();

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

    init_led();
    init_usart(115200); 

  while (1)
  {
        printf("https://shequ.stmicroelectronics.cn/stm32c031!\r\n");
    led4_tog();
    HAL_Delay(100);
  }
}

三、运行

编译后,下载程序到开发板

串口输出乱码

006.jpg

修改时钟频率,时钟为配置的48M。修改内容如下:

007.jpg

重新编译,下载后,串口输出

008.jpg

串口输出正常。

收藏 评论1 发布时间:2024-3-16 22:48

举报

1个回答
背影101 回答时间:2024-4-3 16:52:37

学到了

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版