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

【经验分享】stm32之GPIO_Part1

[复制链接]
STMCU小助手 发布时间:2022-1-23 15:34
配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。
最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
电源.png
* k* j0 w* d% ?5 M, o. z* h关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。
3 @3 |5 b* Y+ u: @2 c6 a7 a% t3 v& z8 O9 E' U5 e8 ]
下面还是用张图介绍下时钟树,6 {$ l8 P, o, h* W! h1 ?
: L) ^: I2 t) X: i- o
时钟树.png
  I1 {( @" g. u2 g& T
图中红色部分是主要的几个时钟源,
HSE , HSI , LSE , LSI , PLL [用作倍频之用]
其实从英文就可理解它们的用途,如HSE代表High Speed External.
! s$ a9 }, E1 G( V, W; t% d( a6 S
HSE就不用说了,和传统的51,avr之类的外部晶振一个道理。
HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。
LSE 是低频率时钟源是供内部RTC用的,和DS1302或HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTC的clk用。
LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。
PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。

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

& ?; h% S4 h4 z" i0 r3 z. m
在知道了上面的知识知识之后就不难明白为啥stm32程序开始都要有个RCC_Configuration的函数了,其实里面就是要对RCC进行一番配置。
2 H3 Y& R! H) M

( l$ j8 G/ B: L: p
我们可以很简单的实现这一函数
void RCC_Configuration(void)
) G: l0 O3 g: p3 z' M& \{   : R! I9 t+ p; U
SystemInit();
! g# h% j- h/ Z7 |( u}
& v7 D: }0 J* M) B7 U
SystemInit是一个库函数,下面将其展开具体研究下[针对103系列],0 G4 R$ X0 Y8 |  n. Q3 i7 [
  f3 `# J' T2 `* g
  1. void SystemInit (void), d' A3 k' F* t2 }2 p$ s
  2. {6 S* v2 h8 c# u: g% {& i$ ^; X
  3.   RCC->CR |= (uint32_t)0x00000001;$ e7 I/ h; s% Z8 z( E( T
  4.   RCC->CFGR &= (uint32_t)0xF8FF0000;
    # _' i0 j+ o% M0 ?( h& N
  5.   RCC->CR &= (uint32_t)0xFEF6FFFF;9 G8 R, o1 X, s: n: N- h
  6.   RCC->CR &= (uint32_t)0xFFFBFFFF;
    1 R! s. ~% h! {
  7.   RCC->CFGR &= (uint32_t)0xFF80FFFF;
    $ K0 G4 u) R9 }7 T" w
  8.   RCC->CIR = 0x009F0000;  _+ U( x( j1 z1 K, B
  9.   SetSysClock();
    ' V. [4 c, D) c) x1 t9 D( j% b- n
  10. }
复制代码

( F: D" V/ b# U( K( {4 ~
关于a&=… 和 a|=…这样的赋值操作我就不说啥了,
里面RCC->CR这样的使用还是比较有意思的
RCC是一个指针型,其类型是RCC_TypeDef类型的,对于103的器件其具体如下
: u( B' V# q4 m/ d! m+ y
  1. typedef struct. w6 ~& q( R5 H. r% n. H. ?
  2. {' G, o  w  l' S" o: [. k
  3.   __IO uint32_t CR;9 A4 O! s* X9 F" w; W
  4.   __IO uint32_t CFGR;+ j& k" |' f% _" w1 [
  5.   __IO uint32_t CIR;
    . O& E/ M; w/ t: S
  6.   __IO uint32_t APB2RSTR;
    . Y6 z' T* I# a/ T7 I
  7.   __IO uint32_t APB1RSTR;7 A! P- B+ _+ F/ G# c+ K: C
  8.   __IO uint32_t AHBENR;
    % J, `# w1 Z% S# d9 B
  9.   __IO uint32_t APB2ENR;- h0 E6 @5 `' z' z! V0 @
  10.   __IO uint32_t APB1ENR;+ l4 m2 X4 Y$ H; `
  11.   __IO uint32_t BDCR;
    " D, C1 z; s% ?. a6 `0 Q
  12.   __IO uint32_t CSR;  R0 b+ F0 s8 q
  13. } RCC_TypeDef;
复制代码
8 K  G* q6 x. K; [
__IO 就是volatile ,而后面那个uint32_t就是告诉要占32位的长度这样RCC指向的其实就是RCC相关寄存器的基地址,然后通过->便可取到相应的寄存器。下面简要说明下配置步骤【103系列】1 Set HSION bit 6 u7 I$ h+ X$ }+ K9 f
2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits( `" W( u( u1 a
3. Reset HSEON, CSSON and PLLON bits : |$ _4 `3 f7 L) m$ C; g9 o
4. Reset HSEBYP bit
- Q4 H7 E% I5 |% S5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits - R$ W  f6 l& c0 _, m
6. Disable all interrupts and clear pending bits
/ |: \( d* _/ f$ @! u7. sysclock的配置
( N; t+ `& A2 e2 b第9部需要借助于如下函数【以72MHZ为例】
0 y0 P+ D2 ]* J% d; S" Ostatic void SetSysClockTo72(void);/ O: F1 L% U$ g( \% }
具体以后有时间再做分析。
$ B& Z! S$ w" c2 F+ M! ]2 Y- P& w  t5 M
赞 收藏 评论0 发布时间:2022-1-23 15:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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