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

一、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

时间: 2024-10-21 15:15:31

SYSTEM文件夹下的sys文件夹学习小结的相关文章

面试题求解:用java列举某个文件夹下所有的文件或者目录编程题

有人问及一个用java列举某个文件夹下所有的文件或者目录编程题.结果他不加思索的写了十几行代码,就搞定了,结果面试官说等通知,直到最后都没通知他,我猜想出题人的最终想法是看如何封装代码,如何灵活使用丰富的API. 于是我试着写一个可选择结果,希望对各位有用: import java.io.File; import java.io.FileFilter; /** 如何列出某个目录下的所有文件/目录 @author leizhimin 2010-3-22 20:58:37 */ public cla

遍历一个文件夹下的所有文件

一个老问题,但是总有人爱问,遍历一个文件夹下的所有文件,并输出文件信息. using System; using System.Collections.Generic; using System.ComponentModel;using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace IOTest { public partial class For

java读取某个文件夹下的所有文件

import java.io.FileNotFoundException;import java.io.IOException;import java.io.File; public class ReadFile {        public ReadFile() {        }        /**         * 读取某个文件夹下的所有文件         */        public static boolean readfile(String filepath) thro

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new

Java遍历一个文件夹下的全部文件

Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其它流类不同的是,流类关心的是文件的内容.而File类关心的是磁盘上文件的存储. 一,File类有多个构造器,经常使用的构造器有: 1.public File(String pathname){} 在pathname路径下创建文件对象 2.public File(String path,String name){} 在path參数指定的文件夹中创建具有给定名字的File对象.假设path为null,构造器将使用

用Java实现将多级文件夹下的所有文件统一放到一个文件夹中

每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了一个小工具. 以下代码只实现了把多级文件夹下的所有文件复制到一个文件夹中,如果需要指定复制文件的格式,可以在1111处添加一个判断.如果需要同时删除原文件夹可以在添加一个递归删除的方法. package Bao; import java.io.BufferedInputStream;import j

cocos2d-x 如何读取遍历文件夹下的所有文件 (简单明了/童少无欺)

比如我要遍历Resources/music下面所有的文件 导入头文件 #include <sys/stat.h> #include "dirent.h" #include "unistd.h" 实现代码 std::string filePath = FileUtils::getInstance()->fullPathForFilename("music"); CCLOG("%s",filePath.c_str

Android开发系列(十七):读取assets文件夹下的数据库文件

在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中写的一个小游戏的一个问题.另外也能够读取Raw文件夹下的数据库文件) 这就造成了一个问题.这个问题事实上非常好解决,解决方法例如以下: 我们首先把有数据的数据库文件放在assets资源文件夹下边,然后在apk应用启动的时候,把assets文件夹下的数据库文件的数据写入到真机的内存中去. 下边開始我们

JAVA 遍历文件夹下的所有文件

JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = 0, folderNum = 0; File file = new File(path); if (file.exists()) { LinkedList<File> list = new LinkedList<File>(); File[] files = file.listFile