作为一枚stm32资深用户,很高兴能测评国产mcu。
1. 我首先下载了 sdk历程,然后很自然的打开了第一个工程,BLINK.先看看代码的目录和框架,完全是抄袭正点原子的呢,不过注释删的很干净,赞。
sys.c 这个文件原子是冗余的,那么mm32也照抄过来了。
2. 先看看sys.c 里面有啥?
#include "sys.h"
/********************************************************************************************************
**函数信息 :System_Clock_Init(u8 PLL)
**功能描述 :外部时钟倍频后作为系统时钟
**输入参数 :PLL:倍频倍数
**输出参数 :无
********************************************************************************************************/
void System_Clock_Init(u8 PLL)
{
unsigned char temp=0;
RCC->CR|=RCC_CR_HSEON; //外部高速时钟使能HSEON
while(!(RCC->CR&RCC_CR_HSERDY));//等待外部时钟就绪
RCC->CFGR=RCC_CFGR_PPRE1_2; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
RCC->CFGR|=RCC_CFGR_PLLSRC; //PLLSRC ON
RCC->CR &=~(RCC_CR_PLLON); //清PLL// RCC->CR &=~(7<<20); //清PLL
RCC->CR &=~(0x1f<<26);
RCC->CR|=(PLL - 1) << 26; //设置PLL值 2~16
FLASH->ACR|=FLASH_ACR_LATENCY_1|FLASH_ACR_PRFTBE|FLASH_ACR_PRFTBS; //FLASH 2个延时周期
RCC->CR|=RCC_CR_PLLON; //PLLON
while(!(RCC->CR&RCC_CR_PLLRDY));//等待PLL锁定
RCC->CFGR|=RCC_CFGR_SW_PLL;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
这个是设置主时钟为48Mhz,时钟源为外部晶振。
回过头来看main.c 发现它并没有调用 System_Clock_Init(xx);
这是为什么呢?
因为在进入main函数之前,系统已经调用了start.s文件中的SystemInit函数。
这个函数的作用就是初始化时钟为内部时钟并且倍频到48Mhz。
3. 找证据:
找到system_MM32L0XX.c 文件中的SetSysClockTo48_HSI()函数。确实已经宏定义了
#elif defined SYSCLK_HSI_48MHz
然后我们就跟这个宏找下去89行:
//#define SYSCLK_FREQ_HSE HSE_VALUE
//#define SYSCLK_FREQ_24MHz 24000000
//#define SYSCLK_FREQ_36MHz 36000000
//#define SYSCLK_FREQ_48MHz 48000000
//#define SYSCLK_HSI_24MHz 24000000
//#define SYSCLK_HSI_36MHz 36000000
#define SYSCLK_HSI_48MHz 48000000
原来真相大白了!
如果使用外部晶体并倍频到48Mhz主频,请打开宏define SYSCLK_FREQ_48MHz 48000000
如果使用内部RC并倍频到48Mhz主频,请打开宏#define SYSCLK_HSI_48MHz 48000000
如此一来,不管你用内部时钟还是外部时钟,只要修改宏定义即可,我还需要你这个sys.c干什么呢?
进入main函数后,需要重新初始化时钟,但是实际上,进main函数之前,时钟就已经初始化好。
4. 写在最后:
如果要修改外部晶体时钟频率怎么办?
请在 MM32L0XX.h中,修改
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] In the following line adjust the value of External High Speed oscillator (HSE)
used in your application
*/
#define HSE_Value ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
#define HSE_VALUE HSE_Value
到此,第一篇测评结束,期待后后面慢慢来品尝,这只是前菜吧~
|