STM32F4系列的GPIO寄存器和F1系列稍有不同,在这里介绍一下各个寄存器和专业名词。PP:推挽输出 PP+PU:带上拉的推挽输出 PP+PD:带下拉的推挽输出 OD:开漏输出 OD+PU:带上拉的开漏输出 OD+PD:带下拉的开漏输出Floating :浮空输入 Analog:模拟输入 MODER寄存器:设置GPIO模式寄存器,00输入模式,01输出模式,10复用模式,11模拟输入模式。 OTYPER寄存器:设置GPIO类型寄存器,仅在做输出时使用,0是推挽输出,1是开漏输出。 OSPEEDR寄存器:设置GPIO速度寄存器,有四种速度。 PUPDR寄存器:设置上拉下拉寄存器 设置步骤: 1. 使能GPIO时钟 2. 设置相应的IO口为输入或输出(MODER寄存器) 3. 设置输入\输出的类型(OTYPER寄存器) 4. 设置输出的速度(OSPEEDR寄存器 ) 5. 如果输出速度>=50M,开启补偿单元 6. 设置上拉下拉寄存器(PUPDR寄存器) 7. 通过复位置位寄存器和输入输出数据寄存器进行操作。
/*-----------------------------------------------------------------------------------------------------------------------------
实 验 一: 跑 马 灯
作 者 : 冰 点
日 期 :2014.2.20
软 件 平 台 : M D K 5.05
------------------------------------------------------------------------------------------------------------------------------*/
#include <stm32f4xx.h>
uint32_t Delaytime;
void Delay(int time)
{
Delaytime=time;
while(Delaytime!=0x00);
}
void LED_init(void)
{
RCC->AHB1ENR|=(1<<2);//开GPIOC时钟
GPIOC->MODER&=0xfffffcfc;
GPIOC->MODER|=0x00000101;//MODER寄存器设置IO作为输入还是输出
GPIOC->OTYPER&=~((1<<0)|(1<<4));
GPIOC->OSPEEDR&=0xfffffcfc;
GPIOC->OSPEEDR|=0x00000303;//速度最快
GPIOC->PUPDR&=0xfffffcfc;//无上拉下拉
SYSCFG->CMPCR = 0x00000001; //使用IO补偿单元 F2 F4新增功能,速度超过50MHZ时使用
}
void SysTick_Handler(void)
{
if(Delaytime!=0x00)
Delaytime--;
}
int main(void)
{
SystemInit();
SysTick_Config(SystemCoreClock/1000); // 每1ms中断1次 SystemCoreClock=168MHZ 也就是1S 168M次
/*----------------------------------------------------------------------------------------------------------------------------- 实 验 一: 跑 马 灯 作 者 : 冰 点 日 期 :2014.2.20 软 件 平 台 : M D K 5.05------------------------------------------------------------------------------------------------------------------------------*/#include <stm32f4xx.h> uint32_t Delaytime;void Delay(int time){ Delaytime=time; while(Delaytime!=0x00); }void LED_init(void){ RCC->AHB1ENR|=(1<<2);//开GPIOC时钟 GPIOC->MODER&=0xfffffcfc; GPIOC->MODER|=0x00000101;//MODER寄存器设置IO作为输入还是输出 GPIOC->OTYPER&=~((1<<0)|(1<<4)); GPIOC->OSPEEDR&=0xfffffcfc; GPIOC->OSPEEDR|=0x00000303;//速度最快 GPIOC->PUPDR&=0xfffffcfc;//无上拉下拉 SYSCFG->CMPCR = 0x00000001; //使用IO补偿单元 F2 F4新增功能,速度超过50MHZ时使用} void SysTick_Handler(void){ if(Delaytime!=0x00) Delaytime--;}int main(void){ SystemInit(); SysTick_Config(SystemCoreClock/1000); // 每1ms中断1次 SystemCoreClock=168MHZ 也就是1S 168M次
在CODE上查看代码片派生到我的代码片
LED_init(); // 中断时间 =168M/1000/168M=0.001S=1ms
LED_init(); // 中断时间 =168M/1000/168M=0.001S=1ms
[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片
while(1)
{
GPIOC->ODR^=((1<<0)|(1<<4));
Delay(1000);
}
|