led.c 文件中输入如下代码

#include "led.h"  

//初始化PF9和PF10为输出口.并使能这两个口的时钟         

//LED IO 初始化

void LED_Init(void)

{         

   GPIO_InitTypeDef  GPIO_InitStructure;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能 GPIOF时钟

   //GPIOF9,F10 初始化设置

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0 和 LED1对应IO 口

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

   GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO

GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭

}

该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PF9和PF10 为推挽输出。这里需要注意的是:在配置STM32 外设的时候,任何时候都要先使能该外设的时钟!GPIO 是挂载在AHB1 总线上的外设,在固件库中对挂载在 AHB1 总线上的外设时钟使能是通过函数RCC_AHB1PeriphClockCmd ()来实现的。

对于这个入口参数设置,看看我们的代码:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能 GPIOF时钟

这行代码的作用是使能AHB1总线上的GPIOF时钟。

在设置完时钟之后,LED_Init 调用 GPIO_Init 函数完成对 PF9 和 PF10 的初始化配置,然后调用函数GPIO_SetBits控制 LED0和 LED1输出 1(LED 灭) 。至此,两个LED的初始化完毕。这样就完成了对这两个 IO 口的初始化。这段代码的具体含义,大家可以看前面一小节,我们有详细的讲解。初始化函数代码如下:

//GPIOF9,F10 初始化设置

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0 和 LED1对应IO 口

   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

   GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO

GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭

保存 led.c代码,然后我们按同样的方法,新建一个 led.h 文件,也保存在LED文件夹下面。

在 led.h中输入如下代码:

#ifndef __LED_H

#define __LED_H

#include "sys.h"

//LED 端口定义

#define LED0 PFout(9)  // DS0

#define LED1 PFout(10)// DS1    

void LED_Init(void);//初始化                   

#endif

这段代码里面最关键就是2个宏定义:

#define LED0 PFout(9)  // DS0 PF9

#define LED1 PFout(10)// DS1 PF10

这里使用的是位带操作来实现操作某个 IO 口的 1 个位的,需要说明的是,这里同样可以使用固件库操作来实现 IO 口操作。

如下:

GPIO_SetBits(GPIOF, GPIO_Pin_9);         //设置GPIOF.9 输出 1,等同 LED0=1;

GPIO_ResetBits (GPIOF, GPIO_Pin_9);       //设置 GPIOF.9输出 0,等同 LED0=0;

有兴趣的朋友不妨修改我们的位带操作为库函数直接操作,这样也有利于学习。

 

回到主界面后,在main函数里面编写如下代码:  

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

int main(void)

{  

delay_init(168);       //初始化延时函数

LED_Init();             //初始化 LED 端口

    

while(1)

{

GPIO_ResetBits(GPIOF,GPIO_Pin_9);  //LED0对应引脚GPIOF.9 拉低,亮  等同 LED0=0;

GPIO_SetBits(GPIOF,GPIO_Pin_10);   //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;

delay_ms(500);           //延时 500ms

GPIO_SetBits(GPIOF,GPIO_Pin_9);      //LED0对应引脚GPIOF.0拉高,灭  等同LED0=1;

GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮  等同LED1=0;

delay_ms(500);                     //延时 500ms

}

}

代码包含了#include "led.h"这句,使得 LED0、LED1、LED_Init 等能在 main()函数里被调用。这里我们需要重申的是,在固件库中,系统在启动的时候会调用 system_stm32f4xx.c 中的函数SystemInit()对系统时钟进行初始化,在时钟初始化完毕之后会调用main()函数。 所以我们不需要再在 main()函数中调用SystemInit()函数。当然如果有需要重新设置时钟系统,可以写自己的时钟设置代码,SystemInit()只是将时钟系统初始化为默认状态。

main()函数非常简单,先调用delay_init()初始化延时,接着就是调用 LED_Init()来初始化GPIOF.9和GPIOF.10为输出。最后在死循环里面实现LED0和LED1交替闪烁,间隔为500ms。

上面是通过库函数来实现的 IO 操作,我们也可以修改main()函数,直接通过位带操作达到

同样的效果,大家不妨试试。位带操作的代码如下:

int main(void)

{  

delay_init(168);       //初始化延时函数

LED_Init();            //初始化 LED 端口

   while(1)

  {

            LED0=0;         //LED0亮

           LED1=1;        //LED1灭

      delay_ms(500);

      LED0=1;        //LED0灭

      LED1=0;        //LED1亮

      delay_ms(500);

    }

}

当然我们也可以通过直接操作相关寄存器的方法来设置IO,我们只需要将主函数修改为如

下内容:

int main(void)

{  

  

  delay_init(168);       //初始化延时函数

  LED_Init();             //初始化 LED 端口

  while(1)

  {

      GPIOF->BSRRH=GPIO_Pin_9;//LED0亮

    GPIOF->BSRRL=GPIO_Pin_10;//LED1灭

    delay_ms(500);

      GPIOF->BSRRL=GPIO_Pin_9;//LED0灭

GPIOF->BSRRH=GPIO_Pin_10;//LED1亮

       delay_ms(500);

    }

  }

