STM32f4---跑马灯实验代码

发布者:那是一条路都最新更新时间:2018-09-29 来源: eefocus关键字:STM32f4  跑马灯  实验代码 手机看文章 扫描二维码
随时随地手机看文章

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时钟使能和配置

推荐阅读最新更新时间:2024-03-16 16:14

STM32F4 USART配置
对于串口就不多罗嗦了, 虽然串口是一种比较古老的接口, 速度较慢, 在计算机上早已淘汰, 但是由于它结构简单, 使用方便, 或许也由于在计算机上使用过有基础支撑(单片机就是在走曾经电脑走过的路), 在嵌入式系统中依然使用相当广泛. 在STM32F429中, 一共有8个串口, 4个USART, 4个UART. 今天要实现的目标, 就是让STM32向串口发送数据到电脑, 让它正真的输出”Hello World!”! 还是使用以前的工程, 不过工程结构略有更改, 如下图: 不同于以前, 我现在选择把整个固件库复制到STM32F4xx_StdPeriph文件夹中, 在用到某个外设时将外设对应的C文件添加进来即可. 本次通讯使
[单片机]
<font color='red'>STM32F4</font> USART配置
STM32F407 串口调试总结
使用开发板的串口通讯例程修改了一个自己板子STM32F407的UART4,发现两边收发的数据但是错误的; 刚开始怀疑是我的USB转串口模块坏了,但在模块上RX脚直接接TX脚,数据发送和接收是正常,说明USB转串口模式是没坏的;然后就怀疑UART4是不是比较特殊,代码需要其他的特殊配置,在自己板子RX脚也是直接接TX脚,进入调试状态查看收发数据,发现也是正常的,也查看了手册和网上资料并没有提到UART4的特殊性,说明我的代码配置是没问题。 最后去看了开发板与我自己板子的电路图,发现原来是板子的晶振频率不对,我的板子晶振频率是8MHz,,开发板晶振频率是25MHz; 使用标准库: 在 stm32f4xx.h 中默认是2
[单片机]
第43章 STM32F429的LTDC应用之汉字小字库和全字库制作
43.1 初学者重要提示 学习本章节前,务必优先学习第42章,需要对点阵字体字符编码有个认识。 LTDC驱动设计和相关问题在第41章有详细说明。 本章节为大家讲解的小字库和全字库方法,简单易用,是直接以C文件格式存储到内部Flash的。支持12点阵,16点阵,24点阵和32点阵的ASCII以及GB2312编码汉字显示。 本章节用到的字库软件下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=202 。 43.2 使用MakeDot小软件生成C文件格式小字库方法 生成方法比较简单,这里做个介绍: 43.2.1 第1步,准备好显示的字符 比如要显示如下字符,采用
[单片机]
第43章 <font color='red'>STM32F4</font>29的LTDC应用之汉字小字库和全字库制作
STM32F407 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)
定时器 真多啊,14个定时器,三种。 通用定时器 注意: 需要手动清除中断标志 TIM3- ARR = 5000-1; //自动重载寄存器,10Khz 的计数频率,计数 5K 次为 500ms TIM3- PSC = 8400-1; //预分频器 两个寄存器的计算 PSC预分频器 //这里时钟选择为 APB1 的 2 倍,而 APB1 为 42M,所以TIM3的时钟频率为84M PSC=8400 f=84M/8400=10000Hz=10KHz t=1/f=0.1ms 每次技术时间0.1ms ARR=5000-1; //自动重载寄存器 计数5000次,共500ms //定时器溢出时间计算方法:Tou
[单片机]
<font color='red'>STM32F4</font>07 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)
stm32f407】SysTick实现延时
一. SysTick介绍: CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。我们就是利用STM32的内部SysTick来实现延时的,这样既不占用中断,也不占用系统定时器 通常SysTick可以通过中断的方式来实现,后续会增加,但是目前只是通过轮询的方式去实现 二. 寄存器介绍 SysTick有4个寄存器 对应的代码在core_cm4.h中 typedefstruct { __IO uint32_t CTRL
[单片机]
话说STM32F4系列的总线矩阵与访问调度
可能不少人见过STM32F4系列的内部系统架构框图。大致如下图,该图很重要,不可视而不见。 图中纵横交错的就是多层AHB总线矩阵,负责把上方黄色主设备跟右边绿色从设备互联起来。所谓AHB主设备是指CPU或DMA ,由它们启动总线访问,即读写操作。那些响应主设备读写访问的设备就是AHB从设备,比如存储器、各类外设等。 因为总线矩阵的存在,使得多个主设备可以并行访问不同的从设备,增强了数据传输能力,提升了访问效率,同时也改善了功耗性能。 不过,虽然总线矩阵使得多个主设备可以并行访问不同的从设备,但在每个预定的时间内,只有一个主设备拥有总线控制权。如果有多个主设备同时出现总线请求时就得进行仲裁。所以总线矩阵里
[单片机]
话说<font color='red'>STM32F4</font>系列的总线矩阵与访问调度
迁移微雪2.9寸电子墨水屏代码Stm32F407上
墨水屏是从立创商城上买的,正常价格大概100元左右。 商城活动 大约 40块钱入手 这是刚来的时候的样子,排线让我弄丢了,直接拆了插槽 把杜邦线焊上去了、、、、 这是 运行demo 时候的样子 墨水屏看起来真的很好看。 进入正题,代码的迁移: 毫无疑问第一步肯定是修改 IO了,我在 readme 文件里面看到了引脚的定义。 这款屏一共用到了六个IO 其中四个是通用IO 两个是作为 SPI协议的 MOSI 和CLK线的 虽然这款屏是标准的 四线SPI,但是屏幕貌似是不需要给单片机回传什么数据的,所以我们只是需要用到 MOSI 和clk线,当然 CS 和GND 也少不了的。在STM32F4的程序中,我借鉴了 正点原子的 S
[单片机]
迁移微雪2.9寸电子墨水屏<font color='red'>代码</font>到<font color='red'>Stm32F4</font>07上
基于STM32F411的cm级超声波测距系统
本项目通过HC-SR04超声波传感器和STM32F411开发板,以精确到cm的精度测量目标物体的距离。 STM32F411RE开发板 x1 HC-SR04超声波传感器 x1 跳线 若干 其中,HC-SR04超声波传感器可以0.3cm精度读取2-400cm范围距离,而且超声波发射器和接收器组合在一起,适合大多数个人爱好项目。主要性能包括: 工作电源:5VDC 工作电流:15mA 工作频率:40KHz 最大距离:4m 最小距离:2cm 测量角度:15度 分辨率:0.3cm 触发输入信号:10uS TTL脉冲 回升输出信号:TTL脉冲,与测量成距离成正比 当传感器接收到一个触发信号,就发出一个40KHz突发信号
[单片机]
基于<font color='red'>STM32F4</font>11的cm级超声波测距系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved