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

【经验分享】STM32学习笔记(一)——点亮一个LED

[复制链接]
STMCU小助手 发布时间:2022-1-14 21:44
引言
最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到时候肯定不够用了,正好前几天买了一块STM32F103ZET6的最小系统,那就赶紧学习吧!从哪里学习呢?同样是从点亮一个小灯开始,就建个工程模板就让我没有耐心了,折腾了一上午终于把工程建立好了!
关于STM32
1124009-20170406101556832-229612160.jpg

! K, q% c0 ^; Z- T* R! |0 _1 q简介
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,按内核架构分为不同产品:
其中STM32F系列有:4 n6 y) e6 f1 F
STM32F103“增强型”系列, v4 t) J, R1 V5 t6 o4 F3 {
STM32F101“基本型”系列
$ `4 s4 e+ {' P( ?STM32F105、STM32F107“互联型”系列6 s1 G2 Z, h* }# g
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
片上资源
下图是 AT89S52的资源
1124009-20170406102227925-597016999.png   g3 t; o3 v1 [7 q3 z
再来看看STM32F103ZET的资源
1124009-20170406101945394-102129070.png
可以明显看出STM3资源是非常丰富,外设接口很多。正因如此,STM32操作起来不如51那么方便,所以在一些小项目上能用51尽量不用STM32单片机。

1 v8 N" U2 m/ z, h0 y8 {1 o1 V
: q& P+ i' T( U% O: \' _$ k: b: y, g/ u7 [
点亮一个小灯LED原理图连接方式
1124009-20170406110207816-2089489566.png 8 d4 i% @3 O; ?' B/ r; |( @( O. ~! B
可以看出只要给D13输出一个高电平就可以将led点亮,低电平熄灭。
GPIO初始化配置
学习单片机貌似都是从点亮led灯开始的,像51单片机点亮小灯直接P1=0就ok了,由于STM32的GPIO工作模式有8种(输入4种+输出4种),所以在GPIO输出之前要先对要操作的GPIO进行配置,如下图:
  1. void GPIO_Config(void)                            //GPIO初始配置0 l% b8 L% D- _1 m" ?& \" H
  2. {& s9 e3 X/ F$ e' q2 ]- h7 ?
  3.     GPIO_InitTypeDef GPIO_InitStructure;      //定义结构体变量7 r0 ^: t2 z2 o, O8 h, W  c
  4. 0 f3 s; E# g+ ~
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOD的时钟, n2 |2 }4 j2 o% p: ^

  6. 8 R0 T1 v/ V4 K8 M) g* V% y
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                    //指定引脚13
    + T# g8 w* Q) S# e  ~
  8.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //设置输出速率50MHz$ Y3 a$ v# ~* K
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出模式9 A) e& D3 y: ^- H
  10.     GPIO_Init(GPIOD, &GPIO_InitStructure);                            //初始化外设GPIOx寄存器
    " A4 |) C) X2 {. }4 v* w
  11. }
复制代码
0 x4 C* Q) w0 f0 e# f2 ]2 g! `: U2 W8 s
& ?7 f2 M+ L- ^# g! B# L3 n
可以看出对GPIO的配置是通过各种函数实现的, 这点和51有所不同,51是直接操作寄存器,其实库函数的本质还是操作寄存器,只不过官方将它封装成了各种函数,来方便操作寄存器,毕竟STM32的寄存器要比51多很多,要记住每个寄存器的名称是不容易的,而通过各个函数就可以简单的操作各个寄存器了,在MDK开发环境中可以通过右键Go to definition of 'xxx'来查看各个函数是如何操作寄存器的。
1124009-20170406104823285-1766946269.png

8 Q, _  Z+ i: r, S4 i& S, w
从初始化配置时,要先使能GPIO的时钟,指定引脚,设定输出速率和工作模式,这些是必不可少的。
2 H/ E/ M# |4 Z9 h5 y$ Y8 c
电平输出
如何让GPIOD_13输出高低电平呢?官方有对应的函数:
  1. #define LED_ON GPIO_SetBits(GPIOD, GPIO_Pin_13)        //端口置1
      C( _4 k4 I3 s' E" G$ Y- }
  2. #define LED_OFF GPIO_ResetBits(GPIOD, GPIO_Pin_13)     //端口置0
复制代码

2 w( v2 Z- A: M" }
  这里使用了宏定义,方便书写,注意高电平点亮,低电平熄灭
: A, G% [; T; o, |. Y
延时函数
/ O6 {! |. z3 H* y: f0 s9 j6 o3 |4 W
  1. void delay(u32 t)            //延时函数5 B% S* W' f7 B* e4 r  V: b9 r  j
  2. {
    3 w' u+ f9 ^+ [6 ^
  3.     u16 i;% r3 N7 m. x7 C" E  g6 L7 Q! U
  4.     while(t--)
    # I2 @/ K( A9 I
  5.         for(i=0;i<1000;i++);+ f2 {5 R( f% q% O
  6. }
复制代码
9 m- p, J( e7 S8 i1 b& b% n/ i
由于STM32的主频有72MHz之高,所以这里的形参定义为了unsigned long 类型,同样下面的变量i,定义为了unsigned int类型,为了占用更多的时间。
主函数* n+ I) [& |( u& h
  1. int main()
    1 L5 N0 J# F' z4 V& t" C# A
  2. {
    & w/ o# T4 o& Z1 A0 U! g- @
  3.     GPIO_Config();            //GPIOD_1初始化配置
    ( K' d4 C$ E# `, x+ D# y! r# l
  4.     while(1)2 i6 u3 i  g+ u* Y9 J
  5.     {
    1 l$ C& y7 g# ]& g1 T( x
  6.         LED_ON;                    //点亮
    " A: X) J. O9 l' X% `/ r) T
  7.         delay(1000);         //延时大概几百毫秒6 x2 p1 N7 D# Q) ?) w1 }
  8.         LED_OFF;                //熄灭
    ( P; B! {1 i( s% d$ }$ S9 c
  9.         delay(1000);
    4 a. s6 M* I8 J  i
  10.     }
    $ d9 a% u& h, t# S% I/ x8 J
  11. $ N; U+ L& o+ ]+ Z4 e, [4 T
  12. }
复制代码

) a9 K, N- n7 p4 I
可以看出delay()函数的实参比较大,如果换做100的话,人眼几乎看不出led灯的闪烁,这是因为主频很高,执行一个循环用的时间更少。只有实参足够大,才能达到延时的效果。
程序下载
STM32的程序下载方式有很多,其中最经济,最简单的下载方式就是串口isp下载了,连接方式如下图
1124009-20170406112218441-2045105749.png
另外还要设置一下启动方式;! ~& o  A4 q# P& M, v7 _& B
1124009-20170406112354675-300600406.png
串口下载时要设置为第二种启动方式,即BOOT0=1,BOOT1=0,然后在按一下Reset键,才可以开始下载(好麻烦^v^)。
下载工具(mcuisp)的设置为如下图:& H  w+ }( i$ e3 l: f8 m
1124009-20170406112854550-561850508.png
加载好生成的hex文件后,就可以点击"开始编程"了,等待一小会,就会看到下载完成,小灯闪烁了。

" a. A# A9 l- Y2 t+ [总结
通过控制led闪烁的学习,可以看出stm32的GPIO位操作不是很方便,或许做这种简单的事情大材小用了吧!本文是使用库函数操作GPIO,也可以通过直接操作相关的寄存器来实现,以后会学习一下如何通过寄存器的设置来控制led,以上内容是我初学STM32单片机的个人理解,有描述不恰当或者错误的地方,欢迎各位朋友指正.

% P! l3 ?* R1 O/ r, v1 d- S8 ]% i5 f
赞 收藏 评论0 发布时间:2022-1-14 21:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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