HalDriverInit();
1、
/**************************************************************************************************
* @fn Hal_DriverInit
*
* @brief Initialize HW - These need to be initialized before anyone.
*
* @param task_id - Hal TaskId
*
* @return None
**************************************************************************************************/
void HalDriverInit (void)
{
/* TIMER */
#if (defined HAL_TIMER) && (HAL_TIMER == TRUE)
#error "The hal timer driver module is removed."
#endif
/* ADC */
#if (defined HAL_ADC) && (HAL_ADC == TRUE)
HalAdcInit();
#endif
/* DMA */
#if (defined HAL_DMA) && (HAL_DMA == TRUE)
// Must be called before the init call to any module that uses DMA.
HalDmaInit();
#endif
/* AES */
#if (defined HAL_AES) && (HAL_AES == TRUE)
HalAesInit();
#endif
/* LCD */
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdInit();
#endif
/* LED */
#if (defined HAL_LED) && (HAL_LED == TRUE)
HalLedInit();
#endif
/* UART */
#if (defined HAL_UART) && (HAL_UART == TRUE)
HalUARTInit();
#endif
/* KEY */
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
HalKeyInit();
#endif
/* SPI */
#if (defined HAL_SPI) && (HAL_SPI == TRUE)
HalSpiInit();
#endif
/* HID */
#if (defined HAL_HID) && (HAL_HID == TRUE)
usbHidInit();
#endif
}
2、
HalAdcInit();
void HalAdcInit (void)
{
#if (HAL_ADC == TRUE)
adcRef = HAL_ADC_REF_VOLT;
#endif
}
#if (HAL_ADC == TRUE)
static uint8 adcRef;
#endif
#define HAL_ADC_REF_VOLT HAL_ADC_REF_AVDD
#define HAL_ADC_REF_AVDD 0x80 /* AVDD_SOC Pin Reference */
2、
/* LED control structure */
typedef struct {
uint8 mode; /* Operation mode */
uint8 todo; /* Blink cycles left */
uint8 onPct; /* On cycle percentage */
uint16 time; /* On/off cycle time (msec) */
uint32 next; /* Time for next change */
} HalLedControl_t;
typedef struct
{
HalLedControl_t HalLedControlTable[HAL_LED_DEFAULT_MAX_LEDS];
uint8 sleepActive;
} HalLedStatus_t;
/***************************************************************************************************
* @fn HalLedInit
*
* @brief Initialize LED Service
*
* @param init - pointer to void that contains the initialized value
*
* @return None
***************************************************************************************************/
void HalLedInit (void)
{
#if (HAL_LED == TRUE)
/* Initialize all LEDs to OFF */
HalLedSet (HAL_LED_ALL, HAL_LED_MODE_OFF);
#endif /* HAL_LED */
#ifdef BLINK_LEDS
/* Initialize sleepActive to FALSE */
HalLedStatusControl.sleepActive = FALSE;
#endif
}
#ifdef BLINK_LEDS
static HalLedStatus_t HalLedStatusControl;
#endif
/***************************************************************************************************
* @fn HalLedSet
*
* @brief Tun ON/OFF/TOGGLE given LEDs
*
* @param led - bit mask value of leds to be turned ON/OFF/TOGGLE
* mode - BLINK, FLASH, TOGGLE, ON, OFF
* @return None
***************************************************************************************************/
uint8 HalLedSet (uint8 leds, uint8 mode)
{
#if (defined (BLINK_LEDS)) && (HAL_LED == TRUE)
uint8 led;
HlaLedControl_t *sts;
switch (mode)
{
case HAL_LED_MODE_BLINK:
/* Default blink, 1 time, D% duty cycle */
HalLedBlink (leds, 1, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
break;
case HAL_LED_MODE_FLASH:
/* Default flash, N times, D% duty cycle */
HalLedBlink (leds, HAL_LED_DEFAULT_FLASH_COUNT, HAL_LED_DEFAULT_DUTY_CYCLE, HAL_LED_DEFAULT_FLASH_TIME);
break;
case HAL_LED_MODE_ON:
case HAL_LED_MODE_OFF:
case HAL_LED_MODE_TOGGLE://状态反转模式即
led = HAL_LED_1;
leds &= HAL_LED_ALL;
sts = HalLedStatusControl.HalLedControlTable;
while (leds)//依次判断LED1...LED4是否要进行操作
{
if (leds & led)//
{
if (mode != HAL_LED_MODE_TOGGLE)
{
sts->mode = mode; /* ON or OFF */ //如果不是反转模式,讲mode传入到sts中保存
}
else//若是反转模式,与点亮模式异或后存入
{
sts->mode ^= HAL_LED_MODE_ON; /* Toggle */
}
HalLedOnOff (led, sts->mode);//根据此模式来设置led灯的状态,该函数的作用是设置亮灭
leds ^= led;//取消leds中与led对应的置一的位,以防止到最后循环跳不出来。
}
led <<= 1;
sts++;
}
break;
default:
break;
}
#elif (HAL_LED == TRUE)
LedOnOff(leds, mode);
#else
// HAL LED is disabled, suppress unused argument warnings
(void) leds;
(void) mode;
#endif /* BLINK_LEDS && HAL_LED */
return ( HalLedState );
}
// 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 < 100)
//如果一个周期中开启时间小于100%
{
led = HAL_LED_1;
leds &= HAL_LED_ALL;
//屏蔽掉不想要操作的LED
sts = HalLedStatusControl.HalLedControlTable;
//HalLedStatusControl是事先定义好的一个结构体
typedef struct
{
HalLedControl_t HalLedControlTable【HAL_LED_DEFAULT_MAX_LEDS】;
uint8 sleepActive;
} HalLedStatus_t;
#define HAL_LED_DEFAULT_MAX_LEDS 4
#ifdef BLINK_LEDS
static HalLedStatus_t HalLedStatusControl;
#endif
while (leds)
//这个循环主要是对传进来的每一个LED进行独立的设置,比如传进来的是需要设置LED1和LED2,那么此循环会先设置LED1然后再设置LED2
{
if (leds & led)
//检测当前LED是否是需要设置的
{
preBlinkState |= (led & HalLedState);
//储存目前的额LED状态
//static uint8 preBlinkState;
sts->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++;
}//真的是高手才能写出的