caizhiwei 发表于 2020-4-27 22:20

【MM32 eMiniBoard测评报告】+sys.c文件显得有些多余

作为一枚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_24MHz24000000
//#define SYSCLK_FREQ_36MHz36000000
//#define SYSCLK_FREQ_48MHz48000000

//#define SYSCLK_HSI_24MHz24000000
//#define SYSCLK_HSI_36MHz36000000
#define SYSCLK_HSI_48MHz48000000
原来真相大白了!

如果使用外部晶体并倍频到48Mhz主频,请打开宏define SYSCLK_FREQ_48MHz 48000000
如果使用内部RC并倍频到48Mhz主频,请打开宏#define SYSCLK_HSI_48MHz 48000000

如此一来,不管你用内部时钟还是外部时钟,只要修改宏定义即可,我还需要你这个sys.c干什么呢?
进入main函数后,需要重新初始化时钟,但是实际上,进main函数之前,时钟就已经初始化好。

4. 写在最后:
如果要修改外部晶体时钟频率怎么办?
请在 MM32L0XX.h中,修改
/**
* @brief 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

到此,第一篇测评结束,期待后后面慢慢来品尝,这只是前菜吧~{:lol:}



gaoyang9992006 发表于 2020-4-27 23:50

是的,随便找个例子工程,编译后,然后可以定位到这个宏位置。

wziyi 发表于 2020-4-28 07:18

官方的提供软件明显是凑数的
页: [1]
查看完整版本: 【MM32 eMiniBoard测评报告】+sys.c文件显得有些多余