ZigBee学习之25—InitBoard.doc_第1页
ZigBee学习之25—InitBoard.doc_第2页
ZigBee学习之25—InitBoard.doc_第3页
ZigBee学习之25—InitBoard.doc_第4页
ZigBee学习之25—InitBoard.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

#1楼主:【原创】ZigBee学习之25InitBoard文章发表于:2010-02-11 10:22/初始化板上的IO InitBoard( OB_COLD );/参数【OnBoard.h】#define OB_COLD 0#define OB_WARM 1#define OB_READY 2/【OnBoard.c】void InitBoard( byte level ) if ( level = OB_COLD ) /关中断,最初的时候已经见过了 osal_int_disable( INTS_ALL ); / 关闭所有的LED,调用了LED设置函数HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF );/【hal_led.h】/ #define HAL_LED_ALL (HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4),我这里呢只有两个LED,所以可以屏蔽掉LED3,LED4,或者将后两个LED也映射到前面两个LED(其实就是宏定义啦)/ #define HAL_LED_MODE_OFF 0x00/#define HAL_LED_MODE_ON 0x01/#define HAL_LED_MODE_BLINK 0x02/#define HAL_LED_MODE_FLASH 0x04/#define HAL_LED_MODE_TOGGLE 0x08/LED设置函数【hal_led.c】uint8 HalLedSet (uint8 leds, uint8 mode) #if (defined (BLINK_LEDS) & (HAL_LED = TRUE)/前提条件是定义了闪烁LED和LED硬件驱动服务使能;/ HAL_LED定义在【hal_board_cfg.h】#ifndef HAL_LED#define HAL_LED TRUE/当设为FALSE时就不使用LED#endif#if (!defined BLINK_LEDS) & (HAL_LED = TRUE)#define BLINK_LEDS#endif uint8 led; HalLedControl_t *sts;/ LED控制结构体typedef struct uint8 mode; /* 操作模式 */ uint8 todo; /* 剩余的闪烁周期数 */ uint8 onPct; /* 周期中所占的比例 */ uint16 time; /* 开关周期时间(msec) */ uint32 next; /* 下次改变的时间 */ HalLedControl_t; switch (mode) case HAL_LED_MODE_BLINK: HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);/LED设置的一些默认参数【hal_led.h】#define HAL_LED_DEFAULT_MAX_LEDS 4#define HAL_LED_DEFAULT_DUTY_CYCLE 5#define HAL_LED_DEFAULT_FLASH_COUNT 50#define HAL_LED_DEFAULT_FLASH_TIME 1000/LED闪烁函数【hal_led.c】void HalLedBlink (uint8 leds, uint8 numBlinks, uint8 percent, uint16 period)#if (defined (BLINK_LEDS) & (HAL_LED = TRUE)/同样先判断是否启用了LED并且使用LED闪烁功能 uint8 led; HalLedControl_t *sts; if (leds & percent & period)/判断参数的有效性,percent参数指明一个周期中LED将开启的时间 if (percent mode = HAL_LED_MODE_OFF; /*关闭先前的模式 */ sts-time = period; /* Time for one on/off cycle */ sts-onPct = percent; /* % of cycle LED is on */ sts-todo = numBlinks; /* Number of blink cycles */ if (!numBlinks) sts-mode |= HAL_LED_MODE_FLASH; /如果规定的次数未达到则继续闪烁 sts-next = osal_GetSystemClock(); /* Start now */ /读取当前系统时钟【OSAL_Timers.c】 uint32 osal_GetSystemClock( void ) return ( osal_systemClock ); /static uint32 osal_systemClock; /这样看来第一次运行的时候osal_systemClock=0,系统中应该启动了定时器,用来记录系统运行时间。sts-mode |= HAL_LED_MODE_BLINK; /* Enable blinking */ leds = led;/屏蔽掉已设置好的这个LED led = 1;/检测下一个LED sts+; /真的是高手才能写出的函数啊!自叹,C语言编程能力还差的远啊 osal_set_event (Hal_TaskID, HAL_LED_BLINK_EVENT);/【hal_drivers.h】/#define HAL_LED_BLINK_EVENT 0x0002/extern uint8 Hal_TaskID;/此函数为用户设置任务标志【OSAL.c】/第一个参数是任务ID,第二个参数是要设置的事件byte osal_set_event( byte task_id, UINT16 event_flag ) if ( task_id mode = mode; /* ON or OFF */ else sts-mode = HAL_LED_MODE_ON; /* Toggle */开关的切换,利用了和1相异或为取反的特性。到这里为止还只是设置了LED的模式,并没有真正的对LED进行开关的操作,也就是说LED并没有演示出效果。 HalLedOnOff (led, sts-mode);/这个函数是对LED进行开关操作的真正的函数了,这个函数执行完后应该能看到LED状态的变化。列举程序中部分段落(因为其他段落都差不多呵呵)【hal_led.c】 if (leds & HAL_LED_1)/检测是否是LED1 if (mode = HAL_LED_MODE_ON)/检测开关模式 HAL_TURN_ON_LED1();/点亮LED1 else HAL_TURN_OFF_LED1(); if (mode) HalLedState |= leds; else HalLedState &= leds; /此用来记住当前操作的LED的状态,如果是点亮的就把HalLedState中相应的位置位,否则清零 leds = led; led mode = mode; /* ON or OFF */ else sts-mode = HAL_LED_MODE_ON; /* Toggle */ HalLedOnOff (led, sts-mode); leds = led; led = 1) ) led = HAL_LED_4; /* Timer2 for Osal timer*/设置OSAL的时钟 OnboardTimerIntEnable = FALSE; HalTimerConfig (OSAL_TIMER, / 8bit timer2 HAL_TIMER_MODE_CTC, / Clear Timer on Compare HAL_TIMER_CHANNEL_SINGLE, / Channel 1 - default HAL_TIMER_CH_MODE_OUTPUT_COMPARE, / Output Compare mode OnboardTimerIntEnable, / Use interrupt Onboard_TimerCallBack); / Channel Mode/【OnBoard.h】/ 使用指定的定时器#define OSAL_TIMER HAL_TIMER_2/【hal_timer.h】/#define HAL_TIMER_0 0x00 / 8bit timer/fine HAL_TIMER_1 0x01 / 16bit Mac timer/fine HAL_TIMER_2 0x02 / 8bit timer/fine HAL_TIMER_3 0x03 / 16bit timer/efine HAL_TIMER_MAX 4 / Max number of timer/定时器的操作模式/#define HAL_TIMER_MODE_NORMAL 0x01 / Normal Mode/#define HAL_TIMER_MODE_CTC 0x02 / Clear Timer On Compare/#define HAL_TIMER_MODE_MASK (HAL_TIMER_MODE_NORMAL | HAL_TIMER_MODE_CTC)/定时器通道定义/#define HAL_TIMER_CHANNEL_SINGLE 0x01 / Single Channel - default/#define HAL_TIMER_CHANNEL_A 0x02 / Channel A/#define HAL_TIMER_CHANNEL_B 0x04 / Channel B/#define HAL_TIMER_CHANNEL_C 0x08 / Channel C/#define HAL_TIMER_CHANNEL_MASK (HAL_TIMER_CHANNEL_SINGLE | HAL_TIMER_CHANNEL_A | HAL_TIMER_CHANNEL_B | HAL_TIMER_CHANNEL_C)/通道模式/#define HAL_TIMER_CH_MODE_INPUT_CAPTURE 0x01 / Channel Mode Input-Capture/#define HAL_TIMER_CH_MODE_OUTPUT_COMPARE 0x02 / Channel Mode Output_Compare/#define HAL_TIMER_CH_MODE_OVERFLOW 0x04 / Channel Mode Overflow/#define HAL_TIMER_CH_MODE_MASK (HAL_TIMER_CH_MODE_INPUT_CAPTURE | HAL_TIMER_CH_MODE_OUTPUT_COMPARE | HAL_TIMER_CH_MODE_OVERFLOW)/更新定时器的函数【OnBoard.c】void Onboard_TimerCallBack ( uint8 timerId, uint8 channel, uint8 channelMode) if (timerId = OSAL_TIMER) & (channelMode = HAL_TIMER_CH_MODE_OUTPUT_COMPARE) osal_update_timers();/【OSAL_Timers.c】/每一个时钟滴答跟新时钟结构体void osal_update_timers( void ) osalTimerUpdate( tmr_decr_time );/【OSAL_Timers.c】static void osalTimerUpdate( uint16 updateTime ) halIntState_t intState; osalTimerRec_t *srchTimer; osalTimerRec_t *prevTimer; osalTimerRec_t *saveTimer; /typedef struct/ /void *next; /UINT16 timeout; /UINT16 event_flag; /byte task_id;/ osalTimerRec_t; HAL_ENTER_CRITICAL_SECTION( intState ); /保存中断状态 / Update the system time osal_systemClock += updateTime; /就目前的程序流程来看updateTime=0 / Look for open timer slot if ( timerHead != NULL ) /osalTimerRec_t *timerHead; / Add it to the end of the timer list srchTimer = timerHead; prevTimer = (void *)NULL; / Look for open timer slot while ( srchTimer ) / Decrease the correct amount of time if (srchTimer-timeout timeout = 0; else srchTimer-timeout = srchTimer-timeout - updateTime; / When timeout, execute the task if ( srchTimer-timeout = 0 ) osal_set_event( srchTimer-task_id, srchTimer-event_flag ); / Take out of list if ( prevTimer = NULL ) timerHead = srchTimer-next; else prevTimer-next = srchTimer-next; / Next saveTimer = srchTimer-next; / Free memory osal_mem_free( srchTimer ); srchTimer = saveTimer; else / Get next prevTimer = srchTimer; srchTimer = srchTimer-next; #ifdef POWER_SAVINGosal_retune_timers();/osal_retune_timers调整CPU睡眠时间到最低的超时值,如果超时值大于RETUNE_THRESHOLD,则睡眠时间将被设置为RETUNE_THRESHOLD/ osal_timer_activate()启动或者停止系统时钟,参数为FALSE或者TRUE#endif HAL_EXIT_CRITICAL_SECTION( intState ); / Re-enable interrupts./所有的定时器都以链表的形式储存着。这段关于系统时钟的程序也没有看懂,真的看的是不明所以,不晓得到底要干什么,请知道的通知说明一下啊,谢谢了 #ifdef POWER_SAVING /配置时钟服务【hal_timer.c】uint8 HalTimerConfig (uint8 timerId, uint8 opMode, uint8 channel, uint8 channelMode, bool intEnable, halTimerCBack_t cBack) uint8 hwtimerid; hwtimerid = halTimerRemap (timerId);/API硬件定时器ID与硬件定时器ID的转换,为什么要做这个转换?搞不懂【hal_timer.c】#define HW_TIMER_1 0x00#define HW_TIMER_3 0x01#define HW_TIMER_4 0x02#define HW_TIMER_INVALID 0x03#define HW_TIMER_MAX 0x03uint8 halTimerRemap (uint8 timerId) switch (timerId) case HAL_TIMER_0: return HW_TIMER_3; case HAL_TIMER_2: return HW_TIMER_4; case HAL_TIMER_3: return HW_TIMER_1; default: return HW_TIMER_INVALID; if (opMode & HAL_TIMER_MODE_MASK) & (timerId HAL_TIMER_MAX) & (channelMode & HAL_TIMER_CHANNEL_MASK) & (channel & HAL_TIMER_CHANNEL_MASK)/检测参数的正确性 halTimerRecordhwtimerid.configured = TRUE; halTimerRecordhwtimerid.opMode = opMode; halTimerRecordhwtimerid.channel = channel; halTimerRecordhwtimerid.channelMode = cha

温馨提示

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

评论

0/150

提交评论