liuzaiy 发表于 2022-6-12 16:44

测试中不管设置什么值延时时间都没有变化

STM32 FreeRTOS 串口队列接收

dengdc 发表于 2022-6-12 16:47

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

liuzaiy 发表于 2022-6-12 16:49


void TIM4_Init(void)//256us中断一次
{

TIM4_EGR = 0x01; // 允许产生更新事件
TIM4_PSCR = 0x07;//计数器时钟=主时钟/128=16MHZ/128 //相当64us
TIM4_ARR = 31;// 设定重装载时的寄存器值,255是最大值
TIM4_CNTR = 31; // 设定计数器的初值 // 定时周期=(ARR+1)*64=16.320mS,本次为2ms
TIM4_CR1 = 0x01; // b0 = 1,允许计数器工作// b1 = 0,允许更新// 设置控制器,启动定时器
TIM4_IER = 0x01;// 允许更新中断
_asm("rim"); // 允许CPU全局中断
}
更多操作

liuzaiy 发表于 2022-6-12 16:52

如果我要设置成5us中断一次   TIM4_APP要如何设置

yszong 发表于 2022-6-12 16:53

我的程序里在中断服务程序里改变了初值CNTR,功能正常,你试试。

liuzaiy 发表于 2022-6-12 16:55

我的也是啊!中断设置成2ms这个CNTR不管怎么设置好像都不会有影响

liuzaiy 发表于 2022-6-12 16:57

还有ST的参考手册上说TIM4是个向上增长计数器,我怎么感觉是个向下的?

xxrs 发表于 2022-6-12 16:59

1、“写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器”
2、“在向上计数模式中,计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件”,
以上,摘自STM8S手册。在你这里,你把TIM4_CNTR设置为31,等于TIM4_ARR

wyjie 发表于 2022-6-12 17:01

意思是说,TIM4从31开始计数然后在TIM4_CNTR等于31时触发中断

dingy 发表于 2022-6-12 17:08

这好像没有意义啊,计时时间应该是计时器时钟周期的整数倍,用这种方法是无法64us得到5us的。仅供参考!

dongnanxibei 发表于 2022-6-12 17:08

建议在cubeMX里配置。

dongnanxibei 发表于 2022-6-12 17:09

然后再根据需求修改参数,自己配置寄存器的活,我也好久没搞过了,都是用的配置工具。

liuzaiy 发表于 2022-6-12 17:09

STM8在2MHZ下运行,TIME4设置128分频,算下来确实是64us,确实没法得到5us

juventus9554 发表于 2022-6-12 17:18

那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度应该够用了吧

dengdc 发表于 2022-6-12 17:20

ARR = FREQ_TIMCLK / 200000;/* 频率200k 就是5us */

liuzaiy 发表于 2022-6-12 17:25

不分频是在大概62ns的周期吧?

liuzaiy 发表于 2022-6-12 17:28

定时器设置也就80个周期就产生中断就可以了。

chuxh 发表于 2022-6-12 17:29

为什么算的不太一样?

huangchui 发表于 2022-6-12 17:32

你是对的,我误按2的24次方算了

shimx 发表于 2022-6-12 17:33

计时时间应该是计时器时钟周期的整数倍
页: [1] 2 3
查看完整版本: 测试中不管设置什么值延时时间都没有变化