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

编程知识 更新时间:2023-04-06 21:14:38

纪录一下自己的学习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) {
    
}

更多推荐

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

本文发布于:2023-04-06 21:14:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/73113799286d79cbe244cc2dcef11d54.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:寄存器   新手入门   过程   led

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 50865文章数
  • 14阅读数
  • 0评论数