找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4747|回复: 1
打印 上一主题 下一主题
收起左侧

STM32F407 跑马灯实验

[复制链接]
跳转到指定楼层
楼主
ID:262 发表于 2014-10-24 13:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);

    }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72113 发表于 2015-1-12 23:09 | 只看该作者
有机会试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表