在线时间1537 小时
UID258281
注册时间2014-12-6
NXP金币0
TA的每日心情 | 开心 2020-1-12 00:23 |
---|
签到天数: 745 天 [LV.9]以坛为家II
金牌会员
- 积分
- 6868
- 最后登录
- 2020-7-15
|
本次实验测试是利用系统滴答定时器“systick”产生微秒及毫秒定时,程序是参照网上资料修改,实际运行时还存在一些疑问。
一、实验资源
1、LPC11U68(OM13058)开发板;
2、KEIL V5.25.2.0;
3、lpcopen_3_03_keil_iar_lpcxpresso_11u68;
4、逻辑分析仪及配套软件;
二、实验过程
1、先看看修改的函数:
- static uint8_t fac_us=0; //us延时倍乘数
- static uint16_t fac_ms=0; //ms延时倍乘数
- void delay_init()
- {
- SysTick_Config(SystemCoreClock);
- fac_us = SystemCoreClock / 2000000;
- fac_ms = (uint16_t)fac_us * 1000;
- }
- //延时nus
- void delay_us(uint32_t nus)
- {
- uint32_t temp;
- SysTick->LOAD = nus * fac_us; //时间加载
- SysTick->VAL = 0x00; //清空计数器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //开始倒数
- do
- {
- temp = SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- SysTick->VAL = 0X00; //清空计数器
- }
- //延时nms
- void delay_ms(uint16_t nms)
- {
- uint32_t temp;
- SysTick->LOAD = (uint32_t)nms * fac_ms; //时间加载
- SysTick->VAL = 0x00; //清空计数器
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //开始倒数
- do
- {
- temp = SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- SysTick->VAL = 0X00; //清空计数器
- }
复制代码
2、这是测试端口的函数及相关宏定义:
- #define LED_HIGH() Chip_GPIO_WritePortBit(LPC_GPIO, 2, 17, 1); \
- Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 1)
- #define LED_LOW() Chip_GPIO_WritePortBit(LPC_GPIO, 2, 17, 0); \
- Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 0)
复制代码- void LED_Port_Init(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 9, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 2, 17);//设置PIO2_17端口为输出
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 1, 9);//设置PIO1_9端口为输出,用于测试采样。
- }
复制代码
3、下面测试主函数:
- int main(void)
- {
- uint16_t time = 65535;
- SystemCoreClockUpdate();
- delay_init();
- LED_Port_Init();
- while(1)
- {
- LED_HIGH();
- delay_us(time);
- //delay_ms(time);
- LED_LOW()
- delay_us(time);
- //delay_ms(time);
- }
- }
复制代码
三、实验结果
1、10毫秒:
2、699毫秒:
3、700毫秒:time>699后结果就不对了。
4、10微秒
5、100微秒
6、500微秒
7、5000微秒
8、再来个高值65535
从上面的实测数据看延时时间还能接受,但毫秒参数time>699就会出错;微秒延时在uint16_t time = 65535时也是正常的。
四、实验总结
之前测试到time=500,感觉还行就开始其它实验了,但实际应用时发现毫秒延时当time>699时会出问题。本次实验前也参阅了坛友“stm1024”的帖子(https://www.nxpic.org.cn/module/forum/thread-615231-1-1.html),希望同朋友们进一步交流。
|
|