stm32中gpio的学习浅谈

      在基本入门熟悉了开发环境后,我开始学习stm32中的gpio口用法,学习的方法还是最直观简便的先控制LED灯。然而stm32中点亮led倒没有51单片机那么简便。有过51单片机学习经验的伙伴们,肯定熟悉下图的代码(51中控制led的程序)。

      

     如果同样方法写在stm32中肯定是不行的了,首先因为stm32中没有51头文件中那样定义好了P0口可以直接进行总线操作,其次stm32中的gpio口默认是输入模式并且还需要打开相关引脚口的时钟。可能很多人会觉得stm32中官方给的固件库可以直接操作寄存器从而控制gpio口,但是我觉得我这样的初学者还是多了解下底层的方法便于更好的理解。要实现stm32点亮一个led灯(即让gpio口输出一个高电平)一共分三步:

       第一步:通过时钟控制寄存器rcc打开相应gpio口的时钟如下例中的PB0。

       第二步:通过CRL寄存器设置gpio口为推挽输出模式。

       第三步:通过ODR寄存器将相应gpio口输出电平。

      所谓单片机中的寄存器,其实就是一些有特殊功能的内存单元,是生产官方配置的。而我们正是通过寄存器来实现单片机的各种控制。下面来讲解下我所用的三种方法,首先是最原始的直接操作内存单元。相应的寄存器内存地址是通过官方手册查找的,代码如下:

      

      很明显,虽然第一种方法是非常简短且不需要额外库函数的代码,但是程序的可读性和可移植性都非常差。于是我便采用了第二种使用寄存器映射的方法,所谓寄存器映射也可以理解成就是定义寄存器别名的过程。


               第三种也是最后一种便是使用官方所给的固件库了,其实原理大致也就是用宏定义和结构体定义些基地址,然后把寄存器的位操作过程等都写在库函数中封装起来,我们只要操作相应库函数就可以了。为了增加可读性,我把库函数再宏定义了一遍。


      上图代码中那个延时函数是为因为还有没有学习中断才这样写,师兄也指出来和我说那是很不好的习惯,因为在等待延时过程中别的任务都无法运行并且时钟的延时精度不高。由于之前我的C语言功底并不很扎实,所以在结构体,枚举,宏定义以及一些强制类型转换的指针操作,我都添加了许多注释来增加印象。以上图文便是我本篇博客的全部内容了,继续保持学习分享更多的博客。

猜你喜欢

转载自blog.csdn.net/qq_42660303/article/details/81058615