2 直接操作STM32寄存器的LED点灯测试程序
2.1 创建并编译工程
双击桌面上的“Keil uVision5”图标,启动MDK。
点击“Project”->“New uVision Project…”菜单项,打开工程创建向导。
选择工程目录,设置工程名字,点击保存。
在接下来的对话框中选择对应的SoC,点击“OK”。
在接下来的对话框中选择最基本的运行时软件组件,点击“OK”。
管理工程的项目。点击如下的图标,启动管理程序。
设置目标的名字为“STM32F103”,第一个组的名字为“Sources”,这些名字都可以根据需要任意取名。如下图所示,设置好后,点击“OK”完成工程的项目管理。
设置完成后,会在MDK集成开发环境的左边看到如下的树形目录结构。
新建源文件,并进行保存。
将新建的文件加入到工程中。
编写源代码。在新建的文件中加入以下代码,然后保存。
int main(void)
{
int i;
unsigned int *GPIOB_CRL = (unsigned int *)0x40010C00;
unsigned int *GPIOB_BSRR = (unsigned int *)0x40010C10;
unsigned int *RCC_APB2ENR = (unsigned int *)0x40021018;
*RCC_APB2ENR = 0x8;
*GPIOB_CRL = 0x44244444;
while (1) {
for (i = 0; i < 1000000; i++);
*GPIOB_BSRR = 0x20;
for (i = 0; i < 1000000; i++);
*GPIOB_BSRR = 0x200000;
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里解释一下上面的代码:
嵌入式外设基本都是通过操作一组特殊功能寄存器(SFR)来驱动硬件工作的,要能编写出能够使外设正常工作的代码就需要了解硬件的工作原理并熟读手册中的寄存器说明。下图是STM32F103的系统总线结构。
从上图中我们可以看到,我们编程的对象GPIOB是挂在APB2外设总线上的,编程GPIOB也就可能会和APB2产生联系。通过阅读芯片手册,发现一个相关的寄存器RCC_APB2ENR,这是一个挂接在APB2总线上的所有外设的时钟使能寄存器。时钟使能意味着外设可以在时钟的驱动下工作,所以他是GPIOB能工作的前提条件。查看寄存器,相应的描述如下:
所以*RCC_APB2ENR = 8的作用就是开始GPIOB的时钟。
GPIO管脚的功能是复用的,可以做输入,可以做输出,要驱动LED发光,管脚应该被配置成输出模式。GPIOx_CRx是端口配置的寄存器,每个端口用4个比特来控制,16个端口需要64个比特,也就使用了两个寄存器。对于GPIOB,这两个寄存器分别是GPIOB_CRL和GPIOB_CRH,GPIOB5对应的比特位为GPIOB_CRL[23:20],这4个比特位有不同的组合,决定了不同的管脚功能。
如果这4个比特位为0010,那么管脚为通用推挽输出,最大速率为2MHz。
语句*GPIOB_CRL = 0x44244444的作用就是将GPIOB5设为上面的输出模式,其他管脚保持复位的默认配置不变。
将管脚配置成输出后,就可以控制管脚输出高低电平,从而来控制LED的亮灭。GPIOx_BSRR寄存器用于该目的,该寄存器非常简单,高16位用于清除操作,即可使输出为低电平,低16位用于设置操作,即可使输出为高电平。
在上面的while循环中,先置位bit5,输出高电平,根据原理图,LED熄灭;延时后置位bit21,输出低电平,LED点亮,延时后循环进行,那么LED闪烁。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
编译工程。点击下图中两个工具按钮的其中之一都可以编译工程(左边一个按钮只重新编译修改的,速度更快,右边一个按钮是重新编译整个工程)。
如果没有问题,那么编译输出将会出现如下内容。
2.2 仿真
设置工程选项。点击如下图所示的工具栏按钮,打开工程选项设置按钮。
在Target选项卡中设置晶振频率为8MHz。
在Debug选项卡中设置使用仿真器进行调试,并设置动态库和参数,然后点击“OK”。
点击调试按钮开始调试,如下图所示。
选择查看外设。
启动逻辑分析仪。
在逻辑分析仪中查设置需要分析的信号,然后点击“Close”。
点击run按钮运行程序。
效果如下。