
STM32初学者笔记(1) 一步步建立自己的STM32函数 使用自己建立的 STM32F103.H 的 头文件。里面有大量中文注释。非常适合初学者。$ L& r% T' d5 S; h+ u: J+ G* t" t) B" M STM32的库实在太庞大负责,对初学者来说实在是件头痛的事情! 下面是万利开发板 LCD DEMO 例子中的函数,改后初学者可以对照学习一下。 % k' }" S6 ~0 x0 E# S' k$ w //=========================================================================# S- v' n% X) P$ d5 | // 原函数名称: RCC_Configuration(void) //========================================================================= void STM32_RCC_Configuration(void)# A9 D% O; q. p( L7 | {# W7 G. t! q6 {) q5 X / Z8 Z1 Y+ @$ S! L STM32_Rcc_Regs->cr.bit.HSEON=0; // HSE振荡器开启关闭6 i) e( a5 M" m& B STM32_Rcc_Regs->cr.bit.HSEBYP=0; // 外部高速时钟没有旁路 STM32_Rcc_Regs->cr.bit.HSERDY=0; // 外部高速时钟就绪标志清零 0 P; @ Z, y+ _- x* T1 U STM32_Rcc_Regs->cr.bit.HSEON=1; // 外部高速时钟使能 1:HSE振荡器开启 & E4 j; |5 g0 U 7 l {+ P4 W2 O/ T while( !(STM32_Rcc_Regs->cr.bit.HSERDY ) );//由硬件置1来指示外部时钟已经稳定。 $ q F: X' J' t2 L$ y+ @ /* HCLK = SYSCLK=72MHZ :HLCK 提供给CPU, 内存和DMA 最大72MHZ */ STM32_Rcc_Regs->crfgr.bit.HPRE=RCC_AHB_SYSCLK_DIV1_B; //AHB预分频 / X9 |; I" W3 f; D: } /* PCLK2 = HCLK/1=SYSCLK=72 PCLK2 提供给 APB2外设,最大72MHZ */ STM32_Rcc_Regs->crfgr.bit.PPRE2=RCC_APB2_HCLK_DIV1_B; //高速APB预分频(APB2) /* PCLK1 = HCLK/2=SYSCLK/2=36 PCLK1提供给APB1外设,最大36MHZ */ STM32_Rcc_Regs->crfgr.bit.PPRE1=RCC_APB1_HCLK_DIV2_B; //低速APB预分频(APB1)必须保证APB1时钟频率不超过36MHz 8 m6 Z* r1 g! C0 |( u' S4 M $ u1 J; M" E- x) ]( l; \ /* ADCCLK = PCLK2/6 ADC转换速率:72M/6 = 12MHZ */ STM32_Rcc_Regs->cfgr.bit.ADCPRE=RCC_ADCPRE_PCLK2_DIV6_B; ) i+ M7 w4 y+ v( L: c9 J* D4 y# | /* Flash 2 wait state *// m- G6 Y5 |+ k, z* m4 f/ |3 ^* a STM32_Flash_Regs->ACR.all&=((u32)0x00000038); //清零某些位 STM32_Flash_Regs->ACR.bit.LATENCY=2; ) {2 q8 f3 F$ f/ D STM32_Flash_Regs->ACR.bit.PRFTBE=1; //预取缓冲区使能 @6 _$ G( z! k! b7 Z3 ] / O# C! t% q( M: g /* PLLCLK = 8MHz * 9 = 72MHZ ) */5 x9 m% o9 V% d6 [ STM32_Rcc_Regs->cfgr.bit.PLLXTPRE=0; //HSE分频器作为PLL输入 0:HSE不分频" l: L6 f! F9 _' h0 g3 X& | STM32_Rcc_Regs->cfgr.bit.PLLSRC=1; //HSE时钟作为PLL输入时钟0 p7 T8 S( n$ U d STM32_Rcc_Regs->cfgr.bit.PLLMUL=RCC_PLL_9_B; //PLL倍频系数9 /* Enable PLL */# @; Q+ E5 y" P8 J STM32_Rcc_Regs->cr.bit.PLLON=1; // PLL使能 ! E6 b7 l' [* `' X7 F/ V; T9 W( V while( !(STM32_Rcc_Regs->cr.bit.PLLRDY ) ); // PLL时钟就绪标志 PLL锁定后由硬件置1 /* Select PLL as system clock source */* r0 Q8 M; _% _2 J! `1 l7 q7 q6 a STM32_Rcc_Regs->cfgr.bit.SW=0; STM32_Rcc_Regs->cfgr.bit.SW=2; //RCC_SW_SYSCLK_PLL /* Wait till PLL is used as system clock source */ 7 J0 G) E) d+ R) r0 f: f" x while(STM32_Rcc_Regs->cfgr.bit.SWS!=2); //RCC_SWS_SYSCLK_PLL1 r2 }) r7 k$ z /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */2 U/ Y5 \& [) g9 G5 K6 B, i* N7 H STM32_Rcc_Regs->apb2enr.all |=(RCC_AFIOEN|RCC_IOPAEN|RCC_IOPBEN|RCC_IOPCEN|RCC_IOPDEN|RCC_IOPEEN);! P( Y5 k1 {1 L; p; x /* TIM2 AND CAN clocks enable *// h0 ~' [. s; U7 H STM32_Rcc_Regs->apb1enr.all |=(RCC_TIM2EN| RCC_CANEN); 6 Y; ?6 e& \, j0 w. l' h } 出处:netjob |
是啊 当时还在学校
. i" E) _2 o X* J" c5 R
才发现,这是08年的帖子,08年还没有HAL....