打印
[STM32F4]

F405定时器输出脉冲,单步运行和连续运行产生的宽度不一致

[复制链接]
1289|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
玄德|  楼主 | 2021-6-2 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 玄德 于 2021-6-3 11:19 编辑

F405,把 PB8 管脚映射为 TIM10 ch1,想用 PWM mode 1 模式产生一个 1mS 宽的脉冲,高有效。

程序编写完,下载运行,示波器监测 PB8 脚,
发现用仿真器单步运行时脉冲宽度正常,很准确的 1mS;
如果程序下载后连续运行,或者 CPU 脱开仿真器、上电自主运行,脉冲宽度只有 12uS。
二者相差几十倍。

也就是说,单步运行和连续运行,产生的脉冲宽度严重不一致。

不知道为什么?怎么解决?

补充:因为 PB8 还可以映射到 TIM4 ch3,所以用 TIM4 ch3 单独编了一段测试程序,
输出结果与 TIM10 完全相同,单步运行就正常,连续运行就不正常,不正常时也是 12uS 。

另外,特意把正常和不正常的 RCC 寄存器的值截图,进行比较,没有区别。



使用特权

评论回复
沙发
玄德|  楼主 | 2021-6-2 16:37 | 只看该作者
本帖最后由 玄德 于 2021-6-3 08:51 编辑

完整程序如下:

//Configure PB8 as output:

RCC -> AHB1ENR |= 1 << 1;                                        //Enable clock of GPIOB.

GPIOB -> MODER &= ~( 0x3 << 16 ) ;                                //PB8 as AF mode.
GPIOB -> MODER |= 2 << 16;
GPIOB -> AFR[1] |= 3 << 0;                                        //PB8 as AF3 (TIM10).

//Configure TIM10.
RCC -> APB2ENR |= ( 1 << 17 );                                //Enable clock of TIM10.

TIM10 -> CCMR1 |= 6 << 4;                                        //Ch1 as PWM mode 1 mode.
TIM10 -> CCER |= 1 << 0;                                        //Ch1 output enabled.

TIM10 -> PSC = 83;                                                   //脉冲宽度为 1mS 。
TIM10 -> CCR1 = 2000;

//测试程序。
while        (1)
        {
        TIM10 -> CNT = 0;
        TIM10 -> CR1 |= 1 << 0;                                    //启动定时器。

        while         ( !( TIM10 -> SR & ( 1 << 1 ) ) );        //等待脉冲结束。

        TIM10 -> CR1 &= ~( 1 << 0 );                                //Disable TIM10.
        TIM10 -> SR &= ~( 3 << 1 );                                //Clear flag.

        for        ( i=0; i<0x20000; i++ );
        }




使用特权

评论回复
板凳
香水城| | 2021-6-3 07:17 | 只看该作者
你这里的一个脉冲靠什么掌控的?

使用特权

评论回复
地板
玄德|  楼主 | 2021-6-3 08:48 | 只看该作者
香水城 发表于 2021-6-3 07:17
你这里的一个脉冲靠什么掌控的?


需要产生单个脉冲的时候,用软件控制,
使能定时器,检测到匹配事件后再关闭。


使用特权

评论回复
5
玄德|  楼主 | 2021-6-3 11:24 | 只看该作者
本帖最后由 玄德 于 2021-6-3 13:32 编辑

补充实验:因为 TIM10 工作不正常,而 PB8 还可以映射到 TIM4 ch3,
所以用 TIM4 ch3 单独编了一段测试程序。
输出结果与 TIM10 完全相同,单步运行时正常,连续运行就不正常,不正常时也是 12uS 。

12uS 和 1mS,相差 84 倍,
而 84 这个数字在 F4 系列经常见到。
所以,特意把正常和不正常的 RCC 寄存器的值截图,进行比较。
但是没有区别。

似乎预分频寄存器 PSC 被跳过,无视。
现在没有思路了。
实在没法,可能要换用 IO 方式产生脉冲。




使用特权

评论回复
6
玄德|  楼主 | 2021-6-3 16:20 | 只看该作者
本帖最后由 玄德 于 2021-6-3 16:22 编辑


上午怀疑 PSC 寄存器不起作用,下午用实验验证一下。

具体方法是:
保持 PSC 分频器的值为 0,即分频系数为 1,
那么脉冲宽度由匹配寄存器 CCR1(针对 TIM10) 或 CCR3(针对 TIM4) 决定。

实验结果:
无论单步运行,还是带仿真器连续运行,还是下载后 CPU 自主运行(重新上电),
脉宽都是正常的,不再出现异常的 12uS 。

两个定时器都试了,结果都正常,而使用 PSC 的时候都不正常。

这似乎验证了上面的结论:连续运行或者自主运行时,PSC 被无视了。
原因不明。


使用特权

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

本版积分规则

个人签名:有事请找 xuander

153

主题

5927

帖子

44

粉丝