将主函数替换为上面代码,然后重新执行,可以看到,结果跟库函数操作和位带操作一样的效果。大家可以对比一下。这个代码在我们跑马灯实验的main.c文件中有注释掉,大家可以替换试试。


关键字:STM32f4  跑马灯  实验代码 引用地址:STM32f4---跑马灯实验代码

上一篇:STM32f4---蜂鸣器实验代码
下一篇:STM32F4时钟使能和配置

推荐阅读

新闻摘要:•  Arm以引领安全为己任,加速自动驾驶技术在大众市场部署•  Arm “安全就绪”(Safety Ready)计划:协助Arm芯片合作伙伴开发车用SoC•  分核-锁步(Split-Lock):在应用处理器中首次搭载具有颠覆性的安全创新•  针对7纳米制程进行优化,Cortex-A76AE是全球第一款具有集成安全、高性能、领先效率和防护等IP选项的自动驾驶级处理...
  theverge报道称,三星Galaxy Fold已在美国上市开售,售价1980美元。三星表示,在2019年12月31日前购买Galaxy Fold的用户可享受Galaxy Fold Premier Service,不过这项服务并没有提供像其他三星手机那样的标准服务,而是只提供一次性换屏服务,售价149美元。  报道中还指出,那些想购买三星Galaxy Fold的用户,需要到AT&T部分门店、Best Buy门...
  经济实惠且灵活的储能技术将推动全球向清洁能源的过渡,使清洁电力能够渗透到新兴的应用领域。根据欧洲专利局(EPO)和国际能源署(IEA)今天发布的一项新的联合研究报告,在2005年至2018年期间,全球电池和其他储能技术的专利以每年14%的速度增长,是所有技术领域平均水平的四倍。   报告《电池和电力存储的创新–基于专利数据的全球分析》显示...
Generac推出一款新型微型逆变器进军太阳能储能市场。该美国制造商除了专门生产备用发电设备的,还提供备用电池存储解决方案。图片:GeneracGenerac是为住宅、轻型商业和工业市场提供备用发电产品的美国制造商,公司将 推出 两款住宅用新型光伏太阳能微型逆变器。Generac推出的PWRmicro 1:1产品是单模块微型逆变器,PWRmicro 2:1是720W双模块微型逆变器...

史海拾趣

问答坊 | AI 解惑

十万火急!

首先,不知道属于那个模块,关于用电的放在这里再说,版本见谅! 最近学校为了防止大功率电器,不知道用的什么破玩意,用电用限制啦!负荷多了就跳闸的! 具体电气描述如下: 宿舍电气不多,四台台式液晶电脑,五个电风扇,五个台灯,三个灯管, ...…

查看全部问答∨

周4这个任务交差,哪个帮我看下如何修改LED闪烁方式

两种键盘  1.单行的时候有的时候有2个灯在闪烁 2.双行的时候任何时候时候都只一个灯在闪烁   我现在把P3.6口的状态作为单行和双行区别 P3.6=高..单行 P3.6=低..双行 所发为单行键盘 程序,,,哪个帮我添加个功能,,使单行双行都可以 ...…

查看全部问答∨

ADS1210的DSIO输出编程问题

  这两天在调一块板子,使用ADS1210作AD采样,硬件采用三线连接:/DRDY,SDIO,SCLK,使用SDIO输出。但是在读取1210输出寄存器的时候,老是读到三个字节的0x00,请问是怎么回事啊,请达人赐教,谢谢! 1210初始化及读取程序:   while ...…

查看全部问答∨

arm9和arm7区别?

谢谢,指点迷津…

查看全部问答∨

wince 5.0如何去掉右下角的时间显示

因为系统一直都要断电的,时间不准,所以不想让他显示在那里,请问如何实现,谢谢。…

查看全部问答∨

谁那里有DbgView的源代码?

谁那里有DbgView的源代码?麻烦您发给我一份,急用。。。 多谢啦。。 我的邮箱 xushuaipri@foxmail.com…

查看全部问答∨

ADS7843触摸屏问题

各位好~我在做一款ARM板,CPU使用AT91SAM9261,WINCE系统.用ADS7843做触摸屏控制,现在的问题是功能实现了,但是在点击触摸屏时,会出现这样的问题.在点击的一点与其他不固定一点拉出一个框框.就类似按住鼠标左键鼠标在电脑桌面上拉动鼠标圈出的框框是 ...…

查看全部问答∨

BC4 ROM版 with no EEPROOM 搜索遇到不到设备

用的协议栈是微软自带的,主要是要配置pskey值,值都配置好了。但是warm reset后打印出pskey值又成默认的了。 希望做过这方面的达人给你点意见。 分没有多少,就先给100好了.不够再加.…

查看全部问答∨

单片机编程器疑问??

刚学习单片机中,忽然想到程序是怎样下载到ROW中,想不明白啊!编程器的大致原理还请在座那位高手指点一下!我现在所知道的:每种编程器都是针对不同的MCU的,从芯片方面,其厂商的主页上有关于它产品的烧录相关资料,但基本看不懂!而中文网页上搜 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved