Keil转STM32CubeIDE笔记三
使用STM32CubeIDE通过对串口USART2进行配置,并通过电脑对单片机发出指令,使三盏不同颜色的小灯按照指令亮灭。
利用串口收发实现控制三盏LED灯亮灭——点灯宗师篇
一,新建工程及初始化配置
1,新建工程
按照流程将工程新建并改名为serial(串口),并依旧选择熟悉的是stm32f103c8t6型号芯片

2,进行引脚配置
因为本期是使用串口控制三盏小灯,在我们小学二年级的时候就学过了,串口收发需要配置TX(发送)和RX(接收)两条传输线,并且三盏小灯也需要配置三个GPIO输出引脚。
STM32F03C8T6为我们准备了三对USART,这里以PA2和PA3(USART2)这一对为例,因为是使用异步模式,所以也无需配置CK时钟,之后的三盏小灯我们依旧使用PA7,PA6,PA5这三个引脚,并配置为输出模式。

3,对USART进行模式参数配置
之后我们就要对我们选中的USART2进行模式选择和参数配置了,点击左边的Connectivity(硬件接口),选择我们刚才配置的USART2,之后就进行模式选择,这里一共有七种模式选择, 意思分别为:
1. Asynchronous(异步模式)
- 特点:无需共享时钟信号,通信双方通过约定波特率同步。数据按帧传输,帧结构包含起始位、数据位、校验位、停止位。
- 应用:最常用的 UART 通信(如嵌入式设备调试、传感器数据传输)。
2. Synchronous(同步模式)
- 特点:需额外时钟线(CLK),由主设备提供时钟信号,数据严格按时钟同步传输,传输效率更高。
- 应用:对时序要求高的高速通信场景。
3. Single Wire (Half-Duplex)(单线半双工)
- 特点:仅用一根线实现数据传输,同一时刻只能发送或接收(半双工),节省硬件引脚。
- 应用:对成本敏感、通信速率要求不高的场景(如简易传感器通信)。
4. Multiprocessor Communication(多处理器通信)
- 特点:支持多个处理器设备互联,通过地址识别机制区分不同从设备,实现主从式多设备通信。
- 应用:工业控制中多模块协同工作(如主控制器与多个从模块通信)。
5. IrDA(红外通信)
- 特点:基于红外线传输数据,需红外收发硬件,通信距离短但抗电磁干扰。
- 应用:早期短距离无线通信(如红外遥控器、部分消费电子设备)。
6. LIN(本地互联网络)
- 特点:用于汽车电子的低成本串行通信协议,采用主从架构,本质是异步通信的扩展。
- 应用:汽车内部简单传感器、执行器的互联(如车窗控制器、车灯模块)。
7. SmartCard(智能卡模式)
- 特点:适配智能卡(如 SIM 卡、IC 卡)的通信协议,遵循特定电气特性和数据交互规则。
- 应用:直接与智能卡进行数据读写(如金融卡终端、移动设备 SIM 卡通信)
我们这里使用的是第一种Asynchronous异步传输模式,点击配置。

之后对下方异步传输模式的参数进行详细配置,这里的参数的意思从上往下分别是,波特率为9600bit/s,数据位长度为8位,无奇偶校验,1位停止位,这里的波特率可以按照自己的习惯进行设置。

4,保存配置
点击上方中间的保存图标或者使用快捷键Ctrl+S进行保存,等待CubeMX对我们进行的配置进行初始化代码生成!

