STM32L1开发心得(一、RCC/PWR篇)

STM32L1开发心得(一、RCC/PWR篇)

    因为电压及功耗方面的要求,需要从STM32F103将程序移植到STM32L151上面,以下内容就是程序移植过程中的心得体会。
    STM32F系列的应用很多,网上大把都是F系列的经验文章和例程,但是L系列的文章就很少,尤其是中文的资料就更少,所以使用L系列最痛苦的就是必须啃英文资料,这里写的开发心得就算是为同样英文不好工程师参考吧。
     本篇主要说说RCC/PWR的配置。
     与F1系列相比,L1系列有以下几个关键地方不太一样,需要特别注意:
     1、 L1系列的最高频率只能达到32M
     2、L1系列的HSI是16M的
     3、L1系列的内部RC振荡器除了HSI外,还增加了一个MSI,但MSI不能做为PLL的源
     4、MSI提供了从64K到4M之间几种超低频率,特别适合那种不能睡眠又没多少事干的节能应用场合
     5、内核电压Vcore是可以配置的,而Vcore的不同也影响最大工作频率和FLASH的配置
     6、L1的最低可运行电压为1.65V,用ADC或DAC时最低1.8V
     7、某些外设的总线改变,比如GPIOA在L1系列被映射到AHB总线上
     除了以上需要注意的事项外,笔者在调试RCC时,发现按照F1系列的通常例程修改后很难调通,建议编程时以ST公司提供的例程为蓝本,在此基础上修改成自已所需要的参数,以下是例程(HSI源的PLL):
     RCC_DeInit();
     RCC_HSICmd(ENABLE);                     //开启内部晶振HSI
     while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)== RESET);     //等待HSI就绪
     FLASH->ACR |= FLASH_ACR_ACC64;  //使能64位FLASH
     FLASH->ACR |= FLASH_ACR_PRFTEN;     //使能FLASH预取功能
     FLASH->ACR |= FLASH_ACR_LATENCY;  //1个等待周期
     RCC->APB1ENR |= RCC_APB1ENR_PWREN;    //使能POWER
     PWR->CR = PWR_CR_VOS_0;    //选择内核电压1级(1.8V)
     while((PWR->CSR & PWR_CSR_VOSF) != RESET) {}; //等待内核电压稳定
     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;   //HCLK
     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; //PCLK2
     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;  //PCLK1
     // PLL =16MHZ*2=32MHZ 
     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL |
                                    RCC_CFGR_PLLDIV));
     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI | RCC_CFGR_PLLMUL6 | RCC_CFGR_PLLDIV3);
     RCC->CR |= RCC_CR_PLLON;   //使能RCC
     while((RCC->CR & RCC_CR_PLLRDY) == 0){}  //等待PLL稳定
     //选择PLL做为系统时钟 
     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
     RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   
     //等待PLL稳定
     while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL){}
     //上面配置完成后,就可以将外设联接到时钟总线上了,比如联接GPIOA
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

你可能感兴趣的:(STM32)