序言
st官方已经停止更新标准库了,而且新出的一些芯片用到的基本也都是HAL库,因为原来在学校接触的都是标准库,直到工作以后才接触的HAL库,才知道有cubemx这个神器存在。用它建立工程简直不要太爽。接下来给大家分享一个串口通信的工程。
不解的是,我见过很多的工程师都不用cubemx的,(理由是cubemx建立的工程代码太臃肿)。也许是原来的项目用的是标准库新项目对接用标准库方便,也许是不愿意做出改变,又或许是不了解。不过,既然存在就有它的道理。实际项目中该用什么库听大佬安排。不过身为打工人的自己还是得多一份技能。。。
建立工程
使用的cubemx版本为6.1.2,mdk版本为5.33。使用得测试芯片为stm32f030,当然用其他型号也是一样的。
配置cubemx
首先配置DEBUG,防止下次下载程序的时候得按复位键,省的麻烦。。
然后就是配置外部时钟,配置最高时钟下运行
接下来配置串口(记得使能中断)以及led引脚(PC13)
然后,再次配置一个1mm的时钟(记得使能中断),用于配合串口接收用。(写过经过众多的串口接收,最后还是觉得配合一个定时器使用最为稳妥)
生成代码以后先亮个LED灯压压惊。直接加在main函数中的while循环里即可。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(200);
}
/* USER CODE END 3 */
添加串口部分代码
串口部分包括发送和接收两个部分
添加printf打印代码
在usart.c文件里面添加如下代码后即可在main函数中调用printf函数
/* USER CODE BEGIN 0 */
#include "stdio.h"
struct __FILE
{
int handle;
};
FILE __stdout;
int fputc(int ch, FILE *f)
{
//具体哪个串口可以更改huart1为其它串口
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
return ch;
}
/* USER CODE END 0 */
啥也不说,直接上图即可
添加接收代码
这里要特别说明一下,由于用的是cubemx提供的库,我把串口接收弄成了一个c文件跟一个h文件了,相当于一个APP,必要时直接移植即可。
首先是C文件
//象征性的添加头文件
#include "app_usart.h"
#include "stdint.h"
#include "usart.h"
#if USER_EXTENR_DATA
uint8_t User_Re[Set_Re];
#else
uint8_t *User_Re;//用户使用的指针,用户需要使用到串口接收的值的时候拷贝即可
#endif
struct
{
uint16_t Re_Compl :