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

[复制链接]
 楼主| caizhiwei 发表于 2020-4-27 22:20 | 显示全部楼层 |阅读模式
作为一枚stm32资深用户,很高兴能测评国产mcu。
1. 我首先下载了 sdk历程,然后很自然的打开了第一个工程,BLINK.先看看代码的目录和框架,完全是抄袭正点原子的呢,不过注释删的很干净,赞。
sys.c 这个文件原子是冗余的,那么mm32也照抄过来了。

2. 先看看sys.c 里面有啥?
  1. #include "sys.h"

  2. /********************************************************************************************************
  3. **函数信息 :System_Clock_Init(u8 PLL)                     
  4. **功能描述 :外部时钟倍频后作为系统时钟
  5. **输入参数 :PLL:倍频倍数
  6. **输出参数 :无
  7. ********************************************************************************************************/
  8. void System_Clock_Init(u8 PLL)
  9. {
  10.     unsigned char temp=0;   
  11.     RCC->CR|=RCC_CR_HSEON;  //外部高速时钟使能HSEON
  12.     while(!(RCC->CR&RCC_CR_HSERDY));//等待外部时钟就绪
  13.     RCC->CFGR=RCC_CFGR_PPRE1_2; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  14.    
  15.     RCC->CFGR|=RCC_CFGR_PLLSRC;          //PLLSRC ON
  16.     RCC->CR &=~(RCC_CR_PLLON);                //清PLL//        RCC->CR &=~(7<<20);                //清PLL
  17.    
  18.     RCC->CR &=~(0x1f<<26);       
  19.     RCC->CR|=(PLL - 1) << 26;   //设置PLL值 2~16
  20.    
  21.     FLASH->ACR|=FLASH_ACR_LATENCY_1|FLASH_ACR_PRFTBE|FLASH_ACR_PRFTBS;          //FLASH 2个延时周期
  22.    
  23.     RCC->CR|=RCC_CR_PLLON;  //PLLON
  24.     while(!(RCC->CR&RCC_CR_PLLRDY));//等待PLL锁定
  25.     RCC->CFGR|=RCC_CFGR_SW_PLL;//PLL作为系统时钟         
  26.     while(temp!=0x02)     //等待PLL作为系统时钟设置成功
  27.     {   
  28.         temp=RCC->CFGR>>2;
  29.         temp&=0x03;
  30.     }   
  31. }       

这个是设置主时钟为48Mhz,时钟源为外部晶振。
回过头来看main.c 发现它并没有调用 System_Clock_Init(xx);
这是为什么呢?
因为在进入main函数之前,系统已经调用了start.s文件中的SystemInit函数。
这个函数的作用就是初始化时钟为内部时钟并且倍频到48Mhz。

3. 找证据:
找到system_MM32L0XX.c 文件中的SetSysClockTo48_HSI()函数。确实已经宏定义了
#elif defined SYSCLK_HSI_48MHz
然后我们就跟这个宏找下去89行:
  1. //#define SYSCLK_FREQ_HSE    HSE_VALUE
  2. //#define SYSCLK_FREQ_24MHz  24000000  
  3. //#define SYSCLK_FREQ_36MHz  36000000
  4. //#define SYSCLK_FREQ_48MHz  48000000

  5. //#define SYSCLK_HSI_24MHz  24000000
  6. //#define SYSCLK_HSI_36MHz  36000000
  7. #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中,修改
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] In the following line adjust the value of External High Speed oscillator (HSE)
  3. used in your application
  4. */
  5. #define HSE_Value    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/
  6. #define HSE_VALUE    HSE_Value


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



gaoyang9992006 发表于 2020-4-27 23:50 | 显示全部楼层
是的,随便找个例子工程,编译后,然后可以定位到这个宏位置。
wziyi 发表于 2020-4-28 07:18 | 显示全部楼层
官方的提供软件明显是凑数的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部

100

主题

856

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部