打印
[STM32F1]

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

[复制链接]
1944|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我的目的是想利用定时器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
        }
}




望大神指教,谢谢。
沙发
mmuuss586| | 2018-3-31 09:52 | 只看该作者
有点毛刺也正常吧,和示波器有关

使用特权

评论回复
板凳
followme001|  楼主 | 2018-3-31 10:13 | 只看该作者
mmuuss586 发表于 2018-3-31 09:52
有点毛刺也正常吧,和示波器有关

毛刺不是问题的重点

使用特权

评论回复
地板
sky.sun.zz| | 2018-3-31 10:43 | 只看该作者
TIM1->PSC = 71;
是1KHZ而不是1MHZ

使用特权

评论回复
5
followme001|  楼主 | 2018-3-31 10:48 | 只看该作者
sky.sun.zz 发表于 2018-3-31 10:43
TIM1->PSC = 71;
是1KHZ而不是1MHZ

不会吧。72000000Hz/72=1000000Hz,1000个1KHz是1M,没错的。

使用特权

评论回复
6
xdkun| | 2018-4-5 13:05 | 只看该作者
多高算高啊 ?

使用特权

评论回复
7
followme001|  楼主 | 2018-4-6 17:56 | 只看该作者
这问题好像是因为进出中断服务程序,里面的语句执行时间等等。所以达不到我要的效果。

使用特权

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

本版积分规则

26

主题

154

帖子

1

粉丝