TA的每日心情 | 开心 昨天 00:02 |
---|
签到天数: 3942 天 连续签到: 13 天 [LV.Master]伴坛终老
|
本帖最后由 toofree 于 2017-1-19 03:27 编辑
【赚周年币】技术帖Week2-Day5——LPC824 Lite之12、SCTimer定时器延时
LPC824延时之——最后一种延时,SCTimer定时器延时。软件精确延时,SysTick延时都实验过了。今天就来测试一下最后一种延时SCTimer定时器延时,也算是对LPC824延时篇做个了结。
使用YL-LPC824光盘资料.rar中程序模板,工程“YL-LPC824光盘资料\SDK\peri_example\sctimer\sct_basic\project_sct_basic.uvoptx”做模板,修改部分程序实现SCTimer定时器延时。
复制工程文件夹,改名为“sct_basic_Delay”,不改变原有工程,给自己留点余地,省得万一哪有问题,还得重新解压光盘资料。
不管三七二十一,先编译,仿真运行下,看看什么效果。结果是板上LED1、LED3交替点亮,熄灭。
那么分析一下程序看看。可以看到,用了两个中断,SysTick_Handler()、SCT_IRQHandler()。
86行程序执行后,将获取到“SystemCoreClock”。
那么SystemCoreClock值是多少呢,我们今天就不分析代码了,直接仿真执行一下,观察变量值是多少。
没错,SystemCoreClock是30M。
90行初始化SysTick,并开启中断。
94到126行为初始化SCTimer定时器,并开启中断。我们只关心3行代码。
99行,Chip_SCT_Config(LPC_SCT, SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK);,表示32位计数方式。
105、107行,Chip_SCT_SetMatchCount(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ);,设置计数匹配值和重加载,反正就是指定时周期呗。
我们还是定时1ms,以1ms为单位进行延时。直接复制前一贴中的延时子函数,及中断处理中的代码。
TICKRATE_HZ改成两个独立的宏,TICKRATE_HZ_STK和TICKRATE_HZ_SCT。
做两个Delay()函数,分别叫Delay_Stk()、Delay_Sct()。
当然TimingDelay与是两个,TimingDelayStk,TimingDelaySct。
最终修改代码如下:- #include "board.h"
- /*****************************************************************************
- * Private types/enumerations/variables
- ****************************************************************************/
- //#define TICKRATE_HZ (10) /* 10 ticks per second */
- #define TICKRATE_HZ_STK (1000) /* 1000 ticks per second */
- #define TICKRATE_HZ_SCT (1000) /* 1000 ticks per second */
- static __IO uint32_t TimingDelayStk;
- static __IO uint32_t TimingDelaySct;
- void Delay_Stk(__IO uint32_t nTime);
- void Delay_Sct(__IO uint32_t nTime);
- static volatile uint32_t ticks;
- /*****************************************************************************
- * Public types/enumerations/variables
- ****************************************************************************/
- /*****************************************************************************
- * Private functions
- ****************************************************************************/
- /*****************************************************************************
- * Public functions
- ****************************************************************************/
- /**
- * @brief Handle interrupt from SysTick timer
- * @return Nothing
- */
- void SysTick_Handler(void)
- {
- if (TimingDelayStk > 0)
- TimingDelayStk--;
- }
- /**
- * @brief Handle interrupt from State Configurable Timer
- * @return Nothing
- */
- void SCT_IRQHandler(void)
- {
- /* Clear the SCT Event 0 Interrupt */
- Chip_SCT_ClearEventFlag(LPC_SCT, SCT_EVT_0);
- if (TimingDelaySct > 0)
- TimingDelaySct--;
- }
- /**
- * @brief Application main program
- * @return Nothing (This function will not return)
- */
- int main(void)
- {
- /* Generic Initialization */
- SystemCoreClockUpdate();
- Board_Init();
- /* Enable SysTick Timer */
- SysTick_Config(SystemCoreClock / TICKRATE_HZ_STK);
- /* Custom Initialization */
- /* Initialize the SCT clock and reset the SCT */
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SCT);
- Chip_SYSCTL_PeriphReset(RESET_SCT);
- /* Configure the SCT counter as a unified (32 bit) counter using the bus clock */
- Chip_SCT_Config(LPC_SCT, SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_CLKMODE_BUSCLK);
- /* The match/capture REGMODE defaults to match mode */
- /* No REGMODE changes are needed for this program */
- /* Set the match count for match register 0 */
- Chip_SCT_SetMatchCount(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ_SCT);
- /* Set the match reload value for match reload register 0*/
- Chip_SCT_SetMatchReload(LPC_SCT, SCT_MATCH_0, SystemCoreClock / TICKRATE_HZ_SCT);
- /* Event 0 only happens on a match condition */
- LPC_SCT->EV[0].CTRL = (1 << 12);
- /* Event 0 only happens in state 0 */
- LPC_SCT->EV[0].STATE = 0x00000001;
- /* Event 0 is used as the counter limit */
- LPC_SCT->LIMIT_U = 0x00000001;
- /* Enable flag to request an interrupt for Event 0 */
- Chip_SCT_EnableEventInt(LPC_SCT, SCT_EVT_0);
- /* Enable the interrupt for the SCT */
- NVIC_EnableIRQ(SCT_IRQn);
- /* Start the SCT counter by clearing Halt_L in the SCT control register */
- Chip_SCT_ClearControl(LPC_SCT, SCT_CTRL_HALT_L);
-
- TimingDelayStk = 0;
- TimingDelaySct = 0;
- Board_LED_Set(0,true);
- Board_LED_Set(2,false);
- while (1) {
- //__WFI();
- Board_LED_Toggle(0);
- Delay_Stk(500);
-
- Board_LED_Toggle(2);
- Delay_Sct(500);
-
- }
- }
- void Delay_Stk(__IO uint32_t nTime)
- {
- TimingDelayStk = nTime;
-
- while(TimingDelaySct != 0)
- {
- }
- }
- void Delay_Sct(__IO uint32_t nTime)
- {
- TimingDelaySct = nTime;
-
- while(TimingDelaySct != 0)
- {
- }
- }
复制代码 SysTick和SCTimer定时同时使用,最终实验现象是LED1和LED3交替点亮、熄灭,频率1Hz。
为方便测试,同时打包上传。
main_sct_basic.rar
(1.85 KB, 下载次数: 4)
|
评分
-
查看全部评分
|