打印
[STM32F1]

stm32 delay函数没效果 请求大神指导

[复制链接]
1024|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
刚开始接触单片机这块 用stm32f103CBt6做一个舵机驱动器 就是用它的定时器2 3 4一共发出12路pwm 控制舵机 现在的问题是 在调用定时器2 3 4产生pwm的中间想延时500ms 不过这个延时怎么都不起作用 用了延时和没用是一样的 各个舵机还是一起运动 请各位前辈指导啊 程序如下,分别是主函数和被调用函数,初来乍到第一次发帖,还望前辈帮助啊



沙发
pkuzhx| | 2016-3-15 11:25 | 只看该作者
留名,没看懂你的描述和代码之间有什么联系

使用特权

评论回复
板凳
晴天太抢手|  楼主 | 2016-3-15 14:05 | 只看该作者
pkuzhx 发表于 2016-3-15 11:25
留名,没看懂你的描述和代码之间有什么联系

额。。不好意思 发错了主程序 主程序应该是三次调用TIM定时器 我刚刚那里只写了一个 正确的主程序如下:

#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "usart.h"

int main(void)
{
    delay_init();
          SystemInit();
          
    GPIO_Config();
          TIM2_Config();
          delay_ms(1000);
          TIM3_Config();
          delay_ms(1000);
          TIM4_Config();
       
    while (1)
    {
         
                  


    }
}
另外 这里我只放上去了TIM3的调用函数 TIM2 和4的只是修改相关参数 语句都是一样的

还请前辈多指教 谢谢

使用特权

评论回复
地板
Thethree| | 2016-3-15 15:10 | 只看该作者
你的延时函数在什么地方啊?

使用特权

评论回复
5
晴天太抢手|  楼主 | 2016-3-15 15:58 | 只看该作者
Thethree 发表于 2016-3-15 15:10
你的延时函数在什么地方啊?

在网上找的程序,自带的,据说应该就是原子哥写的,复制过来注释文字都看不到了。。能看的懂吗?


#include "delay.h"
#include "sys.h"

#if SYSTEM_SUPPORT_UCOS
#include "includes.h"                                        //ucos ʹÓà         
#endif

void SysTick_Handler(void)
{                                  
        OSIntEnter();                //½øÈëÖжÏ
    OSTimeTick();       //µ÷ÓÃucosµÄʱÖÓ·þÎñ³ÌÐò               
    OSIntExit();        //´¥·¢ÈÎÎñÇл»ÈíÖжÏ
}
#endif

//³õʼ»¯ÑÓ³Ùº¯Êý
//µ±Ê¹ÓÃucosµÄʱºò,´Ëº¯Êý»á³õʼ»¯ucosµÄʱÖÓ½ÚÅÄ
//SYSTICKµÄʱÖӹ̶¨ÎªHCLKʱÖÓµÄ1/8
//SYSCLK:ϵͳʱÖÓ
void delay_init()         
{

#ifdef OS_CRITICAL_METHOD         //Èç¹ûOS_CRITICAL_METHOD¶¨ÒåÁË,˵Ã÷ʹÓÃucosIIÁË.
        u32 reload;
#endif
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //Ñ¡ÔñÍⲿʱÖÓ  HCLK/8
        fac_us=SystemCoreClock/8000000;        //ΪϵͳʱÖÓµÄ1/8  
         
#ifdef OS_CRITICAL_METHOD         //Èç¹ûOS_CRITICAL_METHOD¶¨ÒåÁË,˵Ã÷ʹÓÃucosIIÁË.
        reload=SystemCoreClock/8000000;                //ÿÃëÖӵļÆÊý´ÎÊý µ¥Î»ÎªK          
        reload*=1000000/OS_TICKS_PER_SEC;//¸ù¾ÝOS_TICKS_PER_SECÉ趨Òç³öʱ¼ä
                                                        //reloadΪ24λ¼Ä´æÆ÷,×î´óÖµ:16777216,ÔÚ72MÏÂ,Ô¼ºÏ1.86s×óÓÒ       
        fac_ms=1000/OS_TICKS_PER_SEC;//´ú±íucos¿ÉÒÔÑÓʱµÄ×îÉÙµ¥Î»          
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //¿ªÆôSYSTICKÖжÏ
        SysTick->LOAD=reload;         //ÿ1/OS_TICKS_PER_SECÃëÖжÏÒ»´Î       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //¿ªÆôSYSTICK   
#else
        fac_ms=(u16)fac_us*1000;//·ÇucosÏÂ,´ú±íÿ¸ömsÐèÒªµÄsystickʱÖÓÊý   
#endif
}                                                                    

#ifdef OS_CRITICAL_METHOD        //ʹÓÃÁËucos
//ÑÓʱnus
//nusΪҪÑÓʱµÄusÊý.                                                                                      
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;        //LOADµÄÖµ                     
        ticks=nus*fac_us;                         //ÐèÒªµÄ½ÚÅÄÊý                           
        tcnt=0;
        told=SysTick->VAL;                //¸Õ½øÈëʱµÄ¼ÆÊýÆ÷Öµ
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;//ÕâÀï×¢ÒâÒ»ÏÂSYSTICKÊÇÒ»¸öµÝ¼õµÄ¼ÆÊýÆ÷¾Í¿ÉÒÔÁË.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;//ʱ¼ä³¬¹ý/µÈÓÚÒªÑÓ³ÙµÄʱ¼ä,ÔòÍ˳ö.
                }  
        };                                                                             
}
//ÑÓʱnms
//nms:ÒªÑÓʱµÄmsÊý
void delay_ms(u16 nms)
{       
        if(OSRunning==TRUE)//Èç¹ûosÒѾ­ÔÚÅÜÁË            
        {                  
                if(nms>=fac_ms)//ÑÓʱµÄʱ¼ä´óÓÚucosµÄ×îÉÙʱ¼äÖÜÆÚ
                {
                           OSTimeDly(nms/fac_ms);//ucosÑÓʱ
                }
                nms%=fac_ms;                                //ucosÒѾ­ÎÞ·¨ÌṩÕâôСµÄÑÓʱÁË,²ÉÓÃÆÕͨ·½Ê½ÑÓʱ   
        }
        delay_us((u32)(nms*1000));        //ÆÕͨ·½Ê½ÑÓʱ,´ËʱucosÎÞ·¨Æô¶¯µ÷¶È.
}
#else//²»ÓÃucosʱ
//ÑÓʱnus
//nusΪҪÑÓʱµÄusÊý.                                                                                      
void delay_us(u32 nus)
{               
        u32 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
//¶Ô72MÌõ¼þÏÂ,nms<=1864
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)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;       //Çå¿Õ¼ÆÊýÆ÷                      
}
#endif

使用特权

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

本版积分规则

3

主题

8

帖子

0

粉丝