stm32 史上最简单得GPIO设置

stm32f4 GPIO寄存器设置

 说起GPIO设置,是大部分人学单片机得第一步,常常也是最后一步,哈哈。stm32 库函数的GPIO采用结构体实现,洋洋洒洒,让人看不到底。针对库函数和寄存器编程方法的选择,我是这么理解的,如果你想系统学习嵌入式,我劝你放下库函数,拿起寄存器。如果你在快速开发,只是做个应用,那么我劝你用库函数就足够了,本文旨在从零开始,打地基,所以用一用寄存器一砖一瓦吧。本文以一个简单的高电平来实验。

1. GPIO基本设置

 stm32的低功耗设计,为每个模块设计了时钟开关,用的打开,不用的关闭,完全是为了省电。所以大家不要嫌麻烦,在电池供电时候,这个很好用的。下面代码中RCC系列寄存器中,一部分用来管理各个模块的时钟,具体看下datasheet,一目了然。

RCC->AHB1ENR |= (uint32_t)(1<<0); //enable the GPIOA clk
GPIOA->MODER |= (uint32_t)(5<<16); //A8  output
GPIOA->OSPEEDR|= (uint32_t)(0<<16); //A8  low speed 
GPIOA->PUPDR = (uint32_t)(5<<16); //A8  pullup`在这里

 设置完时钟后,就可以使用GPIO的正常功能了。
在GPIO设置过程中,首先选引脚,stm32中A,B,C,等GPIO口均对应一组寄存器,所以选引脚,首先选寄存器组,GPIOA还是GPIOB。这里选GPIOA,然后设置输出模式,设置速度,设置上拉。然后最简单的GPIO配置就完成了。接下来是控制输出了了。

2.GPIO输出控制

GPIO输出高电平和低电平,stm提供了BSRR寄存器,可以按位拉高和拉低,stm32还提供了一个数据寄存器,可以按字节操作,方便的很。下面采用BSRR寄存器来拉高拉低。

GPIOA->BSRR |=(uint32_t)(1<<8);  //set A8 low
GPIOA->BSRR |=(uint32_t)(1<<24); //set A8 high

3.总结

 有时使用寄存器,程序反而更简洁。学会控制GPIO,其他模块的流程大体一样。

你可能感兴趣的:(从零单排嵌入式)