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

STM32 跑马灯实验分享

[复制链接]
STMCU小助手 发布时间:2023-3-10 10:39
理论学习5 M+ n! I1 [" @$ a
GPIO配置相关的IO口寄存器:
' r! d/ z2 D" T0 K$ @7 e
0 V% u) b1 ]2 X7 e4 e, |
3f225c7598fa44d5aaac80d1ed48875f.png . E6 F& j3 [/ B! G0 g' h- x
+ g7 j5 \0 `  A4 U0 t
实践学习
& O- }$ ]3 J$ T9 v0 |一、设计规划

$ k. [+ b3 K: X4 q7 y: s1.1 实验目标% [  c4 Z: K7 W6 \$ D6 a
开发板上两个LED:DS0和DS1交替闪烁,实现跑马灯的效果。
; D; I  p5 j7 Z7 x# z" `% e0 a' r  H( b/ d
1.2 硬件资源
0 g* R7 C6 V6 Z7 U2 Q: _7 }0 M
8 _+ d6 G. C4 A: C* X
b00c7a51bd5d49429dc83b0efed00deb.png
& H3 [1 j! l0 Z4 o
9 r2 S6 Y9 F0 s7 }8 u3 x二、程序设计. D. A( [5 e3 ]- J0 i0 }
2.1 工程文件2 b) |! U' e2 Y3 p! N, E) L
; P+ k$ [- j/ T0 `) G$ S9 k9 O
cd12d1105f9143328c30cc2795447c00.png 0 b4 r0 b5 ?6 i3 c4 p; H

( w0 f6 |, T" M* |/ x添加工程目录(.c和.h)% h. y% D. q/ H$ p& U! r
  y6 x4 d" L+ u& S0 @% v. j
0e3aad22132f4b61a11d0fe8c11c6f58.png # Q4 P. K6 z) u3 X
' M1 w. F$ S: U! K. B
2.2 led.h文件
  1. #ifndef _LED_H
    4 g4 u9 I) R; B# |
  2. #define _LED_H$ U, `) b' A4 }
  3. #include "sys.h"  ! O6 K- P0 ?. ]7 P
  4. 2 c- q) {4 Y/ D( l1 ?$ O
  5. //LED端口定义
    0 ~7 j$ K3 w3 ~& _( n1 I
  6. #define LED0 PFout(9)     //DS0,基于sys文件的位带操作1 v2 j7 ~2 L% j7 X& n
  7. #define LED1 PFout(10)    //DS12 H& Q0 D* T. H
  8. void LED_Init(void);      //初始化函数声明
    % E: d* J* V; o! V: |* t) ^

  9. ' H0 W, M2 S0 u7 F$ D
  10. #endif
复制代码
1 X# G. h+ @$ V. K+ h* j$ j. W
2.3 led.c文件  r6 L6 p" U8 p, j( _: X& Z9 c
使用sys.c文件中的GPIO_Set函数对IO口进行初始化  U7 r  _) D" s, F7 U4 E
0 o3 |+ O# e: w4 H( ?) @  W* A
5e54bbd369ff41ed9c745aa5ec2b1c60.png 5 K! C4 f* s, _- t; ^' \

: i/ Y' ]. y: L  f; b* ?* M) Z# F RCC AHB1外设时钟使能寄存器(RCC_AHB1ENR): U& W/ \4 C* m  k& o% T$ {2 W
4 x, }& @, z$ t$ a
619ef5623b364a96aaf5511b4e691b3f.png
& D* W8 }: T' ~: d
4 m7 I4 Z8 b- U/ J位 5 GPIOFEN : IO 端口 F 时钟使能 (IO port F clock enable)
0 c, Z! D4 q, Y9 E由软件置 1 和清零。
5 z; C+ A3 ~( d: ^. X7 u0 :禁止 IO 端口 F 时钟
- ]! Y8 E" w7 z, {1 :使能 IO 端口 F 时钟
0 I0 U' i, Z! o4 u- S* R4 W0 Y* T
  1. #include "led.h"
    1 P" s+ e2 N3 ]7 f, G) z
  2. //初始化PF9和PF10为推挽输出* {/ y% W5 P1 @3 U3 C$ I
  3. //LED IO初始化
    - R& a' y4 Z" Y# O9 W  @
  4. void LED_Init(void)0 C1 P$ m! A& f" C6 ?
  5. {
    " v/ n& y8 e6 K. `+ S& y( O
  6.         RCC->AHB1ENR |= 1<<5;                     //使能相关位的时钟( p6 F( D' i4 O8 d. i, `3 T
  7.         GPIO_Set(GPIOF,PIN9|PIN10,                //设置相应的IO口* c1 i4 ]" I* _( ~: P8 z# j) L. u
  8.                          GPIO_MODE_OUT,GPIO_OTYPE_PP,     //MODE_OUT:输出   OTYPE_PP:推挽
    , u1 x1 V8 b/ {! l6 a6 T
  9.                          GPIO_SPEED_100M,GPIO_PUPD_PU);   //SPEED_100M      PUPD_PU:上拉/ M8 }% ~$ m+ I3 Z
  10.         LED0 = 1;$ o- V4 m+ c5 R4 G
  11.         LED1 = 1;
    7 S* G7 _1 i9 U. D& g
  12. }
复制代码

8 g5 s6 `7 T, H' |- Q3 W4 M: w+ y% d  Z- V$ I1 c/ [
1<<5 = 0x0000 0010       ' [. Y: }* f% P
# a  o: u3 i0 R% s& o
RCC->AHB1ENR = RCC->AHB1ENR | 0x0000 0010    //将寄存器与左移表达式按位或,即将第5位置为1,即GPIOF的时钟进行时钟使能。
) D1 z8 P9 H. L
2 F" I2 o: E: [然后通过sys.c程序中的GPIO_Set函数对IO口进行配置与使能。
' F/ J5 {& l" C6 e5 c0 e1 P

6 u, n* K& C# N! N. Z' C- C( [6 ~2.3 text.c文件* S, Y  P+ l2 N! u
Stm32_Clock_Init(336,8,2,7);
! I* U' X1 d9 n# f5 ^8 v4 Zplln:主频系数 = 8*366 = 2688MHz; _2 z% q6 g/ G: `" ?3 V
pllm:主PLL = 2688 MHz / 8 = 366MHz
6 _" z0 m% n0 z0 b- ipllp:系统时钟 = 366 / 2 = 168MHz
" F/ ^7 a7 x' ~$ Vpllq:USB/SDIO/随机数产生器时钟 = 168MHz / 7
4 F- |) u$ O' z8 L, c& v# }2 s' ^; c5 J. I! ?8 B/ r" e. T4 f9 ]% ?
6b14b7293dcc4a7c8eef7415dbcddd76.png 4 q0 Y, \& k! w/ q

