基于HAL库STM32F103ZET6之串口打印调试

目录

一、确定使用哪个串口

 二、配置CubeMX

三、编写串口打印相关程序

工程文件下载路径:


一、确定使用哪个串口

        根据开发板的原理图确定CH340芯片与串口几相连,如下图,可知CH340通过跳线与单片机的PA9、PA10相连,查看数据手册可知与CH340相连的是串口1,或在CubeMX中也可以确定与CH340相连的是串口1。

 二、配置CubeMX

        2-1、配置时钟源,高速时钟选择晶体谐振器(外部晶振),低速时钟暂不做设置默认即可

        2-2、配置Debug(调试接口),选择SW,注:如果不配置Debug会造成程序下载一次后就烧不进去,如果因忘记配置无法烧录可在点击烧录时按一下复位(记得配置后再烧录,有时也会烧不进去,多试几次就行)

        2-3、配置时钟树,选择时钟源和设置时钟频率

         2-4、配置USART1(串口1)为异步通信,其余默认即可,要记住默认波特率为115200,后面调试助手会用到,USART1_RX为数据接收端(PA10),USART1_TX为数据发送端(PA9)

注意:数据接收端(PA10)是与CH340的TXD相连,数据发送端(PA9)是与CH340的RXD相连,这是因为单片机的数据发送端是向CH340发送数据的,对CH340来说就是接收端

MCU:TXD->CH340:RXD

MCU:RXD->CH340:TXD

         2-5、设置工程的保存路径及名称

三、编写串口打印相关程序

         3-1、编译程序,配置下载器,我用的是DAP_Link(st-link,jlink配置也几乎相同)

        3-2、勾选使用微库,并导入头文件stdio.h

         3-3、对prinf函数进行重定向

/************** printf重定向 **************/
#ifdef __GNUC__
	#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
	#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印
	return ch;
}

        3-4、在主程序添加以下代码,单片机将会每500毫秒打印输出到上位机一次

printf("printf test!\r\n");		//打印输出 printf test!
HAL_Delay(500);					//延时500毫秒

 3-5、编译后,下载程序到单片机

现象如下:

参考:STM32-HAL库关于printf函数重定向的问题

工程文件下载路径:

百度网盘:

链接:https://pan.baidu.com/s/1HyHPZqfMJJB0jUflW3_v4g?pwd=afyr 
提取码:afyr

后期会继续更新,敬请关注!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用STM32F103ZET6串口2功能,您需要完成以下步骤: 1. 首先,在STM32F103ZET6的datasheet中查找UART2的引脚分配。通常,UART2的引脚是PA2和PA3。 2. 然后,您需要在代码中启用UART2。您可以使用STM32CubeMX来生成初始化代码。在"Pinout & Configuration"选项卡中,选择UART2并将其配置为所需的波特率、数据位、停止位等。 3. 在生成的代码中,您可以找到用于初始化UART2的函数。此函数将启用UART2并设置其参数。 4. 接下来,您需要使用HAL库的函数来发送和接收数据。例如,使用"HAL_UART_Transmit()"函数发送数据,使用"HAL_UART_Receive()"函数接收数据。 下面是一个简单的示例代码,演示如何初始化UART2并发送一条消息: ``` #include "stm32f1xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); char msg[] = "Hello, world!\n"; while (1) { HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } void Error_Handler(void) { while(1); } ``` 请注意,此示例代码仅发送一条消息。您可以根据自己的需求修改代码以接收和处理数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风影星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值