Proteus仿真STM32实例:简易抢答器

帮微信好友调试了一个基于Proteus的抢答器程序,一晃距离上次使用Proteus,已经过去五六年了,当时还是仿真的51单片机。借此机会,我们看一下,如果使用Proteus仿真STM32,本次测试实现的目标如下:

  • 使用Proteus搭建仿真的原理图
  • 使用STM32CubeMX创建STM32F103R6的工程
  • 添加printf输出重定向代码,即串口1的打印输出功能
  • 添加HAL库的按键读取函数
  • 点击按键,来回切换LED的状态

安装Proteus 8.9 Pro

安装过程比较简单,默认下一步即可,安装完毕,记得先激活,再运行软件,具体激活方法,参考Crack文件夹中的激活说明。

注意:其中到下图步骤时,注意选择“Custom”:

然后将“Installation Path”和“Program Data Path”选择为同一个目录,否则容易发生闪退现象:

创建工程

  • 点击“New Project”,创建新工程。

  • 随意命名,如Keil_STM32F103RT6,并选择安装路径。

  • 创建一个缺省的原理图。

  • 不用创建PCB视图。

  • 选择“No Firmware Project”,不用创建代码工程,我们将使用STM32CubeMX创建工程。

  • 完成Proteus工程的创建。

  • 完成原理图的绘制如下。

  • 双击主芯片,设置属性

Proteus使用过程中可能出现的问题

  • 用proteus仿真时,一直出现animating:0.00149(CPU load 70%),但就是没结果?

模拟电路仿真有点慢,你可以把电路中的电阻改成数字式的。双击电阻,在model type后边有个下拉菜单,把analog改为digital。

  • 如何改变原理图大小?选择System->Set Sheet Sizes。

  • 如遇到下面报错该如何解决?

No power supply specified for net VSD in Power Rail Configuration. No power supply specified for net VDDA in Power Rail Configuration. No power supply specified for net VSSA in Power Rail Configuration.

解决办法:

Step1:点击工具栏上方的 Design 选项

Step2:点击 “Configure Power Rails" 

Step3:勾选左下角的 "Use default power rail connections?" 然后配置“Unconnected power nets”。

step4: 点击 OK

  • 在使用Proteus调试串口时会遇到自带的Virtual Terminal无法弹出窗口。

解决办法如下:在Simulation中止后,进入工具栏Debug->Reset Debug Pop up Windows,并在弹出窗口中选“yes”。再次运行Simulation,可以发现窗口可以正常弹出。

  • STM32F103RT6对应的启动文件为?startup_stm32f10x_ld.s: for STM32 Low density devices

ld:低密度产品,FLASH小于64K md:中等密度产品,FLASH=64 or 128 hd:高密度产品,FLASH大于128

  • 串口显示乱码

可能晶振不对。

  • 如何旋转元器件摆放方向?

旋转:Ctrl+M,或者:+ 或者 -

选中元件后依次按下键盘上的Ctrl+M,元件便完成水平方向180°;小键盘的“+”键,可以使元件完成逆时针90°翻转;小键盘的“-”,使元件完成顺时针90°翻转。

STM32CubeMX创建工程

  • 使用STM32CubeMX创建主芯片为STM32F103R6的工程。

  • 选择晶振作为外部高速时钟。

  • 使能串口1。

  • 配置GPIO。

其中PA6与BTN2相连;PB7与LED相连。

  • 配置时钟树:

  • 配置工程设置,并生成代码。

生成后的Keil工程目录如下所示:

  • 添加串口1的重定向:

/* USER CODE BEGIN 0 */
#include "stdio.h"

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    //具体哪个串口可以更改huart1为其它串口
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff);
    return ch;
}
/* USER CODE END 0 */
  • main.c文件中添加引用的头文件:

  • main函数中添加如下实现代码:

其中,int GetPress(void)函数实现如下:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int GetPress(void)
{
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==0)
    {
        HAL_Delay(10);//防抖
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==0)
  {
   while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)==0)//等待按键抬起。
   {;}
   return 1;
  }
  else return 0;
    }
    else    return 0;
}
/* USER CODE END 0 */

测试结果

上面实现了一个按键和LED对应关系,自己在此基础上,多加几组按键和LED,就可以变成一个抢答器了,自己下载源码尝试一下哈。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 2
关注 62
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