STM32入门——第一天学习GPIO

第一步 学习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 和 CRHIDR 和 ODRBSRRBRRLCKR

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

STM32入门——第一天学习GPIO_第1张图片


   模式配置表:


              STM32入门——第一天学习GPIO_第2张图片


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

CRH同理。

 

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

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

 

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


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

           STM32入门——第一天学习GPIO_第3张图片



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


STM32入门——第一天学习GPIO_第4张图片




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

 

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

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

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

 

 

接下来是按键操作:


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



STM32入门——第一天学习GPIO_第5张图片



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


STM32入门——第一天学习GPIO_第6张图片



























































你可能感兴趣的:(STM32学习)