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

【经验分享】stm32之GPIO_Part1

[复制链接]
STMCU小助手 发布时间:2022-1-23 15:34
配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。
最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
电源.png 0 f' Q# K8 j% b8 H! B
关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。
4 m; y) K, J$ L  e8 c4 j! F" b, c( ^6 ~' t+ V# H4 r5 U4 ?0 U+ r
下面还是用张图介绍下时钟树,, t# q. P0 t  }& t! y* ~
( u- F% F1 m2 C0 _/ \' F* `
时钟树.png

  d% s* Y+ v3 P5 k( i& w
图中红色部分是主要的几个时钟源,
HSE , HSI , LSE , LSI , PLL [用作倍频之用]
其实从英文就可理解它们的用途,如HSE代表High Speed External.

9 Y* n  E  w  p6 H% H2 X
HSE就不用说了,和传统的51,avr之类的外部晶振一个道理。
HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。
LSE 是低频率时钟源是供内部RTC用的,和DS1302或HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTC的clk用。
LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。
PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。
0 c! ]' ?8 y6 L+ T; w6 a$ D* A
Arm整了个叫做AMBA的总线,不过对我来说就是一学术名词,具体内部有多复杂暂不知道也不过分关心。一般来说,只要知道AHB[advanced highspeed bus]上是高速的东西【诸如flash,dma什么的】,时钟对应HCLK,其上通过一个所谓的桥【bridge】连接到APB【p对应peripheral  】,其上连接的是一些外设【诸如gpio,串口什么的】,时钟对应PCLK。当然stm32的APB分成了两个,用1和2区分,GPIO挂在了APB2上了。
- X5 P( _4 ]' E
在知道了上面的知识知识之后就不难明白为啥stm32程序开始都要有个RCC_Configuration的函数了,其实里面就是要对RCC进行一番配置。& x) K2 p: D0 A+ c3 c
: l; x2 f# N9 E1 X7 I) P
我们可以很简单的实现这一函数
void RCC_Configuration(void)
7 i2 @* N# Z  h% `: L0 ~4 K{   
8 v4 P+ C1 ^2 S) u( b) y$ } SystemInit();- B/ n4 |; J- Z- D" V& v8 j8 v; k$ A
}8 z0 A1 r5 h; }7 Q8 b" Y+ N; V
SystemInit是一个库函数,下面将其展开具体研究下[针对103系列],, {) G& m  y  k# N$ D2 `

. }# Z- l2 {+ l7 ^$ w9 Q
  1. void SystemInit (void)
    & y8 _8 {9 R* \# _4 S8 @- d
  2. {# o" R" D3 [4 d! V0 o. n9 p+ p
  3.   RCC->CR |= (uint32_t)0x00000001;
    : s+ t6 ]$ R' D9 M: Y
  4.   RCC->CFGR &= (uint32_t)0xF8FF0000;
    ) ~2 o0 {9 ?2 W" {; V1 f# b
  5.   RCC->CR &= (uint32_t)0xFEF6FFFF;
    , W9 P1 O1 l* [! P/ q
  6.   RCC->CR &= (uint32_t)0xFFFBFFFF;0 a4 n4 D' \: v, S6 S4 I2 G
  7.   RCC->CFGR &= (uint32_t)0xFF80FFFF;/ O4 l) {5 R' X/ X, w6 w7 L
  8.   RCC->CIR = 0x009F0000;; u4 Q( y1 c  H2 \$ j
  9.   SetSysClock();
    & e% r6 z. X3 g% L
  10. }
复制代码

8 ], @6 c( c# l' }
关于a&=… 和 a|=…这样的赋值操作我就不说啥了,
里面RCC->CR这样的使用还是比较有意思的
RCC是一个指针型,其类型是RCC_TypeDef类型的,对于103的器件其具体如下
" h7 t$ K' b, k+ c5 J1 a
  1. typedef struct& [! P, t+ T7 U2 N
  2. {
    4 T" t1 Y4 Y; ~) Q4 G# z
  3.   __IO uint32_t CR;
    6 C! b; E' ^6 [) M
  4.   __IO uint32_t CFGR;
    " F0 M5 ~: B+ d; r& B
  5.   __IO uint32_t CIR;9 Y9 |: ^# S7 h9 K) j4 v5 B2 K
  6.   __IO uint32_t APB2RSTR;
    + n, Z" \" f9 ^5 d
  7.   __IO uint32_t APB1RSTR;
    9 k+ p* }2 G9 J! r
  8.   __IO uint32_t AHBENR;2 B. H9 n' K7 c; [1 f  C
  9.   __IO uint32_t APB2ENR;
    ' K1 @- Z( ]! }7 @
  10.   __IO uint32_t APB1ENR;
    , n/ v  H3 H; D' x% m: s
  11.   __IO uint32_t BDCR;
    2 i. e& d* m; y3 g
  12.   __IO uint32_t CSR;
    1 V2 _2 f" X; G$ T6 I
  13. } RCC_TypeDef;
复制代码
5 ~  t/ c- M9 I0 V
__IO 就是volatile ,而后面那个uint32_t就是告诉要占32位的长度这样RCC指向的其实就是RCC相关寄存器的基地址,然后通过->便可取到相应的寄存器。下面简要说明下配置步骤【103系列】1 Set HSION bit
( b' v2 P8 G! J8 u& H' k2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
  u) P- j$ z- L* H% v3. Reset HSEON, CSSON and PLLON bits , S* J7 t5 R4 R* |' ^, w
4. Reset HSEBYP bit   u) E! s. o+ X9 w# e/ Y
5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits
  X- s+ d! B6 [: S5 K" r% M. k. R6. Disable all interrupts and clear pending bits
- V/ D; Z5 K7 F7. sysclock的配置) O; x& g2 ^1 `% n1 k
第9部需要借助于如下函数【以72MHZ为例】
# b6 k. s' V/ ]3 }static void SetSysClockTo72(void);
& r2 x+ N2 C9 d0 P7 s4 B4 ~: w具体以后有时间再做分析。. D7 ]5 v& b% a. \, ]

/ g& _  [" E. r
赞 收藏 评论0 发布时间:2022-1-23 15:34

举报

0个回答

所属标签

相似技术帖

官网相关资源

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