[STM8]

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

[复制链接]
420|35
手机看帖
扫描二维码
随时随地手机跟帖
zhenykun|  楼主 | 2020-11-18 22:16 | 显示全部楼层 |阅读模式

逻辑很简单,使用通用定时器2,设置每10us产生一次中断,然后在定时器中断里面设置IO口翻转,用示波器观察IO口的翻转频率
硬件上STM8S使用内部16MHZ使用,没有使用外部晶振。定时器2由f(master)二分频,即为2MHZ/2=1MHZ,即每1us计数一次。
设置ARR寄存器值为10,则应该是每10us产生一次中断,中断里面翻转IO,则IO的频率应该是1s/(10us*2)=50KHZ
然后实际测试发现ARR寄存器设置到150以下频率就不能再上去了

使用特权

评论回复
wyjie| | 2020-11-18 22:20 | 显示全部楼层
然后是多少啊

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:23 | 显示全部楼层

1s/(150us*2)=3.3KHZ
ARR设置到150以上的所有测试波形都与理论计算符合,150以下所有的测试波形都为3.3KHZ!!!
请问是怎么回事呢??

使用特权

评论回复
jiahy| | 2020-11-18 22:26 | 显示全部楼层
IO口的设置模式是?

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:30 | 显示全部楼层
GPIO_MODE_OUT_PP_LOW_FAST 换了几种IO模块波形一样

使用特权

评论回复
午夜粪车| | 2020-11-18 22:35 | 显示全部楼层
定时器的配置函数呢

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:38 | 显示全部楼层

/*通用定时器2配置函数*/
void TIM2_Config(void)
{
  asm("sim");         //sim是禁止中断
  
  TIM2_PrescalerConfig(TIM2_PRESCALER_2,TIM2_PSCRELOADMODE_IMMEDIATE);              //f(master)/2=2MHZ/2=1MHZ=1us/count  
  TIM2_SetCounter(0);
  TIM2_SetAutoreload(200);                                                                              
  TIM2_ITConfig(TIM2_IT_UPDATE,ENABLE);         
  TIM2_Cmd(ENABLE);
  asm("rim");        //rim使能中断
}

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:42 | 显示全部楼层
然后没有用到其他外设和中断,只用了定时器2和一个IO口

使用特权

评论回复
jlyuan| | 2020-11-18 22:45 | 显示全部楼层
换了其他IO口也是一样的现象?

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:51 | 显示全部楼层
一样的现象

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 22:54 | 显示全部楼层
更改定时器2的分频系数也一样,只要频率是低于3.3KHZ的全部没问题,高于3.3KHZ的全部只能到3.3KHZ

使用特权

评论回复
heweibig| | 2020-11-18 22:57 | 显示全部楼层
为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。

使用特权

评论回复
jiahy| | 2020-11-18 23:01 | 显示全部楼层
其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。

使用特权

评论回复
houcs| | 2020-11-18 23:07 | 显示全部楼层
不用定时器
直接主函数里
while(1)
{
io_conv;
}
看看是多少频率

使用特权

评论回复
pangb| | 2020-11-18 23:12 | 显示全部楼层
要16MHZ,初始要 CLK_CKDIVR =0 ;

使用特权

评论回复
liliang9554| | 2020-11-18 23:16 | 显示全部楼层
中断响应要时间,主时钟不能太慢。

使用特权

评论回复
yszong| | 2020-11-18 23:19 | 显示全部楼层
应该是时钟或定时器的设置问题,曾经输出过38K的方波。

使用特权

评论回复
jiajs| | 2020-11-18 23:23 | 显示全部楼层
你在主函数里面用另外一个I/O取反。ARR寄存器设置到150以下的时候,如果主函数里面的I/O频率为0,那可能原因就是I/O取反还没结束呢,10us到了……

使用特权

评论回复
zhenykun|  楼主 | 2020-11-18 23:27 | 显示全部楼层
我把f(master)的频率设置为不分频,即为16MHZ,果然速度上去了,然而最高也只能到46KHZ左右

使用特权

评论回复
yszong| | 2020-11-18 23:34 | 显示全部楼层
通过直接操作寄存器的方式在main函数中直接取反IO,其他啥也不干呢

使用特权

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

本版积分规则

868

主题

11535

帖子

3

粉丝