我就不把仿真文件和代码文件放在后面了,直接给有需要的人,还有不喜欢看内容的人
链接:https://pan.baidu.com/s/1cPim96Wg4YSeOjBA7YMDng
提取码:3gsp
1、首先打开Proteus 8它的主界面如下图所示
2、 新建工程并选择保存位置
3、画出单片机的最小系统,如下图所示
4、在此基础上,画出输入输出的引脚连接的物件,如图中的LED和按键开关
5、打开stm32cubeide,并新建stm32工程
6、选择单片机的型号为stm32f103r6 选择LQFP64封装
7、取个名字,点击完成,在弹出的窗口中有Linux的选项中选择No,之后就进行了如下图所示的界面
8、配置PA4和PA5引脚分别是输出和输入的引脚,如图所示
9、在左边选中RCC,将HSE和LSE配置成如下图所示,注:如果用内部时钟可以不用配置,系统默认使用内部时钟,并且在Proteus中也可以不用画出晶振
10、同样点击左边的GPIO将两个引脚配置成如下图所示
11、配置外部时钟,如果只用内部时钟可以跳过此步骤
12、 选择多文件系统,更有条理性(可以不用设置)
13、点击yes后会进入main.c函数的界面
14、在inc和src文件夹中分别新建led.h led.c key.h key.c 四个文件它们的代码如下
led.h:
#ifndef __LED_H
#define __LED_H
#include "gpio.h"
#define LED0(x) {(x==0)?(HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET)):(HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET));}
#define LED0_T HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
void led_init(void);
#endif
led.c
#include "led.h"
void led_init(void)
{
LED0(0); //init led0 and led1,close them.
}
key.h
#ifndef __KEY_H
#define __KEY_H
#include"gpio.h"
#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) /* 读取KEY0引脚 */
//#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) /* 读取KEY1引脚 */
//#define WKUP HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) /* 读取WKUP引脚 */
#define KEY0_PRES 1 /* KEY0按下 */
//#define KEY1_PRES 2 /* KEY1按下 */
//#define WKUP_PRES 3 /* WKUP按下 */
uint8_t key_scan(uint8_t mode);/* 按键扫描函数 */
#endif
key.c
#include "key.h"
#include "led.h"
//int ret;
/*
#define KEY0_RET 1
#define KEY1_RET 2
#define KEY2_RET 3
#define KEY_UP 1
#define KEY_DOWN 0
#define KEY0_VAL HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin);
#define KEY1_VAL HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);
#define KEY2_VAL
*/
uint8_t key_scan(uint8_t mode)
{
static uint8_t key_up = 1; /* 按键按松开标志 */
uint8_t keyval = 0;
if (mode) key_up = 1; /* 支持连按 */
if (key_up && (KEY0 == 0 )) /* 按键松开标志为1, 且有任意一个按键按下了 */
{
HAL_Delay(10); /* 去抖动,后面会换成高精度延时函数! */
key_up = 0;
if (KEY0 == 0)
keyval = KEY0_PRES;
}
else if (KEY0 == 1) /* 没有任何按键按下, 标记按键松开 */
{
key_up = 1;
}
return keyval; /* 返回键值 */
}
main.c文件也只需要修改下面的地方
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "key.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
uint8_t key_val;
led_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
key_val = key_scan(0);
if(key_val == KEY0_PRES)
{
LED0_T;
}
// LED0_T;
HAL_Delay(10);
}
/* USER CODE END 3 */
}
15、点击左上角的锤子进行编译,看是否有错误
16、在左边选中该工程右键选最后一个,或者Alt+Enter会弹出一个窗口
17、选择settings在其中勾选生成hex文件,然后再次编译,在debug文件夹中就会生成hex文件了
18、再次回到Proteus软件双击上面的晶振配置成32.768kHz,双击下面的晶振配置成8MHz
19、双击单片机在中间的文件program file中定位到hex文件,如图所示
20、单击左下角的运行按键,就可以看见单片机在运行了因为配置的引脚初始状态是down所以初始是亮灯的。而输入引脚是up的
单击一下(或长按)按钮可以看见输入引脚变蓝了(down)了,并且在松开按钮后LED灯灭了
说明一下函数key_scan中的参数如果是1则会立即响应。
再次单击则会点亮灯,从而实现了LED灯的翻转
总结:本篇文章只是一个引子,stm32低端产品的开发其实和51类似都是可以通过仿真来实现的,而且本篇文章只使用了两个软件,对于摸不到头脑的新手来说十分友好。注:若出现VSSA,VDDA的问题请参考本篇文章Proteus仿真错误解决方法:No power supply specified for net 5V in Power Rail Configuration._HALFA博客-CSDN博客_proteus仿真错误