1.使能时钟
stm32有AHB,APB1,APB2三条时钟总线,我们的外设就挂在在这三条总线下,所以当用到某个外设时,我们需要打开相应的外设的时钟.
以APB2为例:我们需要用到GPIOB,则让对应的位为1. RCC->APB2ENR|=1<<3
2.配置相应的模式
GPIOX_CRL: 端口配置低寄存器
GPIOX_CRH:端口配置高寄存器
每四位控制一个IO口,CRL控制低八位(0~7)IO口,CRH控制高八位(8~15)
低两位MODEy[1:0]:00输入模式,01输出模式的最大速度10MHz,10输出模式的最大速度2MHz,11输出模式的最大速度50MHz(低两位决定了输入输出模式,并且在输出模式下还决定了输出速度)
高两位CNFy[1:0]:
当为输入模式时:00模拟输入,01浮空,10上拉/下拉输入模式(ODR决定上拉下拉),11保留
当为输出模式时:00通用推挽输出,01通用开漏输出,10复用推挽输出,11复用开漏输出
CRL寄存器:
例如需要配置GPIOB第五引脚:(注意第五引脚是第六个引脚)
GPIOB->CRL&=0xff0fffff //将pin5对应的四个控制位清零,其他保持不变
GPIOB->CRL|=0x00300000 //设置pin5引脚为推挽输出,最大翻转速度为50MHz
(以上配置的是通用推挽输出,同理我们可以通过改变CRL的值来配置不同的输入输出模式,当需要配置上拉和下拉时我们需要将ODR对应位置0或1)
例如需要将GPIOB_Pin5设为上拉输入:GPIOB->CRL&=0xff0fffff; GPIOB->CRL|=0x00800000; GPIOB->ODR=1<<5;
3.端口输出高低电平
ODR寄存器:
该寄存器只用到了低16位,因为我们的芯片只有16脚,所以高位没用到,当我们需要将某引脚置1或0,只需要左移相应的引脚,例如第0引脚则左移0,第1引脚左移1.依次类推
GPIOB->ODR=1<<5;
程序:
#include "stm32f10x.h"
int main(void)
{
RCC->APB2ENR=1<<3;
GPIOB->CRL&=0xff0fffff;
GPIOB->CRL|=0x00300000;
GPIOB->ODR=0<<5;
}