ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:18.32KB ,
资源ID:7282219      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7282219.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ZigBee学习之26HalDriverInit.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ZigBee学习之26HalDriverInit.docx

1、ZigBee学习之26HalDriverInit#1楼主:【原创】ZigBee学习之26HalDriverInit()文章发表于:2010-02-11 10:24 / 初始化硬件驱动,这个估计跟硬件更加紧密了,只要板子不同就要做相应的修改 HalDriverInit();/【hal_drivers.c】void HalDriverInit (void) HalTimerInit();/定时器初始化/【hal_timer.c】/一些宏定义#define HAL_TIMER1_16_PRESCALE HAL_TIMER1_16_TC_DIV128#define HAL_TIMER1_16_PRES

2、CALE_VAL 128#define HAL_TIMER3_8_PRESCALE HAL_TIMER34_8_TC_DIV128#define HAL_TIMER3_8_PRESCALE_VAL 128#define HAL_TIMER4_8_PRESCALE HAL_TIMER34_8_TC_DIV128#define HAL_TIMER4_8_PRESCALE_VAL 128 /* Clock settings */#define HAL_TIMER_16MHZ 16#define HAL_TIMER_32MHZ 32#define HAL_TIMER1_16_TC_DIV1 0x00

3、/* No clock pre-scaling */#define HAL_TIMER1_16_TC_DIV8 0x04 /* Clock pre-scaled by 8 */#define HAL_TIMER1_16_TC_DIV32 0x08 /* Clock pre-scaled by 32 */#define HAL_TIMER1_16_TC_DIV128 0x0c /* Clock pre-scaled by 128 */#define HAL_TIMER1_16_TC_BITS 0x0c /* Bits 3:2 */定时器的初始化很简单就是设置了各个寄存器的初始值,然后屏蔽了中断,

4、就不多说了void HalTimerInit (void) T1CCTL0 = 0; /* Make sure interrupts are disabled */ T1CCTL1 = 0; /* Make sure interrupts are disabled */ T1CCTL2 = 0; /* Make sure interrupts are disabled */ T3CCTL0 = 0; /* Make sure interrupts are disabled */ T3CCTL1 = 0; /* Make sure interrupts are disabled */ T4CCT

5、L0 = 0; /* Make sure interrupts are disabled */ T4CCTL1 = 0; /* Make sure interrupts are disabled */禁止定时器的中断 /* Setup prescale & clock for timer0 */ halTimerRecordHW_TIMER_1.prescale = HAL_TIMER1_16_PRESCALE; halTimerRecordHW_TIMER_1.clock = HAL_TIMER_32MHZ; halTimerRecordHW_TIMER_1.prescaleVal = HA

6、L_TIMER1_16_PRESCALE_VAL; /* Setup prescale & clock for timer2 */ halTimerRecordHW_TIMER_3.prescale = HAL_TIMER3_8_PRESCALE; halTimerRecordHW_TIMER_3.clock = HAL_TIMER_32MHZ; halTimerRecordHW_TIMER_3.prescaleVal = HAL_TIMER3_8_PRESCALE_VAL; /* Setup prescale & clock for timer3 */ halTimerRecordHW_TI

7、MER_4.prescale = HAL_TIMER4_8_PRESCALE; halTimerRecordHW_TIMER_4.clock = HAL_TIMER_32MHZ; halTimerRecordHW_TIMER_4.prescaleVal = HAL_TIMER4_8_PRESCALE_VAL; /设置定时器1,3,4的通道数据结构,其实就是在数据结构中设置了定时器相关寄存器的地址。默认所有的定时器使用通道0 /* Setup Timer1 Channel structure */ halTimerChannelHW_TIMER_1.TxCCTL = TCHN_T1CCTL;/

8、#define TCHN_T1CCTL &(X_T1CCTL0) halTimerChannelHW_TIMER_1.TxCCL = TCHN_T1CCL; halTimerChannelHW_TIMER_1.TxCCH = TCHN_T1CCH; halTimerChannelHW_TIMER_1.TxOVF = TCNH_T1OVF; halTimerChannelHW_TIMER_1.ovfbit = TCHN_T1OVFBIT; halTimerChannelHW_TIMER_1.intbit = TCHN_T1INTBIT; /* Setup Timer3 Channel struc

