0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32库函数开发&按键库函数开发源码篇

冬至子 来源:Qt历险记 作者:诺苏编程 2023-10-31 16:00 次阅读

LED流水灯

led.h

#ifndef __LED_H
#define __LED_H


#include "stm32f4xx.h"




void Led_Init(void);


void Led1_Init(void);
void Led2_Init(void);
void Led3_Init(void);
void Led4_Init(void);


#endif
typedef struct
{
  uint32_t GPIO_Pin;              /* 指定要配置的GPIO引脚 */


  GPIOMode_TypeDef GPIO_Mode;     /* 指定选定接点的操作模式。*/


  GPIOSpeed_TypeDef GPIO_Speed;   /* 指定选定接点的速度。*/


  GPIOOType_TypeDef GPIO_OType;   /* 指定选定接点的操作输出类型。*/


  GPIOPuPd_TypeDef GPIO_PuPd;     /* 指定选定接点的操作上拉/下拉。*/
}GPIO_InitTypeDef;

led.c

#include "led.h"




// init 4 pin
void Led_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  //使能GPIOE组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  
  //使能GPIOF组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);


  // GPIOF pin9 pin10
  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;    //引脚9/10
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOF, &GPIO_InitStruct);

  // GPIOE pin9 pin10
  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14;    //引脚13/14
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOE, &GPIO_InitStruct);


}




/*********************************
引脚说明:


LED0 -- PF9


**********************************/


void Led1_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOF组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9;    //引脚9
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOF, &GPIO_InitStruct);

}
/*********************************
引脚说明:


LED2 -- PF10


**********************************/
void Led2_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;



  //使能GPIOF组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_10;    //引脚10
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 



  GPIO_Init(GPIOF, &GPIO_InitStruct);
  
}
/*********************************
引脚说明:


LED3 -- PE13


**********************************/
void Led3_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOE组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13;    //引脚13
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOE, &GPIO_InitStruct);
}
/*********************************
引脚说明:


LED4 -- PE14


**********************************/
void Led4_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOE组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_14;    //引脚14
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOE, &GPIO_InitStruct);
}

main.c

#include "stm32f4xx.h"
#include "led.h"




// 延时
void delay(int n)
{
  int i,j;

  for(i=0; i< n; i++)
    for(j=0; j< 30000; j++);


}






int main(void)
{
//  Led1_Init();
//  Led2_Init();
//  Led3_Init();
//  Led4_Init();


  Led_Init();

  while(1)
  {


    //输出0  LED0灯亮
    GPIO_ResetBits(GPIOF, GPIO_Pin_9);
    delay(1000);

    //输出1  LED0灯灭
    GPIO_SetBits(GPIOF, GPIO_Pin_9);


    //输出0  LED1灯亮
    GPIO_ResetBits(GPIOF, GPIO_Pin_10);
    delay(1000);

    //输出1  LED1灯灭
    GPIO_SetBits(GPIOF, GPIO_Pin_10);


    //输出0  LED2灯亮
    GPIO_ResetBits(GPIOE, GPIO_Pin_13);
    delay(1000);

    //输出1  LED2灯灭
    GPIO_SetBits(GPIOE, GPIO_Pin_13);


    //输出0  LED3灯亮
    GPIO_ResetBits(GPIOE, GPIO_Pin_14);
    delay(1000);

    //输出1  LED3灯灭
    GPIO_SetBits(GPIOE, GPIO_Pin_14);


  }
  return 0;
}

按键控制灯

#ifndef __LED_H
#define __LED_H


#include "stm32f4xx.h"






#define LED0_ON    GPIO_ResetBits(GPIOF, GPIO_Pin_9)
#define LED0_OFF  GPIO_SetBits(GPIOF, GPIO_Pin_9)




void Led_Init(void);


#endif


/* ================================================ */


#include "led.h"




/*********************************
引脚说明:


LED0 -- PF9
LED1 -- PF10
LED2 -- PE13
LED3 -- PE14


**********************************/
void Led_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;

  //使能GPIOE组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);    
  //使能GPIOF组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  



  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_9|GPIO_Pin_10;    //引脚9 10
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOF, &GPIO_InitStruct);

  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14;    //引脚13 14
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz; //速度 
  GPIO_Init(GPIOE, &GPIO_InitStruct);  

  GPIO_SetBits(GPIOF, GPIO_Pin_9);
  GPIO_SetBits(GPIOF, GPIO_Pin_10);
  GPIO_SetBits(GPIOE, GPIO_Pin_13);
  GPIO_SetBits(GPIOE, GPIO_Pin_14);


}
#ifndef __KEY_H
#define __KEY_H


#include "stm32f4xx.h"






void Key_Init(void);


#endif


#include "key.h"




/*********************************
引脚说明:


KEY0--PA0


**********************************/
void Key_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;


  //使能GPIOA组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;    //引脚0
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;    //输入模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_Init(GPIOA, &GPIO_InitStruct);  


}

main.c

#include "stm32f4xx.h"
#include "led.h"
#include "key.h"




