打印

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

[复制链接]
2141|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 | 只看该作者
楼主直接上工程文件。这样直接复制过来乱码多

使用特权

评论回复
5
tongbu2015| | 2015-8-10 22:12 | 只看该作者
这个是采用滴答时钟的功能的,延时很准确的。

使用特权

评论回复
6
tongbu2015| | 2015-8-10 22:13 | 只看该作者
不过需要注意ms延时的时候,最大为1870ms左右的,这个是需要注意的。

使用特权

评论回复
7
tongbu2015| | 2015-8-10 22:14 | 只看该作者
我也实际的验证过了,调用该ms函数延时一次想实现2s的延时都是不可以的。

使用特权

评论回复
8
comeon201208| | 2015-8-15 14:10 | 只看该作者
这个是采用滴答时钟进行延时的,需要注意中断的影响。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

12

帖子

0

粉丝