环境介绍
- 系统: Ubuntu18.04
- 工作环境: STM32Cube+Truestudio
- 芯片: stm32f103ret6
简介 stm32cube 是一个非常便捷的STM32开发工具,使用它可以非常迅速的完成项目功能框架的搭建,这里编译器的选用Truestudio,主要是因为其免费开源且多平台,其代码预览能力也是甩keil好几条街(个人看法,主要原因还是本人现在改用linux系统,无法使用keil),但是其代码补全和代码编辑能力还是有点不足,这里推荐使用vscode进行配合编辑.本系列博文不对STM32各个功能进行详细介绍,只介绍各个功能在本系列博文所用平台的使用方法和一些特定功能如何修改.
uart和usart在本质上没有区别,uart只能用于异步收发数据,而usart则可同时用于同步异步收发数据,usart比uart多出一根时钟线,用于同步数据.
这里介绍如何使用STM32Cube配置uart,选择uart4,模式设置为异步通信,其他的设置默认即可
下面简单配置一下时钟,采用外部晶振,配置如下:
接下来就是生成代码,打开project manager 选择code 然后点击下面这个选项,生成的代码会分别生成各个功能配置的c/h文件,否则会都生成在mian.c文件里
最后点击生成代码即可,生成的代码只是个框架,主要实现的功能还需要我们自己去填充用户代码
接下用Truestudio打开项目代码,打开main.c文件,在/*USER CODE BEGIN 1*/ /*USER CODE END 1*/
中定义两个变量
uint8_t *txbuf;
float a=12.0;
在while(1)循环中/*USER CODE BEGIN 3*/ /*USER CODE END 3*/
之间填充
sprintf(txbuf,"HAL print float is:%f",a);
HAL_UART_Transmit(&huart4,txbuf,strlen(txbuf),0xffff);
HAL_Delay(1000);
此时直接编译烧录我们可以看到板子输出HAL print float is:
,并不会输出浮点数,接下来我们点击工具栏project选择Build Setting 在下面的位置输入-u_printf_float
就可以输出浮点数了
当然我这里采用的HAL库的串口输出,不能格式化输出,相对不方便所以用到了sprintf函数,下面介绍printf重定向方法,方便输出在/*USER CODE BEGIN 0*/和/*USER CODE END 0*/
之间输出以下代码即可完成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(&huart4, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
这样我们就可以直接通过printf的方式输出浮点数了,用
printf("printf float is :%f"`,a);
HAL_Delay(1000);
代替
sprintf(txbuf,"HAL print float is:%f",a);
HAL_UART_Transmit(&huart4,txbuf,strlen(txbuf),0xffff);
HAL_Delay(1000);
可以获得相同的输出结果