发新帖我要提问
12
返回列表
打印
[STM8]

ARR寄存器设置到150以下频率就不能再上去了

[复制链接]
楼主: zhenykun
手机看帖
扫描二维码
随时随地手机跟帖
21
zhenykun|  楼主 | 2017-9-28 22:48 | 只看该作者 回帖奖励 |倒序浏览
16MHZ的主时钟,翻转一次IO居然要us级的时间???

使用特权

评论回复
22
wuhany| | 2017-9-28 22:49 | 只看该作者

定时器2由f(master)二分频,即为2MHZ/2=1MHZ,你都说了f(master) = 2MHZ了。一个反转指令在C语言上就是一句话,到汇编上了就是几条指令。
/*******************************************************************************
* 名称: Sysclock_Init
* 功能: 设置系统时钟频率
* 形参: 无
* 返回: 无
* 说明: 时钟选择
         如果选择外部24MHz主时钟的,外部不是24M的话
         把#define HSE_24M  HSE_VALUE注释掉即可,
         如果不需要切换到外部时钟,把#define __HSE_VALUE  HSE_VALUE
         注释掉即可
******************************************************************************/
void SystemClock_Init(void)
{
    CLK_HSICmd(ENABLE);//启用内部高速时钟
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//配置HSI时钟分频系数为1,16MHZ供给CPU
      /* CLK_HSECmd(ENABLE);                     //外部时钟使能
       CLK_HSICmd(ENABLE);//开启内部高速时钟 16MHz
       CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);//时钟分频设置系统时钟16M不分频
       CLK_ClockSwitchCmd(ENABLE);
       CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE); */
}

这是我的时钟配置,我Main里取了个反,还有其他任务执行……,我测I/O的频率是99.20Khz~
while(1)
    {     
              
       // Led_SystemRun();//系统指示灯
         GPIO_WriteReverse(LED_OUT, LED_OUT1_PIN);
        //Beep_Load();//蜂鸣器负载刷新
        
        //Relay_Load();//继电器负载刷新
        
        UartDriver();  //调用串口驱动
        
        IWDG_ReloadCounter();//喂狗
        
/************ 5min调试光敏时间,时间到关闭外部中断 *********/
        if( dog_time == 0 )
        {
            GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);
            GPIO_WriteHigh(LED_OUT, LED_OUT1_PIN);
        }  
    }

如果不是要求时间间隔非常小的话,我建议还是尽量定时器配置的中断时间久一些。
/*******************************************************************************
* 名称: Time4_Init
* 功能: 定时器4初始化
* 形参: 无
* 返回: 无
* 说明: 定时器4用来一个1MS的时间基准
******************************************************************************/
void Time4_Init(void)
{
    TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);//理论定时中断时间8us*125=1MS
    TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE);
    TIM4_ARRPreloadConfig(ENABLE);
    TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    TIM4_Cmd(ENABLE);
}
我用的定时器4,配置的是1ms

使用特权

评论回复
23
jiaxw| | 2017-9-28 22:50 | 只看该作者

再多注释几个,主函数里反转频率有500Khz了

使用特权

评论回复
24
spark周| | 2017-9-28 22:53 | 只看该作者

我又做了实验,定时器4定时15us中断一次,在中断中I/O取反
void Time4_Init(void)
{
    TIM4_TimeBaseInit(TIM4_PRESCALER_16, 14);
    TIM4_PrescalerConfig(TIM4_PRESCALER_16, TIM4_PSCRELOADMODE_IMMEDIATE);
    TIM4_ARRPreloadConfig(ENABLE);
    TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    TIM4_Cmd(ENABLE);
}

使用特权

评论回复
25
huangchui| | 2017-9-28 22:54 | 只看该作者

还没探究STM8的极限,等下有空了用查询的方法做短延时我再试一下吧。

使用特权

评论回复
26
wyjie| | 2017-9-28 22:55 | 只看该作者

进入退出中断都要时间,系统主时钟只有这么快,估计很难得到很快的频率

使用特权

评论回复
27
spark周| | 2017-9-28 22:56 | 只看该作者

赞同,其实搞10us没啥意义的,就是玩玩。实际用的1ms,10Ms直接上

使用特权

评论回复
28
dengdc| | 2017-9-28 22:57 | 只看该作者
10us时间太短了,用中断根本处理不过来。

使用特权

评论回复
29
zhenykun|  楼主 | 2017-9-28 22:59 | 只看该作者

哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

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

本版积分规则