二,代码部分
1,项目思路
我们的目标是利用串口收发实现控制三盏LED灯亮灭,因此单片机需要对接受到的信息进行区分,简单的思路就是,当收到'0'时LED小灯熄灭,当收到'1'时LED小灯亮起,那我们又面临了一个问题,那就是如何区分三盏小灯呢?这里我们的简单思路就是,将三盏小灯进行命名,例如这里我就以颜色进行命名,红色小灯就叫'R',蓝色小灯就叫'B',绿色小灯当然就是'G'了,当然还有其他命名方式了,小伙伴们可以自己思考思考。
2,串口收发函数认识
这里我们需要对电脑发送给单片机的信息进行一个存储,所以需要定义一个能存放两个char类型字符的数组。注:uint8_t为无符号类型8bit长度,char字符也为8bit即1字节长度。
uint8_t receive[2];
之后我们需要知道串口发送和串口接收的函数。在这里有一个小技巧,当函数名较长不便于我们记忆时,我们可以打出前面的一部分,例如此处我们可以打出HAL_UART_R时,之后可以按住快捷键Alt+/,IDE会弹出之后的函数部分,并引出函数里面的成员,方便我们快速对函数进行配置,大大减少了我们的操作难度,所以这个快捷键是小伙伴们必备技能之一!
HAL_UART_Receive(huart, pData, Size, Timeout);//串口接收
HAL_UART_Transmit(huart, pData, Size, Timeout);//串口发送
引出两个函数之后我们就需要对函数内部的成员有一个认识,这又该怎么办呢?
这时我们往往会按住Ctrl,之后鼠标左键点击我们想要查找的函数名,就会跳转到该函数的定义文件处,在该函数的上方就会有每个成员的定义,下方就会出现该函数执行的原理。小伙伴们只需要将上方注释读懂便可轻松将函数配置好了。

而在我们这里函数内部的四个成员的含义分别是:
- huart:UART 句柄,配置的外设。
- PData:存储数据的数组。
- size:接收的数据长度。
- Timeout:等待数据接收的时间。
而在我们这里,通过分析我们应该要配置的外设为huart2,数组为定义的receive,接受的数据长度为2,等待时间因为我们需要一直等待电脑给单片机发送数据,所以设置为HAL_Delay_MAX即等待最长时间。需要注意的是,huart为指针类型,所以huart2前面不要忘记加上&取地址符了!
配置完成后就是这样了
HAL_UART_Receive(&huart2, receive, 2,HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2, receive, 2, 1000);
3,代码实现基本功能
之后便是对接收到的数据进行分析判断并对小灯进行电平操作了。
我们可以先定义一个GPIO_PinState类型的变量,来表示电平,名字就叫state,并给它初始化配置为SET,高电平。
GPIO_PinState state =GPIO_PIN_SET;
之后当我们收到的数据为'0',则将state变量改为GPIO_PIN_RESET(低电平),如果接收到的数据为'1',则保持不变;
if(receive[1] =='0'){
state =GPIO_PIN_RESET;
}
之后只剩下对三盏LED小灯的选择问题了,这就非常简单了,只需要我们对接收到的数据的另一位与我们定义的三个名字进行一一对应即可,使用三个if语句便可完成此功能。
注意三盏小灯的引脚与颜色对应关系即可
if(receive[0]=='R'){
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, state);
}
else if(receive[0]=='G'){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,state);
}
else if(receive[0]=='B'){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,state);
}
4,保存代码并编译检查
点击上方小锤子图标编译代码,下方出现0错误0警告即可。


三,硬件连接
1,串口接线
这里我使用的是CH340USB转串口模块,需要注意的是一点是,单片机的PA2为TX引脚,PA3为RX引脚,需要与串口模块上面的TX与RX进行正反接,然后共地即可,串口模块还需要外接5V供电,这里建议使用杜邦线借用ST_LINK模块上的5V电压。




2,串口助手配置
网上各种串口助手五花八门,这里随便选取一个即可,这里找到串口号,波特率,数据位停止位等都必须保持与初始化参数配置保持一致!,收发都使用文本模式。

3,程序烧入
ST_LINK与CH340都插在电脑上,然后点击上方RUN图标将程序烧入即可,整体接线如图:

四,实验现象
我们在串口助手发送区分别发送R1,B1并观察对应LED小灯是否亮起,
可以看到,对应颜色的小灯如约亮起,而由于没有发出'G1'指令,中间的绿色小灯并未亮起,符合实验预期!实验圆满完成!


五,实验小结
本次实验是使用STM32CubeIDE通过对串口USART2进行配置,并通过电脑对单片机发出指令,使三盏不同颜色的小灯按照指令亮灭。小小的实验,便学习到了关于串口的基本配置,模式选择,参数含义,还有串口收发函数的认识,两个快捷键的使用小技巧,以及两台设备之间的通信。
完成了本次实验的小伙伴们,荣获点灯宗师头衔!!!
实验还有很多缺陷,例如程序一直在等待电脑发送数据,阻塞了整个程序的运行,之后小伙伴们可以考虑为它加上中断或者DMA来解决此问题。期待能做出更加优美的项目,写出更加华丽的文章,帮助更多有需要,有兴趣的小伙伴们!!!
更多推荐



所有评论(0)