打印
[STM32F1]

基于STM32-GPIO的流水灯实现

[复制链接]
2096|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
像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文件,接下来就可以开始项目编程了。

沙发
huangcunxiake|  楼主 | 2018-3-6 17:52 | 只看该作者
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亮->......的循环过程

使用特权

评论回复
板凳
xuanhuanzi| | 2018-3-6 18:05 | 只看该作者
分层太多,看着就难懂了。

使用特权

评论回复
地板
xixi2017| | 2018-3-7 19:35 | 只看该作者
io的几种模式学习

使用特权

评论回复
5
aizaixiyuanqian| | 2018-3-7 21:00 | 只看该作者
基础的教程,感谢分享。

使用特权

评论回复
6
aspoke| | 2018-3-7 22:05 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

程序入门从点亮一个LED开始。

使用特权

评论回复
7
232321122| | 2018-3-7 22:05 | 只看该作者
能够具体讲解一下每一个IO模式吗

使用特权

评论回复
8
ghuca| | 2018-3-7 22:06 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

使用特权

评论回复
9
soodesyt| | 2018-3-7 22:06 | 只看该作者
固件库的开发方式。

使用特权

评论回复
10
mnynt121| | 2018-3-7 22:07 | 只看该作者
xixi2017 发表于 2018-3-7 19:35
io的几种模式学习

主要还是理解不同的工作方式。

使用特权

评论回复
11
aspoke| | 2018-3-7 22:10 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

入门的最简单程序了。

使用特权

评论回复
12
232321122| | 2018-3-7 22:10 | 只看该作者
很多的时候不知道怎么配置IO模式

使用特权

评论回复
13
ghuca| | 2018-3-7 22:10 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

可以使用宏定义配置IO.

使用特权

评论回复
14
soodesyt| | 2018-3-7 22:10 | 只看该作者
以前都是使用固件库开发stm32.

使用特权

评论回复
15
mnynt121| | 2018-3-7 22:10 | 只看该作者
xixi2017 发表于 2018-3-7 19:35
io的几种模式学习

现在的程序都是可以通过stm32cube配置了。

使用特权

评论回复
16
lzbf| | 2018-3-12 17:17 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

说的很不错。

使用特权

评论回复
17
houjiakai| | 2018-3-12 17:17 | 只看该作者
huangcunxiake 发表于 2018-3-6 17:52
LED相关引脚初始化:

 使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32 ...

内部自定义的设计。

使用特权

评论回复
18
youtome| | 2018-3-12 17:18 | 只看该作者
上传一个完整的工程代码

使用特权

评论回复
19
cemaj| | 2018-3-12 17:18 | 只看该作者
不是正常使用的1K的电阻吗

使用特权

评论回复
20
pl202| | 2018-3-12 17:19 | 只看该作者
端口工作模式弄明白就可以。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

3476

帖子

10

粉丝