一、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:挂起寄存器
原文地址:https://www.cnblogs.com/youwei666/p/11788543.html