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

STM32F4xxx简洁GPIO驱动,参考DSP库,定义了位变量.

[复制链接]
wjandsq 发布时间:2015-7-29 21:10
/* stdperiph_gpio.h *// @" }" l5 y' d0 w& w
1 y0 a; C+ o' h5 k" ]9 |; Z# }- e
/* Includes ------------------------------------------------------------------*/' V4 }0 `2 M+ T2 u2 B/ _; d% v
#include "stm32f4xx.h"/ `# G; B! A3 Q/ g6 ]5 }

$ a5 I5 n) Y: k3 m/* Define to prevent recursive inclusion -------------------------------------*/
! S& F3 r0 G& s& L: T6 c: g#ifndef __STDPERIPH_GPIO_H  M% E) ]) q  g8 _  U5 C
#define __STDPERIPH_GPIO_H
0 A$ h# w/ [. i
. F! b  V7 a0 ~: o/ A# p4 ~extern void StdPeriph_GPIO_Config(void);% Y, Y' B2 K* S# J& i  T. O
extern void StdPeriph_GPIO_Driver(void);% w1 T; u8 Q) m; ?8 Y/ i% n* v' C; S

$ Z6 U: L- T) `1 x; M' h8 D- Sunion OutPort {0 m2 l$ B, R# N2 N7 p. V
  uint8_t all;
% C( Z/ t+ h& S% `3 {8 y; p) U  struct {
9 W- p% {* [$ W8 ~& Q! ?    uint8_t b0:1;            // 0      bit0
9 {& V! e$ y, Q    uint8_t b1:1;            // 1      bit1
+ X) i( n. a3 R! F1 w    uint8_t b2:1;            // 2      bit2, m- e9 T- ]2 I9 }
    uint8_t b3:1;            // 3      bit3
; t- S/ g9 o* {) V% G9 e9 c$ d    uint8_t b4:1;            // 4      bit42 E9 K  n% u9 ~; ~/ `; P$ E4 S
    uint8_t b5:1;            // 5      bit5' X5 @. d: t. [6 l+ f9 \$ x9 Z( Q
    uint8_t b6:1;            // 6      bit6
2 p- u% v8 u) t* A* a8 P    uint8_t b7:1;            // 7      bit7    & I4 w! |  `# Z; _5 \/ ~0 L
  }bit;
! ]+ G- h: L9 `) p7 q7 a};
; E& a% M3 B$ j, A0 f9 E1 z5 j
; w* }2 v' N; p( Eextern __IO union OutPort Q1;- T0 @( U2 @4 y, D" A% c  ?" e& U
) c/ z8 i$ y( ^% D- {* ^; m, g) H" B
#endif
+ L0 ]7 d" `9 d6 A6 r% E" g+ I6 K( m* \. _+ T2 N8 `: N
/* stdperiph_gpio.c */* U* S& \# z8 a) F, z; N' p
/* Includes ------------------------------------------------------------------*/! ]" Q( K6 Z, G& ?, \8 P) \
#include "stm32f4xx.h"
" P3 c3 l2 e: G2 E#include "stm32f4xx_gpio.h") r. C# K! S2 G* ^( P
#include "stm32f4xx_rcc.h"
. {2 W0 }& C- j3 H) @5 U! H
( B7 {7 h; B/ k; x3 a4 v6 |- zstruct BITS {
/ I1 m" w5 M& s. D' `1 F   uint16_t GPIO0:1;            // 0      GPIO0
3 e; T9 J2 X% R3 A* I   uint16_t GPIO1:1;            // 1      GPIO16 @8 L; d: Q1 U1 X+ `
   uint16_t GPIO2:1;            // 2      GPIO2) e6 M( m0 Q( I2 {9 L
   uint16_t GPIO3:1;            // 3      GPIO3
$ |$ t) e' H: f5 @   uint16_t GPIO4:1;            // 4      GPIO4
, ]0 `. {$ C  K# _( m. I   uint16_t GPIO5:1;            // 5      GPIO5. L# T# z( s6 v0 @
   uint16_t GPIO6:1;            // 6      GPIO6; M1 c: h# Y' i; g9 C! J
   uint16_t GPIO7:1;            // 7      GPIO7
! t/ ?0 T( `/ c  X   uint16_t GPIO8:1;            // 8      GPIO8
6 g& n- g  N+ j0 t- R   uint16_t GPIO9:1;            // 9      GPIO9
( f' i& g+ J! z   uint16_t GPIO10:1;           // 10     GPIO10
7 Y# i0 L2 }* }) c, D   uint16_t GPIO11:1;           // 11     GPIO11) f8 W) g- E5 t5 e( z
   uint16_t GPIO12:1;           // 12     GPIO120 N3 `" i9 ~8 o2 p( E' ]' O
   uint16_t GPIO13:1;           // 13     GPIO136 n+ P! s- T+ N8 \3 R
   uint16_t GPIO14:1;           // 14     GPIO14
) X/ u4 m! O. A  U0 _2 J0 q   uint16_t GPIO15:1;           // 15     GPIO15
. Z* }0 p/ Y0 _- W* h8 Z: t};
- `: B. A8 C3 ~3 y3 z8 B8 N8 M) J& m8 W: ~; r5 e0 t( B5 `
union BSRL_REG {
9 A- F, c. Q9 r4 U, {7 u   uint16_t all;
% y7 V" |7 m/ M4 S/ q4 o/ t/ J   struct BITS bit;
2 F* c" M, r! I! E};
1 N* p( N& J3 ~# x2 Z
) ?' w' ~( c# Yunion BSRH_REG {
; c( d, A1 a! f; J) f   uint16_t all;
* I3 \. \$ J! k/ Y% E7 P5 g+ T   struct BITS bit;7 U. V) O2 \, e$ D+ n6 M) b
};
4 b7 h# V& S. |9 m( w
5 G0 C, k3 t  [' y: T__IO union BSRL_REG GPIOE_BSRL_Shadow;+ T- i5 J  Q: b3 C/ C4 I4 D
__IO union BSRH_REG GPIOE_BSRH_Shadow;$ ?4 U5 P( [2 U) |# c$ b
* K. O& @  d& s
) ~5 u+ l: K0 K3 L+ m% f8 u
union OutPort {6 G1 f  z" x7 b6 R  i
  uint8_t all;4 K# S2 ]) R9 n
  struct {
8 Y# C; A8 _8 @6 O/ D6 x) R0 P& ]    uint8_t b0:1;            // 0      bit0
+ o( O- N/ ?. n% w    uint8_t b1:1;            // 1      bit1
7 r3 ~. |+ {; X5 [* [    uint8_t b2:1;            // 2      bit27 G- `. J( [8 v" v- X0 S
    uint8_t b3:1;            // 3      bit3
. o. H4 d3 B$ Z& u$ e    uint8_t b4:1;            // 4      bit4# {' q# h- j5 J8 F: @! F
    uint8_t b5:1;            // 5      bit5- m1 X! y7 v" o# q6 J" }# ]( B
    uint8_t b6:1;            // 6      bit68 E3 o- q& u8 e7 o7 p" r
    uint8_t b7:1;            // 7      bit7   
  Q& }+ E' Q& D2 {  }bit;
! v# x' k% z* A& }6 S/ ~; D};' @. z4 ^# m6 ]2 Q) ?) D
" ~! T! J, X9 E' D" E& A6 D
__IO union OutPort Q1;6 f6 C# \; w+ J" e/ L

$ O& o7 E6 {. Ivoid StdPeriph_GPIO_Driver(void)
) `: H/ H: l) ?{6 G6 n) K0 |+ N& B/ n
  /* 1: 打开MOSFET 0: 关闭MOSFET */, V. G  x4 u8 f# Y# Y$ o# ~( B
  GPIOE_BSRL_Shadow.all = 0;
2 t7 @( ^3 K0 T. L8 g  GPIOE_BSRH_Shadow.all = 0;
, w2 [/ O0 c: D7 E5 j! _  J  if(Q1.bit.b0 == 0){
3 Q) r( w6 g6 ?* @    GPIOE_BSRH_Shadow.bit.GPIO0 = 1;
* x! Z/ f. P4 f6 y5 x9 G: n$ g  } else {3 F' H4 F8 o4 x& A; T- H' c
    GPIOE_BSRL_Shadow.bit.GPIO0 = 1;
  V; V. |4 k3 H! _3 c- e( c: |  }" d* |* C, p& z" B/ ^
  if(Q1.bit.b1 == 0){
4 @) P! Q) g1 _5 G# c    GPIOE_BSRH_Shadow.bit.GPIO1 = 1;
( L, z, s# L! t: G, D  } else {
4 c( _3 a9 {8 S' e) {- q9 F# }    GPIOE_BSRL_Shadow.bit.GPIO1 = 1;1 i3 c; A  Z. ?, _/ c
  }
/ O, o( u3 a% k7 z. @  if(Q1.bit.b2 == 0){" |; ^4 d5 V/ p  H/ l
    GPIOE_BSRH_Shadow.bit.GPIO2 = 1;: y( Y+ Y4 Y% r6 h
  } else {/ E; p4 g, |& @- O
    GPIOE_BSRL_Shadow.bit.GPIO2 = 1;
* u: t  X1 h# r+ O# e+ a  }5 M) ?, ?* r$ Z' B/ H& Q& ^
  if(Q1.bit.b3 == 0){
: f" S: u" B& ^' M- D6 G8 w    GPIOE_BSRH_Shadow.bit.GPIO3 = 1;
" C# b4 `8 w& e2 m8 W* U3 @$ c2 @  } else {8 }4 G+ s3 ?/ s  Z- L3 e
    GPIOE_BSRL_Shadow.bit.GPIO3 = 1;% y: v9 u. D$ g
  }: x: u* [9 Q% u6 G
  if(Q1.bit.b4 == 0){9 C. b9 m8 r' R2 e, t. t( c1 D
    GPIOE_BSRH_Shadow.bit.GPIO4 = 1;
: W+ r( p9 `, [" p- K8 ?5 @$ }5 g  } else {. a2 w! ]6 z. z3 \. H, R
    GPIOE_BSRL_Shadow.bit.GPIO4 = 1;& u+ A' ~  q# ^  ?% n  M. p
  }. ^: w. Z, @3 d
  if(Q1.bit.b5 == 0){
8 g; u7 m8 O; z6 W3 _, U    GPIOE_BSRH_Shadow.bit.GPIO5 = 1;
8 Q/ l( O1 R" ]( q: F, ]  } else {
+ Q- \% I$ V- E2 E% {( X    GPIOE_BSRL_Shadow.bit.GPIO5 = 1;$ I  R# o* C: C; x* b5 `& w
  }2 a7 [/ s* j0 m% ^: H! ?
  if(Q1.bit.b6 == 0){8 R. S) _5 k& j; E9 d7 M% b
    GPIOE_BSRH_Shadow.bit.GPIO6 = 1;) A+ x( u/ q2 V( p7 f' e% k, z
  } else {+ A* _2 M, J" p( q( P$ r* K
    GPIOE_BSRL_Shadow.bit.GPIO6 = 1;
7 |) ?  W1 H; R  H  }. X% x* d3 G- c1 m3 B8 f2 T
  if(Q1.bit.b7 == 0){
7 Y# W* i6 ~# L, K    GPIOE_BSRH_Shadow.bit.GPIO7 = 1;3 u0 s- K, t; m$ V7 z4 C
  } else {4 I4 D0 z0 a7 `; u0 d5 B
    GPIOE_BSRL_Shadow.bit.GPIO7 = 1;
+ T0 X, I/ ?9 d  }
: d, {0 L) H! a2 r4 p! ?  GPIOE->BSRRL = GPIOE_BSRL_Shadow.all;+ u: i5 u5 c5 c, i
  GPIOE->BSRRH = GPIOE_BSRH_Shadow.all;
9 D2 B/ k; G" T# k}   p3 D& P: t" L& g& c- }( d
& i+ p" p8 z& [8 k. h
+ \$ f: m% a& h6 }( Y6 o' G. }& M- S

评分

参与人数 1 ST金币 +15 收起 理由
沐紫 + 15 赞一个!

查看全部评分

收藏 评论9 发布时间:2015-7-29 21:10

举报

9个回答
wjandsq 回答时间:2015-7-29 21:22:00
本帖最后由 wjandsq 于 2015-7-30 22:29 编辑
9 g$ K* a6 Z* @
1 a6 t- _  G2 f/ j5 [# a; V0 Y8 z! a# F注意事项:6 p  `7 A! ]/ ]
1. 可以在主程序或定时程序中调用StdPeriph_GPIO_Driver函数,刷新GPIOE.0~GPIOE.7的状态。
+ [" r: H. B& J5 B: o5 J7 f2. 在应用程序中,只需访问Q1的位即可。例如下一句
) c& q7 I" X- n+ Y  Z. z   "Q1.bit.b0 = 1;"就可以修改GPIOE.0的状态为高电平;同样地,"Q1.bit.b0 = 0;"可以修改GPIOE.0的状态为低电平。4 d: S  ]7 S3 w2 A8 b5 U
   StdPeriph_GPIO_Driver函数调用的频率,建议在1~10ms,满足要求的即可。) q' @! D1 k* ^% e; V* I$ y
   在MDK-ARM V5.15开发环境,键入"Q1."则会出现自动提示,Q1.all 是访问所有的位, Q1.bit.b7是访问最高位。
4 s0 x# v9 @/ B6 q$ D# e( I
# [, G5 B" ?, T6 O4 O
moyanming2013 回答时间:2015-7-29 21:31:37
2.jpg
lkl0305 回答时间:2015-7-29 21:58:50
学习学习
mark0668 回答时间:2015-7-29 22:46:28
3.jpg
; M, f, @% Z  ^% i
党国特派员 回答时间:2015-7-30 08:13:52
学习学习 null.png null1.png
yanhaijian 回答时间:2015-7-30 08:35:39
要简洁用宏定义。
风子 回答时间:2015-7-30 09:04:53
学习学习
stary666 回答时间:2015-7-30 09:17:58
看看,,,,,,,,,,,,,
wjandsq 回答时间:2015-7-30 20:15:46
本帖最后由 wjandsq 于 2015-7-30 22:35 编辑
3 d7 C" ?1 N, W4 ^  J
. A' @4 Q( \9 w, I' M% W补充说明:
3 B+ |/ b' j6 `5 M6 T. q: I, R1. 驱动编程的目的和出发点在于,仅在一个地方调用StdPeriph_GPIO_Driver函数,
: P: x+ k- r: G6 ~6 x) b8 C   用户层只操作Q1输出端口的8个位,8位变量Q1是函数对应用层提供的接口。
, d3 |! z8 n4 ?: A0 E9 d+ f7 q5 `' I2 Q4 ^
2.宏定义的作用
/ V& X, C& D" |7 L  宏定义直接操作GPIO,可以立即刷新GPIO的输出状态。
; }$ c) I# q0 |4 T/ s: g  例如在SPI通信中函数中,代码开头使CS片选脚变低,代码结尾使CS片选变高。
9 [( E: o7 v6 k$ X: t8 F- f& u, g1 N, W3 o! C
  但宏定义不能给用户提供一个统一的中间变量。; @8 K* O% Q+ a; V
  假设有二个输出端口Q1、Q2,每个端口均是8路输出,分别安排在任意的GPIOA-GPIOE,6 x6 x9 q, S" g3 m
   可以设置16个宏定义,将这16路输出端口设置为高,另外再设置16个宏定义,
' k4 ]: K7 {- z# V9 |, }+ B  分别将这16个输出端口设置为低。显然,这种写法将对GPIO的操作复杂化了。
8 f- q. g; u! t! V8 X  宏定义保证了效率,但对于应用层而言,不利于用户的使用和记忆。
8 N) \9 _4 V9 Q1 h* ]7 y( `$ r5 m: a' p
! ~( T+ k! G! E  e, h) ?
" j& x% V' s+ O$ y: \0 g

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