你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32-GPIO的流水灯实现

[复制链接]
STMCU小助手 发布时间:2022-2-4 19:00
学会了如何新建一个工程模板,下面就要开始动手实践了。像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推。如果你已经有了一定的C语言基础以及曾经使用过类似的芯片,那么学习起来绝对事半功备。当然没有也不需要担心,本项目实现起来很简单。不过学习嵌入式,第一点就是要转变思路,从现在开始你不在是仅仅和编程语言打交道了,交叉编译的方式注定嵌入式项目软硬件不分家,从硬件实现,软件设计,软硬件调试,硬件运行观察结果,熟悉和适应这个流程对于嵌入式学习和研发具有重要意义。
  因为所有例程都是在现有开发板完成的,所以主要涉及上面后三个方面,其中最核心的部分就是软件设计。流水灯的实现并不复杂,系统的来说包含硬件接口信息获得,驱动配置,逻辑实现,编译测试等组成。了解了上述流程,项目设计就比较简单了:
  1)原理图分析
   
171609449231279.jpg

0 _4 H+ P  X2 W! D7 m
  根据上面原理图。就能得出信息LED对应端口PD2,PD3,PD4,PD7,外部上拉电阻,低电平点亮。
  STM32的GPIO端口工作模式有8种:
  模拟输入  用于模拟量的输入,或者低功耗下省电。
  下拉输入 端口内下拉电阻电路导通。默认为低电平,外部高电平动作。
  上拉输入  端口内上拉电阻电路导通,默认为高电平,外部低电平动作。
  浮空输入  端口内上下MOSFET均不导通,高阻态,输入状态仅由端口决定。
  开漏输出  端口输出为0时内部下拉电阻电路接地,输出1时端口相当于悬空,即默认只能输出0,如果外部需要输出1,需要外接上拉电阻电路。
  推挽输出  端口输出为0时内部下拉电阻电路接地,输出1时内部接上拉电阻电路,默认输出为0。
  复用开漏输出 内部设置同开漏,但被其他外设复用。
  复用推挽输出 内部设置同推挽,但被其他外设复用。
  结合原理图和GPIO端口的配置信息,可知端口配置为推挽输出,由内部上拉电阻来保证LED熄灭。
  熟悉下stm32f10x固件函数库中的stm32f10x_gpio.c文件,接下来就可以开始项目编程了。
  LED相关引脚初始化:
  1. void LED_UserConfig(void)
    + {: I% l- \8 a: O' i, l) _+ W
  2. {! \% l0 E% r6 A8 y* [! h, O
  3.     GPIO_InitTypeDef GPIO_InitStructure;//定义必须在所有运行代码之前,c语言机制问题6 T3 N4 F4 Z! s1 Q) l# e5 R
  4.     9 e- L7 L- Z' }
  5.     /*使能外设区域时钟*/% L: |) [+ q: T1 {5 u0 u! F
  6.     RCC_APB2PeriphClockCmd(RCC_LED_GPIO, ENABLE);
    5 C" V7 D- R7 f! ~; D7 `
  7.     $ h& L. Y4 p" \* ~+ w
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
    : z- }# G% _6 H4 F2 N+ f+ G7 e. v) I
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;             //选择LED输出的端口,可根据实际需要配置 ; P& R" ]7 ^- b
  10.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       //设定GPIO最大输出频率* @% w; m- e. ~4 o' K5 _1 o, o8 m
  11.     GPIO_Init(GPIO_LED, &GPIO_InitStructure);               
    / i) o2 D; ]- N1 w# D( U
  12. }
复制代码

! n8 c3 G; C6 f3 a
  使能外设区域时钟对于所有外设都是必须的,且要先于外设初始化函数,这是因为stm32的寄存器配置也是依靠时钟脉冲才能够处理的。
  GPIO_Mode_Out_PP即固件函数库中对应推挽输出。
  如上,就完成外设初始化,接下来就可以直接利用固件库提供的API接口操作LED了,具体实现代码:
  1. void LED_Control(u8 LED_Number)! O0 g& T- r2 b! w# I' K% t1 U
  2. {+ k9 X& _  ?4 }
  3.     GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);//关闭所有LED
    + W" l* g5 r4 I& R
  4.     switch(LED_Number)) P& P0 h0 x  _5 S& u* L( h
  5.     {
    . {7 @7 }8 H+ d" c" t& [+ X1 Y8 |
  6.        case 0:) l5 i6 i+ a) M8 P. g
  7.                GPIO_ResetBits(GPIO_LED,GPIO_LED_1);//LED1点亮      
    , f3 e, s$ D$ q. a3 B1 a
  8.             break;& }# O4 p* F0 w& {  I. R$ E
  9.        case 1:% E6 \' C* [1 R$ P
  10.                 GPIO_ResetBits(GPIO_LED,GPIO_LED_2);     
    2 s& p" r; K% \. U% F( _2 @& I: r
  11.             break;4 w7 E" b$ p$ y& B- l
  12.        case 2:
    ! P4 V+ `: v$ z  H+ u- [9 l
  13.                 GPIO_ResetBits(GPIO_LED,GPIO_LED_3);        6 `4 |4 ~. [2 r  C% u
  14.             break;+ z* q& `  w( z/ h2 z4 g) _
  15.        case 3:
    5 R. `7 J! X  O. W; i5 X. _
  16.                 GPIO_ResetBits(GPIO_LED,GPIO_LED_4);      4 U7 B% J! m% T8 Z
  17.             break;
    + r) |. I  p0 F' U) B3 Z
  18.         default:
    5 T1 {# l1 {$ |' T3 l1 M# \
  19.                 GPIO_SetBits(GPIO_LED,GPIO_LED_ALL);
    * U- x: b1 S; A" I( W! k) ?" a, o# b
  20.             break;
    , @$ H* A  d! h" Q' e4 k
  21.   }9 r' y9 q- `& Y, Q
  22. }
复制代码
& d- |. e4 P# H' x0 [+ T1 U
  如此,就实现了LED1点亮->LED1灭->LED2亮->......的循环过程,完整代码可参考文件1-1,希望对入门stm32学习有帮助!
, K3 @; s" R3 S/ B) C% w+ A% b
赞 收藏 评论0 发布时间:2022-2-4 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版