
STM32初学者笔记(1) 一步步建立自己的STM32函数7 A; M! m1 c/ S+ w: N: F6 [" q 使用自己建立的 STM32F103.H 的 头文件。里面有大量中文注释。非常适合初学者。+ r8 z t8 ^# C Z" e 7 c8 T7 C% s" L& y& g" e; k6 M STM32的库实在太庞大负责,对初学者来说实在是件头痛的事情!' z' v0 r7 h- s/ ^% t4 I + }3 x$ d3 N b8 _; q+ y: I' I0 Z 下面是万利开发板 LCD DEMO 例子中的函数,改后初学者可以对照学习一下。4 R, `1 X0 [% @6 H) o: @/ d0 l' A+ k //========================================================================= // 原函数名称: RCC_Configuration(void)0 [* T* r( z# _/ q //=========================================================================4 W5 @8 y! r/ X; c8 J Y7 q void STM32_RCC_Configuration(void)7 U* M/ H5 ]! W Z" W {4 T+ q3 m1 `; L- B' y* q/ b1 T # p8 E$ E5 Z, l- P! Q6 F3 H2 u1 O STM32_Rcc_Regs->cr.bit.HSEON=0; // HSE振荡器开启关闭: G ?! k9 H' t STM32_Rcc_Regs->cr.bit.HSEBYP=0; // 外部高速时钟没有旁路! i4 e' S. ^9 ` i, T STM32_Rcc_Regs->cr.bit.HSERDY=0; // 外部高速时钟就绪标志清零5 k" r5 H7 }' k/ _( } STM32_Rcc_Regs->cr.bit.HSEON=1; // 外部高速时钟使能 1:HSE振荡器开启 while( !(STM32_Rcc_Regs->cr.bit.HSERDY ) );//由硬件置1来指示外部时钟已经稳定。 /* HCLK = SYSCLK=72MHZ :HLCK 提供给CPU, 内存和DMA 最大72MHZ */$ B' `5 }* I! C STM32_Rcc_Regs->crfgr.bit.HPRE=RCC_AHB_SYSCLK_DIV1_B; //AHB预分频5 }& z3 p8 T0 a1 i' `; ` /* PCLK2 = HCLK/1=SYSCLK=72 PCLK2 提供给 APB2外设,最大72MHZ */3 G0 G3 m) X. ] STM32_Rcc_Regs->crfgr.bit.PPRE2=RCC_APB2_HCLK_DIV1_B; //高速APB预分频(APB2) 6 e1 ^# r5 b, F9 \, {6 N /* PCLK1 = HCLK/2=SYSCLK/2=36 PCLK1提供给APB1外设,最大36MHZ */, s- Q( z- L2 R8 l1 V/ r) j' ?) m0 c STM32_Rcc_Regs->crfgr.bit.PPRE1=RCC_APB1_HCLK_DIV2_B; //低速APB预分频(APB1)必须保证APB1时钟频率不超过36MHz: ?- T. _* @( T+ A7 A7 C5 g " Q( `- [: h' Y0 X5 \2 o /* ADCCLK = PCLK2/6 ADC转换速率:72M/6 = 12MHZ */1 U4 z) T0 M# U Y; D: m1 q: j! ] STM32_Rcc_Regs->cfgr.bit.ADCPRE=RCC_ADCPRE_PCLK2_DIV6_B; 8 r. m6 M* r( c/ o4 Y, @ /* Flash 2 wait state */$ D/ R- @% {3 A STM32_Flash_Regs->ACR.all&=((u32)0x00000038); //清零某些位( E p. a4 I4 ^ STM32_Flash_Regs->ACR.bit.LATENCY=2; STM32_Flash_Regs->ACR.bit.PRFTBE=1; //预取缓冲区使能 : F4 a/ X5 @. Q5 k /* PLLCLK = 8MHz * 9 = 72MHZ ) */ STM32_Rcc_Regs->cfgr.bit.PLLXTPRE=0; //HSE分频器作为PLL输入 0:HSE不分频 STM32_Rcc_Regs->cfgr.bit.PLLSRC=1; //HSE时钟作为PLL输入时钟 STM32_Rcc_Regs->cfgr.bit.PLLMUL=RCC_PLL_9_B; //PLL倍频系数9 /* Enable PLL */ STM32_Rcc_Regs->cr.bit.PLLON=1; // PLL使能 while( !(STM32_Rcc_Regs->cr.bit.PLLRDY ) ); // PLL时钟就绪标志 PLL锁定后由硬件置16 q& |8 b' \ n7 t 3 ]8 }# x; q2 A" W /* Select PLL as system clock source */; z% G1 U8 r# c8 X* x STM32_Rcc_Regs->cfgr.bit.SW=0; STM32_Rcc_Regs->cfgr.bit.SW=2; //RCC_SW_SYSCLK_PLL1 L! @2 u, w/ Q5 m4 S+ W& u. s! J /* Wait till PLL is used as system clock source */ while(STM32_Rcc_Regs->cfgr.bit.SWS!=2); //RCC_SWS_SYSCLK_PLL, P6 K$ W* A5 q/ ^0 i7 p /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE and AFIO clocks */" Z/ ^- d( ]+ R1 o9 j% e STM32_Rcc_Regs->apb2enr.all |=(RCC_AFIOEN|RCC_IOPAEN|RCC_IOPBEN|RCC_IOPCEN|RCC_IOPDEN|RCC_IOPEEN);) ^; a! K8 Q, l5 N9 ~ ; b; ]' \7 g- q; v% I /* TIM2 AND CAN clocks enable */ STM32_Rcc_Regs->apb1enr.all |=(RCC_TIM2EN| RCC_CANEN); 6 W+ a$ l9 ]. N( c' d6 ~' Y 2 N) y3 U8 A6 G" n* J8 x& ]& h } 出处:netjob |
是啊 当时还在学校
才发现,这是08年的帖子,08年还没有HAL....: e9 f ]1 L+ S+ }" B