打印
[MM32软件]

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

[复制链接]
713|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caizhiwei|  楼主 | 2020-4-27 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
作为一枚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


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



使用特权

评论回复
沙发
gaoyang9992006| | 2020-4-27 23:50 | 只看该作者
是的,随便找个例子工程,编译后,然后可以定位到这个宏位置。

使用特权

评论回复
板凳
wziyi| | 2020-4-28 07:18 | 只看该作者
官方的提供软件明显是凑数的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

857

帖子

14

粉丝