这里是目录
疑难杂症
定时器
输入捕获
HAL库修改输入捕获的极性
HAL库
在用库函数调整输入捕获的极性时,要先重置上一次的设定,才能修改成功:
TIM_RESET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1);
TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);
- 如上述代码所示,在用
TIM_SET_CAPTUREPOLARITY()
函数修改输入捕获的极性前,要先用TIM_RESET_CAPTUREPOLARITY()
函数重置一下设置,才能修改成功,否则会无法修改。(这一条目前只在STM32F407系列单片机上使用过,不确定其他系列单片机是否有这种要求,当然也有可能HAL库更新到某一版本后就没有这个要求了)
PWM输出
标准库初始化配置TIM1、TIM8高级定时器
标准库
在初始化高级定时器TIM1、TIM8时,和初始化普通定时器不同,需要多调用一个函数才能正常输出PWM信号:
TIM_CtrlPWMOutputs(TIM8,ENABLE);
- 这一条目前只在STM32F407系列单片机上使用过,不确定其他系列单片机是否有这种要求,当然也有可能HAL库更新到某一版本后就没有这个要求了
无法烧录程序
提示Could not stop Cortex-M device!Please check the JTAG cable.
- 弹出如下图所示的两个提示框
- 我出现这个问题的原因非常奇怪,是因为我板子上的复位电路(如下图所示,按键没按下时,复位信号线被上拉电阻R2拉高,按下后复位信号线上电平被开关拉低至GND从而产生复位,电容的目的是为了消抖防误触等)里的电容坏了,导致NRST信号线被拉低至了0.7V左右,从而芯片一直处于复位状态而产生的这个bug。把该电容去掉或者更换一个新的后该问题即得到解决,可以成功烧录程序。
提示No Cortex_M SW Device Found、Error: Flash Download failed - Target DLL has been cancelled
- 如下图所示,出现这个问题的原因是,PLL锁相环电路设置不正确导致芯片运行频率过高锁死(一般情况都是,原本跑在8MHz晶振板子上的程序,换到了一个25MHz晶振的板子上运行,你不知道它是25MHz或者忘记修改程序了而导致的)
- 解决办法也很简单,因为STM有三种启动模式,而只有一种是从默认的主闪存存储器启动(即从STM32的片上Flash启动,STM32的片上Flash也是存储用户编写的程序的地方),因此修改BOOT引脚的高低电平,不从flash启动,芯片就不会因频率过高而自锁,从而就可以烧录进去修改后的设置正确的程序,再把BOOT引脚改过来,即可正常使用。
小技巧
三种启动模式
- STM32是现在非常流行的一款单片机,它一共有三种启动方式,如下图所示:
- STM32的启动方式是由BOOT0和BOOT1两个引脚的电平状态确定的,即在给STM32上电后,会在第四个SYSCLK时钟上升沿锁定这两个引脚的电平,并且转到对应的启动方式。而这两个引脚的电平一般是由外部的跳线帽进行选择这两个引脚是接到开发板的VCC还是GND上,GND对应着0,VCC对应着1。
- 上图BOOT1处的X表示当BOOT0为0即低电平时,不论BOOT1为0还是为1,STM32都从主闪存存储器启动即从STM32的片上Flash启动,STM32的片上Flash是存储用户编写的程序的地方。这个一般也是最常用的启动方式。
- 第二种从系统存储器启动的方式就是我们常说的串口下载程序,即ISP。在32出厂时由生产者内置了一段BootLoader,而且这个地方是ROM,即只读存储器,用户是无法修改的,从这里启动后我们可以通过STM32的串口1将程序烧录进单片机里。需要注意的是这里烧录的程序是存储在主闪存存储器里的,因此我们还需要再次将跳线帽拔下来,将BOOT0引脚设置为低电平,然后将单片机重新上电启动,才能运行刚刚通过串口1烧录进单片机的程序。另外还需要注意的是这种下载程序的方法只能从串口1下载,其他串口是不可以的。