void delay(int n)
{
  int i,j;

  for(i=0; i< n; i++)
    for(j=0; j< 30000; j++);


}






int main(void)
{

  unsigned char count = 0;

  Key_Init();
  Led_Init();

  while(1)
  {
    /*
    //应用场景1
    //判断按键是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
    {
      //大约延时20ms 起到消抖作用
      delay(20);
      //判断按键是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
      {
        //灯状态变更
        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
        count++;
      }    

    }  
    //根据按键时长实现不同的功能 
    if(count == 50)
    {
      GPIO_ResetBits(GPIOE, GPIO_Pin_14);
    }
    */

    //应用场景2  比如输入银行密码
    //判断按键是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
    {
      //大约延时15ms 起到消抖作用
      delay(15);
      //判断按键是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
      {
        //等待按键松开
        while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET);
        //灯状态变更
        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);

      }    

    }  



  }
  return 0;
}

按键中断

#ifndef __EXTI_H
#define __EXTI_H


#include "stm32f4xx.h"




void Exti_PA0_Init(void);


#endif


#include "exti.h"


/*********************************
引脚说明:


KEY0--PA0(选择下降沿触发)




**********************************/


void Exti_PA0_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  EXTI_InitTypeDef  EXTI_InitStruct;
  NVIC_InitTypeDef  NVIC_InitStruct;

  //使能SYSCFG及GPIOA时钟:
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  //使能GPIOA组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);



  //初始化IO口为输入。
  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0;    //引脚0
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;    //输入模式
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;    //上拉
  GPIO_Init(GPIOA, &GPIO_InitStruct);  

  //设置IO口与中断线的映射关系。
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);


  EXTI_InitStruct.EXTI_Line  = EXTI_Line0;      //中断线0
  EXTI_InitStruct.EXTI_Mode  = EXTI_Mode_Interrupt;  //中断模式
  EXTI_InitStruct.EXTI_Trigger= EXTI_Trigger_Falling;  //下降触发
  EXTI_InitStruct.EXTI_LineCmd= ENABLE;        //中断使能
  //初始化线上中断,设置触发条件等。
  EXTI_Init(&EXTI_InitStruct);


  NVIC_InitStruct.NVIC_IRQChannel            = EXTI0_IRQn;     //中断通道,可在stm32f4xx.h文件当中查找
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority  = 1;        //抢占优先级
  NVIC_InitStruct.NVIC_IRQChannelSubPriority      = 1;        //响应优先级
  NVIC_InitStruct.NVIC_IRQChannelCmd          = ENABLE;      //通道使能
  //配置中断分组(NVIC),并使能中断。
  NVIC_Init(&NVIC_InitStruct);


}




void delays(int n)
{
  int i,j;

  for(i=0; i< n; i++)
    for(j=0; j< 30000; j++);


}




/***************************************************************
1、中断服务函数是满足条件后,CPU自行执行的函数不需要主动调用
2、中断服务函数是不能传递值与返回值
3、STM32的中断服务函数名可在startup_stm32f40_41xxx.s中查找
****************************************************************/
//编写中断服务函数
void EXTI0_IRQHandler(void)
{
  //判断标志位是否1
  if(EXTI_GetITStatus(EXTI_Line0) == SET)
  {
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
    {
      //延时一段时间
      delays(15);

      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
      {
        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
      }  

    }
  }
  //清空中断线0
  EXTI_ClearITPendingBit(EXTI_Line0);    
}

main.c

#include "stm32f4xx.h"
#include "led.h"
#include "key.h"




void delay(int n)
{
  int i,j;

  for(i=0; i< n; i++)
    for(j=0; j< 30000; j++);


}






int main(void)
{

  unsigned char count = 0;

  Key_Init();
  Led_Init();

  while(1)
  {
    //判断按键1是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
    {
      //大约延时15ms 起到消抖作用
      delay(15);
      //判断按键1是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
      {
        //等待按键1松开
        while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET);
        //灯1状态变更
        GPIO_ToggleBits(GPIOF, GPIO_Pin_9);
      }    

    }  


    //判断按键2是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET)
    {
      //大约延时15ms 起到消抖作用
      delay(15);
      //判断按键2是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET)
      {
        //等待按键2松开
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == Bit_RESET);
        //灯2状态变更
        GPIO_ToggleBits(GPIOF, GPIO_Pin_10);
      }    

    }  

    //判断按键3是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET)
    {
      //大约延时15ms 起到消抖作用
      delay(15);
      //判断按键3是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET)
      {
        //等待按键3松开
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == Bit_RESET);
        //灯3状态变更
        GPIO_ToggleBits(GPIOE, GPIO_Pin_13);
      }    

    }  

    //判断按键4是否按下 按下为低电平
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET)
    {
      //大约延时15ms 起到消抖作用
      delay(15);
      //判断按键4是否按下 按下为低电平
      if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET)
      {
        //等待按键4松开
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == Bit_RESET);
        //灯4状态变更
        GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
      }    

    }  
  }
  return 0;
}

作业

#ifndef __BEEP_H
#define __BEEP_H