3 p7 y$ a" c% {- H: F+ l
  1. #include "sys.h"
    ) O" p9 p/ J& {: ?' d6 M
  2. #include "delay.h"4 _& {9 {( u7 X8 w1 x+ A& _0 m
  3. #include "led.h"
    # M! @+ Z1 l8 [! U& z, j7 A

  4. , L6 o' n6 @8 k
  5. int main(void)
    " F% [$ h' |; `1 G
  6. {
    & O5 ?( s# K, _. t, Z. O* n) T
  7.         Stm32_Clock_Init(336,8,2,7);    //时钟频率168M
    : D" N, g  h1 t, _+ @
  8.         delay_init(168);                 
    3 x3 Y4 i  S+ s( L/ _& m
  9.         LED_Init();2 ~" }$ y6 y! g* r, D6 j$ B
  10.         while(1)
    7 N' a1 ~' O/ }! [& L
  11.         {
    5 ?1 h' m; `3 d7 i; t$ y3 d* \
  12.                 LED0 = 0;- ~. _, _. r" |- p, H
  13.                 LED1 = 1;" y& z# O6 e/ I' y: @! L% f
  14.                 delay_ms(500);) \3 Y, f1 _1 l" m/ b0 r
  15.                 LED0 = 1;! T' J+ M! g; h+ _
  16.                 LED1 = 0;) K0 d1 o. j5 N
  17.                 delay_ms(500);$ j7 X, q; _( d4 D+ B
  18.         }* K3 I8 R6 ~8 A" m9 ?" F
  19. }
复制代码

7 K  C4 F) |0 o" v- V' P  A$ _+ t6 E三、在线调试
8 u; Z3 _- p' X& ]. x
* I# c% A: B) b  w' @2 \* i
496c6dfeaa20446c9f39390fb06c67fd.png
( a8 ^) M  \0 D/ i

# s. u3 N' y* [2 y 将代码下载到32开发板上,然后点击1进行代码在线调试。; L4 F6 a5 S) b* M/ F2 S& G1 n9 i
点击2打开观察窗口,添加PF9和PF10两个GPIO的值,同时打开GPIOF的寄存器(最右面所示)9 [+ P& D% P  M' T6 J% n" @
如下图在线调试后代码运行到启动文件的_main程序,下一步将进入main中执行C程序。
* D: A( p9 c5 v& o1 Z, A2 c0 ?
# v  L! S$ B' S. c* _/ Z8 T
2eb46ae1c66344c989ea2d85e708be64.png
4 Y+ W) P. ]& k- N* _8 J5 f9 }4 d, b8 o, G( F
在LED_Init(void)中的GPIO_set后设置一个断点,来观察GPIO相关寄存器配置变化2 P. N% \7 H; z( o: c# H
可以通过寄存器相关的位看出其GPIO模式的配置:MODER将GPIO9/10配置为01(通用输出模式)、OTYPER复位状态(输出推挽)、OSPEEDR将GPIO9/10配置为11(100MHz高速)、ODR将GPIO9/10两个位配置为1(初始化点亮LED灯)
  `* J( ~. F4 I! v
+ ~* u: v0 G$ l
3f0d379b2e2e4ca691fb7d0fa9ee6c4c.png
" ?7 [0 s  R. r2 ?- h5 [1 N- F  ~# j8 S4 t5 L
整体运行代码,可以发现输出寄存器PF9/10在0、1两者进行转换。
& f: v0 |" y# S! s0 [. v9 [' k* ~" ]+ a
LED寄存器变化
$ I: c; m' y/ s
: \" a& r& |! S* j
/ A3 }. [, ^9 o% F* ?
四、上板验证# [8 ^7 y# }0 `" @
代码编译后无错误,点击下载按钮+ D2 }. l$ {# W  K8 K0 I8 @; m

" \! w, x0 b, _  K
256b665c3b8f46328215ba95f05f5bf5.png - F: \3 z) R/ m4 h; ^
) Q. c0 O; \9 D
58806d86b4284cc084bac3cbc816d847.png 7 L  M6 T6 X  k3 l
3 f- B9 [6 u+ o
————————————————
9 s, ~0 _3 f  u$ @# h5 v版权声明:追逐者-桥
6 c/ p2 A5 z# \$ x8 U3 \
( e/ h- N( G$ m* e0 W2 p. ]8 N2 ~# S+ n; M8 ^; U
收藏 评论0 发布时间:2023-3-10 10:39

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版