OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2916|回复: 4

分享一个不完善的基于tim3的延时函数,顺便请大家帮忙完善

[复制链接]

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-4-7 14:14:13 | 显示全部楼层 |阅读模式
2金钱
用上ucos后,发现systick被占用了,所以写了这个基于TIM3采用时钟摘取法做的延时函数,用示波器测的时候发现每十几个准确的延时之间必然夹杂一个非常不准确的波形,不知道为什么。话不多说一些,上函数。
[mw_shl_code=applescript,true]#include "tim3delay.h"

vu8 overfull = 0;//溢出标志

void tim3delay_init(void)
{
        TIM_TimeBaseInitTypeDef        TIM_BaseInitStructure;
        NVIC_InitTypeDef                                NVIC_InitStructure;
        RCC_ClocksTypeDef                                rccclk;
        u8                                                                                        i;
        u8                                                                                        psc;//预分频系数
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        
        RCC_GetClocksFreq(&rccclk);
        if(rccclk.HCLK_Frequency == rccclk.PCLK1_Frequency)
                i = 1;
        else i = 2;
        
        psc = (u8)(rccclk.PCLK1_Frequency / 1000000) * i - 1;//此预分频下频率为1MHz
        
        TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_BaseInitStructure.TIM_Period = 0xffff;
        TIM_BaseInitStructure.TIM_Prescaler = psc;        
        TIM_TimeBaseInit(TIM3,&TIM_BaseInitStructure);
        
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
        
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        TIM_Cmd(TIM3,ENABLE);
}

void delay_us(u16 xus)
{
        u16 thecount;
        u32 nextcount;
        u8  overnum = 0;//当前超长延时下需要定时器溢出的次数
        
        thecount = TIM_GetCounter(TIM3);
        nextcount = (u32)thecount + (u32)xus;
        if(nextcount <= 65535)
                while(TIM3->CNT < nextcount);
        else
        {
                do{
                        nextcount -= 65535;
                        overnum++;
                }while(nextcount > 65535);
                overfull = 0;
                while((TIM3->CNT < nextcount) || (overnum > overfull));
        }
}

void delay_ms(u16 xms)//最大取值65
{
        delay_us(xms * 1000);
}

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                overfull++;
        }
}[/mw_shl_code]

我有故事,你有酒吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
 楼主| 发表于 2016-4-7 14:16:16 | 显示全部楼层
这是最主要的地方,也是出错的地方,别的初始化就不用看了[mw_shl_code=applescript,true]void delay_us(u16 xus)
{
        u16 thecount;
        u32 nextcount;
        u8  overnum = 0;//当前超长延时下需要定时器溢出的次数
         
        thecount = TIM_GetCounter(TIM3);
        nextcount = (u32)thecount + (u32)xus;
        if(nextcount <= 65535)
                while(TIM3->CNT < nextcount);
        else
        {
                do{
                        nextcount -= 65535;
                        overnum++;
                }while(nextcount > 65535);
                overfull = 0;
                while((TIM3->CNT < nextcount) || (overnum > overfull));
        }
}[/mw_shl_code]
我有故事,你有酒吗
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-4-7 14:39:38 | 显示全部楼层
还没太仔细看,延时中减去的65535是不是该65536

主要想说的是,楼主使用的都是默认字体么,看着很舒服,很有美感
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
 楼主| 发表于 2016-4-7 14:52:44 | 显示全部楼层
龙之谷 发表于 2016-4-7 14:39
还没太仔细看,延时中减去的65535是不是该65536

主要想说的是,楼主使用的都是默认字体么,看着很舒服, ...

因为溢出之后是从0计数,所以此处应减去溢出之前所能计数到的最大值。网页上的字体和keil里的字体不一样,大神的关注点好特别
我有故事,你有酒吗
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-4-7 15:20:06 | 显示全部楼层
来俩不甜的 发表于 2016-4-7 14:52
因为溢出之后是从0计数,所以此处应减去溢出之前所能计数到的最大值。网页上的字体和keil里的字体不一样 ...

因为没有时间仔细阅读程序,所以希望楼主考虑到以下点:
计数0~65535共65536个数,65536为溢出的第一个数相当于下一周的0,即65536-65536

如果楼主已考虑到以上,我还是想说帖子很工整,呵呵
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 02:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表