zoukankan      html  css  js  c++  java
  • STM32学习笔记(二) 基于STM32-GPIO的流水灯实现

      学会了如何新建一个工程模板,下面就要开始动手实践了。像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推。如果你已经有了一定的C语言基础以及曾经使用过类似的芯片,那么学习起来绝对事半功备。当然没有也不需要担心,本项目实现起来很简单。不过学习嵌入式,第一点就是要转变思路,从现在开始你不在是仅仅和编程语言打交道了,交叉编译的方式注定嵌入式项目软硬件不分家,从硬件实现,软件设计,软硬件调试,硬件运行观察结果,熟悉和适应这个流程对于嵌入式学习和研发具有重要意义。

      因为所有例程都是在现有开发板完成的,所以主要涉及上面后三个方面,其中最核心的部分就是软件设计。流水灯的实现并不复杂,系统的来说包含硬件接口信息获得,驱动配置,逻辑实现,编译测试等组成。了解了上述流程,项目设计就比较简单了:

      1)原理图分析

        

      根据上面原理图。就能得出信息LED对应端口PD2,PD3,PD4,PD7,外部上拉电阻,低电平点亮。

      STM32的GPIO端口工作模式有8种:

      模拟输入  用于模拟量的输入,或者低功耗下省电。

      下拉输入  端口内下拉电阻电路导通。默认为低电平,外部高电平动作。

      上拉输入  端口内上拉电阻电路导通,默认为高电平,外部低电平动作。

      浮空输入  端口内上下MOSFET均不导通,高阻态,输入状态仅由端口决定。

      开漏输出  端口输出为0时内部下拉电阻电路接地,输出1时端口相当于悬空,即默认只能输出0,如果外部需要输出1,需要外接上拉电阻电路

      推挽输出  端口输出为0时内部下拉电阻电路接地,输出1时内部接上拉电阻电路,默认输出为0。

      复用开漏输出 内部设置同开漏,但被其他外设复用。

      复用推挽输出 内部设置同推挽,但被其他外设复用。

      结合原理图和GPIO端口的配置信息,可知端口配置为推挽输出,由内部上拉电阻来保证LED熄灭。

      熟悉下stm32f10x固件函数库中的stm32f10x_gpio.c文件,接下来就可以开始项目编程了。

      LED相关引脚初始化:

    void LED_UserConfig(void)
    {
        GPIO_InitTypeDef GPIO_InitStructure;//定义必须在所有运行代码之前,c语言机制问题
        
        /*使能外设区域时钟*/
        RCC_APB2PeriphClockCmd(RCC_LED_GPIO, ENABLE); 
        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
        GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;             //选择LED输出的端口,可根据实际需要配置 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //设定GPIO最大输出频率
        GPIO_Init(GPIO_LED, &GPIO_InitStructure);               
    }

      使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32的寄存器配置也是依靠时钟脉冲才能够处理的。

      GPIO_Mode_Out_PP即固件函数库中对应推挽输出。

      如上,就完成外设初始化,接下来就可以直接利用固件库提供的API接口操作LED了,具体实现代码:

    void LED_Control(u8 LED_Number)
    {
        GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);//关闭所有LED
        switch(LED_Number)
        {
           case 0:
                   GPIO_ResetBits(GPIO_LED,GPIO_LED_1);//LED1点亮       
                break;
           case 1:
                    GPIO_ResetBits(GPIO_LED,GPIO_LED_2);     
                break;
           case 2:
                    GPIO_ResetBits(GPIO_LED,GPIO_LED_3);        
                break;
           case 3:
                    GPIO_ResetBits(GPIO_LED,GPIO_LED_4);      
                break;
            default:
                    GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);
                break;
      }
    }            

      如此,就实现了LED1点亮->LED1灭->LED2亮->......的循环过程,完整代码可参考文件1-1,希望对入门stm32学习有帮助!

      具体代码参考:http://files.cnblogs.com/files/zc110747/1.LightWater.7z

  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/zc110747/p/4654782.html
Copyright © 2011-2022 走看看