GD32F130R8芯片中的delay程序,可行哦

[复制链接]
2534|7
 楼主| kangwenhong1992 发表于 2015-8-8 10:46 | 显示全部楼层 |阅读模式
#include "delay.h"
#include "core_cm3.h"
#include "gd32f1x0_misc.h"
static uint8_t  fac_us=0;//usÑÓʱ±¶³ËÊý                          
static uint16_t fac_ms=0;//msÑÓʱ±¶³ËÊý
//³õʼ»¯ÑÓ³Ùº¯Êý
//SYSTICKµÄʱÖӹ̶¨ÎªHCLKʱÖÓµÄ1/8
//SYSCLK:ϵͳʱÖÓ          ÕâÀïΪ72MHZ
void delay_init(uint8_t SYSCLK)
{
        SysTick_CKSource_Enable(SYSTICK_CKSOURCE_HCLK_DIV8);
        fac_us=SYSCLK/8;                //,fac_us¶¼ÐèҪʹÓÃ8·ÖƵ
        fac_ms=(uint16_t)fac_us*1000;//´ú±íÿ¸ömsÐèÒªµÄsystickʱÖÓÊý   
}                       
//ÑÓʱnus
//nusΪҪÑÓʱµÄusÊý.       
//×¢Òâ:nusµÄÖµ,²»Òª´óÓÚ798915us
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
//×¢ÒânmsµÄ·¶Î§
//SysTick->LOADΪ24λ¼Ä´æÆ÷,ËùÒÔ,×î´óÑÓʱΪ:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLKµ¥Î»ÎªHz,nmsµ¥Î»Îªms
//¶Ô168MÌõ¼þÏÂ,nms<=798ms
void delay_xms(uint16_t nms)
{                                     
        uint32_t temp;                  
        SysTick->LOAD=(uint32_t)nms*fac_ms;//ʱ¼ä¼ÓÔØ(SysTick->LOADΪ24bit)
        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
//nms:0~65535
void delay_ms(uint16_t nms)
{                  
        uint8_t repeat=nms/540;        //ÕâÀïÓÃ540,ÊÇ¿¼Âǵ½Ä³Ð©¿Í»§¿ÉÄܳ¬ÆµÊ¹ÓÃ,
                                                //±ÈÈ糬Ƶµ½248MµÄʱºò,delay_xms×î´óÖ»ÄÜÑÓʱ541ms×óÓÒÁË
        uint16_t remain=nms%540;
        while(repeat)
        {
                delay_xms(540);
                repeat--;
        }
        if(remain)delay_xms(remain);
       
}


.h文件:
#include "gd32f1x0_rcc.h"
void delay_init(uint8_t SYSCLK);
void delay_ms(uint16_t nms);
void delay_us(uint32_t nus);
哆来咪 发表于 2015-8-8 16:15 | 显示全部楼层
滴答定时器直接有这么一个函数的吧。建议函数名可以和库的命名方式类似,然后放到库中补充。
大叔乔东 发表于 2015-8-9 15:31 | 显示全部楼层
这个程序不是很完善,应该做个公式,根据主频率来定义的。不然换个主频率,延时就不准了。
number9 发表于 2015-8-10 09:24 | 显示全部楼层
楼主直接上工程文件。这样直接复制过来乱码多
tongbu2015 发表于 2015-8-10 22:12 | 显示全部楼层
这个是采用滴答时钟的功能的,延时很准确的。
tongbu2015 发表于 2015-8-10 22:13 | 显示全部楼层
不过需要注意ms延时的时候,最大为1870ms左右的,这个是需要注意的。
tongbu2015 发表于 2015-8-10 22:14 | 显示全部楼层
我也实际的验证过了,调用该ms函数延时一次想实现2s的延时都是不可以的。
comeon201208 发表于 2015-8-15 14:10 | 显示全部楼层
这个是采用滴答时钟进行延时的,需要注意中断的影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部