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

[复制链接]
543|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 | 显示全部楼层
毛刺不是问题的重点
bqyj 发表于 2019-10-18 17:32 | 显示全部楼层

TIM1->PSC = 71;
是1KHZ而不是1MHZ
 楼主| morrisk 发表于 2019-10-18 17:35 | 显示全部楼层
不会吧。72000000Hz/72=1000000Hz,1000个1KHz是1M,没错的。
zhuhuis 发表于 2019-10-18 17:39 | 显示全部楼层

多高算高啊 ?
gongche 发表于 2019-10-18 17:40 | 显示全部楼层
还有6161这个MCU,寄存器是分2个BANK的,中断程序需要保护BANK现场,重新设置BANK。
 楼主| morrisk 发表于 2019-10-18 17:43 | 显示全部楼层

这问题好像是因为进出中断服务程序,里面的语句执行时间等等。所以达不到我要的效果。
八层楼 发表于 2019-11-14 09:43 | 显示全部楼层
主要受到io口的限制
晓伍 发表于 2019-11-14 09:45 | 显示全部楼层
楼主想要多高的频率啊
磨砂 发表于 2019-11-14 09:49 | 显示全部楼层
速度已经很不错了
木木guainv 发表于 2019-11-14 09:52 | 显示全部楼层
速度太快了
xiaoqizi 发表于 2019-11-14 09:55 | 显示全部楼层
楼主还是不要要求那么高吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

701

主题

6879

帖子

2

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