标题: STM32F407 跑马灯实验 [打印本页]

作者: heicad    时间: 2014-10-24 13:32
标题: STM32F407 跑马灯实验
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);

    }


作者: wcm_e    时间: 2015-1-12 23:09
有机会试试




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1