• 嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)


    有工程实例,链接在最底部。

    开发涉及工具

    开发环境(IDE):IAR-ARM8.32.4
    开发板:STM32_F4VE_V2.0
    下载器:J-Link
    固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

    控制端口配置

    端口的设定与确认

    首先确认好LED是连接在单片机的哪一个端口,例如我使用的开发板上面设计有LED,那么我们就从其原理图上查找端口连接方式,如下图所示,可得的信息有:
    1.此开发板有两颗可控制LED
    2.D2_LED是连接在PA6上。D3_LED连接在PA7上。
    3.两颗LED共阳极连接,接3.3V,控制信号为低电平时才点亮。
    在这里插入图片描述

    端口配置方法

    然后根据已得信息,我们查找固件库中关于GPIO配置的例程,我使用的固件库版本在STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\GPIO\GPIO_IOToggle路径中,点开其main.c和main.h文件,

    在这里插入图片描述

    在这里插入图片描述
    通过简单分析可整理成如下GPIO配置步骤:
    1.定义GPIO配置的结构体变量;
    2.要开启相应GPIO端口的时钟;
    3.指定端口的PIN脚;
    4.配置引脚的模式;
    5.配置引脚的频率;
    6.配置引脚的输出方式;
    7.配置引脚是上拉还是下拉;
    8.然后将所有配置初始化给引脚;
    整合代码如下:

    void LED_IOConf(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;//新建一个配置GPIO的结构体变量
      
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//GPIOA挂载在AHB1总线上,在这里开启它的时钟
      
      GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_6;//确认好LED是连接在哪一个引脚
      GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_OUT;//控制LED灯引脚是输出模式
      GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;//这个是引脚的输出频率配置,没有特别的要求一般选最高100M
      GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;//端口用作控制信号输出一般情况都设置为推挽输出
      GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;//配置引脚是上拉还是下拉
      GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化引脚配置
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实现点亮LED

    从前面的分析我们已知,现在给LED一个低电平就会让它点亮,那么如何使端口输出低电平呢?
    我们可以从stm32f4xx.gpio.h里面找到相应的函数,封装到自己的函数中然后调用,方式如下:

    void LED_OFF(void)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_6);//引脚输出高电平,LED不亮
    }
    
    • 1
    • 2
    • 3
    • 4
    void LED_ON(void)
    {
      GPIO_ResetBits(GPIOA, GPIO_Pin_6);//引脚输出低电平,LED亮
    }
    
    • 1
    • 2
    • 3
    • 4

    点亮我们则调用void LED_ON(void),例如:

    void main()
    {
      LED_IOConf();//调用配置函数
      LED_OFF();//让LED的最初状态为不亮
      
      while(1)
      {
        LED_ON();//点亮LED
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们也可以让LED闪烁起来,加上延时功能,简单的延时函数可以这样写:

    void Delay_us(uint16_t xus)
    {
      uint16_t i = 0;
      for(i = xus;i > 0;i --)
      {
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();
      }
    }
    
    void Delay_ms(uint16_t xms)
    {
      uint16_t i = 0;
      for(i = xms;i > 0;i --)
      {
        Delay_us(1000);
      }
    }
    
    void Delay_s(uint16_t xs)
    {
      uint16_t i = 0;
      for(i = xs;i > 0;i --)
      {
        Delay_ms(1000);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    在主函数中如下方式调用:

    void main()
    {
      LED_IOConf();//调用配置函数
      LED_OFF();//让LED的最初状态为不亮
      
      while(1)
      {
        LED_ON();//点亮LED
        Delay_ms(500);//等待500毫秒
        LED_OFF();//熄灭LED
        Delay_ms(500);//等待500毫秒
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    程序下载与仿真

    1.首先在工程名上鼠标右键选择Options
    在这里插入图片描述
    2.点击General Optons -->Target–>Dervice
    在这里插入图片描述
    3.点击后面的小控件选择好自己使用的芯片;
    在这里插入图片描述
    在这里插入图片描述
    4.再点击左侧Debugger–>Setup,在Driver的下拉框中选择仿真器,我使用的J-Link所以选择它,点击OK;
    在这里插入图片描述
    5.在菜单栏选择绿色的控件点击后等待程序下载和调试界面加载
    在这里插入图片描述
    6.加载完成后,可点击如下控件进行逐句调试,直接运行就点旁边白色控件,关闭调试点击红色X号控件;
    在这里插入图片描述
    工程实例链接:https://download.csdn.net/download/qq_45100839/88423150

  • 相关阅读:
    学习强化学习该具备的技能和环境
    MySQL安装、修改默认字符集、添加path路径 (超详细,带图文)
    【STM32基础 CubeMX】ADC的基础使用
    自定义注解
    大数据-玩转数据-Flink Catalog
    《你好,旧时光文本聚类分析》
    ERP采购管理 华夏
    09 | Harbor中的镜像清除
    【R语言】【2】绘图base和lattice和ggplot2库
    携职教育:软考高项彻底没用了?软考高项证书还值不值得考?
  • 原文地址:https://blog.csdn.net/qq_45100839/article/details/133815032