今天我们用定时器做一个us/ms延时,并且保留其中断,us/ms延时均用查询的方式实现,故不影响中断额实时性。
上次用MPLAB+MCC构建了简单的点灯例程。虽然固件包里面已经帮我们做了一个软件的软延时(__delay_us()和__delay_ms()),具体在pic.h里面
- #ifdef __PICCPRO__
- /****************************************************************/
- /* Built-in delay routines */
- /****************************************************************/
- // NOTE: To use the macros below, YOU must have previously defined _XTAL_FREQ
- #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
- #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
- #endif
IDE帮我们其实做了很多工作,包括头文件的包含,一些常见的标志头定义等,好处就是易上手,不要考虑那么多,但有点小麻烦就是想查看那些头文件及源文件还是有点烦的。
下面我们看下我们的PIC16F15244的固件包里面具体有什么:
扯远了,我们开始配置定时器并且开启中断:
生成代码。我们对代码进行修改,现在它300ms的中断里面,让LED闪烁一次:
对timr0.c添加:
- <font color="#ff0000">#include "pin_manager.h"</font>
- ......
- void TMR0_CallBack(void)
- {
- // Add your custom callback code here
- <font color="#ff0000"> LED_Toggle(); </font>
- if(TMR0_InterruptHandler)
- {
- TMR0_InterruptHandler();
- }
- }
下面我们新建我们的延时函数:
delay.h:
- #ifndef DELAY_H
- #define DELAY_H
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <xc.h>
- #include "mcc_generated_files/tmr0.h"
-
- void delay_us(uint32_t nus);
- void delay_ms(uint32_t nms);
- #ifdef __cplusplus
- }
- #endif
- #endif /* DELAY_H */
delay.c:
|