问题一:右侧watch窗口无法显示数据动态变化
现象:在main循环中加入累加的数值都不变化
现象2:单步执行卡在如下函数
原因:一般是因为没有用微库进入半主机模式
解决措施:
措施一:打开勾选下面的。
措施二:上面没办法解决就检查板子供电,不能只是仿真器供电,可能是这个供电功率不足。
措施三:有可能是cubeMx的版本有bug,然后重新安装一个版本的CubeMx。
问题二:CubeMx生成代码卡死
解决措施:打开工程源文件夹,要删除其他所有文件仅保持如下圈圈里文件。
问题三:PWM周期计算不准
为什么时钟频率为18M,经过18倍分频,设置触发值为20000时,周期不是20ms,而是21ms?
此时我的定时器时钟为18M,分频系数为18,counter period为20000,经过18分频后,定时器时钟为1M,电平反转周期等于 20000/1000000 = 1/50 = 0.02s,约为20ms,单个电平持续时间为20ms,两个电平则为40ms左右,因此基本符合,但是为什么不是精确的20ms呢?
而将分频数PSC改为17,counter period的值改为19999后就是正好的20ms,这是为什么呢?
原因是:
1).TIM Period:定时周期,实质是存储到重载寄存器TIMx ARR 的数值,脉冲计数器从0累加到这个值上溢或从这个值自减至0下溢。这个数值加1然后乘以时钟源周期就是实际定时周期。本实验中向该成员赋值为 999,即定时周期为 (999+1) * T为时钟源周期
2).TIM Prescaler:对定时器时钟 TIMxCLK 的预分频值,分频后作为脉冲计数器 TIMxCNT 的驱动时钟,得到脉冲计数器的时钟频率计算方式是 :
fcnt = ftim_clk/ (N+1),
本实验给分频为18分频,即N=18-1 = 17,这个N就是填入到寄存器PSC中的值。已知AHB 时钟频率为18 MHz、TIMxCLK 为1 8MHz,所以输出到脉冲计数器TIMx CNT 的时钟频率为
f_CNT=18 MHz/(17+1)=1 MHz。
最终得到的分频后时钟频率为1MHz
总而言之。STM32存在1分频,分频数 = PSC寄存器值+1,填入寄存器的值是分频数减一。脉冲计数器又是从0开始累加而不是从1开始累加,所以计数20000次的寄存器值为19999。