本教程面向新手,尽量做到0基础入门。无奈STM32的坑太大兜不住,但是为了避免踩雷,设计了基于Proteus仿真平台的stm32软硬件结合开发教程。工欲善其事必先利其器,话不多说这里暂且认为各位小伙伴已经准备好MDK5和Proteus软件准备学习了。如果有没有准备好的小伙伴在评论区扣1,我再单独讲一期软件的安装和使用。
目前Proteus仿真stm32会遇到很多问题,也是很多同学被劝退的主要原因。本系列教程会去除掉一切容易出现的bug,并提供最终的仿真模型和对应的源代码给大家,让大家尽情享受在学开发的愉悦中。
首先介绍下proteus,安装proteus的教程大家可以在网上搜索一下,非常多的教程,且该软件已经进入了广大校园的正式课堂中,尤其其对51仿真的支持非常完美。本系列教程笔者借鉴多方资料综合自己的实际经验总结了STM32开发必学的多个任务仿真供大家学习。本项目中所有建立的模型均为proteus8.13版本,请使用该版本以上打开本例所有仿真文件。
打开软件后,点击左上角新建--新建工程,选择一个目录然后重新命名一下自己的工程名称就可以开始玩了。
在新建的页面中,侧边栏可以供操作的快捷工具栏,我标出了几个常用的地方。
器件库里的电子元器件非常全面,供大家学习使用。电源和地里面是为了给你设计的电路提供电源和地的供电回路。虚拟仪表里面有示波器,逻辑分析仪,串口数据监视器,以及SPI和I2C等通讯协议调试器等等。基本上以上的东西可以供大家0成本,不需要买任何东西就能学到电子工程师必备的技能。当然大前提一定是,虚拟仿真和实践还是有差距的,这里的学习只是提供大家理论联系实际的机会,和真正的实践大家还是有一段距离。唯一的好处就是不用花钱。
在对应的器件库和终端里面,选择你要设计的电路的元件。本例中以项目中需求的LED为例,将需要的元件拖入到图纸中。然后准备连线。
在选择模式下,对电路进行连线。并将电源和地也都连接好,我们就可以开始准备仿真了。
点击左下角的运行仿真的按钮,即可以运行仿真,如果电路没有问题,会直接显示当前CPU的负荷是多少,否则会显示当前电路的问题和其他仿真问题。如图我们完美的点亮了一个LED灯,而我们只用了两个元器件。但是这个LED灯还是无法闪烁,只能一直亮。那么如何能让LED灯按照要求闪烁呢。这就引入了CPU,我们本例所涉及的是当前学校最流行的stm32系列CPU。但是proteus并没有支持全系的STM32,我们只能在有限的CPU内进行学习,这虚拟仿真和实践的差距之一。
通过器件库我们看到,CPU涉及了stm32F1x和stm32F4x系列的部分CPU,已经足够我们对原理进行学习了。那么,我们这里选择CPU-stm32F103R6进行学习,并搭建我们的硬件电路图。
如上图,本例中,使用PB8引脚连接LED等,并串联R1的限流电阻到电源端。这样当CPU在程序中设置PB8为高电平时,LED灯两端没有电压差故不会点亮,当设置PB8为低电平时,LED灯两端达到让LED灯点亮的电压差,故LED点亮。
作为第一讲教程,总体来说代码还是很明晰的,尤其是有51基础的同学。没有基础也没关系。可以根据图片中程序的注释进行学习,看不懂得部分可以记住,我们需要弄懂注释的部分可以进行修改即可,而不需要每一句都理解透。毕竟我们是不是底层驱动工程师,我们主要面向应用。
该代码主程序由IO初始化部分和主循环组成,IO初始化需要配置:1.时钟,2.pin脚,3.输入输出模式,4.pin脚速度。程序中GPIO_SetBits(GPIOB,GPIO_Pin_8)这句只是给led灯一个初始状态,只循环一次,故为对led灯进行状态初始化。主循环则是分别在PB8高电平和低电平之间,利用delay函数进行led闪烁的控制。该延时的时间可以通过程序调节,呈现出不同的仿真效果。
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB8引脚配置
GPIO_InitStructure.GPIO_Mode = 0X10; //配置PB8为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB8
GPIO_SetBits(GPIOB,GPIO_Pin_8); //PB8输出高电平,LED熄灭
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8); //PB8输出低电平,LED点亮 GPIOx->BRR = GPIO_Pin;
Delay(500); //延时,保持点亮一段时间
GPIO_SetBits(GPIOB,GPIO_Pin_8);
Delay(500); //保持熄灭一段时间
}
}
仿真效果图如下,LED灯会按照固定的频率进行闪烁,且这个固定频率可调,可以在程序中修改后在观察效果。
仿真资源包含proteus仿真文件和keil源代码,下载的同学可以直接运行proteus观察试验效果。
基于Proteus无实物零基础STM32入门自学教程(一)--LED灯点亮闪烁-嵌入式文档类资源-CSDN下载