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

如何将STM32的外部晶振设置主频为48M

[复制链接]
攻城狮Melo 发布时间:2023-3-14 13:59
因为项目上对时钟要求不高,只需要用到一个9600波特率的串口和一些普通IO口,下面是简单的使用方法。
0 O" X, F0 ^9 \8 E7 {  r
  1. void MYRCC_DeInit(void)
    " F6 @8 y4 B6 U8 @" a+ z
  2. {/ K/ q& j- F. ?+ R7 V( f; c8 m: n
  3.     RCC->APB1RSTR = 0x00000000;//复位结束
    8 l# F/ H3 h" @+ L9 [
  4.     RCC->APB2RSTR = 0x00000000;" x7 w: f$ m/ \: i6 Q
  5. , Z4 {( g, p9 W& i! D$ D8 p# S
  6.     RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.
    + c3 E; a) P" I# K% `& a  }/ u: {
  7.     RCC->APB2ENR = 0x00000000; //外设时钟关闭.- c0 t9 N! ?9 O+ Z3 d0 F' ]
  8.     RCC->APB1ENR = 0x00000000;4 ]+ T6 ~' I6 X# o; k5 I" O' r( D
  9.     RCC->CR |= 0x00000001;     //使能内部高速时钟HSION4 i' F7 ~) Q' u" E3 I
  10.     RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]1 ~" g% P. B, `* O7 H4 P" E6 d
  11.     RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
    2 s/ }( _7 w0 p8 k4 |! @' G
  12.     RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP0 c: Z- C! G# P
  13.     RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
    & N9 @. }$ i4 e! h
  14.     RCC->CIR = 0x00000000;     //关闭所有中断
    ' }% `' p% R6 V) m, i) B
  15.     //配置向量表3 Q2 W6 t$ [5 w  E$ I; Y
  16. #ifdef  VECT_TAB_RAM, y! k7 q& ]. f" F/ C
  17.     NVIC_SetVectorTable(0x20000000, 0x0);
    " P# v4 ?! ?: K
  18. #else
    , j+ x1 _. l7 v9 i' Z0 i% W+ z7 }
  19.     NVIC_SetVectorTable(0x08000000, 0x0);- N8 x1 B) @: F
  20. #endif7 a. Q+ ?$ q$ U5 ~# P
  21. }* ]; O% t+ j  \% X
  22. 9 M- t9 N( M9 y" _! }- h  m
  23. " u5 ^" @6 I* P! q* K) t

  24. # ]" l/ L4 z% y- U
  25. void Stm32_Clock_Init(u8 PLL)
    0 l, w) }! Q. b- f9 @; `* G
  26. {# d/ d' Y; t8 p. _# x
  27.     unsigned char temp = 0;$ T# F; l( P9 \; {% E, V
  28.     MYRCC_DeInit();                  //复位并配置向量表
    6 z; r# I2 P+ N- ~8 b
  29.     RCC->CR |= 0x00000001; //内部高速时钟使能HSION
    6 C& q! S2 \* B% E6 ^7 G
  30.     while(!(RCC->CR >> 1)); //等待内部时钟就绪
    % n  l/ k# z% ?2 H- A# S1 H
  31.     RCC->CFGR = 0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;+ u/ z; M8 H7 [8 @9 v' e
  32.     PLL -= 2; //抵消2个单位% {' y& M' B: c: H) Q. q
  33.     RCC->CFGR |= PLL << 18; //设置PLL值 2~166 g. E1 ~. D7 d7 `; z6 E2 ]! l
  34.     RCC->CFGR |= 0 << 16;         //PLLSRC ON  HSI经2分频后作为PLL输入时钟
    5 k1 ?$ k1 {" [" m2 q3 k  V$ Q* o- p
  35.     FLASH->ACR |= 0x32;         //FLASH 2个延时周期
    8 R4 D; n; E! D' G5 d! N+ E6 k

  36. : S3 d) F& i1 X
  37.     RCC->CR |= 0x01000000; //PLLON! m) i* v% [5 n* _2 V( o2 F2 q/ ]
  38.     while(!(RCC->CR >> 25)); //等待PLL锁定
    $ q( y" q2 S. N; J3 `
  39.     RCC->CFGR |= 0x00000002; //PLL作为系统时钟
    8 i$ @( A2 Q* k. ]8 P# s
  40.     while(temp != 0x02)   //等待PLL作为系统时钟设置成功
    $ t! }: Z( o/ R7 ~8 ^
  41.     {
    9 P$ j1 I4 X. d8 \+ |) l" P% |
  42.         temp = RCC->CFGR >> 2;8 j/ z& ?: P+ A/ b
  43.         temp &= 0x03;0 R1 B; J5 y0 q' y, \8 K) W" p
  44.     }8 }* }. U/ R8 I# N. R$ m
  45. }
    # G7 G2 W- j9 s; a9 m, v- u
  46. 6 l% F$ y  H  ^5 F" @+ f! \4 Y. D

  47. - V% y; ?3 b. E4 @; x
  48. int main(void); |! m( u2 K3 |4 V. n
  49. {7 k% r  g/ w3 o  o$ |
  50.     int i;# I, e) h! ~) p) ]
  51.     Stm32_Clock_Init(12);+ l+ |& ]: y3 ]7 ~8 p
  52.     delay_init();                     //延时函数初始化+ P8 M5 ^7 U' G$ p8 o
  53.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级% U5 B% e6 m( E6 p" t
  54.     uart_init(9600);         //串口初始化为115200
    : }, F6 f) i9 l! k* A2 E! g0 s' h" X
  55.     LED_Init();                             //LED端口初始化
    & W: n9 d6 g) O/ }7 r3 q
  56.     TIM3_Int_Init(49, 48 - 1); //10Khz的计数频率,计数到5000为500ms/ X9 L8 G6 Y1 i- ^$ p; J: p1 D$ K3 H

  57. " S$ ~7 b9 a- ]. H1 ]
  58.     while(1)( |+ U* Y& M5 T% \
  59.     {$ p6 m# b$ T, p) o* p" R: v
  60.         printf("hello\r\n");) B" ]* h; w2 \* _* ^9 }
  61.         delay_ms(1000);' v$ d# g" Q1 ?- G8 M
  62.     }, _/ S* A0 \. L! `9 @! ]
  63. }& t' _7 P; o5 b/ w0 m
  64. + [; @1 Z2 a' D% y/ J7 J' p
复制代码
# F( `3 \% J" J. H! Z" ^8 k
为了保证系统时钟的delay函数正常,还需要在system_stm32f10x.c中注释掉原有的时钟#define SYSCLK_FREQ_72MHz 72000000并改为#define SYSCLK_FREQ_48MHz 48000000。: r, m% j& z9 Y. M
" ^: q* H3 U- Z, Y' [6 e- g
20190831213410305.png
, S' z" \' m, p& R4 s, j2 b7 D————————————————6 {, v7 I% w! s" H0 V7 o6 _1 o
版权声明:小盼你最萌哒
如有侵权请联系删除
: ?9 _3 K* A- V7 j+ l3 v, J' E8 ^# Y7 ]
" ~4 u8 r1 I6 y/ \% u) x
赞 收藏 评论0 发布时间:2023-3-14 13:59

举报

0个回答

所属标签

相似技术帖

官网相关资源

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