参考网友——正点原子之寄存器操作STM32F103ZE
寄存器操作:实验1 LED流水灯
STM32 IO简介 作为所有开发板的经典入门实验,莫过于跑马灯了。 该实验的关键在于如何控制STM32的IO口输出。了解了STM32的IO口如何输出的,就可以实现跑马灯了。通过这一节的学习,你将初步掌握STM32基本IO口的使用,而这是迈向STM32的第一步。 STM32的IO口可以由软件配置成8种模式: 1、输入浮空 2、输入上拉 3、输入下拉 4、模拟输入 5、开漏输出 6、推挽输出 7、推挽式复用功能 8、开漏复用功能 每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。STM32的很多IO口都是5V兼容的,这些IO口在与5V电平的外设连接的时候很有优势,具体哪些IO口是5V兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level标FT的就是5V电平兼容的)。 STM32的每个IO端口都有7个寄存器来控制。他们分别是:配置模式的2个32位的端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位/复位寄存器BSRR;一个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;这里我们仅介绍常用 的几个寄存器,我们常用的IO端口寄存器只有4个:CRL、CRH、IDR、ODR。 CRL和CRH控制着每个IO口的模式及输出速率。
该寄存器的复位值为0X4444 4444,从上图可以看到,复位值其实就是配置端口为浮空输入模式。从上图还可以得出:STM32的CRL控制着每个IO端口(A~G)的低8位的模式。每个IO端口的位占用CRL的4个位,高两位为CNF,低两位为MODE。这里我们可以记住几个常用的配置,比如0X4表示模拟输入模式(ADC用)、0X3表示推挽输出模式(做输出口用,50M速率)、0X8表示上/下拉输入模式(做输入口用)、0XB表示复用输出(使用IO口的第二功能,50M速率)。 CRH的作用和CRL完全一样,只是CRL控制的是低8位输出口,而CRH控制的是高8位输出口。这里我们对CRH就不做详细介绍了。
给个实例,比如我们要设置PE2,3,4,5位为推挽输出。
代码如下: GPIOE->CRL&=0XFF0000FF;
GPIOE->CRL|=0X00333300;//PE2,3,4,5推挽输出
GPIOE->ODR|=0X003C; //PE2,3,4,5输出高 通过这3句话的配置,我们就设置了PE2,3,4,5推挽输出。 ODR是一个端口输出数据寄存器,只用了低16位。
led.c文件部分内容:
//初始化PE2,3,4,5推挽输出.并使能PORTE时钟
//LED IO初始化
void LED_Init(void)
{
RCC->APB2ENR|=1<<6; //使能PORTE时钟
GPIOE->CRL&=0XFF0000FF;
GPIOE->CRL|=0X00333300;//PE2,3,4,5推挽输出
GPIOE->ODR|=0X003C; //PE2,3,4,5输出高
}
led.h文件部分内容:
//LED端口定义
#define LED0 PEout(2)// PE2
#define LED1 PEout(3)// PE3
#define LED2 PEout(4)// PE4
#define LED3 PEout(5)// PE5
void LED_Init(void);//初始化
主函数:
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
}
详情请登录网友——正点原子官方论坛http://www.openedv.com/forums/list.htm或下载《STM32不完全手册V2.0》
源代码:实验1 LED流水灯.rar