ZigBee学习之26HalDriverInit.docx

上传人:b****5 文档编号:7282219 上传时间:2023-01-22 格式:DOCX 页数:12 大小:18.32KB
下载 相关 举报
ZigBee学习之26HalDriverInit.docx_第1页
第1页 / 共12页
ZigBee学习之26HalDriverInit.docx_第2页
第2页 / 共12页
ZigBee学习之26HalDriverInit.docx_第3页
第3页 / 共12页
ZigBee学习之26HalDriverInit.docx_第4页
第4页 / 共12页
ZigBee学习之26HalDriverInit.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

ZigBee学习之26HalDriverInit.docx

《ZigBee学习之26HalDriverInit.docx》由会员分享,可在线阅读,更多相关《ZigBee学习之26HalDriverInit.docx(12页珍藏版)》请在冰豆网上搜索。

ZigBee学习之26HalDriverInit.docx

ZigBee学习之26HalDriverInit

#1楼主:

【原创】ZigBee学习之26——HalDriverInit()

文章发表于:

2010-02-1110:

24

//初始化硬件驱动,这个估计跟硬件更加紧密了,只要板子不同就要做相应的修改

HalDriverInit();

//【hal_drivers.c】

voidHalDriverInit(void)

{

HalTimerInit();//定时器初始化

//【hal_timer.c】

//一些宏定义

#defineHAL_TIMER1_16_PRESCALEHAL_TIMER1_16_TC_DIV128

#defineHAL_TIMER1_16_PRESCALE_VAL128

#defineHAL_TIMER3_8_PRESCALEHAL_TIMER34_8_TC_DIV128

#defineHAL_TIMER3_8_PRESCALE_VAL128

#defineHAL_TIMER4_8_PRESCALEHAL_TIMER34_8_TC_DIV128

#defineHAL_TIMER4_8_PRESCALE_VAL128

/*Clocksettings*/

#defineHAL_TIMER_16MHZ16

#defineHAL_TIMER_32MHZ32

#defineHAL_TIMER1_16_TC_DIV10x00/*Noclockpre-scaling*/

#defineHAL_TIMER1_16_TC_DIV80x04/*Clockpre-scaledby8*/

#defineHAL_TIMER1_16_TC_DIV320x08/*Clockpre-scaledby32*/

#defineHAL_TIMER1_16_TC_DIV1280x0c/*Clockpre-scaledby128*/

#defineHAL_TIMER1_16_TC_BITS0x0c/*Bits3:

2*/

//定时器的初始化很简单就是设置了各个寄存器的初始值,然后屏蔽了中断,就不多说了

voidHalTimerInit(void)

{

T1CCTL0=0;/*Makesureinterruptsaredisabled*/

T1CCTL1=0;/*Makesureinterruptsaredisabled*/

T1CCTL2=0;/*Makesureinterruptsaredisabled*/

T3CCTL0=0;/*Makesureinterruptsaredisabled*/

T3CCTL1=0;/*Makesureinterruptsaredisabled*/

T4CCTL0=0;/*Makesureinterruptsaredisabled*/

T4CCTL1=0;/*Makesureinterruptsaredisabled*/

//禁止定时器的中断

/*Setupprescale&clockfortimer0*/

halTimerRecord[HW_TIMER_1].prescale=HAL_TIMER1_16_PRESCALE;

halTimerRecord[HW_TIMER_1].clock=HAL_TIMER_32MHZ;

halTimerRecord[HW_TIMER_1].prescaleVal=HAL_TIMER1_16_PRESCALE_VAL;

/*Setupprescale&clockfortimer2*/

halTimerRecord[HW_TIMER_3].prescale=HAL_TIMER3_8_PRESCALE;

halTimerRecord[HW_TIMER_3].clock=HAL_TIMER_32MHZ;

halTimerRecord[HW_TIMER_3].prescaleVal=HAL_TIMER3_8_PRESCALE_VAL;

/*Setupprescale&clockfortimer3*/

halTimerRecord[HW_TIMER_4].prescale=HAL_TIMER4_8_PRESCALE;

halTimerRecord[HW_TIMER_4].clock=HAL_TIMER_32MHZ;

halTimerRecord[HW_TIMER_4].prescaleVal=HAL_TIMER4_8_PRESCALE_VAL;

//设置定时器1,3,4的通道数据结构,其实就是在数据结构中设置了定时器相关寄存器的地址。

默认所有的定时器使用通道0

/*SetupTimer1Channelstructure*/

halTimerChannel[HW_TIMER_1].TxCCTL=TCHN_T1CCTL;

//#defineTCHN_T1CCTL&(X_T1CCTL0)

halTimerChannel[HW_TIMER_1].TxCCL=TCHN_T1CCL;

halTimerChannel[HW_TIMER_1].TxCCH=TCHN_T1CCH;

halTimerChannel[HW_TIMER_1].TxOVF=TCNH_T1OVF;

halTimerChannel[HW_TIMER_1].ovfbit=TCHN_T1OVFBIT;

halTimerChannel[HW_TIMER_1].intbit=TCHN_T1INTBIT;

/*SetupTimer3Channelstructure*/

halTimerChannel[HW_TIMER_3].TxCCTL=TCHN_T3CCTL;

halTimerChannel[HW_TIMER_3].TxCCL=TCHN_T3CCL;

halTimerChannel[HW_TIMER_3].TxCCH=TCHN_T3CCH;

halTimerChannel[HW_TIMER_3].TxOVF=TCNH_T3OVF;

halTimerChannel[HW_TIMER_3].ovfbit=TCHN_T3OVFBIT;

halTimerChannel[HW_TIMER_3].intbit=TCHN_T3INTBIT;

/*SetupTimer4Channelstructure*/

halTimerChannel[HW_TIMER_4].TxCCTL=TCHN_T4CCTL;

halTimerChannel[HW_TIMER_4].TxCCL=TCHN_T4CCL;

halTimerChannel[HW_TIMER_4].TxCCH=TCHN_T4CCH;

halTimerChannel[HW_TIMER_4].TxOVF=TCNH_T4OVF;

halTimerChannel[HW_TIMER_4].ovfbit=TCHN_T4OVFBIT;

halTimerChannel[HW_TIMER_4].intbit=TCHN_T4INTBIT;

}

#if(definedHAL_ADC)&&(HAL_ADC==TRUE)

//如果开启了硬件ADC服务则进行ADC的初始化

HalAdcInit();

//【hal_adc.c】

voidHalAdcInit(void)

{

#if(HAL_ADC==TRUE)

volatileuint8tmp;

ADCCON1=HAL_ADC_STSEL|HAL_ADC_RAND_GEN|0x03;

//#defineHAL_ADC_STSELHAL_ADC_STSEL_ST

//#defineHAL_ADC_STSEL_ST0x30

//设置ADCCON1.ST=1为启动前提条件

//#defineHAL_ADC_RAND_GENHAL_ADC_RAND_STOP

//#defineHAL_ADC_RAND_STOP0x0c

//停止随机数发生器

//这些配置都可以在【hal_adc.c】中的常数定义部分找到

ADCCON2=HAL_ADC_REF_VOLT|HAL_ADC_DEC_RATE|HAL_ADC_SCHN;

//AVDD_SOC为参考电压,8位分辨率,AVDD/3为输入

//以上只是ADC的初始状态,使用的时候需要根据情况进行更改

tmp=ADCL;/*通过读取转换值来清除EOC*/

tmp=ADCH;

//因为每次重启后读取的ADC对外部的转换都是地电平,所以这里启动两次对地的ADC转换来消除这个bug

ADCCON3=HAL_ADC_REF_VOLT|HAL_ADC_DEC_RATE|HAL_ADC_ECHN;

while((ADCCON1&HAL_ADC_EOC)!

=HAL_ADC_EOC);/*Waitforconversion*/

tmp=ADCL;/*readADCL,ADCHtoclearEOC*/

tmp=ADCH;

ADCCON3=HAL_ADC_REF_VOLT|HAL_ADC_DEC_RATE|HAL_ADC_ECHN;

while((ADCCON1&HAL_ADC_EOC)!

=HAL_ADC_EOC);/*Waitforconversion*/

tmp=ADCL;/*readADCL,ADCHtoclearEOC*/

tmp=ADCH;

#endif

}

#endif

#if(definedHAL_DMA)&&(HAL_DMA==TRUE)

HalDmaInit();

//DMA初始化【hal_dma.c】

voidHalDmaInit(void)

{

HAL_DMA_SET_ADDR_DESC0(&dmaCh0);

//【hal_dma.h】

//DMA配置数据结构

typedefstruct{

uint8srcAddrH;

uint8srcAddrL;

uint8dstAddrH;

uint8dstAddrL;

uint8xferLenV;

uint8xferLenL;

uint8ctrlA;

uint8ctrlB;

}halDMADesc_t;

//设置DMA通道0的配置地址

#defineHAL_DMA_SET_ADDR_DESC0(a)\

st(\

DMA0CFGH=(uint8)((uint16)(a)>>8);\

DMA0CFGL=(uint8)((uint16)(a));\

HAL_DMA_SET_ADDR_DESC1234(dmaCh1234);

}

#endif

/*AES高级加密单元,暂时不说吧*/

#if(definedHAL_AES)&&(HAL_AES==TRUE)

HalAesInit();

#endif

/*LCD初始化,这个要大改了,相信每个人的板子上面的LCD设计都有可能不相同的吧*/

//使用LCD的前提是要定义了LCD_HW

#if(definedHAL_LCD)&&(HAL_LCD==TRUE)

HalLcdInit();

#endif

/*LED初始化,也跟硬件关系很大*/

#if(definedHAL_LED)&&(HAL_LED==TRUE)

HalLedInit();

//【hal_led.c】

voidHalLedInit(void)

{

#if(HAL_LED==TRUE)

/*关闭所有LED*/

HalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF);

/*这个sleepActive不晓得是用作什么用的,后面应该会提到,初始化为FALSE*/

HalLedStatusControl.sleepActive=FALSE;

#endif/*HAL_LED*/

}

#endif

/*UART初始化,这里只是配置了UART的端口以及UART-DMA模式的配置,并没有配置UART数据传输格式*/

#if(definedHAL_UART)&&(HAL_UART==TRUE)

HalUARTInit();

//【hal_uart.c】

voidHalUARTInit(void)

{

#ifHAL_UART_DMA

halDMADesc_t*ch;

//如果允许UART的DMA则定义一个DMA配置数据结构变量

#endif

//初始设置USART0优先级高于USART1

P2DIR&=~P2DIR_PRIPO;

//#defineP2DIR_PRIPO0xC0

P2DIR|=HAL_UART_PRIPO;

//#ifHAL_UART_0_ENABLE

//#defineHAL_UART_PRIPO0x00

//#else

//#defineHAL_UART_PRIPO0x40

//#endif

//如果定义HAL_UART_0_ENABLE则UART0有最高优先级,否则UART1高优先级。

在我的板子上是使用UART0所以要定义HAL_UART_0_ENABLE了,呵呵

#ifHAL_UART_0_ENABLE

//设置UART0I/O到P0.哈哈刚好符合我板子的情况,太妙了

//#defineHAL_UART_0_PERCFG_BIT0x01

PERCFG&=~HAL_UART_0_PERCFG_BIT;

/*配置P0上的TxandRx*/

//#defineHAL_UART_0_P0_RX_TX0x0c

P0SEL|=HAL_UART_0_P0_RX_TX;

/*保证ADC不用这几个引脚作为输入,其实重启后的状态就是不用的*/

ADCCFG&=~HAL_UART_0_P0_RX_TX;

/*用UARTMode*/

U0CSR=CSR_MODE;

/*清空缓存*/

U0UCR=UCR_FLUSH;

#endif

//对于UART1的配置如出一辙,只是换了一下管脚而已,把UART配置到P1啦

#ifHAL_UART_1_ENABLE

//SetUART1I/OlocationtoP1.

PERCFG|=HAL_UART_1_PERCFG_BIT;

/*EnableTxandRxonP1*/

P1SEL|=HAL_UART_1_P1_RX_TX;

/*MakesureADCdoesntusethis*/

ADCCFG&=~HAL_UART_1_P1_RX_TX;

/*ModeisUARTMode*/

U1CSR=CSR_MODE;

/*Flushit*/

U1UCR=UCR_FLUSH;

#endif

//下面是UART的DMA配置,需要先定义HAL_UART_DMA为TRUE

#ifHAL_UART_DMA

ch=HAL_DMA_GET_DESC1234(HAL_DMA_CH_TX);

//#defineHAL_DMA_GET_DESC1234(a)(dmaCh1234+((a)-1))

//#defineHAL_DMA_CH_TX3

//以上是配置TX用DMA通道2

HAL_DMA_SET_DEST(ch,DMA_UDBUF);

//通道的目的地址设为UxDBUF【hal_uart.c】

//#defineDMA_UDBUFHAL_DMA_U0DBUF

//#defineHAL_DMA_U0DBUF0xDFC1

//#defineHAL_DMA_U1DBUF0xDFF9

//在TI的这个驱动中只支持两个USART中的一个使用DMA,不支持同时使用

//配置VLEN域使用LEN字段

HAL_DMA_SET_VLEN(ch,HAL_DMA_VLEN_USE_LEN);

//初始化为一次传输一字节

HAL_DMA_SET_WORD_SIZE(ch,HAL_DMA_WORDSIZE_BYTE);

//一次触发只传输一个字节,触发源为UART0TX完成

HAL_DMA_SET_TRIG_MODE(ch,HAL_DMA_TMODE_SINGLE);

HAL_DMA_SET_TRIG_SRC(ch,DMATRIG_TX);

//源地址递增,目的地址不递增

HAL_DMA_SET_SRC_INC(ch,HAL_DMA_SRCINC_1);

HAL_DMA_SET_DST_INC(ch,HAL_DMA_DSTINC_0);

//传输完成不发送IRQ请求

HAL_DMA_SET_IRQ(ch,HAL_DMA_IRQMASK_DISABLE);

//8位一字节,高优先级模式

HAL_DMA_SET_M8(ch,HAL_DMA_M8_USE_8_BITS);

HAL_DMA_SET_PRIORITY(ch,HAL_DMA_PRI_HIGH);

//一下是配置RX为DMA的源,接收使用DMA模式,大同小异就不多说了.

ch=HAL_DMA_GET_DESC1234(HAL_DMA_CH_RX);

//Thestartaddressofthesource.

HAL_DMA_SET_SOURCE(ch,DMA_UDBUF);

//Usingthelengthfieldtodeterminehowmanybytestotransfer.

HAL_DMA_SET_VLEN(ch,HAL_DMA_VLEN_USE_LEN);

HAL_DMA_SET_WORD_SIZE(ch,HAL_DMA_WORDSIZE_WORD);

//Thebytesaretransferred1-by-1onRxCompletetrigger.

HAL_DMA_SET_TRIG_MODE(ch,HAL_DMA_TMODE_SINGLE);

HAL_DMA_SET_TRIG_SRC(ch,DMATRIG_RX);

//Thesourceaddressisconstant-theRxDataBuffer.

HAL_DMA_SET_SRC_INC(ch,HAL_DMA_SRCINC_0);

//Thedestinationaddressisincrementedby1wordaftereachtransfer.

HAL_DMA_SET_DST_INC(ch,HAL_DMA_DSTINC_1);

//TheDMAistobepolledandshallnotissueanIRQuponcompletion.

HAL_DMA_SET_IRQ(ch,HAL_DMA_IRQMASK_DISABLE);

//Xferall8bitsofabytexfer.

HAL_DMA_SET_M8(ch,HAL_DMA_M8_USE_8_BITS);

//DMAhashighestpriorityformemoryaccess.

HAL_DMA_SET_PRIORITY(ch,HAL_DMA_PRI_HIGH);

#endif

}

#endif

/*KEY初始化*/

#if(definedHAL_KEY)&&(HAL_KEY==TRUE)

HalKeyInit();

//【hal_key.c】在这个文件中定义了SW6,SW5的端口,看来要大改了,我只有3个独立按键,而且用的是P1口

voidHalKeyInit(void)

{

#if(HAL_KEY==TRUE)

halKeySavedKeys=0;

#ifdefined(HAL_KEY_SW_6_ENABLE)

//#defineHAL_KEY_SW_6_BITHAL_KEY_BIT1

//#defineHAL_KEY_BIT10x02

//#defineHAL_KEY_SW_5_BITHAL_KEY_BIT0

//对于CC2430DB,SW6用的是P0_1,SW5用的是P2_0;对于CC2430EB,没有SW6,SW5用的是P0_5

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);

#endif

#ifdefined(HAL_KEY_SW_5_ENABLE)

HAL_KEY_SW_5_SEL&=~(HAL_KEY_SW_5_BIT);

HAL_KEY_SW_5_DIR&=~(HAL_KEY_SW_5_BIT);

HAL_KEY_SW_5_INP|=HAL_KEY_SW_5_BIT;

#endif

/*初始化回调函数*/

pHalKeyProcessFunction=NULL;

/*Startwithkeyisnotconfigured*/

HalKeyConfigured=FALSE;

#endif/*HAL_KEY*/

}

#endif

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1