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

[复制链接]
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部

868

主题

11535

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部