#include "stm32f4xx.h"


void Beep_Init(void);


#endif


#include "beep.h"


/************************************
引脚说明


Beep -- PF8


************************************/
void Beep_Init()
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  //使能GPIOF组时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  

  GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_8;    //引脚8
  GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;  //输出模式
  GPIO_InitStruct.GPIO_OType  = GPIO_OType_PP;  //推挽输出
  GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_DOWN;    //xia la
  GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_100MHz; //速度 

  GPIO_Init(GPIOF, &GPIO_InitStruct);


}


#include "stm32f4xx.h"
#include "beep.h"


void delay(int n)
{
  int i,j;

  for(i=0; i< n; i++)
    for(j=0; j< 30000; j++);


}


int main(void)
{
  Beep_Init();

  while(1)
  {
    GPIO_ResetBits(GPIOF, GPIO_Pin_8);
    delay(1000);

    GPIO_SetBits(GPIOF, GPIO_Pin_8);
    delay(1000);
  }


  return 0;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348755
  • RCC
    RCC
    +关注

    关注

    0

    文章

    91

    浏览量

    26705
  • GPIO
    +关注

    关注

    16

    文章

    1133

    浏览量

    50570
  • 按键控制
    +关注

    关注

    0

    文章

    44

    浏览量

    8714
  • LED流水灯
    +关注

    关注

    0

    文章

    10

    浏览量

    8322
收藏 人收藏

    评论

    相关推荐

    库函数开发

    阅读性强,可移植高后期维护难度低库函数开缺点相对于寄存器开发,运行效率略低注意:库函数其实是ST公司对寄存器的进一步封装。4.3库函数开发L
    发表于 08-16 08:47

    STM32f1库函数开发

    2021-01-11 学习日志STM32f1库函数开发学习实战一 · I/O口1. 文件夹结构2. 配置细节 · 从寄存器到库函数3. 跑马灯4.
    发表于 08-17 06:29

    STM32开发指南V1.0 库函数版本1

    STM32开发指南V1.0 库函数版本》完美标签part1
    发表于 05-30 14:20 0次下载

    STM32开发指南V1.0 库函数版本2

    STM32开发指南V1.0 库函数版本》完美标签part2
    发表于 05-30 14:20 0次下载

    STC库函数使用参考

    STC库函数使用参考STC库函数使用参考
    发表于 07-06 15:14 0次下载

    ALIENTEK MiniSTM32开发板例程-库函数版本

    ALIENTEK MiniSTM32开发板例程-库函数版本—1-27个实验例程。
    发表于 07-25 17:45 0次下载

    ALIENTEK MiniSTM32开发板例程(库函数版本)

    ALIENTEK MiniSTM32开发板例程(库函数版本)_标准例程+扩展例程。
    发表于 07-25 17:45 0次下载

    STM32F1开发指南-库函数版本_V3.3(上)

    STM32F1开发指南-库函数版本_V3.3(上)
    发表于 09-28 09:34 0次下载

    STM32F1开发指南-库函数版本_V3.3(下)

    STM32F1开发指南-库函数版本_V3.3(下)
    发表于 09-28 09:36 0次下载

    stm32下标准库函数与HAL库函数编程方式的差异

    stm32下标准库函数与HAL库函数编程方式的差异标准库函数HAL库函数标准库函数与HAL
    发表于 12-09 14:21 15次下载
    <b class='flag-5'>stm32</b>下标准<b class='flag-5'>库函数</b>与HAL<b class='flag-5'>库函数</b>编程方式的差异

    基于标准库函数与基于HAL库函数stm32编程方式对比

    一、基于标准库函数stm32编程方式二、基于HAL库函数stm32编程方式差异上面也提到了,STM32有非常多的寄存器,而导致了
    发表于 12-28 19:09 30次下载
    基于标准<b class='flag-5'>库函数</b>与基于HAL<b class='flag-5'>库函数</b>的<b class='flag-5'>stm32</b>编程方式对比

    STM32库函数开发-GPIO

    2021-01-11 学习日志STM32f1库函数开发学习实战一 · I/O口1. 文件夹结构2. 配置细节 · 从寄存器到库函数3. 跑马灯4.
    发表于 01-13 16:17 13次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>库函数</b><b class='flag-5'>开发</b>-GPIO

    基于STM32F407库函数开发按键控制LED灯

    STM32库函数实际是ST公司对寄存器开发封装。
    的头像 发表于 05-19 15:09 1578次阅读
    基于<b class='flag-5'>STM32</b>F407<b class='flag-5'>库函数</b><b class='flag-5'>开发</b><b class='flag-5'>按键</b>控制LED灯

    CH32和stm32库函数一样吗?

    CH32和stm32库函数一样吗? STM32是ST公司推出的一款32位微控制器,其拥有强大的性能及丰富的外设功能,实现了嵌入式应用的功能。而在STM32
    的头像 发表于 08-16 11:15 547次阅读

    STM32库函数SystemInit()详解

    STM32库函数SystemInit()详解
    的头像 发表于 09-18 15:45 1981次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>库函数</b>SystemInit()详解