码迷,mamicode.com
首页 > 其他好文 > 详细

2. 基于STM32F10x.3.5.0库的流水灯程序实现

时间:2015-07-17 18:12:05      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

  上文主要描写了如何新建一个工程,那么下面就开始了stm32芯片的学习之旅,像c/c++中经典的入门代码"hello world"一样,stm32入门程序流水灯绝对也是经典,如果你已经有了一定的C语言基础以及对51芯片有一定了解,那么学习起来绝对事半功备,当然没有也不需要担心,本程序代码量很少,实现起来很简单。不过学习stm32,第一点就是要转变思路,从现在开始你不在是仅仅和编程语言打交道了,交叉编译的方式注定嵌入式软硬件不分家,必要的硬件知识也是必须的(本博客中所有程序都是在stm32f107芯片,基于stm提供的芯片固件库实现的,其它芯片需要自行修改,以后就不在赘述)。

  当然现在只是刚开始,硬件需求低,只要知道外设选择的端口就可以了,如本例:

    技术分享

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

用过51的应该都知道,我们只要将对应的I/O设置为1,0即可,不过STM32直接设置是不行的,这是因为STM32的每个管脚都可以有8中模式:

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

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

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

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

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

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

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

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

从上面可以得出,想要实现流水灯,GPIO口的配置就是推挽输出,且低电平点亮

了解了这些之后,对于简单的流水灯就知道如何做了

第一步:配置外设,如流水灯,就是配置上述4个端口

第二步:设置/复位端口

第三步:流水灯逻辑实现

熟悉下stm32f10x固件函数库的说明书,就可以开始写程序了。

个人建议常见的外设配置可以封装到同一个文件里,这样便于以后的修改和移植(见文件Lightwater中stm32f10x_user.c和stm32f10x_user.h)文件

配置代码如下:

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的时钟拿出来讲,但这里要注意点:

时钟使能要在寄存器配置之前,这是因为stm32的寄存器配置也是依靠时钟脉冲才能够处理的。

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

GPIO_Speed_50MHz设定的意义不大,主要用于限制输入的,与本例无关。

如上,就完成外设初始化,接下来就可以像51那样操作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学习有帮助!

2. 基于STM32F10x.3.5.0库的流水灯程序实现

标签:

原文地址:http://www.cnblogs.com/zc110747/p/4654782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!