一、相关知识
(1)串口协议
STM32微控制器系列的串口协议通常指的是通用异步收发传输器(UART, Universal Asynchronous Receiver/Transmitter)。UART是一种非常广泛使用的硬件通信协议,用于异步串行通信。STM32微控制器通常包含多个UART接口,用于与外部设备或另一个微控制器进行串行通信。
UART(Universal Asynchronous Receiver Transmitter,通用异步收发传输器)是一个全双工通用异步串行收/发模块,主要用于打印程序调试信息、上位机和下位机的通信以及ISP程序下载等场合UART至少需要两根数据线用于通信双方进行数据双向同时传输,最简单的UART接口由TxD、RxD、GND共3根线组成。其中,TxD用于发送数据,RxD用于接收数据,GND为信号地线,通过交叉连接实现两个芯片间的串口通信。
(2)RS-232标准
RS-232标准,是一种定义异步通信口的物理接口和电气特性的标准。它最初设计用于提供计算机和电话线之间调制解调器的接口,但随着时间的推移,它的应用范围已经扩展到其他各种设备之间的串行通信。
RS-232标准使用串行通信,数据按位顺序传输。通常采用DB-9或DB-25的形式,以DB-9最为常见。每个连接器都有不同的引脚分配,用于传输数据、控制信号和提供电源。
信号电平:它使用负电压表示逻辑“1”(标记),正电压表示逻辑“0”(空格)。通常,标记的电压范围在-3V到-15V之间,空格的电压范围在+3V到+15V之间。
信号线:RS-232定义了多个信号线,包括数据线(TXD、RXD)、地线(GND)、控制线(如CTS、RTS、DTR、DSR等)和定时线(如DCD、RI)。
传输速率
对可靠性要求不高的场合,DB-9通常采用三线制串口,仅需发送(Tx)、接收(Rx)和地(GND)三条线,即可实现全双工通信,进行最基本的数据收发传送,最高传输速率可达20kbps
(3)RS232与TTL电平区别
RS-232电平和TTL电平的主要区别在于它们的电压表示方式和适用环境。RS-232使用较高的电压水平(-3V到-15V表示逻辑“1”,+3V到+15V表示逻辑“0”),适用于较长距离和噪声较大的工业环境。而TTL使用较低的电压水平(0V到0.8V表示逻辑“0”,2.0V到5V表示逻辑“1”),适用于短距离和电子设备内部通信。由于这些差异,RS-232和TTL电平之间通常需要电平转换电路以便进行通信。
(4)"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理
当模块通过USB接口与计算机或其他USB设备连接时,CH340芯片会与主机进行通信,并模拟成一个虚拟的串行端口(COM口)。
计算机发送的数据通过USB接口到达CH340芯片,芯片将这些数据转换为TTL电平的串行数据信号。
如果需要将数据发送到使用RS-232接口的设备,CH340芯片还会将TTL电平的信号进一步转换为RS-232电平的信号。
二、标准库点亮流水灯
相关程序:
//主函数main:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
//使用各个外设前必须开启时钟,否则对外设的操作无效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //GPIO引脚,赋值为所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数
//函数内部会自动根据结构体的参数配置相应寄存器
//实现GPIOA的初始化
/*主循环,循环体内的代码会一直循环执行*/
while (1)
{
GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
Delay_ms(300); //延时300ms
GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
Delay_ms(300); //延时300ms
GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
Delay_ms(300); //延时300ms
}
}
//delay函数:
#include "stm32f10x.h"
// @brief 微秒级延时
// @param xus 延时时长,范围:0~233015
//@retval 无
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
// @brief 毫秒级延时
//@param xms 延时时长,范围:0~4294967295
// @retval 无
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
(1)实物连接图
(2)实践效果
(4)观察波形
三、总结
学习到了更多stm32标准库的知识。