码迷,mamicode.com
首页 > 其他好文 > 详细

SYSTEM文件夹下的sys文件夹学习小结

时间:2019-11-03 20:13:42      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:优先   电源   isa   alt   inf   ble   一个   系统时钟初始化   reset   

一、sys文件夹包含五个文件,其中,我们需要重点了解两个,sys.c和sys.h。

二、sys.h里面定义了STM32F1的I/O口输入读取宏定义和输出宏定义。

      sys.c里面定义了很多与STM32F1底层硬件相关的设置函数,包括系统时钟的配置、I/O配置、中断的配置等。

三、sys.h 中几个其他的全局宏定义:

//0,不支持 OS; 1,支持 OS
#define SYSTEM_SUPPORT_OS 0 //定义系统文件夹是否支持 OS
//Ex_NVIC_Config 专用定义
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define GPIO_D 3
#define GPIO_E 4
#define GPIO_F 5
#define GPIO_G 6
#define FTIR 1 //下降沿触发
#define RTIR 2 //上升沿触发
//JTAG 模式设置定义
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00

SYSTEM_SUPPORT_OS,这个宏定义用来定义 SYSTEM 文件夹是否支持操作系统( OS),
如果在 OS 下面使用 SYSTEM 文件夹,那么设置这个值为 1 即可,否则设置为 0(默认)。

四、Stm32_Clock_Init函数

★ 1、STM32的时钟树图

技术图片

 

①PLLMUL

PLLMUL用于设置STM32的PLLCLK,STM32支持2~16倍频设置。

常用的是8MHz外部晶振+9倍频设置,刚好得到72MHz的PLLCLK。

②SW

SW是STM32的SYSCLK切换开关。

从图中可以看出,SYSCLK的来源可以是3个:HSI、PLLCLK和HSE,一般选择PLLCLK作为SYSCLK,最大为72MHz

③SYSTICK(系统滴答时钟)

从图中可以看出,来源是AHB分频后再8分频,一般设置AHB不分频,所以SYSTICK的频率就等于SYSCK/8

④PCLK1

PCLK1是APB1总线上外设的时钟,最大为36MHz

⑤PCLK2

PCLK1是APB2总线上外设的时钟,最大为72MHz

 

2、 Stm32_Clock_Init函数

该函数的主要功能就是初始化STM32的时钟,还包括对向量表的配置、相关外设的复位及配置。

//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16         
void Stm32_Clock_Init(u8 PLL)
{
    unsigned char temp=0;   
    MYRCC_DeInit();          //复位并配置向量表
     RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
    while(!(RCC->CR>>17));//等待外部时钟就绪
    RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
    PLL-=2;                  //抵消2个单位(因为是从2开始的,设置0就是2)
    RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
    RCC->CFGR|=1<<16;      //PLLSRC ON 
    FLASH->ACR|=0x32;      //FLASH 2个延时周期
    RCC->CR|=0x01000000;  //PLLON
    while(!(RCC->CR>>25));//等待PLL锁定
    RCC->CFGR|=0x00000002;//PLL作为系统时钟     
    while(temp!=0x02)     //等待PLL作为系统时钟设置成功
    {   
        temp=RCC->CFGR>>2;
        temp&=0x03;
    }    
}            

Stm32_Clock_Init函数中设置了APB1位2分频,APB2为1分频,AHB为1分频,同时选择了PLLCLK作为系统时钟。

该函数只有一个参数PLL,用来配置时中的倍频数的,比如当前所用的晶振为8MHz,PLL的值设为9,那么STM32将运行在72MHz的速度下。

3、Sys_Soft_Reset函数

该函数用来实现STM32的软复位

//系统软复位   
void Sys_Soft_Reset(void)
{   
    SCB->AIRCR =0X05FA0000|(u32)0x04;      
}          
Sys_Soft_Reset函数只是对SCB->AIRCR进行了一次操作,即实现了STM32的软复位。
4、Sys_Standby函数
STM32提供了3种低功耗模式,以达到不同层次的降低功耗的目的,分别是睡眠模式、停止模式、待机模式
Sys_Standby函数用来是STM32进入待机模式,在该模式下,STM32所消耗的功率最低。
//进入待机模式      
void Sys_Standby(void)
{
    SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)       
      RCC->APB1ENR|=1<<28;     //使能电源时钟        
     PWR->CSR|=1<<8;          //设置WKUP用于唤醒
    PWR->CR|=1<<2;           //清除Wake-up 标志
    PWR->CR|=1<<1;           //PDDS置位          
    WFI_SET();                 //执行WFI指令         
}         

这里用到了一个WFI_SET()函数,这是在C语言里面嵌入一条汇编指令。该函数的代码如下:

//THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI  
void WFI_SET(void)
{
    __ASM volatile("wfi");          
}

执行完WFI指令之后,STM32就进入了待机模式,系统将停止工作。

5、JTAG_SET函数

STM32支持JTAG和SWD两种仿真接口,他们和普通的I/O口共用。

STM32在默认状态下是开启JTAG的,我们可以通过修改JTAG模式配置,从而切换为普通的I/O口或其他状态。

JTAG模式配置函数代码如下:

//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;       
//#define JTAG_SWD_DISABLE   0X02
//#define SWD_ENABLE         0X01
//#define JTAG_SWD_ENABLE    0X00          
void JTAG_Set(u8 mode)
{
    u32 temp;
    temp=mode;
    temp<<=25;
    RCC->APB2ENR|=1<<0;     //开启辅助时钟       
    AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
    AFIO->MAPR|=temp;       //设置jtag模式
} 

6、中断管理函数

STM32在一些寄存器的控制下有序地执行,下面列举几个:

①ISER:Interrupt Set – Enable Registers 中断设置-启用寄存器

②ICER:Interrupt Clear – Enable Registers 中断清除-启用寄存器

③ISPR:Interrupt Set – Pending Registers 中断设置-挂起寄存器

④ICPR:Interrupt Clear – Pending Registers 中断清除-挂起寄存器

⑤IABR:Interrupt Active Bit Registers  中断激活位寄存器

⑥IP:Interrupt Priority Registers 中断优先级控制的寄存器组

 

外部中断EXTI控制MDK的几个寄存器:

IMR:中断屏蔽寄存器

EMR:事件屏蔽寄存器

RTSR:上升沿触发选择寄存器

FTSR:下降沿触发选择寄存器

SWIER:软件中断事件寄存器

PR:挂起寄存器

 

SYSTEM文件夹下的sys文件夹学习小结

标签:优先   电源   isa   alt   inf   ble   一个   系统时钟初始化   reset   

原文地址:https://www.cnblogs.com/youwei666/p/11788543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!