编写keil5代码实现proteus仿真stm32点灯

工具:keil5,proteus,stm32中文文档

要求:两个灯循环亮灭

keil5配置包

keil5中我安装的MDK版本,同时也安装了stm32f1xx的包,如图中版本

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例


有这个包就可以了,不用cube直接生成,因为只需要点个灯,当然最简单最好。

proteus原理图

protues stm32 仿真案例 proteus仿真stm32f103zet6_单片机_02

keil5配置

新建一个project

protues stm32 仿真案例 proteus仿真stm32f103zet6_proteus_03


点击第一个新建工程,选择一下目录

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_04


这里我命名为1,上边是proteus原理图,我也命名的为1,保存。

protues stm32 仿真案例 proteus仿真stm32f103zet6_引脚_05


这里我们就搜索stm32f103t6,有一个选项,如果没有安装stm32f1xx的包,这里是搜索不到的,需要自行打开pack那个文件安装到keil对应的目录。

我们选中芯片,点击ok

protues stm32 仿真案例 proteus仿真stm32f103zet6_proteus_06


弹出这个界面,我们选择这两项然后点ok。工程文件建好了。 我们双击Source Group 1,这里弹出下边界面

protues stm32 仿真案例 proteus仿真stm32f103zet6_stm32_07


我们新建一个main.c的文件添加进去。

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_08

protues stm32 仿真案例 proteus仿真stm32f103zet6_proteus_09


我们把hex文件也勾上,在构建的时候会生成这个文件好放入proteus芯片中进行仿真

protues stm32 仿真案例 proteus仿真stm32f103zet6_引脚_10


接下来就可以编写main代码了

main代码实现

流程:

一、原理图中我们把两个LED接在了PA8和PA9两个接口,在驱动这两个引脚之前,我们要先使能这两个引脚,也就是把他们时钟使能打开,这样你才能让这两个引脚工作,
二、然后我们再进行引脚的一个初始化,比如设置引脚的工作模式,因为stm32一个引脚可以有很多种工作方式,所以我们设置一种就可以。
三、前两种设置好之后,我们就可以控制引脚状态,让他高电平或者低电平来控制LED灯开关。

一、时钟使能寄存器寻找

打开stm32中文文档

直接搜索RCC,找到如图所示的,要看准是外设时钟使能,

protues stm32 仿真案例 proteus仿真stm32f103zet6_单片机_11


直接跳转到 7.3.7

protues stm32 仿真案例 proteus仿真stm32f103zet6_proteus_12


我们可以沿着7.3.7里边的内容,来寻找到IOA的时钟使能对应的控制位

protues stm32 仿真案例 proteus仿真stm32f103zet6_单片机_13


到这里我们记录下了时钟使能的寄存器(RCC_APB2ENR),PA引脚时钟和i能对应的位是位2。

main编写:
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

等号左边是官方定义好的寄存器,右边是也是官方定义的一个状态,两个都是直接引用官方库中头文件中的值,就是方便使用的,大家也可以右键查看定义,追踪一下看看地址对不对。

二、GPIO寄存器寻找

回到stm32中文文档,继续搜索GPIO找到GPIO寄存器描述

然后

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_14


protues stm32 仿真案例 proteus仿真stm32f103zet6_proteus_15


小结:到这里我们知道了,端口配置的寄存器(GPIOA_CRH),可以配置两种工作模式,输入与输出,我们点亮LED灯需要输出模式,而且还是通用推挽输出模式,而且PA8和PA9对应的也就是从0位一直到7位,0到3是PA8引脚的配置,4到7是PA9引脚的配置。我们随便选一个MODE的配置,比如选择01模式,最大速度10MHz,所以寄存器我们设置成如图所示的位

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_16

GPIOA->CRH &= ~0x000000ff; // 0到7位清零
GPIOA->CRH |= 0x00000011; // 位0置1,位4置1
三、引脚控制

引脚控制好找,直接寻找GPIOA_ODR寄存器就可以,

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_17


改变如图这两个位就可以实现引脚输出高低电平。先不编写代码,前两部初始化好了之后,我们直接编译,构建,把hex文件放入proteus中看下两个灯的初始状态。

protues stm32 仿真案例 proteus仿真stm32f103zet6_protues stm32 仿真案例_18


初始化结束后就直接是低电平,那我们要熄灭他直接让他输出高电平就可以了。

GPIOA->ODR |= 1<<9; // PA9拉高,关灯
delay_ms();		// 延迟
GPIOA->ODR &= ~(1<<9);	//PA9拉低,开灯
GPIOA->ODR |= 1<<8;			// PA8拉高,关灯
delay_ms();	// 延迟
GPIOA->ODR &= ~(1<<8);	//PA8拉低,开灯

全部代码

#include "stm32f10x.h"                  // Device header
void delay_ms(void)
{
	for(int i=1000;i>0;i--)
		for(int j=600; j>0; j--);
}
int main()
{
	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
	GPIOA->CRH &= ~0x000000ff;
	GPIOA->CRH |= 0x00000011;
	while(1)
	{
		GPIOA->ODR |= 1<<9; // PA9拉高,关灯
		delay_ms();		// 延迟
		GPIOA->ODR &= ~(1<<9);	//PA9拉低,开灯
		GPIOA->ODR |= 1<<8;			// PA8拉高,关灯
		delay_ms();	// 延迟
		GPIOA->ODR &= ~(1<<8);	//PA8拉低,开灯
		
	}
}

这样就实现两个灯循环亮了;