9、ture */ halTimerChannelHW_TIMER_3.TxCCTL = TCHN_T3CCTL; halTimerChannelHW_TIMER_3.TxCCL = TCHN_T3CCL; halTimerChannelHW_TIMER_3.TxCCH = TCHN_T3CCH; halTimerChannelHW_TIMER_3.TxOVF = TCNH_T3OVF; halTimerChannelHW_TIMER_3.ovfbit = TCHN_T3OVFBIT; halTimerChannelHW_TIMER_3.intbit = TCHN_T3INTBIT; /* Set

10、up Timer4 Channel structure */ halTimerChannelHW_TIMER_4.TxCCTL = TCHN_T4CCTL; halTimerChannelHW_TIMER_4.TxCCL = TCHN_T4CCL; halTimerChannelHW_TIMER_4.TxCCH = TCHN_T4CCH; halTimerChannelHW_TIMER_4.TxOVF = TCNH_T4OVF; halTimerChannelHW_TIMER_4.ovfbit = TCHN_T4OVFBIT; halTimerChannelHW_TIMER_4.intbit

11、= TCHN_T4INTBIT;#if (defined HAL_ADC) & (HAL_ADC = TRUE)/如果开启了硬件ADC服务则进行ADC的初始化 HalAdcInit();/【hal_adc.c】void HalAdcInit (void)#if (HAL_ADC = TRUE) volatile uint8 tmp; ADCCON1 = HAL_ADC_STSEL | HAL_ADC_RAND_GEN | 0x03;/ #define HAL_ADC_STSEL HAL_ADC_STSEL_ST/ #define HAL_ADC_STSEL_ST 0x30/设置ADCCON1.

12、ST =1为启动前提条件/ #define HAL_ADC_RAND_GEN HAL_ADC_RAND_STOP/ #define HAL_ADC_RAND_STOP 0x0c/停止随机数发生器/这些配置都可以在【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;/因为每次重启后

13、读取的ADC对外部的转换都是地电平,所以这里启动两次对地的ADC转换来消除这个bug ADCCON3 = HAL_ADC_REF_VOLT | HAL_ADC_DEC_RATE | HAL_ADC_ECHN; while (ADCCON1 & HAL_ADC_EOC) != HAL_ADC_EOC); /* Wait for conversion */ tmp = ADCL; /* read ADCL,ADCH to clear EOC */ tmp = ADCH; ADCCON3 = HAL_ADC_REF_VOLT | HAL_ADC_DEC_RATE | HAL_ADC_ECHN; wh

14、ile (ADCCON1 & HAL_ADC_EOC) != HAL_ADC_EOC); /* Wait for conversion */ tmp = ADCL; /* read ADCL,ADCH to clear EOC */ tmp = ADCH;#endif#endif #if (defined HAL_DMA) & (HAL_DMA = TRUE) HalDmaInit();/DMA初始化【hal_dma.c】void HalDmaInit( void ) HAL_DMA_SET_ADDR_DESC0( &dmaCh0 );/【hal_dma.h】/DMA配置数据结构typedef

15、 struct uint8 srcAddrH; uint8 srcAddrL; uint8 dstAddrH; uint8 dstAddrL; uint8 xferLenV; uint8 xferLenL; uint8 ctrlA; uint8 ctrlB; halDMADesc_t;/设置DMA通道0的配置地址#define HAL_DMA_SET_ADDR_DESC0( a ) st( DMA0CFGH = (uint8)( (uint16)(a) 8 ); DMA0CFGL = (uint8)( (uint16)(a) ); ) HAL_DMA_SET_ADDR_DESC1234( dm

16、aCh1234 );#endif /* AES高级加密单元,暂时不说吧 */#if (defined HAL_AES) & (HAL_AES = TRUE) HalAesInit();#endif /* LCD初始化,这个要大改了,相信每个人的板子上面的LCD设计都有可能不相同的吧 */使用LCD的前提是要定义了LCD_HW#if (defined HAL_LCD) & (HAL_LCD = TRUE) HalLcdInit();#endif /* LED初始化,也跟硬件关系很大 */#if (defined HAL_LED) & (HAL_LED = TRUE) HalLedInit();/

