STM32CubeMX学习教程之六:USART串口输出和printf( )重定向到串口

完整源码下载:

https://github.com/simonliu009/STM32CubeMX-USART-Output-and-printf-redirect-to-USART

软件:

STM32CubeMX V4.25.0  

System Workbench V2.4

固件库版本:
STM32Cube FW_F1 V1.6.1

硬件:

OneNet 麒麟座V2.3

在STM32CubeMX中新建项目,选择正确的MCU型号

 

首先设置RCC和SYS,如下图

 

然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),如下图

配置USART1为Asychronous模式

 

可以看到PA9和PA10被配置为了USART1_TX, USART1_RX。

UART1配置用默认的115200,8, None和1就好。

 

Project - setting ,ToolChain/IDE选择 SW4STM32

勾选这里

保存以后,点击任务栏的生成代码图标

生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目。

编辑main.c, 添加如下代码,其中17为字符串长度(\r和\n各占一个字符),10为超时时间:

  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
	  HAL_UART_Transmit(&huart1,"\r\nUART Transmit\r\n",17,10);
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

 

 

 

然后右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。

然后任务栏上点击Run图,当然会报错的,原因请查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右键点击  项目名Run.cfg ,给它改个名字,

 

然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:

然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:

然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:

source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]

reset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none 

然后再Run一下,就可以了。


通过串口调试软件(波特率设为115200)就可以看到它不断输出 

UART Transmit

那么如何使用printf( )输出到串口呢,其实官方有个例程。解压STM32Cube_FW_F1_V1.6.0.zip文件,

打开STM32Cube_FW_F1_V1.6.0\Projects\STM3210C_EVAL\Examples\UART\UART_Printf\SW4STM32\STM3210C_EVAL的项目,就可以看到main.c里面做了几件事情:

/* Private function prototypes -----------------------------------------------*/
#ifdef __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)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* Private functions -------------------------------------------------
/* USER CODE BEGIN 0 */

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
/* USER CODE END 0 */

 

然后修改main.c的输出内容:

 

  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
	  printf("printf function UART1 output test~~!\r\n");
	  HAL_UART_Transmit(&huart1,"\r\nUART Transmit\r\n",17,10);
	  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

 

最后,不要忘记把STM32Cube_FW_F1_V1.6.0\Projects\STM3210C_EVAL\Examples\UART\UART_Printf\syscalls.c 文件复制到src目录,很多教程没有提到这点。如果不复制这个文件,那么printf()是不起作用的。再Run一次,就能看到你的输出内容为

 

UART Transmit
printf function UART1 output test~~!

UART Transmit
printf function UART1 output test~~!


 

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用stm32单片机中,如果想要将printf函数重定向USART1,可以通过重定向fputc函数来实现。具体步骤如下: 1. 首先,需要包含头文件stdio.h,以便使用printf函数和FILE类型。\[3\] 2. 在代码中定义一个函数,例如USART1_printf,用于重定向fputc函数。这个函数的实现可以根据需求自定义,但需要包含头文件stdio.h、string.h和stdarg.h。\[2\] 3. 在重定向函数USART1_printf中,使用USART_SendChar函数将字符发送到USART1。可以根据需要使用其他USART发送函数,如USART_SendString等。\[2\] 4. 在main函数中,调用USART_Configuration函数进行USART1的配置。然后,可以使用printf函数来打印调试信息,这些信息将被重定向USART1。\[1\] 下面是一个示例代码: ```c #include <stdio.h> #include <string.h> #include <stdarg.h> // 重定向fputc函数到USART1 int USART1_printf(const char* format, ...) { va_list args; va_start(args, format); char buffer\[100\]; vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); int len = strlen(buffer); for (int i = 0; i < len; i++) { USART_SendChar(USART1, buffer\[i\]); } return len; } int main(void) { USART_Configuration(); // USART1的配置函数 // 使用printf函数打印调试信息,信息将被重定向USART1 printf("\r\nstm32f103rct6\r\n"); printf("\r\nCortex-M3\r\n"); while (1); return 0; } ``` 通过以上步骤,就可以将printf函数重定向USART1,实现在stm32单片机中通过USART1打印调试信息。 #### 引用[.reference_title] - *1* *3* [STM32printf函数重定向](https://blog.csdn.net/qq_29344757/article/details/75363639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32实现将printf重定向串口的3种方法](https://blog.csdn.net/studyingdda/article/details/127388762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值