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

【经验分享】stm32之GPIO_Part1

[复制链接]
STMCU小助手 发布时间:2022-1-23 15:34
配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。
最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
电源.png + w" Y+ o, E4 t; k! ?0 M
关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。
# v; c; Y) k& A) i7 v) s& x: F4 O2 J$ s- Z! ^
下面还是用张图介绍下时钟树,# o9 u* o% i* u$ M+ J, J6 O

3 t* S2 l9 R2 {: a' w7 P0 ^ 时钟树.png

4 N2 T4 j2 l0 R/ ?
图中红色部分是主要的几个时钟源,
HSE , HSI , LSE , LSI , PLL [用作倍频之用]
其实从英文就可理解它们的用途,如HSE代表High Speed External.

3 M# J% t/ b: \- M0 h! M2 l
HSE就不用说了,和传统的51,avr之类的外部晶振一个道理。
HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。
LSE 是低频率时钟源是供内部RTC用的,和DS1302或HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTC的clk用。
LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。
PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。
( L  N6 P+ Y6 V" l  c! j
Arm整了个叫做AMBA的总线,不过对我来说就是一学术名词,具体内部有多复杂暂不知道也不过分关心。一般来说,只要知道AHB[advanced highspeed bus]上是高速的东西【诸如flash,dma什么的】,时钟对应HCLK,其上通过一个所谓的桥【bridge】连接到APB【p对应peripheral  】,其上连接的是一些外设【诸如gpio,串口什么的】,时钟对应PCLK。当然stm32的APB分成了两个,用1和2区分,GPIO挂在了APB2上了。
  G- D' m1 v6 R! p& {: n5 O# G3 ?
在知道了上面的知识知识之后就不难明白为啥stm32程序开始都要有个RCC_Configuration的函数了,其实里面就是要对RCC进行一番配置。6 O% `7 \5 N0 ]' {" u" B: u" S' ]

( b+ C0 _' j' |5 \# w1 k
我们可以很简单的实现这一函数
void RCC_Configuration(void)
* K/ G9 j! i, L" F0 Y+ g! I{   ( z/ C0 _- K( y/ l8 L: F8 w
SystemInit();1 q) }# p+ h) i' v$ I
}
$ v8 v) Q# d& f2 U; b) L) t2 w
SystemInit是一个库函数,下面将其展开具体研究下[针对103系列],5 _6 P0 X5 L6 h) V, I% Z% `

7 H# j0 h3 A/ H
  1. void SystemInit (void)
    7 @& r, f: V, B5 D+ L' W
  2. {- f4 k6 Z5 f3 P' L- F' c* g
  3.   RCC->CR |= (uint32_t)0x00000001;, |2 P( u2 \* }9 I3 k! R. Z7 ]9 a- s
  4.   RCC->CFGR &= (uint32_t)0xF8FF0000;
    . i1 m  _: b$ l& y" s3 _) a
  5.   RCC->CR &= (uint32_t)0xFEF6FFFF;% p- ?  {# D& O3 w; M  E! F
  6.   RCC->CR &= (uint32_t)0xFFFBFFFF;0 x$ j2 t0 M% `& P5 {$ c2 o
  7.   RCC->CFGR &= (uint32_t)0xFF80FFFF;4 ~8 p) E" h. m8 r
  8.   RCC->CIR = 0x009F0000;
    3 y1 p5 B, ?8 G8 s. h7 y4 x" }0 ]
  9.   SetSysClock();
    8 o6 H- C7 Q# C$ D- D1 z, R4 H8 T6 _
  10. }
复制代码

9 |2 [- d* w! Y0 _7 [
关于a&=… 和 a|=…这样的赋值操作我就不说啥了,
里面RCC->CR这样的使用还是比较有意思的
RCC是一个指针型,其类型是RCC_TypeDef类型的,对于103的器件其具体如下0 W( d4 ]9 h, Y+ {4 H& h4 U
  1. typedef struct4 ?1 n0 g& _1 J4 l- o% l
  2. {$ ~3 }, u3 ?; H3 k7 O. R, H
  3.   __IO uint32_t CR;
    / f% `6 F* k8 v  _/ \
  4.   __IO uint32_t CFGR;9 E- e4 c/ e6 U! g
  5.   __IO uint32_t CIR;
    * T6 P0 T- m# F; y' m
  6.   __IO uint32_t APB2RSTR;* i5 b1 t; v. h& c
  7.   __IO uint32_t APB1RSTR;! J: R" X/ ~8 R. M( R) n7 c" S
  8.   __IO uint32_t AHBENR;
    8 Y9 M# v% q: p; ?4 Q- _6 J. P
  9.   __IO uint32_t APB2ENR;
    + ^5 A% G: ]: Q6 |: U0 L& ^0 B4 E
  10.   __IO uint32_t APB1ENR;
    ; x  J$ Z" a$ }( I# u( X
  11.   __IO uint32_t BDCR;
    ( a; v6 J" t1 c0 ]' O- n7 Y
  12.   __IO uint32_t CSR;
    ( {2 q4 R9 [" U
  13. } RCC_TypeDef;
复制代码
7 b, r2 y$ T6 ^
__IO 就是volatile ,而后面那个uint32_t就是告诉要占32位的长度这样RCC指向的其实就是RCC相关寄存器的基地址,然后通过->便可取到相应的寄存器。下面简要说明下配置步骤【103系列】1 Set HSION bit 5 v" q7 D5 I# ~7 |2 _/ \
2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
" z6 C7 ^. _1 _! y1 R/ L2 [2 i3. Reset HSEON, CSSON and PLLON bits
1 h  Q$ h  ]3 d& ^/ C; p' o% W4. Reset HSEBYP bit
8 M+ J4 p# H) ^3 ^# Y0 C2 V) H9 q5 W5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits ; q" |8 W+ h8 p
6. Disable all interrupts and clear pending bits   }9 Y" p* T" P* E( D& O
7. sysclock的配置* P3 |' o+ D( `7 b. b  |
第9部需要借助于如下函数【以72MHZ为例】5 d4 a  S- i) N. T5 V
static void SetSysClockTo72(void);
( F# `+ t9 Q& ~% M具体以后有时间再做分析。; C* a% C1 V3 q' a3 {8 L

8 q. E5 e0 v2 d4 a
收藏 评论0 发布时间:2022-1-23 15:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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