17、【hal_led.c】void HalLedInit (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 (defined H

18、AL_UART) & (HAL_UART = TRUE) HalUARTInit();/【hal_uart.c】void HalUARTInit( void )#if HAL_UART_DMA halDMADesc_t *ch;/如果允许UART的DMA则定义一个DMA配置数据结构变量#endif / 初始设置USART0优先级高于USART1 P2DIR &= P2DIR_PRIPO;/ #define P2DIR_PRIPO 0xC0 P2DIR |= HAL_UART_PRIPO;/#if HAL_UART_0_ENABLE/ #define HAL_UART_PRIPO 0x00/#e

19、lse/ #define HAL_UART_PRIPO 0x40/#endif/如果定义HAL_UART_0_ENABLE则UART0有最高优先级,否则UART1高优先级。在我的板子上是使用UART0所以要定义HAL_UART_0_ENABLE了,呵呵#if HAL_UART_0_ENABLE/设置UART0 I/O到P0.哈哈刚好符合我板子的情况,太妙了/#define HAL_UART_0_PERCFG_BIT 0x01 PERCFG &= HAL_UART_0_PERCFG_BIT; /* 配置P0上的Tx and Rx */ #define HAL_UART_0_P0_RX_TX 0x

20、0c P0SEL |= HAL_UART_0_P0_RX_TX; /* 保证ADC不用这几个引脚作为输入,其实重启后的状态就是不用的 */ ADCCFG &= HAL_UART_0_P0_RX_TX; /*用UART Mode */ U0CSR = CSR_MODE; /* 清空缓存 */ U0UCR = UCR_FLUSH;#endif/对于UART1的配置如出一辙,只是换了一下管脚而已,把UART配置到P1啦#if HAL_UART_1_ENABLE / Set UART1 I/O location to P1. PERCFG |= HAL_UART_1_PERCFG_BIT; /* En

21、able Tx and Rx on P1 */ P1SEL |= HAL_UART_1_P1_RX_TX; /* Make sure ADC doesnt use this */ ADCCFG &= HAL_UART_1_P1_RX_TX; /* Mode is UART Mode */ U1CSR = CSR_MODE; /* Flush it */ U1UCR = UCR_FLUSH;#endif/下面是UART的DMA配置,需要先定义HAL_UART_DMA为TRUE#if HAL_UART_DMA ch = HAL_DMA_GET_DESC1234( HAL_DMA_CH_TX );/

22、 #define HAL_DMA_GET_DESC1234( a ) (dmaCh1234+(a)-1)/ #define HAL_DMA_CH_TX 3/以上是配置TX用DMA通道2 HAL_DMA_SET_DEST( ch, DMA_UDBUF );/通道的目的地址设为UxDBUF【hal_uart.c】/#define DMA_UDBUF HAL_DMA_U0DBUF/ #define HAL_DMA_U0DBUF 0xDFC1/#define HAL_DMA_U1DBUF 0xDFF9/在TI的这个驱动中只支持两个USART中的一个使用DMA,不支持同时使用 /配置VLEN域使用LEN

23、字段 HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); /初始化为一次传输一字节 HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_BYTE ); /一次触发只传输一个字节,触发源为UART0 TX完成 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

24、_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 ); / The start add

25、ress of the source. HAL_DMA_SET_SOURCE( ch, DMA_UDBUF ); / Using the length field to determine how many bytes to transfer. HAL_DMA_SET_VLEN( ch, HAL_DMA_VLEN_USE_LEN ); HAL_DMA_SET_WORD_SIZE( ch, HAL_DMA_WORDSIZE_WORD ); / The bytes are transferred 1-by-1 on Rx Complete trigger. HAL_DMA_SET_TRIG_MOD

26、E( ch, HAL_DMA_TMODE_SINGLE ); HAL_DMA_SET_TRIG_SRC( ch, DMATRIG_RX ); / The source address is constant - the Rx Data Buffer. HAL_DMA_SET_SRC_INC( ch, HAL_DMA_SRCINC_0 ); / The destination address is incremented by 1 word after each transfer. HAL_DMA_SET_DST_INC( ch, HAL_DMA_DSTINC_1 ); / The DMA is

27、 to be polled and shall not issue an IRQ upon completion. HAL_DMA_SET_IRQ( ch, HAL_DMA_IRQMASK_DISABLE ); / Xfer all 8 bits of a byte xfer. HAL_DMA_SET_M8( ch, HAL_DMA_M8_USE_8_BITS ); / DMA has highest priority for memory access. HAL_DMA_SET_PRIORITY( ch, HAL_DMA_PRI_HIGH );#endif#endif /* KEY初始化 *

28、/#if (defined HAL_KEY) & (HAL_KEY = TRUE) HalKeyInit();/【hal_key.c】在这个文件中定义了SW6,SW5的端口,看来要大改了,我只有3个独立按键,而且用的是P1口void HalKeyInit( void )#if (HAL_KEY = TRUE) halKeySavedKeys = 0; #if defined (HAL_KEY_SW_6_ENABLE)/ #define HAL_KEY_SW_6_BIT HAL_KEY_BIT1/#define HAL_KEY_BIT1 0x02/ #define HAL_KEY_SW_5_BI

29、T HAL_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 #if defined (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; /* Start with key is not configured */ HalKeyConfigured = FALSE;#endif /* HAL_KEY */#endif

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

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