在线时间0 小时
UID29442
注册时间2008-1-15
NXP金币0
该用户从未签到
新手上路

- 积分
- 16
- 最后登录
- 1970-1-1
|
一个正在完善中的Software Framework,基于K20,对官方提供的头文件进行优化扩充,并提供高度抽象的接口函数,现在已经可以使用的驱动有GPIO,FLASH,SPI,ADC和USART。提供一个状态机调度器,并附有详细例程。
另外:内附彩蛋若干~有意者可以慢慢探索(比如AES,EzPort……)。
参考工程在application目录的template文件夹下,IAR工程文件路径:\application\template\build_iar
简单的LED闪烁代码
/*----------------------------------------------------------------------------*
* State machine: LED Flash *
*----------------------------------------------------------------------------*/
/*! \brief initialize work led
*/
PRIVATE STATE(LED_Init) BEGIN
//! gpio initialization
ESSF_GPIO_INIT(LED_WORK_PORT);
ESSF_GPIO_ENABLE(LED_WORK_PORT);
ESSF_GPIO_PIN_CONFIG(LED_WORK_PIN, PIN_FUNC_GPIO, PIN_OUTPUT);
//! transfer to next state
TRANSFER_TO_STATE(LED_Toggle);
EXIT_STATE;
END
/*! \brief toggle led and set delay down counter
*/
PRIVATE STATE(LED_Toggle) BEGIN
//! toggle work led
ESSF_GPIO_TOGGLE(LED_WORK_PIN);
//! initialize delay down counter
s_hwLEDDelay = 10000;
//! transfer to next state
TRANSFER_TO_STATE(LED_Delay);
EXIT_STATE;
END
/*! \brief delay
*/
PRIVATE STATE(LED_Delay) BEGIN
if (s_hwLEDDelay) {
s_hwLEDDelay--;
} else {
//! transfer to state: Output String
TRANSFER_TO_STATE(LED_Toggle);
}
REFLEXIVE_STATE;
END
读取系统温度的代码- /*----------------------------------------------------------------------------*
- * State machine: Read Temprature *
- *----------------------------------------------------------------------------*/
- /*! \brief initialize adc, calibrate temperature channel and start first
- *! conversion
- */
- PRIVATE STATE(ADC_Init) BEGIN
-
- //! initiliaze adc
- ESSF_ADC_INIT(ESSF_ADC0);
- //! configure adc0
- ESSF_ADC
- ADC_P_CLK, //!< clock source: peripheral clock
- ADC_VREF_VREF_PIN, //!< reference: extern Vrefh/Vrefl
- ADC_PRESCALE_DIV8, //!< prescaler : div8
- //! \name adc work mode
- //! @{
- //ADC_SW_TRIGGER | //!< software trigger mode (default)
- //ADC_SINGLE_SAMPLE | //!< single sample mode (default)
- ADC_16BIT_MODE | //!< 16bit mode
- ADC_LONG_SAMP_20CLK | //!< long sample mode with extra 20 ADCLK
- ADC_HW_AVERAGE_32 //!< hardware average 32 samples
- //! @}
- ESSF_END_ADC(ESSF_ADC0);
- //! enable ADC
- ESSF_ADC_ENABLE(ESSF_ADC0);
- //! calibration
- ESSF_ADC_CHN_CALIB(ESSF_ADC0, ADC_CHN_TEMP);
- //! start adc sample: temperature sensor
- ESSF_ADC_START(ESSF_ADC0, ADC_CHN_TEMP);
- //! transfer to next state
- TRANSFER_TO_STATE(Wait_ADC_Result);
- EXIT_STATE;
- END
- /*! \brief wait adc conversion complete
- */
- PRIVATE STATE(Wait_ADC_Result) BEGIN
-
- //! wait adc ready
- if (ESSF_ADC_IS_READY(ESSF_ADC0, ADC_CHN_TEMP)) {
- TRANSFER_TO_STATE(Calculate_Temprature);
- }
- REFLEXIVE_STATE;
- END
- /*! \brief get adc conversion result and calculate chip temperature in 0.1K
- */
- PRIVATE STATE(Calculate_Temprature) BEGIN
-
- //! get adc result
- int32_t lADCResult = ESSF_ADC_GET_RESULT(ESSF_ADC0, ADC_CHN_TEMP);
- //! start adc sample: temperature sensor
- ESSF_ADC_START(ESSF_ADC0, ADC_CHN_TEMP);
- /* ---------------- temperature calculation body begin ----------------- */
- lADCResult = (lADCResult * 33000) >> 16;
- int32_t iResult = ((lADCResult - 7190) * 1000 / 1715);
- //! update system temperature
- SAFE_ATOM_CODE (
- s_hwSystemTemperature = (250 + 2731) - (vsf_uint16_t)iResult;
- )
- /* ---------------- temperature calculation body end ------------------- */
-
- //! transfer to next state
- //TRANSFER_TO_STATE(Wait_ADC_Result);
-
- CALL_FSM_EX( REF_STATE(Temperature_Output_String), NULL,
- REF_STATE(Wait_ADC_Result), pArg
- );
- EXIT_STATE;
- END
- static vsf_uint16_t get_system_temperature(void)
- {
- vsf_uint16_t tResult;
- SAFE_ATOM_CODE(
- tResult = s_hwSystemTemperature;
- )
- return tResult;
- }
-
复制代码
不用怀疑,以上代码都是ANSI-C代码,任何编译器均支持。
|
|