|
本人习惯学习开发板的时候,首先打开周期定时器,而M4的pit和arm自带的滴答时钟挺好用,于是今天就把尝试了一下。打开pit时, 调用了PIT_DRV_Init(0,1)和PIT_DRV_InitChannel(0,0,&pitConfig),并打开了pit中断,NVIC_EnableIRQ(PIT0_IRQn)和系统总中断INT_SYS_EnableIRQGlobal();然并卵,pit定时器并没有工作,查看相关寄存器,最后发现pit使能中断位没有置位,进入函数PIT_DRV_InitChannel(0,0,&pitConfig),发现此函数没有使能中断位。于是在pit初始化里加入PIT_DRV_StartTimer(0,0),pit果然启动。
pit实现一个计数器每10ms增加1,在主循环里实现led4周期为2s的闪烁。如下:
int main()
{
gpio_output_pin_user_config_t led;
gpio_output_pin_t led_config;
led_config.outputLogic = 1;
led_config.driveStrength = 0;
led_config.slewRate = 0;
led_config.isOpenDrainEnabled = 1;
led.pinName = kGpioLED4;
led.config = led_config;
GPIO_DRV_OutputPinInit(&led);
INT_SYS_DisableIRQGlobal();
SysTick_Config(SystemCoreClock/1000000*10000);//滴答时钟
NVIC_DisableIRQ(PIT0_IRQn);
pit_user_config_t pitConfig;
pitConfig.isInterruptEnabled =1;
pitConfig.isTimerChained =0;
pitConfig.periodUs =10000;
PIT_DRV_Init(0,1);
PIT_DRV_InitChannel(0,0,&pitConfig);
PIT_DRV_StartTimer(0,0);
NVIC_SetPriorityGrouping(5);
NVIC_SetPriority(PIT0_IRQn,3);
NVIC_EnableIRQ(PIT0_IRQn);
INT_SYS_EnableIRQGlobal();
while(1)
{
if((cnt<=100))
{
GPIO_DRV_ClearPinOutput(led.pinName);
}
else if(cnt<=200)
{
GPIO_DRV_SetPinOutput(led.pinName);
}
else
{
cnt = 0;
}
}
return 0;
}
pit中断处理函数:
void PIT0_IRQHandler(void)
{
extern int cnt;
PIT_TFLG(0) =1;
cnt ++;
}
|
|