STM32串口proteus虚拟仿真通信实验
- 物联网-嵌入式工程师
- 2025-02-16
- 325热度
- 0评论
实验目标
本实验使用VSPD虚拟两个串口COM1和COM2。串口助手作为上位机通过COM2串口发送命令到单片机,控制LED灯点亮和熄灭。单片机作为下位机通过COM1端口接收控制命令,并改变LED灯的状态。
绘制电路图
启动proteus8,建立一个新的仿真工程,绘制如下电路图。
电路图右侧连接到PD0和PD1引脚的是晶振电路,本实验采用HSE(高速外部时钟),需要外接晶振电路,为单片机提供稳定的8Mhz时钟信号。
晶振电路由晶振和两个相同容量的电容构成,这两个电容一般称为匹配电容或负载电容,并联到晶振两端,为晶体振荡提供电流回路,若没有这两个电容,晶振的振荡会因为没有电流回路而停振,这两个电容的容量都很小,选择几十皮法即可,两个电容的另一端都需要接地。
单片机的PD0和PD1是外接时钟引脚,PD0为片内振荡电路的输入端,PD1为片内振荡电路的输出端,这两个引脚外接晶振和电容,晶振一般取值为12MHZ,电容一般取值为10P~30P。
在proteus仿真电子元器件库搜索“COMPIM”,添加串口仿真器件到电路模型元器件库,添加一个串口器件到电路模型,Physical port设置为COM1,并设置Physical Baud rate为115200,Physical Data Bits设置为8(数据位为8位)。这个地方配置的参数,需要我们在CSTM32CubeIDE中配置相同参数,而且在串口助手测试时,也是用相同参数,即8N1+115200。
构建工程
启动STM32CubeIDE,新建STM32工程,工程名称为“STM32SerialPort”,单片机选择STM32F103R6。
在“Project Explorer”窗口,选择并打开工程的STM32SerialPort.ioc文件,该文件是STM32项目的配置文件。开发人员可以通过图形化界面配置STM32单片机的各个外设、引脚、时钟、中断等资源,这些配置信息会存储在.ioc文件中。当STM32CubeIDE自动生成代码时,这些信息会被用来生成初始化代码,这些代码通常包括外设初始化、时钟配置、引脚配置等。
配置窗口如下图所示:
完成如下配置:
- 通过修改 RCC寄存器的相关位来启用 HSE。
- 配置通信模式为asynchronous异步通信模式,8N1+115200的串口通信参数。
- 开启USART1中断
- 配置GPIO端口引脚
- 配置系统时钟为72Mhz
配置完成后,选择保存文件,STM32CubeIDE会自动生成上述配置代码。
添加代码
在main.c文件内,需要添加delay_us(uint32_t us)函数,该函数实现毫秒级延时。
void delay_ms(uint32_t ms) {
uint32_t startTick = uwTick;
while ((uwTick - startTick) < ms) {
}
}
函数delay_us依赖于一个全局变量 uwTick 来计算时间差。uwTick 变量由 SysTick 定时器的中断服务例程(ISR)来更新,每次中断时递增,从而记录自系统启动以来经过的毫秒数。
函数通过计算 uwTick 的当前值与开始值之差来确定是否达到了指定的延时时间,该函数为阻塞函数,因为在延时等待期间,CPU 将一直执行这个空循环,不做其他任何工作。该函数不适用于需要高效利用 CPU 或需要同时处理多个任务的系统。在多任务系统中,考虑使用操作系统提供的延时函数来避免忙等待。
完整的main()函数代码如下:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
delay_ms(1000);
// 反转PC1引脚的输出状态
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_1);
}
}
函数内部调用HAL_Init()函数对HAL进行初始化,调用SystemClock_Config()对系统时钟进行初始化,调用MX_GPIO_Init()函数对配置的引脚进行初始化。
在函数的while循环内部,调用delay_ms(1000)函数延时1000ms,然后调用HAL_GPIO_TogglePin()函数切换GPIO引脚(在这里是PC1)的输出状态,这样,连接在PC1引脚上的LED就会以1秒的间隔闪烁。
编译和运行程序
编译成功后,启动Proteus8,打开建立的延时实验仿真工程,为STM32F103R6单片机设置运行程序。程序执行效果如下图所示: