历史上的今天
今天是:2024年09月03日(星期二)
2020年09月03日 | stm32中gpio的学习浅谈
2020-09-03 来源:eefocus
在基本入门熟悉了开发环境后,我开始学习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语言功底并不很扎实,所以在结构体,枚举,宏定义以及一些强制类型转换的指针操作,我都添加了许多注释来增加印象。以上图文便是我本篇博客的全部内容了,继续保持学习分享更多的博客。
史海拾趣
|
【奇趣51DIY】之1——LC测量小工具(03月01日-04月10日) 经过了 寻人帖 和 意见征集,我们的『51DIY』活动已经引起了一部分坛友的热切关注,一周过去了,急不可待的你是否早已跃跃欲试? 今天开始,我们就要真正开始我们的DIY活动了!DIY第一波:LC测量小工具。这是在上一周的意见征集贴里,由quanzx大叔 ...… 查看全部问答> |
|
最近在帖子上看到有童鞋在问关于M3的优先级的问题,很多人都不太了解IntPriorityGroupingSet()和IntPrioritySet()的用户, 这里整理了一篇关于中断优先级的文章,请大家仔细阅读,如果还有不懂的,请与我联系。 qq:9064114 ...… 查看全部问答> |
|
本系统通过太阳能电池板配合升压稳压模块将太阳能转换为电能储存在电池中;光敏模块判断白天黑夜;热释电模块判断是否有人经过路灯;驱动模块驱动大功率LED;MSP430单片机通过控制输出PWM的占空比来控制大功率LED的亮度。整个系统可以实现利用太阳 ...… 查看全部问答> |
|
想用MSP430F5529做点小玩意玩玩,当然不是样品啦,准备小批量一点,嘿嘿。。。。但这次经历着实让我抓狂了一把。。。。 首先联系的当然是安富利,比较它比较大嘛。价格给的还是蛮合适的,但是要求出具公 ...… 查看全部问答> |
|
我是想说啊,ISD4004播放的时候不是找到对应的地址就播放了吗?如果不给他停止程序的话是不是就会一直播放下去?如果想要播放完那段就继续其他别的操作要怎么做?求指教!… 查看全部问答> |




