本文是我在学习proteus软件和STM32CubeMX过程当中的心得和学习笔记,在学习时已经有C, C++的基础。文章附上了学习的代码,仅供大家参考。如果有问题,有错误欢迎大家留言。
此外,博主还有另外几篇文章,分别关于Python基础知识、Python的具体应用、C语言指针结构体的难点、C++入门和进阶知识点和C++高阶知识点,大家点击即可翻阅。
从15-16年开始,意法半导体公司(ST)逐渐停止了对SPL标准外设库的更新和维护,转向了HAL和LL库。对于STM32CubeMX的学习主要是学习HAL库,HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性,HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
参考了别的博主的博客和B站视频。
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 下载与安装教程。
第一步,新建一个项目,在搜索栏中输入本次要使用的仿真硬件,这里是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(双击)。
第三步,将Clock Configuration中的HCLK时钟改为72MHz(最高时钟频率),如图所示。
第四步,Project Maneger中将项目名称修改为LED,修改保存路径,修改设备型号和版本。最后在Code Generator中将生成.c和.h文件的选项打钩,点击生成代码,就可以在路径底下生成一个工程代码。到这一步为止,我们就生成了.c和.h文件,但是它是不能在单片机上运行的,要生成单片机能够运行的.hex文件还需要keil的帮助。
第五步,在生成的项目文件当中,找到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);
第六步,在Proteus中,点击新建项目,步骤参考自手把手教你上手Proteus。项目建好之后点击P,可以查找元器件。博主的Proteus版本太低,找不到C8,就用C6替代了,效果一样的。我们依次找到LED,电阻。
电源和地在这个图标中可以找到。
最终电路图如图所示,点击运行就小灯就闪烁起来了,至此第一个项目就完成了。
如果出现下面的错误,就是电网布置错误了,Design -> Configure Power Rails -> Power Rails -> Name, 在GND中将VDDA和VSSA移除,VDDA和VSSA添加到VCC/VDD中,点击OK,重新运行即可。
如图所示,我们打开在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。
在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