• 菜鸟学STM32之跑马灯


    微信公众号:小樊Study
    关注共同学习,问题或建议,请公众号留言!!!

    作为一名程序员,在初步学习编程想必都绕不开一个最为基础的入门级示例“Hello World”,那么,在学习单片机时,最基础的入门示例是什么呢?没错,那就是“点亮一盏LED灯”本次将通过一个经典的跑马灯程序,带大家开启 STM32F4 之旅,通过本次的学习,你将了解到 STM32F4 的 IO 口作为输出使用的方法。
    我们将通过代码控制STM32F4 开发板上的两个 LED:DS0 和 DS1 交替闪烁,实现类似跑马灯的效果。

    硬件连接

    GPIO工作方式

    • 4种输入模式:
        输入浮空
        输入上拉
        输入下拉
        模拟输入

    • 4种输出模式:
       开漏输出(带上拉或者下拉)
       开漏复用功能(带上拉或者下拉)
       推挽式输出(带上拉或者下拉)
       推挽式复用功能(带上拉或者下拉)

    • 4种最大输出速度:
        -2MHZ
        -25MHz
        -50MHz
        -100MHz

    软件设计

    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 ()来实现的。

    在设置完时钟之后,LED_Init 调用 GPIO_Init 函数完成对 PF9 和 PF10 的初始化配置,然后调用函数 GPIO_SetBits 控制 LED0 和 LED1 输出 1(LED 灭)。至此,两个 LED 的初始化完毕。这样就完成了对这两个 IO 口的初始化。

    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

    这里使用的是位带操作来实现操作某个 IO 口的 1 个位的

    在 main 函数里面编写如下代码:

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    
    
    //跑马灯实验 -库函数版本
    
        
    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);
         }
    }

    代码包含了#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。

    然后按

    编译工程

    可以看到没有错误,也没有警告。从编译信息可以看出,我们的代码占用 FLASH 大小为:5672 字节(5248+424),所用的 SRAM 大小为:1880 个字节(1832+48)。这里我们解释一下,编译结果里面的几个数据的意义:Code:表示程序所占用 FLASH 的大小(FLASH)。RO-data:即 Read Only-data,表示程序定义的常量(FLASH)。RW-data:即 Read Write-data,表示已被初始化的变量(SRAM)ZI-data:即 Zero Init-data,表示未被初始化的变量(SRAM)有了这个就可以知道你当前使用的 flash 和 sram 大小了,所以,一定要注意的是程序的大小不是.hex 文件的大小,而是编译后的 Code 和 RO-data 之和。

    下载验证

    下载完之后,LED0 和 LED1 循环闪烁

  • 相关阅读:
    在pos:a元素不设定宽度的情况下,他的最大宽度是受父元素的宽度所限制的。
    跳过权限检查,强制修改mysql密码
    IIS7.5 配置ASP+ACCESS使用环境(转)
    windows 2008配置运行PHP5.5.X
    Content encoding error问题解决方法
    ubuntu 中文显示乱码问题 (转)
    Ubuntu 12.04中文输入法的安装(zhuan)
    html5开发之viewport使用
    Windows/Linux 环境搭建Git服务器 + vs2012集成git
    Windows+VS+SVN实现版本控制
  • 原文地址:https://www.cnblogs.com/fw-qql/p/12740467.html
Copyright © 2020-2023  润新知