ZigBee学习之26HalDriverInit.docx
《ZigBee学习之26HalDriverInit.docx》由会员分享,可在线阅读,更多相关《ZigBee学习之26HalDriverInit.docx(12页珍藏版)》请在冰豆网上搜索。
![ZigBee学习之26HalDriverInit.docx](https://file1.bdocx.com/fileroot1/2023-1/22/6965a990-4e8a-4b6e-8a59-712a79a1b1f5/6965a990-4e8a-4b6e-8a59-712a79a1b1f51.gif)
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
}