STM32F101VCT6 点灯闪烁程序
教你用STM32一步一步点亮led灯

STM32之一步一步点亮led (2011-05-09 19:40)标签: stm32led MDK 入门分类:stm32入手stm32以来,一直想快速上手,所以在各大论坛闲逛,各个达人的blog 上学习,正所谓欲速则不达,心急是吃不了热豆腐的!有木有最终决定使用st官网的库开发,据大侠们写道使用库可以快速上手,貌似的确如此,一个个教程写的那么好,直接拿过来用就是了。
可是那么多个库,聪明的你请告诉到底选择哪一个啊My God!实话实说,我被这些库折腾了个够!好吧,我最后还是承认最后用的是的库,是很方便!切入正题,点亮LED。
硬件:红牛开发板,STM32F103ZET6(144封装).软件:RealView MDKstm32固件库:附上自己整理后的库:根据官网库自己整理了下,新建了工程模板如下图:(主要参考文章《在Keil MDK+环境下使用STM32 库.pdf》)在KeilMDK+环境下使用库.pdf入图所示:新建一个目录01_ProLed,建议放在英文路径下,避免不必要的麻烦。
将上面的库解压到此目录,再新建一个project目录,存放工程。
说明:CMSIS:最底层接口。
StartUp:系统启动文件。
StdPeriph_Lib:stm32外围设备驱动文件。
Project:工程文件。
User:用户文件。
新建工程步骤:此处略去300字。
简单说明:该文件是内核访问层的源文件和头文件,查看其中的代码多半是使用汇编语言编写的。
在线不甚了解。
--摘自《在Keil MDK+环境下使用STM32 库》该文件是外设访问层的头文件,该文件是最重要的头文件之一。
就像51里面的一样。
例如定义了 CPU是哪种容量的 CPU,中断向量等等。
除了这些该头文件还定义了和外设寄存器相关的结构体,例如:1.typedef struct2.{3.__IO uint32_t CR;4.__IO uint32_t CFGR;5.__IO uint32_t CIR;6.__IO uint32_t APB2RSTR;7.__IO uint32_t APB1RSTR;8.__IO uint32_t AHBENR;9.__IO uint32_t APB2ENR;10.__IO uint32_t APB1ENR;11.__IO uint32_t BDCR;12.__IO uint32_t CSR;13.14.#ifdef STM32F10X_CL15.__IO uint32_t AHBRSTR;16.__IO uint32_t CFGR2;17.#endif /* STM32F10X_CL */18.19.#if defined (STM32F10X_LD_VL)|| defined (STM32F10X_MD_VL)||defined (STM32F10X_HD_VL)20.uint32_t RESERVED0;21.__IO uint32_t CFGR2;22.#endif /*STM32F10X_LD_VL ||STM32F10X_MD_VL ||STM32F10X_HD_VL */23.} RCC_TypeDef;包含了那么多寄存器的定义,那么在应用文件中(例如自己编写的 main 源文件)只需要包含即可,而不是以前固件库的需要包含这个头文件。
单片机C语言LED灯点亮程序完全版

1例子1第二个灯亮之答禄夫天创作#include<reg52.h>void main(){P1=0xfd;}#include<reg52.h>Sbit D1=P1^0;Void main(){D1=0}注意:稍微改法式时需重新hex化例子2第一个灯亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3第一个灯亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xfe; //将单片机P1口的8个口由高到低分别赋值为11111110while(1); //法式停止在这里,在后面会讲到为什么这样写.}2例子1第三个灯闪烁fir循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){D2=0;for(a=0;a<=10000;a++){};D2=1;for(a=0;a<=10000;a++){};}例子2第三个闪烁while循环#include<reg52.h>sbit D2=P1^2;unsigned int a;void main(){a=5000;D2=0;while(a--);a=5000;D2=1;while(a--);}2.#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000led1=0;//点亮灯while(i--); //延时i=50000;led1=1; //熄灭灯while(i--);}}3例子1 3 5 7灯同时亮#include<reg52.h> //52单片机头文件sbit led1=P1^0; //单片机管脚位声明sbit led3=P1^2; //单片机管脚位声明sbit led5=P1^4; //单片机管脚位声明sbit led7=P1^6; //单片机管脚位声明void main() //主函数{led1=0;//将单片机P1.0口清零led3=0;//将单片机P1.2口清零led5=0;//将单片机P1.4口清零led7=0;//将单片机P1.6口清零while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子2 1 3 5 7同时亮#include<reg52.h> //52单片机头文件void main() //主函数{P1=0xaa; //将单片机P1口的8个口由高到低分别赋值为10101010while(1); //法式停止在这里,在后面会讲到为什么这样写.}例子3流水灯一个一个接着亮不循环#include<reg52.h> //52单片机头文件void main() //主函数{unsigned int i; //界说一个int型变量while(1){i=50000; //变量赋初值为50000P1=0xfe;//点亮第一个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfd;//点亮第二个灯while(i--); //延时i=50000; //变量赋初值为50000P1=0xfb;//点亮第三个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xf7;//点亮第四个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xef;//点亮第五个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xdf;//点亮第六个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0xbf;//点亮第七个灯while(i--); //延时i=50000; //变量赋初值为50000 P1=0x7f;//点亮第八个灯while(i--); //延时}}例子4#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char uchar temp,num,num1;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;while(1){for(num1=0;num1<3;num1++){for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_crol_(temp,1);P1=0xff;beep=1;delay(100);}}for(num1=0;num1<3;num1++) {for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_cror_(temp,1);P1=0xff;beep=1;delay(100);}}while(1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}4延时子法式void delay(){uint x;for(x=100;x>0;x--){};}For的嵌套void delay(){uint x,y; %局部变量for(x=100;x>0;x--) %小括号后不加分号for(y=600;y>0;y--); %小括号后的分号暗示该语句是上一条语句的,分号将该句与下句隔开(或者{for(y=600;y>0;y--);})#include<reg52.h>例子1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;void delay(); %注意分号不能少void main(){while(1){D1=0;delay();D1=1;delay();}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=600;y>0;y--);}带参数的比不带参数的要方便例子2无参和有参的比较#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;//void delay();void delay(uint);%带一个参数的,参数类型必需要写,参数可不写.比如可以写成uint z.也可以带多个参数void main()while(1){D1=0;delay(1200);%亮2秒D1=1;delay(1200);}}/*void delay(){uint x,y;for(x=100;x>0;x--) for(y=600;y>0;y--); }*/void delay(uint z) {uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);例子3#include<reg52.h>#define uint unsigned int #define uchar unsigned char sbit D1=P1^0;void delay(uint);void main(){while(1){D1=0;delay(1200);D1=1;delay(1200);}}void delay(uint z){uint x;uchar y;for(x=z;x>0;x--)for(y=20;y>0;y--);5循环左移三位如10100101(a5)-00101101(2d)。
STM32实验报告

实验一:一个灯的闪烁一、实验要求1.熟悉使用STM32F103ZET6开发板2.利用C语言程序实现一个灯闪烁二、电路原理图图1-1 LED灯硬件连接图三、软件分析1.本实验用到以下3个库函数(省略了参数):RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();2.配置输入的时钟:SystemInit()主要对RCC寄存器进行配置,GPIOA连接在APB2上,因此RCC_APB2PeriphClockCmd()函数需要使能APB2Periph_GPIOA3.声明GPIO结构: PF6~PF10口配置为输出GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;4.应用GPIO口:点亮LED1有五种方法①ODR寄存器法:GPIOA->ODR=0xffbf;②位设置/清除寄存器法:GPIOA->BRR|=0X001;③方法③只适用于GPIOx_BSRR寄存器④GPIO_WriteBit()函数法:GPIO_Write(0xffbf);⑤置位复位库函数法:GPIO_ResetBits(GPIOF,GPIO_Pin_8);5.主函数程序:int main(void){RCC_Configuration(); /* 配置系统时钟 */GPIO_Configuration(); /* 配置GPIO IO口初始化 */ for(;;){GPIOF->ODR = 0xfeff; /* PF8=0 --> 点亮D3 */Delay(600000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(600000);}}四、实验现象下载程序后开发板上的LED1灯闪烁五、总结通过对本实验可以发现,和51等8位单片机相比,STM32对I/O端口的操作变得复杂了许多。
STM32通用定时器的基本定时器功能实现灯闪烁

/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*此函数的语句"TIMx->EGR = TIM_PSCReloadMode_Immediate;"以软件方式产生更新事件(注:当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。)。*/
}
/*stm32f10x_it.c*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
void TIM3_IRQHandler(void)
/**
* @brief Main program
* @param None
* @retval : None
*/
int main(void)
{
RCC_Configuration();
奋斗STM32开发板基于ucos2.86a ucGUI3.90的LED闪烁例程

基于ucOSII ucGUI 的LED闪烁控制例程手册作者Sun68嵌入式实时操作系统uCosII是由美国工程师Jean brosse所创,它在中国的流行源于那本被邵贝贝引进翻译的著名书籍《嵌入式实时操作系统uCos-II》,这本书是学习ucosII 的宝典,虽然很厚,但理解了关键概念,再结合实际应用例程,还是很容易看懂的。
uCosII 通过了美国航天管理局(FAA)的安全认证,可以用于飞机、航天器与人性命攸关的控制系统中。
也就是说,用户可以放心将uCosII用到自己的产品中, ucGUI也是Micrium公司的产品,在本例程里使用了ucGUI3.90版本,它为嵌入式应用提供了功能强大的图形用户接口,使得用户在开发具有人机界面的应用时,可以很方便做出复杂精致的用户显示界面。
并提供了交互的接口。
uCOSII特点:可移植性:uCosII源码绝大部分是用移植性很强的ANSI C写的。
与微处理硬件相关的部分是用汇编语言写的。
uCOS可以在绝大多数8位、16位、32位以及64位处理器、微控制器及数字信号处理器(DSP)上运行。
可裁剪性:可以通过开关条件编译选项,来定义哪些uCosII的功能模块用于用户程序,方便控制代码运行所占用的空间及内存。
可剥夺性:uCOSII是完全可剥夺型的实时内核,它总是运行处于就绪状态下的优先级最高的任务。
多任务:uCOSII可以管理64个任务,每个任务对应一个优先级,并且是各不相同。
其中8个任务保留给uCOSII。
用户的应用程序可以实际使用56个任务。
可确定性:绝大多数uCosII的函数调用和服务的执行时间具有可确定性,也就是说用户总是能知道函数调用与服务执行了多长时间。
任务栈:每个任务都有自己单独的栈,uCOSII规定每个任务有不同的栈空间。
系统服务:uCOSII提供很多系统服务,例如信号量、互斥信号量、事件标志、消息邮箱、消息队列、内存的申请与释放及时间管理函数等。
中断管理:中断可以使正在执行的任务暂时挂起,中断嵌套层数可达255层。
单片机c语言闪烁灯程序

单片机c语言闪烁灯程序1.闪烁灯1.实验任务如图4.1.1 所示:在P1.0 端口上接一个发光二极管L1,使L1 在不停地一亮灭,一亮一灭的时间间隔为0.2 秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0 端口用导线连接到“八路发光二极管指示块”区域中的L1 端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2 秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:2如图4.1.1 所示的石英晶体为12MHz,因此,1 个机器周期为1 微秒机器周期微秒MOV R6,#20 2 个机器周期2D1: MOV R7,#248 2 个机器周期2 2+2×248=498 20×DJNZ R7,$ 2 个机器周期2×248 498DJNZ R6,D1 2 个机器周期2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248 时,延时5ms,R6=20、R7=248 时,延时10ms,以此为基本的计时单位。
如本实验要求0.2 秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1 所示,当P1.0 端口输出高电平,即P1.0=1 时,根据发光二极管的单向导电性可知,这时发光二极管L1 熄灭;当P1.0 端口输出低电平,即P1.0=0 时,发光二极管L1 亮;我们可以使用SETB P1.0 指令使P1.0端口输出高电平,使用CLR P1.0 指令使P1.0 端口输出低电平。
简单的STM32汇编程序—闪烁LED
简单的STM32汇编程序—闪烁LED要移植操作系统,汇编是道不得不跨过去的坎。
所以承接上篇的思路,我准备⽤汇编写⼀个简单的闪烁LED灯的程式。
以此练习汇编,为操作系统做准备。
第⼀步,还是和上篇⼀样,建⽴⼀个空的⽂件夹。
第⼆步,因为是要⽤汇编来写程式,所以不需要启动代码,这⾥选择否。
第三步,建⽴⼀个.s⽂件,并把⽂件添加到⼯程中。
第四步,在LED.s⽂件中添加如下代码。
LED0 EQU 0x422101a0RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40010804Stack_Size EQU 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem SPACE Stack_Size__initial_spAREA RESET, DATA, READONLY__Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerAREA |.text|, CODE, READONLYTHUMBREQUIRE8PRESERVE8ENTRYReset_HandlerBL LED_InitMainLoop BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoopLED_InitPUSH {R0,R1, LR}LDR R0,=RCC_APB2ENRORR R0,R0,#0x04LDR R1,=RCC_APB2ENRSTR R0,[R1]LDR R0,=GPIOA_CRHBIC R0,R0,#0x0FLDR R1,=GPIOA_CRHSTR R0,[R1]LDR R0,=GPIOA_CRHORR R0,R0,#0x03LDR R1,=GPIOA_CRHSTR R0,[R1]MOV R0,#1LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_ONPUSH {R0,R1, LR}MOV R0,#0LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_OFFPUSH {R0,R1, LR}MOV R0,#1LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}DelayPUSH {R0,R1, LR}MOVS R0,#0MOVS R1,#0MOVS R2,#0DelayLoop0ADDS R0,R0,#1CMP R0,#330BCC DelayLoop0MOVS R0,#0ADDS R1,R1,#1CMP R1,#330BCC DelayLoop0MOVS R0,#0MOVS R1,#0ADDS R2,R2,#1CMP R2,#15BCC DelayLoop0POP {R0,R1,PC}; NOPEND///////////////////////////////////////////////////////代码的简单讲解1,预定义LED0 EQU 0x422101a0 ;PA8的Bit-Bond地址。
STM32点亮闪烁LED灯
STM32点亮闪烁LED灯详解请看其他博客:1/*本程序实现STM开发板上LED灯红绿蓝闪烁*/2345 #include "stm32f10x.h"// 相当于51单⽚机中的 #include <reg51.h>6 #include "stm32f10x_gpio.h"7/*89 *由于STM32的GPIO⼯作模式有8种(输⼊4种+输出4种)10 *在GPIO输出之前要先对要操作的GPIO进⾏配置11知识点:12⼀个结构体13 typedef struct//结构体14 {15 uint16_t GPIO_Pin;16 GPIOSpeed_TypeDef GPIO_Speed;17 GPIOMode_TypeDef GPIO_Mode;18 }GPIO_InitTypeDef;19三个函数:20 1、GPIO_Init(GPIOB,&GPIO_InitTypeDef);21 2、GPIO_ResetBits(GPIOB,GPIO_Pin_5); 这⾥的意思是给端⼝5⾼电平22 3、GPIO_SetBits(GPIOB,GPIO_Pin_5); 把GPIO引脚设置低电平(红LED灯亮)23*/2425//驱动程序:GPIO初始化设置26int led_gpio_init_()27 {28 GPIO_InitTypeDef GPIO_InitTypeDef;//定义⼀个结构体变量2930/*使能GPIO的rcc时钟*/31 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);3233/*配置GPIO引脚*/34 GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_0|GPIO_Pin_1;//使⽤操作符可以⼀次使⽤多个引脚,端⼝0是绿⾊ 1是蓝35 GPIO_InitTypeDef.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速率50MHz36 GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出37/*初始化*/38 GPIO_Init(GPIOB,&GPIO_InitTypeDef);//参数⼀选择GPIO外设(ABCDE)参数⼆指向GPIO_InitTypeDef的指针39 }4041//延时函数42void delay()43 {44int i = 10000000;45while(i--);46 }4748//主函数49int main(void)50 {51 led_gpio_init_();//调⽤GIPO初始化函数5253/*循环给⾼低电平实现闪烁*/54while(1)55 {56 GPIO_ResetBits(GPIOB,GPIO_Pin_5);57 delay();58 GPIO_SetBits(GPIOB,GPIO_Pin_5);59 delay();6061 GPIO_ResetBits(GPIOB,GPIO_Pin_0);62 delay();63 GPIO_SetBits(GPIOB,GPIO_Pin_0);64 delay();6566 GPIO_ResetBits(GPIOB,GPIO_Pin_1);67 delay();68 GPIO_SetBits(GPIOB,GPIO_Pin_1);69 delay();70 }71 }下⾯赋三个上⾯⽤到的函数,原处截图,出之STM32f10固件库使⽤⼿册中⽂版⼿册(这是个好东西,要懂得利⽤以后开发都是根据这个来编程写函数的)最后要烧到开发板的,烧程序的软件过程。
stm32单片机设计定时器中断实现1s的led灯闪烁知识应用
stm32单片机设计定时器中断实现1s的led灯闪烁知识应用要实现1s的LED灯闪烁,可以使用STM32单片机的定时器中断来控制LED的开关。
以下是实现的步骤:1. 配置定时器:选择一个定时器(如TIM2)并设置适当的预分频和计数值,以实现1s的定时周期。
2. 配置中断:使能定时器中断,并将中断优先级设置为适当的值(较高优先级)。
3. 初始化LED引脚:将LED引脚设置为输出,并初始化为高电平(LED关闭)。
4. 编写中断处理程序:在中断处理程序(如TIM2_IRQHandler)中,切换LED引脚的状态。
例如,如果LED引脚当前为高电平,则将其设置为低电平,反之亦然。
5. 启动定时器:启动定时器以开始定时。
整个步骤如下所示的代码示例:```c#include "stm32fxx.h"void TIM2_IRQHandler(void){if(TIM2->SR & TIM_SR_UIF){TIM2->SR &= ~TIM_SR_UIF; // 清除中断标志位// 切换LED引脚状态if(GPIOC->ODR & GPIO_ODR_ODR0)GPIOC->ODR &= ~GPIO_ODR_ODR0; // 关闭LEDelseGPIOC->ODR |= GPIO_ODR_ODR0; // 打开LED}}int main(){// 初始化LED引脚RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // 使能GPIOC时钟GPIOC->MODER |= GPIO_MODER_MODER0_0; // 将PC0设置为输出模式GPIOC->OSPEEDR |= GPIO_OSPEEDR_OSPEED0; // 设置PC0输出速度// 配置定时器RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 使能TIM2时钟TIM2->PSC = 8399; // 将预分频设置为8400-1,得到10kHz 的计数频率TIM2->ARR = 9999; // 将计数值设置为10000-1,得到1s的定时周期// 配置中断TIM2->DIER |= TIM_DIER_UIE; // 使能更新中断NVIC_EnableIRQ(TIM2_IRQn); // 使能TIM2中断NVIC_SetPriority(TIM2_IRQn, 0); // 设置TIM2中断优先级为最高// 启动定时器TIM2->CR1 |= TIM_CR1_CEN; // 启动TIM2定时器while(1){// 程序主循环}return 0;}```以上代码使用了TIM2定时器和PC0引脚作为LED灯的控制。
SMT32学习笔记-操作寄存器实现LED闪烁
2020年6月2日:●直接操作寄存器的方式:1.点亮LED2.增加简单的延时函数,实现LED闪烁3.点亮的绿色的灯,其他两种灯也点亮(后续增加)●首先了解的概念:1.什么是寄存器参考《零死角玩转STM32》的第六章2.如何直接操作寄存器参考《零死角玩转STM32》的第六章程序主代码:#include "stm32f10x.h"void delay(unsigned int xms) // xms代表需要延时的毫秒数{unsigned int x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}int main(void){// 打开GPIOB 端口的时钟*(unsigned int *)0x40021018 |= ( (1) << 3 );// 配置IO口为输出*(unsigned int *) 0x40010C00 |= ( (1) << (4*0) );while(1) //while持续循环{delay(1000);// 控制ODR 寄存器*(unsigned int*) 0x40010C0C &= ~(1<<0); // 给0点亮LED delay(1000);// 控制ODR 寄存器*(unsigned int*) 0x40010C0C |= (1<<0);//给1熄灭LED// 置位|= ,清0 &=~}}void SystemInit(void){// 函数体为空,目的是为了骗过编译器不报错}。