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

【经验分享】stm32之GPIO_Part1

[复制链接]
STMCU小助手 发布时间:2022-1-23 15:34
配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。
最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
电源.png & D+ G$ ~# X% X' A
关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。
8 w+ I& j& _6 G5 @: v" z3 J& |$ Z5 [- @9 r, [% k
下面还是用张图介绍下时钟树,
  s( m5 g, a0 Y8 U7 x( u, \: U0 K8 g. e. _- F  `% c
时钟树.png

( V' n3 ~# ~' X
图中红色部分是主要的几个时钟源,
HSE , HSI , LSE , LSI , PLL [用作倍频之用]
其实从英文就可理解它们的用途,如HSE代表High Speed External.
, g: W- y1 U3 o" @
HSE就不用说了,和传统的51,avr之类的外部晶振一个道理。
HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。
LSE 是低频率时钟源是供内部RTC用的,和DS1302或HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTC的clk用。
LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。
PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。

" a  @/ v5 T, Q5 H9 ~, @2 r
Arm整了个叫做AMBA的总线,不过对我来说就是一学术名词,具体内部有多复杂暂不知道也不过分关心。一般来说,只要知道AHB[advanced highspeed bus]上是高速的东西【诸如flash,dma什么的】,时钟对应HCLK,其上通过一个所谓的桥【bridge】连接到APB【p对应peripheral  】,其上连接的是一些外设【诸如gpio,串口什么的】,时钟对应PCLK。当然stm32的APB分成了两个,用1和2区分,GPIO挂在了APB2上了。

; X5 [. V& |! H  d# b
在知道了上面的知识知识之后就不难明白为啥stm32程序开始都要有个RCC_Configuration的函数了,其实里面就是要对RCC进行一番配置。
% g$ m. v/ v/ o# ?0 g- m$ E( F
# {0 r. r2 ~9 @" r3 a, [
我们可以很简单的实现这一函数
void RCC_Configuration(void)
- k1 U% B) b- `0 F: v{   
7 ?5 i' I, M; m! C SystemInit();/ a6 C8 v8 D3 V/ q; u) z
}6 G3 W# s) M. Z/ J5 ]
SystemInit是一个库函数,下面将其展开具体研究下[针对103系列],
0 i7 u4 D/ _! _% u/ I
9 E& C2 x$ j! i! X8 t
  1. void SystemInit (void)
    1 \& n( c) V+ r* W
  2. {* J* N, K: L% d6 f' N# a& G6 T$ {8 \
  3.   RCC->CR |= (uint32_t)0x00000001;) ]0 S. R# ^  E- K( j0 g
  4.   RCC->CFGR &= (uint32_t)0xF8FF0000;& h- {+ H' X1 M7 s8 e9 m
  5.   RCC->CR &= (uint32_t)0xFEF6FFFF;, Z1 S9 R& [- r# a5 m  k2 ^
  6.   RCC->CR &= (uint32_t)0xFFFBFFFF;5 z- z+ z! {; T( P+ N
  7.   RCC->CFGR &= (uint32_t)0xFF80FFFF;
    ! o. p; X0 Q  }
  8.   RCC->CIR = 0x009F0000;3 n+ U6 V! w- e% v5 _
  9.   SetSysClock();
    " w" q- f: K2 D% q
  10. }
复制代码

7 E# e; B% V0 U2 m! m$ G! p
关于a&=… 和 a|=…这样的赋值操作我就不说啥了,
里面RCC->CR这样的使用还是比较有意思的
RCC是一个指针型,其类型是RCC_TypeDef类型的,对于103的器件其具体如下
( b; i" a; w8 P* ^
  1. typedef struct1 N+ r0 ]0 z* D
  2. {
    - o* |0 C/ j  S" c) t
  3.   __IO uint32_t CR;
    7 L1 ?/ G) D* P0 y# ~6 U# w: J
  4.   __IO uint32_t CFGR;
      h6 [- W% L/ j1 [0 H, Q
  5.   __IO uint32_t CIR;
    9 @. K( O: k+ Q5 Q4 {
  6.   __IO uint32_t APB2RSTR;. D& h5 U! _% m# u! B! y# _  V
  7.   __IO uint32_t APB1RSTR;% N9 n  P2 H0 a: i: x5 c4 _
  8.   __IO uint32_t AHBENR;+ N% D" m# `0 b" c1 W
  9.   __IO uint32_t APB2ENR;% o# q' _: I) v+ t4 m
  10.   __IO uint32_t APB1ENR;9 G4 K  d8 s2 c7 L. M" b6 r
  11.   __IO uint32_t BDCR;
    3 q; _$ A8 n$ v8 W+ E
  12.   __IO uint32_t CSR;
    % m* y  ~! p4 E7 ~. B0 w+ Q
  13. } RCC_TypeDef;
复制代码

3 q* h. D" @5 |! u__IO 就是volatile ,而后面那个uint32_t就是告诉要占32位的长度这样RCC指向的其实就是RCC相关寄存器的基地址,然后通过->便可取到相应的寄存器。下面简要说明下配置步骤【103系列】1 Set HSION bit ! I+ @4 `8 d0 |& @0 u* M( f2 Z
2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
9 q6 `1 a# u4 M3. Reset HSEON, CSSON and PLLON bits 8 n4 r8 Q5 U6 n+ d+ Y) `) k- c
4. Reset HSEBYP bit + R) j7 P2 ?; w
5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits
, b, T2 e' |1 T' Z; D( Y6. Disable all interrupts and clear pending bits 8 }# ~) |  ^& w1 Y
7. sysclock的配置
8 \/ z  S& K  W# H0 i第9部需要借助于如下函数【以72MHZ为例】
1 {5 q! l. c. ?8 \/ I! Y0 @. jstatic void SetSysClockTo72(void);5 w, r7 f! k/ b0 T- F' c+ y
具体以后有时间再做分析。
( Q7 W2 g# {- C: x
+ W: o9 c8 G* `/ d% }, x' ~4 N
赞 收藏 评论0 发布时间:2022-1-23 15:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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