[STM32F1]

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

[复制链接]
808|20
手机看帖
扫描二维码
随时随地手机跟帖
morrisk|  楼主 | 2021-10-9 23:35 | 显示全部楼层 |阅读模式
我的目的是想利用定时器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|  楼主 | 2021-10-9 23:37 | 显示全部楼层
有点毛刺

使用特权

评论回复
zhuhuis| | 2021-10-9 23:39 | 显示全部楼层
有点毛刺也正常吧,和示波器有关

使用特权

评论回复
morrisk|  楼主 | 2021-10-9 23:41 | 显示全部楼层

毛刺不是问题的重点

使用特权

评论回复
bqyj| | 2021-10-9 23:43 | 显示全部楼层

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

使用特权

评论回复
morrisk|  楼主 | 2021-10-9 23:46 | 显示全部楼层
不会吧。72000000Hz/72=1000000Hz,1000个1KHz是1M,没错的。

使用特权

评论回复
zhuhuis| | 2021-10-9 23:49 | 显示全部楼层
多高算高啊 ?

使用特权

评论回复
gongche| | 2021-10-9 23:50 | 显示全部楼层
还有6161这个MCU,寄存器是分2个BANK的,中断程序需要保护BANK现场,重新设置BANK。

使用特权

评论回复
morrisk|  楼主 | 2021-10-9 23:54 | 显示全部楼层
这问题好像是因为进出中断服务程序,里面的语句执行时间等等。所以达不到我要的效果。

使用特权

评论回复
yszong| | 2021-10-9 23:55 | 显示全部楼层
主要受到io口的限制

使用特权

评论回复
supernan| | 2021-10-9 23:57 | 显示全部楼层

楼主想要多高的频率啊

使用特权

评论回复
zwll| | 2021-10-10 09:53 | 显示全部楼层
速度已经很不错了

使用特权

评论回复
stly| | 2021-10-10 09:56 | 显示全部楼层

速度太快了

使用特权

评论回复
renyaq| | 2021-10-10 09:58 | 显示全部楼层
楼主还是不要要求那么高吧

使用特权

评论回复
morrisk|  楼主 | 2021-10-10 10:00 | 显示全部楼层

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
xiaoqizi| | 2021-11-2 15:25 | 显示全部楼层
想要多高的频率啊

使用特权

评论回复
wakayi| | 2021-11-2 15:30 | 显示全部楼层
这个速度要求的太快了

使用特权

评论回复
wowu| | 2021-11-2 15:31 | 显示全部楼层
还是把速度降下来吧

使用特权

评论回复
tpgf| | 2021-11-2 15:32 | 显示全部楼层
io的速度跟不上的

使用特权

评论回复
木木guainv| | 2021-11-2 15:34 | 显示全部楼层
速度有些快啊  还是用专用的芯片吧

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