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

【freeelectron】库函数那些事

[复制链接]
freeelectron 发布时间:2016-3-29 23:41
本帖最后由 freeelectron 于 2016-3-29 23:43 编辑
+ c9 x/ C5 X: G6 D& W4 ]/ W; P( B  B9 ?! [
写在前面的话,去年在社区领到Nucleo-F030开发板,一直没时间去研究,近来有时间,也觉得该为社区贡献点东西!
1 v( R! {) U+ T# ^
. v8 R' E# L- n; ^1.网上关于103的资料比较多,主要是中文资料比较多,包括库函数,寄存器什么的等等,都有中文,而其他系列貌似资 料就比较少;
) f  S6 D* z' |3 F5 u2.现在看来用库函数开发是一种趋势,或者说,可以借助别人写的库函数,或者说,自己将寄存器操作封装成库函数,这样就比较简单,也易读。
5 D7 z) E8 E/ f3 a3.每个系列对应的库函数的定义也不尽相同。
1 V% d: A/ _. O) G, r2 \: M1 b4 ^% d3.刚好前阵看到有人在找库函数,我们都知道,在用官方库函数的时候,会有.c文件和.h文件,那么.c文件里面肯定就是函数原型了,.h文件里面肯定就是对应的函数声明了,那么我们查看库函数的时候,只需打开某个外设对应的.h文件就行了,.h文件里面有很详细的描述,以
Nucleo-F030为例说明,其实也就是整个F0系列的库函数。; _8 K1 [1 {3 r, C- C0 |1 z) R
我们以最常用的外设GPIO为例说明:; s* I8 z5 D" \
当然f0系列,GPIO的库函数定义就是stm32f0XX_gpio.c和
stm32f0XX_gpio.h了
7 m( w  V: i# Q2 ]" Z! \% U
  1. /* Function used to set the GPIO configuration to the default reset state *****/
    % T- {: u$ a* m+ F
  2. void GPIO_DeInit(GPIO_TypeDef* GPIOx);
复制代码
很显然,上面这个函数就是配置GPIO为默认状态;函数原型可以在stm32f0XX_gpio.c里面找到$ Q( }' K. _0 A8 ]9 |! F
  1. /**1 b; u% @7 c* x# p6 q% V8 r6 V. R
  2.   * @brief  Deinitializes the GPIOx peripheral registers to their default reset ' D" z( A& n& h+ x  s7 T
  3.   *         values.
    8 k: L! Y# w* r+ X! V4 B
  4.   * @param  GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral.
    2 e' X5 I& f- R8 z3 O6 }( \& q
  5.   * @note   GPIOE is available only for STM32F072.$ m3 u; w* o8 ?" D1 i8 s$ b1 G4 p& h
  6.   * @note   GPIOD is not available for STM32F031.    3 N5 u: R% [9 B% p
  7.   * @retval None7 @" ]& N) C9 q9 C0 i
  8.   */
    . N& K, s1 D# B& M) \8 K
  9. void GPIO_DeInit(GPIO_TypeDef* GPIOx)3 v$ Z5 [/ B* ~- n/ w: @
  10. {
    8 \0 h9 n/ m3 w0 e+ M7 }( z. K% x
  11.   /* Check the parameters */! {/ }+ O: W& X) a3 H/ u1 U+ ~
  12.   assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    " l9 E4 I( E2 C+ y3 s3 P
  13. 1 M0 @0 L; p6 X
  14.   if(GPIOx == GPIOA)
    5 a, F* d; ~' j0 y5 U, P
  15.   {
    - x6 I5 O3 U: b; `9 V, o
  16.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    1 y6 s( M. P+ U& o' ]  A: [
  17.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOA, DISABLE);
    + @1 h+ m& _" h
  18.   }. x  A1 j' w3 ^( U
  19.   else if(GPIOx == GPIOB)5 x/ u* f; K5 ?
  20.   {: t5 ^) K3 A. g2 e+ Q, `1 _
  21.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, ENABLE);2 r& ?3 ]# {: `3 Q$ A1 K
  22.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOB, DISABLE);2 s& h) o1 l; O1 Y9 s- W. F1 w
  23.   }8 L  @8 @  X$ D
  24.   else if(GPIOx == GPIOC)3 L* f: w2 w% x4 b
  25.   {3 \# f, I* [( s9 e9 r% R7 f
  26.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, ENABLE);8 \0 z; k8 ]' X( r
  27.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOC, DISABLE);) ]: [8 x0 w7 c% D; r. `- s6 ~
  28.   }
    , w; V0 U" \0 K2 n6 F, M+ c
  29.   else if(GPIOx == GPIOD)' Z* c; Y' Q( _7 O9 A) _
  30.   {
      L% u, h9 Y8 g0 j
  31.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, ENABLE);% O+ K2 s. z" t1 k9 W
  32.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOD, DISABLE);# }  S! c2 [" O7 P% j' U
  33.   }
    : e7 z; |& a$ l6 \* w" }" T/ b( a: I: c
  34.   else if(GPIOx == GPIOE)
    3 ]% g; K' Z3 W, H( N/ Q. f
  35.   {
    + C  k  s3 a9 m" _8 J/ Q
  36.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, ENABLE);4 e  ~9 n% P" q  o) ^0 D, K
  37.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOE, DISABLE);8 J  j1 x4 e  y% C& O% c+ c
  38.   }% h8 l/ @& J2 d. |1 e# q
  39.   else4 ^" v* {8 o' ]9 l3 p6 b
  40.   {: Q# [+ b7 E, w* v# e* k- A& k
  41.     if(GPIOx == GPIOF)
    8 e$ p# Q! K7 Q1 p" i5 @
  42.     {: X0 @' E* n& T$ `1 `7 o
  43.       RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, ENABLE);
    1 F1 o( O% a* Y3 h- w! {# S
  44.       RCC_AHBPeriphResetCmd(RCC_AHBPeriph_GPIOF, DISABLE);
    8 B& P3 A) l0 I3 m/ S0 G% |1 w
  45.     }
    - t; z$ ~( Q! _7 k3 k: c  [6 D0 ^
  46.   }, |5 ]* [' E' b/ b/ _3 S3 u. r
  47. }
    " W0 g' c& K: v4 A( C% N
复制代码
关于参数的说明也很详细。- ^$ @3 m! p2 ~' d7 o3 m
  1. /* Initialization and Configuration functions *********************************/
    - `& I+ Z# H  S( ?8 Q. I
  2. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);. |2 p* L% s" O$ f
  3. void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
    & C" r( x6 ~5 A6 e' F) o0 b
  4. void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);) _0 H- k: g) e' `. d

  5. * v5 Q8 I+ r& t. Q$ U  p3 e" Z
  6. /* GPIO Read and Write functions **********************************************// L+ C, R' k* Z1 @
  7. uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    - X& u, K- e( U( \& C
  8. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
    - w8 c1 u( t- j5 C
  9. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    3 L" o+ l! W" B9 i9 |$ F
  10. uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
    3 ^( F0 f6 l, p  Y6 r2 b
  11. void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    ) }  j4 v5 y8 g2 M2 }! ^
  12. void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);0 v' Z% F# v6 t# i; h2 M
  13. void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
    5 w6 n' U* Q1 b( \/ \. X  ~+ {
  14. void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
    ; A( i1 j2 t" Y7 {: J  r* Y
  15. ( K* J$ x) `6 i
  16. /* GPIO Alternate functions configuration functions ***************************/9 V& t; _6 f0 I  @6 o3 [6 b/ j
  17. void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
复制代码
上面几个是关于GPIO的其他的库函数,函数原型的查看也是一样的。+ c& \$ b8 U1 `
其他的外设就不再赘述。. Z1 z0 R1 F5 a! q, J, }0 V1 f
结束语:不管是f0、f1、f2、f4、甚至f7,库函数的使用基本都是这个方法,希望对大家有用。
6 r2 @8 j; P/ R- `& n' q6 y3 y最后,上传一个库函数点灯,(延时用的官方的systick代码,写得不错)。/ m8 a' ?; u! j# N7 }

7 h0 v4 T& a5 B4 t4 {+ X0 D觉得有用,请留下脚印,或者赏个金币。
# Q+ ]# i1 |$ \/ Z9 r3 J& N$ S
# O6 e, t% V& m. T& ~

) X$ B& D( W" }
* I% _: b; P4 W

. E+ \/ y% T3 C6 _: G$ D& A
IMG_20160327_230420.jpg
IMG_20160327_230439.jpg

LED.rar

下载

3.08 MB, 下载次数: 0

评分

参与人数 1 ST金币 +30 收起 理由
沐紫 + 30

查看全部评分

赞 收藏 1 评论6 发布时间:2016-3-29 23:41

举报

6个回答
沐紫 回答时间:2016-3-30 09:14:59
很好,谢谢!
党国特派员 回答时间:2016-3-30 09:16:55
很科普。。。。。 0.png 1.png 2.png 3.png 4.png
freeelectron 回答时间:2016-3-30 09:47:37
党国特派员 发表于 2016-3-30 09:16
* Y- @& v( a* Z/ X7 F8 v$ S( @% I很科普。。。。。
% `% Z! q* C/ U& x% P( b
. d' A9 d" e* G+ [, N6 m' G4 e

( h1 s0 z1 e! T0 F
freeelectron 回答时间:2016-3-30 12:40:22
沐紫 发表于 2016-3-30 09:14
' j, b4 d7 I% C! f7 P很好,谢谢!
+ Y; Y/ I6 w9 o7 J  Z, Q7 G) s, u
还是管理识货
lisingch 回答时间:2016-3-30 14:17:43
不错!收藏学习。
caoren123 回答时间:2016-3-31 14:39:41
看看!!!!写的不错!!!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版