admin管理员组

文章数量:1794759

新手入门stm32F407用寄存器点亮一个led灯过程分享

新手入门stm32F407用寄存器点亮一个led灯过程分享

纪录一下自己的学习stm32寄存器点灯的过程 看完这个过程可能不会让你点灯成功 但是会让大家对寄存器点灯更加透彻

1.我觉得寄存器点灯是stm32中非常需要学习的东西 2.直接上手库函数的话可能就不知道自己用的东西是怎么回事(底层一点的知识) 3.库函数是建立在寄存器的基础上的

先来类比一下:

大家试想一家酒店有很多家房间,房间都有门牌号,我们可以将这个门牌号看成c语言中的指针。房间这个实体看成寄存器,我们就可以通过门牌号去找到各个寄存器,也就是通过指针去找到寄存器,当然找到房间之后我们可以改变房间里面的东西,就相当于通过指针对寄存器进行读写操作

stm32其实将寄存器和地址已经对应好了,哪些地址可以找到哪些寄存器我们可以通过官方手册查找到的,就相当于酒店里面的哪些门牌号对应哪些房间都已经固定了的。

c语言中怎样对地址进行操作呢?       

(unsigned int*)0x40021400 = 10;   这个代码的意思是我们将地址值为0x40021400的内存的值修改成10。相当于我们通过门牌号0x40021400找到了一个房间然后给这个房间装了10个人。

试想一下如果我们查找到了一个寄存器对应的地址为0x40021400, 那我们是不是就可以通过地址修改寄存器上的值,然后控制io口电平状态的输出,进而控制led的亮灭呢?

好了,接下来我们来理解理解点灯代码

/* 点灯步骤 第一步:开启GPIO的端口时钟 第二步:控制GPIO的方向 第三步:控制GPIO的输出寄存器 */

这是在keil5里面创建的main.c int main(void){   //开启GPIO的端口时钟    *(unsigned int*)(0x40023800 + 0x30) |= (1<<5);//可以理解为找到时钟寄存器并将它打开了。就是通过时钟寄存器的地址对他的值进行操作

    //控制GPIO的方向,对其先进行复位然后再控制输入输出方向    *(unsigned int*)(0x40021400 + 0x00) &= ~(0x03<<(2 * 6));//可以理解为通过模式寄存器地址(0x40021400 + 0x00)来控制gpio的输入输出,写入不同的值会有不同的方向

   *(unsigned int*)(0x40021400 + 0x00) |= (1<<(2 * 6));//可以理解为     

//控制GPIO的输出寄存器

//输出高电平    *(unsigned int*)(0x40021400 + 0x14) |= (1<<6);//可以理解为通过输出寄存器地址(0x40021400 + 0x14)控制输出寄存器。 //输出低电平    *(unsigned int*)(0x40021400 + 0x14) &= ~(1<<6);//将GPIO的ord寄存器的第六位置为0; }

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

本文标签: 寄存器新手入门过程led