打印
[STM32F1]

STM32F103 TIM1比较输出不能输出高频率?

[复制链接]
404|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2019-10-18 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的目的是想利用定时器1比较输出500Khz的高低电平信号,也就是用定时器1产生500Khz的中断,
先试用500hz的程序如下:
void timer_init(void)
{
        RCC->APB2ENR |= 1 << 11;
        TIM1->ARR = 0xFFFF;//
        TIM1->PSC = 71;//CPU工作频率72M,预分频72000000/(71+1)=1M,所以定时器1工作频率为1M
        TIM1->CCR1 = 0xFFFF;
        TIM1->RCR = 0x00;
        TIM1->DIER = 0x03;//开启比较中断
        TIM1->BDTR = 0x8000;
        TIM1->CR1 = 0x81;定时器1使能
        nvic_init(2,2,TIM1_CC_IRQn,2);
}


void TIM1_CC_IRQHandler(void) //定时器1中断
{
        u16 temp;
        
        if (TIM1->SR & 0x0002)
        {
                TIM1->SR &= 0xFFFD;
                LED0 = !LED0;利用LED的高低电平测量验证
                temp = TIM1->CCR1;
                TIM1->CCR1 = temp + 2000; //  1M/2000=500HZ,用示波器测量是很标准的高电平2ms,低电平也是2ms
        }
}




下面是500Khz的程序如下:
void timer_init(void)
{
        RCC->APB2ENR |= 1 << 11;
        TIM1->ARR = 0xFFFF;//
        TIM1->PSC = 71;//CPU工作频率72M,预分频72000000/(71+1)=1M,所以定时器1工作频率为1M
        TIM1->CCR1 = 0xFFFF;
        TIM1->RCR = 0x00;
        TIM1->DIER = 0x03;//开启比较中断
        TIM1->BDTR = 0x8000;
        TIM1->CR1 = 0x81;定时器1使能
        nvic_init(2,2,TIM1_CC_IRQn,2);
}


void TIM1_CC_IRQHandler(void) //定时器1中断
{
        u16 temp;
        
        if (TIM1->SR & 0x0002)
        {
                TIM1->SR &= 0xFFFD;
                LED0 = !LED0;利用LED的高低电平测量验证
                temp = TIM1->CCR1;
                TIM1->CCR1 = temp + 2; //  1M/2=500KHZ,用示波器测量是畸变的信号,且信号的频率不对,为50HZ
        }
}


  



下面是1M的程序如下:
void timer_init(void)
{
        RCC->APB2ENR |= 1 << 11;
        TIM1->ARR = 0xFFFF;//
        TIM1->PSC = 71;//CPU工作频率72M,预分频72000000/(71+1)=1M,所以定时器1工作频率为1M
        TIM1->CCR1 = 0xFFFF;
        TIM1->RCR = 0x00;
        TIM1->DIER = 0x03;//开启比较中断
        TIM1->BDTR = 0x8000;
        TIM1->CR1 = 0x81;定时器1使能
        nvic_init(2,2,TIM1_CC_IRQn,2);
}


void TIM1_CC_IRQHandler(void) //定时器1中断
{
        u16 temp;
        
        if (TIM1->SR & 0x0002)
        {
                TIM1->SR &= 0xFFFD;
                LED0 = !LED0;利用LED的高低电平测量验证
                temp = TIM1->CCR1;
                TIM1->CCR1 = temp + 1; //  1M/1=1MHZ,用示波器测量是畸变的信号,且信号的频率不对,为15HZ
        }
}

使用特权

评论回复
沙发
morrisk|  楼主 | 2019-10-18 17:22 | 只看该作者
有点毛刺

使用特权

评论回复
板凳
zhuhuis| | 2019-10-18 17:25 | 只看该作者
有点毛刺也正常吧,和示波器有关

使用特权

评论回复
地板
morrisk|  楼主 | 2019-10-18 17:29 | 只看该作者
毛刺不是问题的重点

使用特权

评论回复
5
bqyj| | 2019-10-18 17:32 | 只看该作者

TIM1->PSC = 71;
是1KHZ而不是1MHZ

使用特权

评论回复
6
morrisk|  楼主 | 2019-10-18 17:35 | 只看该作者
不会吧。72000000Hz/72=1000000Hz,1000个1KHz是1M,没错的。

使用特权

评论回复
7
zhuhuis| | 2019-10-18 17:39 | 只看该作者

多高算高啊 ?

使用特权

评论回复
8
gongche| | 2019-10-18 17:40 | 只看该作者
还有6161这个MCU,寄存器是分2个BANK的,中断程序需要保护BANK现场,重新设置BANK。

使用特权

评论回复
9
morrisk|  楼主 | 2019-10-18 17:43 | 只看该作者

这问题好像是因为进出中断服务程序,里面的语句执行时间等等。所以达不到我要的效果。

使用特权

评论回复
10
八层楼| | 2019-11-14 09:43 | 只看该作者
主要受到io口的限制

使用特权

评论回复
11
晓伍| | 2019-11-14 09:45 | 只看该作者
楼主想要多高的频率啊

使用特权

评论回复
12
磨砂| | 2019-11-14 09:49 | 只看该作者
速度已经很不错了

使用特权

评论回复
13
木木guainv| | 2019-11-14 09:52 | 只看该作者
速度太快了

使用特权

评论回复
14
xiaoqizi| | 2019-11-14 09:55 | 只看该作者
楼主还是不要要求那么高吧

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