继续研究官方自带的例程,这次是用的TCPWM_P4_periodic_Interrupt01这个例子,例程的打开方式请参考之前
PWM帖子中关于PWM例程打开的步骤。
只从TCPWM_P4_periodic_Interrupt01这个名字也看不出来具体作用,分析之后原来是定时器/计数器配合中断来实现LED的周期性亮灭。
先来看一下电路原理,中间的Timer定时器很显眼,左边是时钟电路,右边是中断以及LED电路。
右上角的LED_Green2是我添加的。
双击Timer,原来是我们之前用的PWM模块,只是这次选用Timer/Counter功能它就成了定时器了。
想想也对的,之前用的stm32的定时器本身也是可以产生PWM的。
看一下定时器的配置,Period原本是999,我改成500了,而时钟频率是1kHz.
1kHz什么概念?就是1秒1000次,配合计数器的500,就是500ms完成一次计数,给中断发一个信号。
对了,还要进行引脚配置,如图,新添加的LED2配置为5.2口,板子上就在5.5的旁边。
来看一下主函数:
- int main()
- {
- /* Enable global interrupt */
- CyGlobalIntEnable;
- /* Set up and enable a TCPWM interrupt handler. */
- Isr_Timer_StartEx(InterruptHandler);
- /* Start the TCPWM Component */
- Timer_Start();
- for(;;)
- {
- /* Do nothing */
- }
- }
很简洁,各种初始化后进入无限循环,没什么说的。
再来看一下中断函数:
- _Bool n=0;
- CY_ISR(InterruptHandler)
- {
- /* Clear the TCPWM terminal count interrupt */
- Timer_ClearInterrupt(Timer_INTR_MASK_TC);
- /* Toggle the green LED state */
- LED_Green_Write(~LED_Green_Read());
- n=!n;
- if(n==1)
- LED_Green2_Write(~LED_Green2_Read());
- }
我添加了一个bool变量 n,进入中断后取反一下,如果n为1,则翻转一下LED2的状态。
也就是进入两次中断后翻转一下LED2的状态。
上面分析了根据时钟频率以及定时器的计数值,500ms进入一次中断,那么我添加的LED2就是1000ms,
即1秒翻转一次亮灭状态。
而程序原有的LED是进入中断一次就翻转,即0.5秒翻转一次亮灭状态。
下载程序运行,满足分析的效果,没有录视频,拍了两个照片,如下: