×
单片机 > 单片机程序设计 > 详情

STM32入门——第一天学习GPIO

发布时间:2020-06-01 发布时间:
|

第一步 学习GPIO,以按键控制跑马灯为例


      GPIO是相对于stm32来说的,也就是芯片上的IO引脚,如C51上的P0口。但是stm32上的io口拥有更强大的功能,有GPIOA~G。每个GPIOx共15个引脚,刚开始学习时对于每个IO口的N多个功能没必要深究,但要记住几个重要的功能:输入上拉,输入下拉,推挽输出。这是本次试验用到的。

      输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平。

      输入下拉:同理此时按键与电源相连,按下即为高电平,下拉就是该IO口通过一个电阻与地相连,没按下为低电平,按下为高电平。(这是我个人的简单理解哦,有大神有更深的理解的话可以在下面留言哦!共同进步嘛!)


       推挽输出:作为普通的IO口输出高低电平。


       工程配置好后,可以写代码点亮LED灯了:


       首先讲下几个控制IO口的寄存器:


Stm32每个IO口都由7个寄存器来配置, CRL 和 CRH、IDR 和 ODR、BSRR、BRR、LCKR;


       CRL、CRH  是32位寄存器,CRL控制GPIOx的低8位,CRH控制高8位,每个GPIO共16个IO口,每4个位控制一个IO口。MODEx为00,为输入模式,其余(如01)为输出模式。CNFx控制,是什么样的输入输出模式,如表:


   模式配置表:


  如GPIOA->CRL=0x4444;意思是将GPIOA低8位设置为浮空输入模式;


CRH同理。



    IDR是一个32位寄存器,低16位有效,只读,这些位以16位读出,读出的数据为当前IO口输入状态,如DATA=GPIOA->IDR;表示读出GPIOA的16位IO口输入状态。


    ODR是一个32位寄存器,低16位有效,可读写,从该寄存器读出来的数据用于判断当前 IO 口的输出状态。向该寄存器写数据,则可以控制某个 IO 口的输出电平。如GPIOA->ODR=0x0000;表示GPIOA所有IO口输出低电平。


    接下来是配置跑马灯的代码:


我的板子上与LED灯相连的IO口为PC.0和PC.1;


     

使用任何一个IO口之前都要使能它的时钟,时钟使能寄存器如图:



写RCC->APB2ENR|=1<<4;使能GPIOC的时钟。其它功能以后会用到。


 


配置完后,就可以控制IO口输出电平来控制LED灯亮灭了。


可以通过在主函数写GPIOC->ODR&=0xFFFE;(PC.0=0)或者GPIOC->ODR|=1;(PC.0=1);


或者用原子程序的位带操作也可。


接下来是按键操作:


    按键操作只需将与按键相连的IO口设置为输入模式,然后不断检测IO口的输入电平。(值得注意的是:如果按键与地相连,则相应IO口设为上拉模式,如果与电源相连,则相应IO口设为下拉模式。)


按键的扫描函数,主要看如何实现数据采集过程



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会