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~~!


 

你可能感兴趣的:(STM相关)