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

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

[复制链接]
楼主: zhenykun
手机看帖
扫描二维码
随时随地手机跟帖
zhenykun|  楼主 | 2019-1-16 18:10 | 显示全部楼层
发现IO翻转的极限速率是46KHZ左右

使用特权

评论回复
wuhany| | 2019-1-16 18:12 | 显示全部楼层
也就是说16MHZ的主时钟下,IO的速度设置2MHZ和10MHZ根本就没鸟用~~

使用特权

评论回复
zhenykun|  楼主 | 2019-1-16 18:17 | 显示全部楼层
16MHZ的主时钟,翻转一次IO居然要us级的时间???

使用特权

评论回复
wuhany| | 2019-1-16 18:19 | 显示全部楼层

定时器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

使用特权

评论回复
jiaxw| | 2019-1-16 18:21 | 显示全部楼层
再多注释几个,主函数里反转频率有500Khz了

使用特权

评论回复
ilymy| | 2019-1-16 19:11 | 显示全部楼层
wuhany 发表于 2019-1-16 18:12
也就是说16MHZ的主时钟下,IO的速度设置2MHZ和10MHZ根本就没鸟用~~

这个不是这么理解的吧

使用特权

评论回复
mmuuss586| | 2019-1-16 21:05 | 显示全部楼层

使用特权

评论回复
spark周| | 2019-1-23 09:37 | 显示全部楼层

我又做了实验,定时器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);
}

使用特权

评论回复
huangchui| | 2019-1-23 09:40 | 显示全部楼层
还没探究STM8的极限,等下有空了用查询的方法做短延时我再试一下吧。

使用特权

评论回复
wyjie| | 2019-1-23 09:43 | 显示全部楼层
进入退出中断都要时间,系统主时钟只有这么快,估计很难得到很快的频率

使用特权

评论回复
spark周| | 2019-1-23 09:46 | 显示全部楼层
赞同,其实搞10us没啥意义的,就是玩玩。实际用的1ms,10Ms直接上

使用特权

评论回复
dengdc| | 2019-1-23 09:49 | 显示全部楼层
10us时间太短了,用中断根本处理不过来。

使用特权

评论回复
zhenykun|  楼主 | 2019-1-23 09:52 | 显示全部楼层
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

评论回复
xiaoqizi| | 2019-2-11 13:05 | 显示全部楼层
有没有可能是io口的速度跟不上了呢

使用特权

评论回复
木木guainv| | 2019-2-11 15:11 | 显示全部楼层
10us的话  引脚速度是跟不上的

使用特权

评论回复
磨砂| | 2019-2-12 13:01 | 显示全部楼层
io的动作没有那么快的

使用特权

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

本版积分规则