新手入门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) {
    
}

你可能感兴趣的:(学习,stm32,单片机,嵌入式硬件)