STM32教程第三节:编写第一个LED灯亮起的程序(附实物图)

编写第一个程序使得LED灯亮起

前言

        通过上节课的学习,我们已经学会了如何在keil5 MDK中创建工程,那么本节课我们继续学习在上一节的工程中如何编写代码,使得指南者板上的绿,蓝,红灯亮起。

代码展示

#include "stm32f10x.h"

int main(void)
{
	//打开 GPIOB 端口的时钟
	*(unsigned int*)0x40021018 |= (1<<3);
	
	//配置IO口为输出
	*(unsigned int*)0x40010c00 |= ((1)<<(4*1));//*0,*1,*5
	
	//控制 ODR 寄存器
	*(unsigned int*)0x40010c0c &= ~(1<<0);
}

void SystemInit(void)
{
	//函数体为空,目的是为了骗过编译器不报错
}

        以上就是我们本节课的全部代码,接下来会逐步讲解代码,并逐步分析代码效果。

分析LED亮起所需要改变寄存器的过程

        从stm32f10x官方手册中我们可知,我们想要点亮LED灯,就要打开GPIOB,而GPIOB在APB2上,再向左链接AHB系统总线。而想要控制打开这个通道,就要打开APB2在AHB中的寄存器,即APB2 外设时钟使能寄存器(RCC_APB2ENR),通过查阅资料得知各个内置外设的起始地址。

打开APB2 外设时钟使能寄存器(RCC_APB2ENR)的IOPB EN口

        而APB2 外设时钟使能寄存器(RCC_APB2ENR) 的起始地址为 0x4002 1000 – 0x4002 13FF (复位和时钟控制(RCC)),而该寄存器在地址上有0x18的偏移,即0x40021018为最终地址。

        然后这个最终地址在我们的keil5编译器中是不会被认为是地址的,所以我们要强制转换为地址格式,详细转换方法在小编的第一节课中提到,即转换为 *(unsigned int*)0x40021018 指针地址模式。到这里我们就已经找到了APB2 外设时钟使能寄存器(RCC_APB2ENR) 要打开的地址。

        

        在APB2
总线上的外设被访问时,将插入等待状态直到
APB2
的外设访问结束。

注:

        当外设时钟没有启用时,软件不能读出外设寄存器的数值,返回的数值始终是0x0。

        所以我们要把该寄存器上的IOPB EN处置为1,而剩下的都为0。即根据位运算可知要想只置IOPB EN口为1,则在原来的地址上|=上(1<<3)所得出的新地址即为只改变IOPB EN口为1的地址。到这里我们就打开了 GPIOB 端口的时钟。

控制ODR寄存器输出

        由资料可知,PB0在端口输出数据寄存器(GPIOx_ODR) (x=A..E) 的GPIOB上,在GPIOB上,从0~15这一共16个io口,分别对应PB0~PB15.而我们要打开PB0,就是要使得ODR0为1。

        先找到初始地址为0X4001 0C00 – 0x4001 0FFF,偏移量为0Ch,即地址为0X4001 0C0C。而我们如果要使ODR0为1,那么就要与上(1<<0)的取反,即&~(1<<0)。这样就控制了ODR0为1,剩下的都为0。这样就打开了PB0,使得LED灯green就可以编译了。

配置IO口为输出

        我们知道LED灯的io口可以配置成输入,也可以配置成输出。所以我们设置的PB0它系统默认是输入模式。我们要调成输出模式这就要用到端口配置低寄存器(GPIOx_CRL) (x=A..E)。它控制下八位io口。

        如图所示,我们所需要配置的就是CNF0[1:0]和MODE0[1:0]。在这里我们要使用推挽输出模式,即00。然后配置mode0为01,即10MHz。总和为0001。

        然后他的初始地址为0X4001 0C00,无偏移量,所以该地址或上((1)<<(4*1))。,要打开别的口,led为P0,P1,P5口,就更改位数的值为0,1,5。

实物图展示

总结

        本节课我们编写了一个程序使LED灯依次亮起红,蓝,绿,分析了代码改变寄存器的过程以及设置外设控制oDr寄存器,输出配置io口,打开外设时钟使能寄存器的具体口。下节课我们讲使用寄存器点亮LED并编写寄存器,使得代码更条理。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32教程第三节:编写第一个LED灯亮起的程序(附实物图)

发表评论