【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真

文章目录

  • 一、软件介绍和下载安装
    • 1.1 STM32CubeMX介绍
    • 1.2 Proteus介绍
  • 二、创建第一个项目
    • 2.1 STM32CubeMX生成代码
    • 2.2 keil5 生成可执行文件
    • 2.3 Proteus 搭建简单电路
  • 三、按键开发
  • 四、中断和定时器开发

  博主最近进行单片机的仿真,本篇文章主要利用了STM32CubeMX、Keil和Proteus三个软件,为后期的硬件打下基础。文章主要目的是学习软件的使用和单片机的仿真。

  本文是我在学习proteus软件和STM32CubeMX过程当中的心得和学习笔记,在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。

  此外,博主还有另外几篇文章,分别关于Python基础知识Python的具体应用C语言指针结构体的难点C++入门和进阶知识点C++高阶知识点,大家点击即可翻阅。

一、软件介绍和下载安装

1.1 STM32CubeMX介绍

  从15-16年开始,意法半导体公司(ST)逐渐停止了对SPL标准外设库的更新和维护,转向了HAL和LL库。对于STM32CubeMX的学习主要是学习HAL库,HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性,HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。

  • SPL :Standard Peripheral Library 标准外设库
  • HAL:Hardware Abstraction Layer 硬件抽象层库
  • LL:Low-layer 底层库
      STM32CubeMX是一个图形化的软件配置工具,在这种软件中,用户可以通过图形化的操作,完成初始化代码工程。生成的工程是一个可以正常编译的完整工程,使用的时候只需要添加上用户的代码即可。接下来我们创建第一个仿真项目,点亮LED灯

参考了别的博主的博客和B站视频。

1.2 Proteus介绍

Proteus软件是英国Lab Center Electronics公司出版的电子设计自动化(Electronic design automation,EDA)工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是比较好的仿真单片机及外围器件的工具。虽然国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。
——百度百科

  proteus功能很强大,它是一个合成了PCB设计、电路仿真、虚拟模型仿真为一体的电子设计自动化软件。具体的软件安装可以参考别的博主的文章,这里不在细述,Proteus8.9 下载与安装教程。

二、创建第一个项目

2.1 STM32CubeMX生成代码

  第一步,新建一个项目,在搜索栏中输入本次要使用的仿真硬件,这里是STM32F103C8,属于比较常见的一种单片机。然后,双击搜索结果中出现的项目。第二步将Pinout & Configuration -> system core -> SYS -> Debug 改为Serial Wire, Pinout & Configuration -> system core -> RCC -> High Speed Clock(HSE)和Low Speed Clock(LSE)全部改为Crystal/Ceramic Resonator。最后在图形界面将GPIO口的PA5改为output(双击)。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第1张图片

  第三步,将Clock Configuration中的HCLK时钟改为72MHz(最高时钟频率),如图所示。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第2张图片

  第四步,Project Maneger中将项目名称修改为LED,修改保存路径,修改设备型号和版本。最后在Code Generator中将生成.c和.h文件的选项打钩,点击生成代码,就可以在路径底下生成一个工程代码。到这一步为止,我们就生成了.c和.h文件,但是它是不能在单片机上运行的,要生成单片机能够运行的.hex文件还需要keil的帮助。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第3张图片

2.2 keil5 生成可执行文件

  第五步,在生成的项目文件当中,找到MDK-ARM文件底下的.uvprojx文件,使用keil打开,这里博主使用的keil5。如图所示,输入如下代码,因为小灯闪烁的频率非常快,肉眼观察不到,因此我们加上延时函数。编译运行,生成.hex文件,HEX文件是一种能够烧写到单片机中,被单片机执行的文件格式。代码部分到此就完毕了。这里需要注意的是,我们用户的代码最好写在两个USER CODE注释的中间,这样如果需要用STM32CubeMX改写代码时就不会改变我们写的代码,而写到其他地方去的代码会被覆盖

		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
		HAL_Delay(200);
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);
		HAL_Delay(200);

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第4张图片

2.3 Proteus 搭建简单电路

  第六步,在Proteus中,点击新建项目,步骤参考自手把手教你上手Proteus。项目建好之后点击P,可以查找元器件。博主的Proteus版本太低,找不到C8,就用C6替代了,效果一样的。我们依次找到LED,电阻。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第5张图片
【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第6张图片

  电源和地在这个图标中可以找到。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第7张图片

  最终电路图如图所示,点击运行就小灯就闪烁起来了,至此第一个项目就完成了。

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第8张图片

  如果出现下面的错误,就是电网布置错误了,Design -> Configure Power Rails -> Power Rails -> Name, 在GND中将VDDA和VSSA移除,VDDA和VSSA添加到VCC/VDD中,点击OK,重新运行即可

【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第9张图片
【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第10张图片

三、按键开发

  如图所示,我们打开在STM32CubeMX创建的第一个项目(以.ioc结尾的文件),将管脚改成如下所示,其中PB7、PB8为输出,PC13、PB5、PB1为输入,GPIO设置为pull-up。这个主要用来区分GPIO口用于输入还是输出如果是输出,那么选择no-pull-up and no-pull-down,如果是input,那么需要看具体应用的默认输入值是0还是1,如果默认是输入0,则最好配置为pull down,反之则配置为pull up。这里我们根据实际电路设置,我们的仿真电路默认输入为高电平,为1, 因此设置为pull-up。
【STM32仿真】STM32CubeMX+Keil+Proteus单片机仿真_第11张图片

  在keil中修改代码,可以使用宏定义简化代码。按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平。单片机通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。

  按键的输入引脚有低电平产生不一定是按键按下引起的,有可能是干扰信号。因此,按键需要进行防抖操作处理。首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。然后我们在主函数循环当中调用Scan_Keys()函数。注意以下代码都要写在用户代码注释之间。

// 宏定义,简化代码
#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)		
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)
void Scan_Keys()
{
	// 默认为高电平1,如果输入为0,则检测到一次按键输入
    if(KEY2 == GPIO_PIN_RESET)		
    {
        HAL_Delay(5);		// 防抖,按钮不按下,排除电源不稳等等误判因素
        if(KEY2 == GPIO_PIN_RESET)
        {
						// 确认按下之后,立刻翻转直至按钮松开
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);		
            while(KEY2 == GPIO_PIN_RESET);	
        }
    }
    if(KEY3 == RESET)
    {
        HAL_Delay(5);
        if(KEY3 == RESET)
        {
						// 按下之后,直至按钮松开,再进行翻转操作
            while(KEY3 == RESET);
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
        }
    }
    if(KEY4 == 0)		// RESET可以用0代替
    {
        HAL_Delay(5);
        if(KEY4 == 0)
        {
						// 对两个GPIO口同时操作
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9|GPIO_PIN_8,GPIO_PIN_RESET);
            while(KEY2 == 0);
        }
    }
}

四、中断和定时器开发

持续更新~

end

你可能感兴趣的:(单片机,proteus,嵌入式硬件)