协议栈实验天线杆2、按键控制灯亮灭simpleapp详解_第1页
协议栈实验天线杆2、按键控制灯亮灭simpleapp详解_第2页
协议栈实验天线杆2、按键控制灯亮灭simpleapp详解_第3页
协议栈实验天线杆2、按键控制灯亮灭simpleapp详解_第4页
协议栈实验天线杆2、按键控制灯亮灭simpleapp详解_第5页
免费预览已结束,剩余44页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SimpleAPP分1、SimpleApp程序总是从oword开始的,如果能找到一个例子开始,那么是最好不多的了,还好Ti为我们提供了很simpleappTexasInstruments\ZStack-1.4.3-SimpleApp双击打开\TexasInstruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp\CC2430DB\SimpleApp.eww51的内核那只能用C了,一个地球人都知道的原理就是Cmain()main()函数,那么好main()然后分析它就可以看清楚整个程序的结构了。我们直接看智能灯的应用,跟这个应用相关的配置是(DB):SimpleSwitchDBSimpleControllerDB。SimpleSwitchDB(我的理解是这里是灯的开关),SimpleControllerDB10SS1LED1点亮(如果打开节能选项,将是闪烁状态)S2LED1S3 StartupandshutdowncodeforZStack(启动和关闭第一个宏:MINIMIZE_ROOT(line如果定义这个宏那么ZMAIN中的API函数将被在ROOT段外实现以为用户提供的空间来定义自己的常量,默认这个编译选项是不定义的。所谓的ZMAINAPI函数定义在line138-line144。在line152终于看到了期待main()ZSEGintmain(void{//Turnoffinterruptsosal_int_disable(INTS_ALL);//Initialize//处理器运行时钟,LEDIO//Makesuresupplyvoltageishighenoughtorun//Initializestackmemory//InitializeboardI/OInitBoard(OB_COLD);//InitialzeHALdrivers//InitializeNVSystemosal_nv_init(NULL);//Determinetheextendedaddress//InitializebasicNVitems//InitializetheMAC#ifndef//SincetheAFisn'tatask,callit'sinitializationroutine//Initializetheoperatingsystem//Allowinterruptsosal_int_enable(INTS_ALL);//FinalboardinitializationInitBoard(OB_READY);//Disyinformationaboutthisdevice/*DisythedeviceinfoontheLCD*/#ifdefLCD_SUPPORTEDosal_start_system();//NoReturnfrom}//2、osal_int_disable(INTS_ALL);//关中//【OSAL.CINTS_ALLbyteosal_int_disable(byteinterrupt_id{if(interrupt_id==INTS_ALL{//关闭所有中断响应【hal_mcu.h//#define st(EA=0;//st的定义在【hal_defs.h//#define do{x}while(LINE==-}return(INVALID_INTERRUPT_ID Def.h//#define return(ZSUCCESS//#define }3、HAL_BOARD_INIT();//初始化板子硬件部#defineHAL_BOARD_INIT() uint16 SLEEP&=~OSC_PD; /*turnon16MHzRCand32MHzXOSC//操作SLEEP16MHz32M//【hal_mcu.h//#define while(!(SLEEP&XOSC_STB)); /*waitfor32MHzXOSCstable*/\ /*chipbugworkaround*/\for(i=0;i<504;i++)asm("NOP"); /*Require63usdelayforallrevs//SLEEP寄存器中XOSC_STB64us,手册上是这么CLKCON=(0x00| /*32MHzXOSC//32M32.768Kwhile(CLKCON!=(0x00| //SLEEP|= /*turnoff16MHzRC//64us32K\/*setdirectionforGPIOoutputs LED1_DDR|=LED1_BV; //【hal_board_cfg.h//#define //#define //【hal_defs.h//#define (1n));//这是将某位置位的LED2_DDR|= //【hal_board_cfg.h//#define //#define //上面是对板上LED的初始化,完成的操作时将P1_0,P1_1设为输出(因为这两个IO口具有20ma的电流输出能力)!这里是跟硬件紧密相关的,需要根据自己硬件的具体情况来设。我的开发板上加上液晶指示的LED才两个,真是捉襟见肘啊,液晶背光灯接P2_0,调试LED接P1_0。设计的都不是很合理呢。看来在我的开发板上要完全的掉LED2呢呵呵。进行相应更改:(这些更改都在文件hal_board_cfg.h中越在line94~100)#define #define #define #define \/*configuretristates P2INP|= //这是对Joystick的配置,在【hal_board_cfg.h//#definePUSH2_BV BV(0);这里将JoystickIO设为三态状态,我的板子上没有这个东东哦,所以把Joystick也给了,注释掉【hal_board_cfg.hline120\/*configuresoftwarecontrolledperipheralVDD //配置软件控制的外设VDD\VDD_SW_SBIT= //【hal_board_cfg.hP1_2//#define //#define //#define }4、zmain_vdd_check();//确认VDD是否达到//【ZMain.c】line210//重复检测VDD的状态,直到成功检测的次数达到规定过的要求为止。估计是等电staticZSEGvoidzmain_vdd_check(void{uint8vdd_passed_count=0;booltoggle=0;while(vdd_passed_count<MAX_VDD_SAMPLES//#define 3;【ZMain.c//3{if(HalAdcCheckVdd(ZMAIN_VDD_LIMIT)//【ZMain.c//#define //【hal_adc.h//#define { //Keeptrack#timesVddpassesinarowMicroWait(10000); //延时10毫秒//微秒级延时函数【OnBoard.h//#defineMicroWait(t)//voidOnboard_wait(uint16timeout{while(timeout--{}}}{vdd_passed_count=0; MicroWait(50000); //Wait50msMicroWait //Waitanother50mstotry}//HalAdcCheckVdd()【hal_adc.cVDD是否大于或等boolHalAdcCheckVdd(uint8{uint16//如果修订版本号小于REV_D(0x03)就直接完成电压检测并返回TRUE。CHVER是修订版本号寄存器,此寄存器是只读的。if(CHVER<//检查版本【hal_mcu.h//#define //#define {return}//清除ADCADCIF=////【hal_adc.c//1.25//#define //#defineHAL_ADC_DEC_064 /*Decimateby648-bitresolution*/8位精度//#defineHAL_ADC_CHN_VDD3 /*VDD/3*/以AVDD_SOC/3为输入,检测电压ADCCON3=(HAL_ADC_REF_125V|HAL_ADC_DEC_064|while(!ADCIF);value|=((uint16)ADCH)<<//检return(value>=HalAdcVddLimit[limit]}//HalAdcVddLimitstaticcodeconstuint16HalAdcVddLimit[]{ VDDLimit- //关于电池电压的测量与计算在文档:UsingtheADCtoMeasureSupplyVoltage.pdf中有//MaxADCinputvoltage=referencevoltage//(VDD/3)max=1.25V=>maxVDD=3.75//12bitsresolutionmeansthatmaxADCvalue=0x07FF=2047//(theADCvalueis2’s//Batteryvoltage,VDD=adcvalue*(3.75///其中有两点很重要:1、最大的ADC输入值=参考电压;2、ADC的值以2的补码形式,也就是说12位的精度因为有1位是符号位所以相对于精度为11,即2^11=2048。因为以VDD/3为输入电压,以1.25VDD/31.25VDD=3.75;122.47adc//133页ADCCON3中ECH的说明//Extrachannelselect.Selectsthechannelnumberoftheextraconversionthatiscarriedoutafteraconversionsequencehasended.Thisbitfieldmustbewrittenforanextraconversiontobeperformed.IftheADCisnotrunning,writingtothesebitswilltriggeranimmediatesingleconversionfromtheselectedextrachannel.Thebitsareautomaticallyclearedwhentheextraconversionhasfinished.3IftheADCisnotrunning,writingtothesebitswilltriggeranimmediatesingleconversionfromtheselectedextrachannel.(ADC),这就是关键ADC3ADC//切换LED1和if(vdd_passed_count=={if((toggle=!(toggle)))//【hal_board_cfg.h//#defineHAL_TOGGLE_LED1() 0;}else{LED1_SBIT=1;})//这句很明显了,就是切换LED1toggle}}//关闭//【hal_board_cfg.h//#defineHAL_TURN_OFF_LED1() st(LED1_SBIT=LED1_POLARITY(0);)//#defineHAL_TURN_OFF_LED2() st(LED2_SBIT=LED2_POLARITY(0);)//#define //#define //#define //#defineACTIVE_HIGH /*doublenegationsresulttobe'1'*///这里的宏定义真的是太繁琐了,真不晓得TI这样弄有多大的意义,转了两个弯才看明白原来LED1是高电平点亮}5、zmain_ram_init();//初始化堆栈内存空器,程序段在文件中的存放,以及IARC/C++编译器都有莫大的关系,staticZSEGvoidzmain_ram_init(void{uint8*end;uint8*ptr;//Initializethecall(parameter)stackend=(uint8*)CSTK_BEG; //Lowerend while(--ptr>end)*ptr=ptr=(uint8*)RSTK_END-1; while(--ptr>(uint8*)SP)*(idatauint8*)ptr=}6、InitBoard(OB_COLD);//初始化板上IO#define #define #defineOB_READY//【OnBoard.cvoidInitBoard(bytelevel{if(level==OB_COLD{osal_int_disableINTS_ALL//关闭所有的LED,调用了LEDHalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF//【hal_led.h//#defineHAL_LED_ALL (HAL_LED_1|HAL_LED_2|LED3,LED4,LEDLED(其实就是宏定义啦//#define //#define //#define //#define //#define //LED设置函数【hal_led.cuint8HalLedSet(uint8leds,uint8{#if(defined(BLINK_LEDS))&&(HAL_LED==//前提条件是定义了闪烁LED和LED硬件驱动服务使能//HAL_LED定义在【hal_board_cfg.h#ifndefHAL_LED#defineHAL_LEDTRUE//当设为FALSE时就不使用LED#if(!definedBLINK_LEDS)&&(HAL_LED==TRUE)#defineBLINK_LEDSHalLedControl_ttypedefstructuint8 /*操作模式uint8todo; /*剩余的闪烁周期数*/uint8ot; /*周期中所占的比例*/uint16time; /*开关周期时间(msec)*/uint32next; /*下次改变的时间*/}switch{case#define #define #define #define //LED闪烁函数【hal_led.cvoidHalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16{#if(defined(BLINK_LEDS))&&(HAL_LED==//同样先判断是否启用了LED并且使用LEDuint8led;HalLedControl_t*sts;if(leds&&percent&&//判断参数的有效性,percent参数指明一个周期中LED{if(percent<//{led=leds&=//掉不想要操作的sts=typedef{HalLedControl_tHalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS]; }#define #ifdefstaticHalLedStatus_tHalLedStatusControl;while{if(leds&//检测当前LED{preBlinkState|=(led&//目前的额LED状//staticuint8sts = /*关闭先前的模式sts- = /*Timeforoneon/offcyclests->ot= /*%ofcycleLEDison =numBlinks; /*Numberofblinkcycles*///sts->next= /*Startnow//当前系统时钟【OSAL_Timers.cuint32osal_GetSystemClock(void{return(osal_systemClock}//staticuint32//这样看来第一次运行的时候osal_systemClock=0,系统中应该启动了sts->mode|=HAL_LED_MODE_BLINK; leds^=led;//掉已设置好的这个}led<<=//检测下一个osal_set_event(Hal_TaskID,//【hal_drivers.h//#define //externuint8//此函数为用户设置任务标志【OSAL.c{if(task_id t//【sapi.cconstpTaskEventHandlerFntasksArr[]={#ifdefined(MT_TASK)//【OSAL_Tasks.h//处理函数原型:typedefunsignedshort//定义处理函数的函数指针类//tasksArr中任务循环中的顺序必须和osalInitTask中任务的初始化顺序一const t=sizeof(tasksArr)/sizeof(tasksArr[0]////只有当任务ID{ //typedefunsignedcharhalIntState_t; //【hal_mcu.h#defineHAL_ENTER_CRITICAL_SECTION(x) st(x=EA;HAL_DISABLE_INTERRUPTS();)#define st(EA=x;#defineHAL_CRITICAL_STATEMENT(x) st(halIntState_ts;HAL_ENTER_CRITICAL_SECTION(s);x;HAL_EXIT_CRITICAL_SECTION(s);) //【sapi.c//uint16 //Release}return(INVALID_TASK//如果任务ID超出返回则返回任务无效 //#define return(ZSUCCESS}}//100%也就相当于常亮了,就执行LED{HalLedSet(leds,uint8HalLedSet(uint8leds,uint8{#if(defined(BLINK_LEDS))&&(HAL_LED==//一样的前提是开始了LEDuint8led;HalLedControl_t*sts;switch(mode)//检测要切换的LED{case//如果是闪烁模式,则将指定的LED5%//【hal_led.h#define #define #define #define case/*Defaultflash,Ntimes,D%dutycycleHalLedBlink(leds,HAL_LED_DEFAULT_FLASH_COUNT,HAL_LED_DEFAULT_DUTY_CYCLE,HAL_LED_DEFAULT_FLASH_TIME);//如果是连闪模式,则将指定的LED505%casecasecase//LEDled=HAL_LED_1;leds&=sts=while{if(leds&{if(mode!={ss>mode=mode;/*ONorOFF}{ss>mode^=HAL_LED_MODE_ON;/*Toggle//1LEDLEDLED}//这个函数是对LEDif(leds&//检测是否是{if(mode==//{//点亮}{}}if{HalLedState|=}{HalLedState&=}//此用来记住当前操作的LED的状态,如果是点亮的就把HalLedState中相应的位置leds^=}}}#elif(HAL_LED==LedOnOff(leds,#endif/*BLINK_LEDS&& return(HalLedState//返回的是操作了的LED的状态,每个LED1}}}//如果没有开始LED驱动服务,或者没有开启LED闪烁,就直接关闭{ /*Noontime,turn}#elif(HAL_LED==//如果没有定义闪烁,则只对LEDpercent=(leds&HalLedState)?HAL_LED_MODE_OFF:HalLedOnOff(leds,percent); /*Toggle*/#endif/*BLINK_LEDS&&HAL_LED*/}case/*Defaultflash,Ntimes,D%dutycycleHalLedBlink(leds,HAL_LED_DEFAULT_FLASH_COUNT,casecasecaseled=leds&=sts=HalLedStatusControl.HalLedControlTable;while(leds){if(leds&{if(mode!={sts->mode= /*ONorOFF}{ /*Toggle}HalLedOnOff(led,sts->mode);leds^=led;}led<<=1;}}#elif(HAL_LED==LedOnOff(leds,#endif/*BLINK_LEDS&&HAL_LED return(HalLedState);}//通过上面程序的解读我发现,到目前为止对LED的操作真正实现的只有开、关、切换,所谓的闪烁只是调用了一个系统设置函数osal_set_event(Hal_TaskID,HAL_LED_BLINK_EVENT);难道这都是通过系统来实现的?因为闪烁涉及到了时间占空比,估计还调用了定时器,那有可能还用到了中断,嗯,有可//CheckfornOutvoidChkReset(void){uint8//Isolateresetindicatorbitsrib=SLEEP&LRESET;//得到SLEEPRST状态【hal_mcu.h//#defineLRESET if(rib==RESETPO)//重启的原因【OnBoard.h#defineRESETPO 0x00//上电重启#defineRESETEX 0x08//外部重启#defineRESETWD 0x10//看门狗重启{}elseif(rib==RESETEX{//PutcodeheretohandleExternal}elseif(rib==RESETWD{//PutcodeheretohandleWatchDog}//未知的重启原因,闪烁LED{while(1){HalLedSet(led,HAL_LED_MODE_ON);MicroWait(62500);MicroWait(62500HalLedSet(led,HAL_LED_MODE_OFF);MicroWait(37500);MicroWait(37500);if(!(led>>=1))led=}}}/*Timer2forOsal//设置OSALOnboardTimerIntEnable=HalTimerConfig //8bit //ClearTimeronCompare //Channel1- PARE,OutputCompare //Useinterrupt //Channel//【OnBoard.h//使用指定的定时器#define //【hal_timer.h//#define//8bit//fine16bitMac//fine8bit//fine16bit//efine4//Maxnumberof////#define//Normal//#define//ClearTimer//#defineHAL_TIMER_MODE_MASK(HAL_TIMER_MODE_NORMAL|HAL_TIMER_MODE_CTC)////#define//SingleChannel//#define//Channel//#define//Channel//#define//Channel//#define(HAL_TIMER_CHANNEL_SINGLE HAL_TIMER_CHANNEL_AHAL_TIMER_CHANNEL_B|\\//通道模//#define ChannelModenpt//#define Channel //#defineHAL_TIMER_CH_MODE_OVERFLOW ModeOverflow//#defineHAL_TIMER_CH_MODE_MASK(HAL_TIMER_CH_MODE_INPUT_CAPTURE| PARE|//更新定时器的函数【OnBoard.cvoidOnboard_TimerCallBack(uint8timerId,uint8channel,uint8{if((timerId==OSAL_TIMER)&&(channelMode== {//【OSAL_Timers.cvoidosal_update_timers(void){osalTimerUpdate(tmr_decr_time//【OSAL_Timers.cstaticvoidosalTimerUpdate(uint16updateTime{halIntState_tintState;osalTimerRec_t*srchTimer;osalTimerRec_t*prevTimer;//typedef//void//UINT16//UINT16//byte//}osalTimerRec_t;HAL_ENTER_CRITICAL_SECTION(intState); //Updatethesystemtimeosal_systemClock+=updateTime;//就目前的程序流程来看//Lookforopentimerslotif(timerHead!=NULL)//osalTimerRec_t{//AddittotheendofthetimerlistsrchTimer=timerHead;prevTimer=(void*)NULL;//Lookforopentimerslotwhile(srchTimer){//DecreasethecorrectamountoftimeifschTmr>timeout<=updateTime)cTmcTmcTm//Whentimeout,executethetaskif(scTm>timeout==0){osal_set_event(scTimr>task_id,scTimr>event_flag//Takeoutofif(prevTimer==NULL)timerHead=scTmr->next;pvTm->next=shTm//saveTimer=scTmr//memoryosal_mem_(srchTimer);srchTimer=}{//GetprevTimer=srchTimer;srchTimer=scTimr>next;}}#ifdefPOWER_SAVING//osal_retune_timers调整CPURETUNE_THRESHOLD,则睡眠时间将被设置为//osal_timer_activate()FALSE或者TRUE}HAL_EXIT_CRITICAL_SECTION(intState //eenable}的是不明所以,不晓得到底要干什么,请知道说明一下啊,谢谢了}#ifdef}}//配置时钟服务【hal_timer.cuint8HalTimerConfig(uint8timerId,uint8opMode,uint8channel,uint8boolintEnable,halTimerCBack_t{hwtimerid=halTimerRemap#define #define #defineHW_TIMER_4 #defineHW_TIMER_INVALID #defineHW_TIMER_MAX uint8halTimerRemap(uint8timerId){switch{caseHAL_TIMER_0:returnHW_TIMER_3;caseHAL_TIMER_2:returnHW_TIMER_4;caseHAL_TIMER_3:returnHW_TIMER_1;return}}if((opMode&HAL_TIMER_MODE_MASK)&&(timerIdHAL_TIMER_MAX)(channelMode&HAL_TIMER_CHANNEL_MASK)&&(channel&//{ =TRUE; =opMode; =channel; =channelMode; =intEnable; =cBack;//【hal_timer.c//statichalTimerSettings_t//typedef bool bool halTimerCBack_t//}//typedefvoid(*halTimerCBack_t)(uint8timerId,uint8channel,uint8}{return}return}} //{#ifdefZTOOL_PORTOnboardKeyIntEnable=HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig(OnboardKeyIntEnable,OnBoard_KeyCallback);//初始化Key}}化,而热启动只是重置了一下KEY而已。关于按键的初始化,稍后再做说明7、HalDriverInit();//初始化硬件驱动,这//【hal_drivers.c{HalTimerInit();////【hal_timer.c//#define #define #define /*Clocksettings#define#define#define/*Noclockscaling#define/*Clockpre-scaled8#define/*Clockpre-scaled32#define/*Clockpre-by128#define/*Bits3:2//定时器的初始化很简单就是设置了各个寄存器的初始值,然后了中断,voidHalTimerInit{T1CCTL0=/*MakesureinterruptsaredisabledT1CCTL1=/*MakesureinterruptsaredisabledT1CCTL2=/*MakesureinterruptsaredisabledT3CCTL0=/*MakesureinterruptsaredisabledT3CCTL1=/*MakesureinterruptsaredisabledT4CCTL0=/*MakesureinterruptsaredisabledT4CCTL1=/*Makesureinterruptsaredisabled/*Setupprescale&clockfortimer0*/ halTimerRecord[HW_TIMER_1].prescaleVal=/*Setupprescale&clockfortimer2*/ halTimerRecord[HW_TIMER_3].prescaleVal=/*Setupprescale&clockfortimer3*/ halTimerRecord[HW_TIMER_4].prescaleVal=//1,3,4的通道数据结构,其实就是在数据结构中设置了定时0/*SetupTimer1Channelstructure*/halTimerChannel[HW_TIMER_1].TxCCTL= //#defineTCHN_T1CCTL halTimerChannel[HW_TIMER_1].TxCCL= halTimerChannel[HW_TIMER_1].TxCCH= TCHN_T1CCH;halTimerChannel[HW_TIMER_1].TxOVF= TCNH_T1OVF;halTimerChannel[HW_TIMER_1].ovfbit= halTimerChannel[HW_TIMER_1].intbit= /*SetupTimer3Channelstructure*/halTimerChannel[HW_TIMER_3].TxCCTL= halTimerChannel[HW_TIMER_3].TxCCL= halTimerChannel[HW_TIMER_3].TxCCH= TCHN_T3CCH;halTimerChannel[HW_TIMER_3].TxOVF= TCNH_T3OVF;halTimerChannel[HW_TIMER_3].ovfbit= halTimerChannel[HW_TIMER_3].intbit= /*SetupTimer4Channelstructure*/halTimerChannel[HW_TIMER_4].TxCCTL= halTimerChannel[HW_TIMER_4].TxCCL= halTimerChannel[HW_TIMER_4].TxCCH= TCHN_T4CCH;halTimerChannel[HW_TIMER_4].TxOVF= TCNH_T4OVF;halTimerChannel[HW_TIMER_4].ovfbit= halTimerChannel[HW_TIMER_4].intbit= }#if(definedHAL_ADC)&&(HAL_ADC==//如果开启了硬件ADC服务则进行ADC//【hal_adc.cvoidHalAdcInit{#if(HAL_ADC==volatile ADCCON1=HAL_ADC_STSEL|HAL_ADC_RAND_GEN|//#define //#define //设置ADCCON1.ST=1//#define //#define ////这些配置都可以在【hal_adc.c//AVDD_SOC为参考电压,8位分辨率,AVDD/3//以上只是ADCtmp=ADCL; /*通过转换值来清除EOC*/tmp=ADCH;//因为每次重启后的ADC对外部的转换都是地电平,所以这里启动两次对地的ADC转换来消除这个bugwhile((ADCCON1&HAL_ADC_EOC)!=HAL_ADC_EOC); forconversion*/tmp=ADCL; /*readADCL,ADCHtoclearEOC*/tmp=ADCH;while((ADCCON1&HAL_ADC_EOC)!=HAL_ADC_EOC); forconversion*/tmp=ADCL; /*readADCL,ADCHtoclearEOC*/tmp=ADCH;}#if(definedHAL_DMA)&&(HAL_DMA==TRUE)//DMA初始化【hal_dma.cvoidHalDmaInit(void{HAL_DMA_SET_ADDR_DESC0(&dmaCh0//【hal_dma.h//DMAtypedefstruct{uint8srcAddrH;uint8dstAddrH;uint8dstAddrL;uint8xferLenL;uint8ctrlA;uint8ctrlB;}//设置DMA通道0的配#defineHAL_DMA_SET_ADDR_DESC0(a)\st(\DMA0CFGH=(uint8)((uint16)(a)>>8 DMA0CFGL=(uint8)((uint16)(a) )}/*AES高级加密单元,暂时不说吧#if(definedHAL_AES)&&(HAL_AES==TRUE)/*LCD初始化,这个要大改了,相信每个人的板子上面的LCD设计都有可能不相同的吧*///使用LCD的前提是要定义了#if(definedHAL_LCD)&&(HAL_LCD==TRUE)/*LED#if(definedHAL_LED)&&(HAL_LED==TRUE)//【hal_led.cvoidHalLedInit{#if(HAL_LED==/*关闭所有LEDHalLedSet(HAL_LED_ALL,/*这个sleepActiveHalLedStatusControl.sleepActive=FALSE;#endif/*HAL_LED*/}/*UART初始化,这里只是配置了UART的端口以及RTDMA模式的配置,并没有配置UART数据传输格式*/#if(definedHAL_UART)&&(HAL_UART==TRUE)//【hal_uart.cvoidHalUARTInit(void{#ifhalDMADesc_t//如果允许UART的DMA则定义一个DMA//初始设置USART0优先级高于USART1P2DIR&~P2DIR_PRIPO;//#defineP2DIR_PRIPO P2DIR|=HAL_UART_PRIPO;//#if #define #define //如果定义HAL_UART_0_ENABLE则UART0有最高优先级,否则UART1高优先级。在我的板子上是使用UART0所以要定义HAL_UART_0_ENABLE了,呵呵#if//设置UART0I/O到P0.//#defineHAL_UART_0_PERCFG_BIT PERCFG&=~HAL_UART_0_PERCFG_BIT;/*配置P0上的TxandRx//#defineHAL_UART_0_P0_RX_TX P0SEL|=HAL_UART_0_P0_RX_TX;/*保证ADC不用这几个引脚作为输入,其实重启后的状态就是不用的*/ADCCFG&=~HAL_UART_0_P0_RX_TX;/*用UARTMode*//*清空缓存U0UCR=//对于UART1的配置如出一辙,只是换了一下管脚而已,把UARTP1#if//SetUART1I/OlocationtoP1.PERCFG|=HAL_UART_1_PERCFG_BIT;/*EnableTxandRxonP1 |=/*MakesureADCdoesntusethis*/ADCCFG&=~HAL_UART_1_P1_RX_TX;/*ModeisUARTMode*/U1CSR=CSR_MODE;HAL_DMA_SET_TRIG_MODE(HAL_DMA_SET_TRIG_MODE(ch,HAL_DMA_TMODE_SINGLE/*FlushitU1UCR=//下面是UART的DMA配置,需要先定义HAL_UART_DMA为TRUE#ifHAL_UART_DMAch=HAL_DMA_GET_DE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论