完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在上一篇文章中我利用了延时函数实现了按键软件去抖的方法,现在利用系统的滴答定时器来实现精准延时的。在这块ESK32-30501v2.1的板子上有一个外部8MHZ高速晶振 (HSE),它连接的是PB13和PB14。利用它作为时钟源,编写出精准的延时函数就是本篇文章的目的。
delay.c #include "ht32_cm0plus_misc.h" #include "delay.h" //mS微秒级延时程序 void delay_us(u32 us) { u32 i; SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK); //选择外部参考时钟作为SysTick时钟源。8MHZ SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000); // 重装计数初值 SYSTICK_IntConfig(DISABLE); // 是否开启中断 SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR); //清空定时器 SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE); //使能 for( i = 0;i < us;i++ ) { while( !( (SysTick->CTRL) & (1<<16) ) ); } SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE); //关闭 SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR); //复位清零 } void delay_ms(u16 ms){ //mS毫秒级延时程序 while( ms-- != 0){ delay_us(1000); //调用1000微秒的延时 } } void delay_s(u16 s){ //S秒级延时程序 while( s-- != 0){ delay_ms(1000); //调用1000毫秒的延时 } } 毫秒级函数的实现方法就是调用1000次微秒级函数,秒级函数则是调用1000次毫秒级函数 delay.h #ifndef __DELAY_H #define __DELAY_H #include "ht32_cm0plus_misc.h" void delay_s(u16 s); void delay_ms(u16 ms); void delay_us(u32 us); #endif main() #include "ht32.h" #include "sys.h" #include "led.h" #include "delay.h" #include "key.h" int main() { u8 MENU; u16 t,i; //初始化程序 RCC_Configuration(); //时钟设置 LED_Init(); //设置变量的初始值 MENU = 0; t = 1; //主循环 while(1){ //菜单0 if(MENU == 0){ //变亮循环 for(i = 0; i < 2; i++){ GPIO_WriteOutBits(HT_GPIOC,LED1_PIN|LED2_PIN,SET); delay_us(t); //延时 GPIO_WriteOutBits(HT_GPIOC,LED1_PIN|LED2_PIN,RESET); delay_us(1001-t); //延时 } t++; if(t==1000){ MENU = 1; } } //菜单1 if(MENU == 1){ //变暗循环 for(i = 0; i < 2; i++){ GPIO_WriteOutBits(HT_GPIOC,LED1_PIN|LED2_PIN,SET); delay_us(t); //延时 GPIO_WriteOutBits(HT_GPIOC,LED1_PIN|LED2_PIN,RESET); delay_us(1001-t); //延时 } t--; if(t==1){ MENU = 0; } } } } 当时钟源被设定为8MHz时,如果要产生1ms 时间基准。那么他的计算方法就是(8M/8/1000) = 1ms.这里利用了延时函数实现了LED呼吸灯的效果 。 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1177浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 23:18 , Processed in 0.967089 second(s), Total 48, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号