主要目的:通过定时器100ms,实现LED灯翻转。主要涉及三个文件main.c,pit_lld_cfg.h,pit_lld_cfg.c。
如下图所示,main.c
#include "components.h"
#include "delay.h"
#include "pit_lld_cfg.h"
int main(void) {
/* Initialization of all the imported components in the order specified in
the application wizard. The function is generated automatically.*/
componentsInit();
irqIsrEnable(); //开中断
/*配置PIT并启动*/
pit_lld_start(&PITD,pit_config);
pit_lld_channel_start(&PITD,2);
/* Uncomment the below routine to Enable Interrupts. */
/* irqIsrEnable(); */
//pal_lld_setpad(PORT_E,LD1);
pal_lld_clearpad(PORT_E,LD1);
/* Application main loop.*/
for ( ; ; ) {
/*延迟函数 */
//pal_lld_togglepad(PORT_E,LD1);
//delay_ms(1000);
/*定时器中断 */
if(TIM_100ms_Flag == 1)
{
pal_lld_togglepad(PORT_E,LD1);
TIM_100ms_Flag = 0;
}
}
}
pit_lld_cfg.h
#ifndef _PIT_LLD_CFG_H_
#define _PIT_LLD_CFG_H_
#include "spc5_lld.h"
#include "pit_lld.h"
vuint8_t sg_1ms_Tic;
vuint8_t TIM_1ms_Flag;
vuint8_t TIM_10ms_Flag;
vuint8_t TIM_20ms_Flag;
vuint8_t TIM_100ms_Flag;
vuint8_t TIM_500ms_Flag;
vuint8_t TIM_1s_Flag;
vuint8_t TIM_1min_Flag;
#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver data strupitres and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
/* List of the PITConfig strucutres defined in pit_lld_cfg.c.*/
extern PIT_CH_Config pit_config[SPC5_PIT_CHANNELS];
/* To make applications interface fully compatible. */
#define PIT1 PITD
#define PITD1 PITD
#define pit0_config pit_config
#ifdef __cplusplus
extern "C" {
#endif
/*Callback Prototypes*/
void PIT_1msHandle(void);
#ifdef __cplusplus
}
#endif
#endif /* LLD_USE_PIT */
#endif /* _PIT_LLD_CFG_H_ */
/** @} */
pit_lld_cfg.c
#include "pit_lld_cfg.h"
#include "spc5_lld.h"
#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
PIT_CH_Config pit_config[SPC5_PIT_CHANNELS] ={
{FALSE,0,NULL}
,
{FALSE,0,NULL}
,
{TRUE,1000,PIT_1msHandle}
,
{FALSE,0,NULL}
,
{FALSE,0,NULL}
,
{FALSE,0,NULL}
};
/*===========================================================================*/
/* Driver local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
void PIT_1msHandle(void)
{
sg_1ms_Tic ++;
sg_1ms_Tic % 1 == 0 ? TIM_1ms_Flag = 1:0;
sg_1ms_Tic % 10 == 0 ? TIM_10ms_Flag = 1:0;
sg_1ms_Tic % 20 == 0 ? TIM_20ms_Flag = 1:0;
sg_1ms_Tic % 100 == 0 ? TIM_100ms_Flag = 1:0;
sg_1ms_Tic % 500 == 0 ? TIM_500ms_Flag = 1:0;
sg_1ms_Tic % 1000 == 0 ? TIM_1s_Flag = 1:0;
sg_1ms_Tic % 60000 == 0 ? (TIM_1min_Flag = 1,sg_1ms_Tic = 0):0;
}
#endif /* LLD_USE_PIT */
/** @} */
将这个工程运行,出现错误,多重定义
multiple definition of 'sg 1ms Tic
multiple definition of TlM 100ms Flagmultiple definition of TlM 10ms Flag
multiple definition of TlM 1min Flag
multiple definition of 'TlM 1ms Flag
multiple definition of TlM 1s Flag
multiple definition of `TlM 20ms Flag
multiple definition of 'TlM 500ms Flag
解决方法:不要在头文件中定义变量,去.c中定义,然后其他要用的文件把变量extern 进来
操作:将变量放在.c定义后,会报错
main.c:45:5: error: 'TIM_100ms_Flag' undeclared (first use in this function)
再将变量extern,就不会报错了。
修改后的pit_lld_cfg.h和pit_lld_cfg.c如下:
pit_lld_cfg.h
#ifndef _PIT_LLD_CFG_H_
#define _PIT_LLD_CFG_H_
#include "spc5_lld.h"
#include "pit_lld.h"
extern vuint8_t sg_1ms_Tic;
extern vuint8_t TIM_1ms_Flag;
extern vuint8_t TIM_10ms_Flag;
extern vuint8_t TIM_20ms_Flag;
extern vuint8_t TIM_100ms_Flag;
extern vuint8_t TIM_500ms_Flag;
extern vuint8_t TIM_1s_Flag;
extern vuint8_t TIM_1min_Flag;
#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver constants. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver pre-compile time settings. */
/*===========================================================================*/
/*===========================================================================*/
/* Derived constants and error checks. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver data strupitres and types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver macros. */
/*===========================================================================*/
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
/* List of the PITConfig strucutres defined in pit_lld_cfg.c.*/
extern PIT_CH_Config pit_config[SPC5_PIT_CHANNELS];
/* To make applications interface fully compatible. */
#define PIT1 PITD
#define PITD1 PITD
#define pit0_config pit_config
#ifdef __cplusplus
extern "C" {
#endif
/*Callback Prototypes*/
void PIT_1msHandle(void);
#ifdef __cplusplus
}
#endif
#endif /* LLD_USE_PIT */
#endif /* _PIT_LLD_CFG_H_ */
/** @} */
pit_lld_cfg.c
#include "pit_lld_cfg.h"
#include "spc5_lld.h"
vuint8_t sg_1ms_Tic;
vuint8_t TIM_1ms_Flag;
vuint8_t TIM_10ms_Flag;
vuint8_t TIM_20ms_Flag;
vuint8_t TIM_100ms_Flag;
vuint8_t TIM_500ms_Flag;
vuint8_t TIM_1s_Flag;
vuint8_t TIM_1min_Flag;
#if (LLD_USE_PIT == TRUE) || defined(__DOXYGEN__)
/*===========================================================================*/
/* Driver local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported variables. */
/*===========================================================================*/
PIT_CH_Config pit_config[SPC5_PIT_CHANNELS] ={
{FALSE,0,NULL}
,
{FALSE,0,NULL}
,
{TRUE,1000,PIT_1msHandle}
,
{FALSE,0,NULL}
,
{FALSE,0,NULL}
,
{FALSE,0,NULL}
};
/*===========================================================================*/
/* Driver local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Driver exported functions. */
/*===========================================================================*/
void PIT_1msHandle(void)
{
sg_1ms_Tic ++;
sg_1ms_Tic % 1 == 0 ? TIM_1ms_Flag = 1:0;
sg_1ms_Tic % 10 == 0 ? TIM_10ms_Flag = 1:0;
sg_1ms_Tic % 20 == 0 ? TIM_20ms_Flag = 1:0;
sg_1ms_Tic % 100 == 0 ? TIM_100ms_Flag = 1:0;
sg_1ms_Tic % 500 == 0 ? TIM_500ms_Flag = 1:0;
sg_1ms_Tic % 1000 == 0 ? TIM_1s_Flag = 1:0;
sg_1ms_Tic % 60000 == 0 ? (TIM_1min_Flag = 1,sg_1ms_Tic = 0):0;
}
#endif /* LLD_USE_PIT */
/** @} */