STM32开发中的随笔小记

1.    无法加载正确的库文件or“core_cm3.c”中的类型定义有冲突

解决办法:使用IDE自身的最新CMSIS库文件

STM32开发中的随笔小记

STM32开发中的随笔小记


2.    无法找到自定义的include文件

解决办法:检查预编译设置中的include文件路径是否正确

STM32开发中的随笔小记STM32开发中的随笔小记


3.    出现错误: no definition for "assert_param" 

解决办法:“stm32f10.h”中的” #include "stm32f10x_conf.h"”没有被打开。需要在预编译设置中添加Define

STM32开发中的随笔小记STM32开发中的随笔小记


4.CAN通信配置相关

4.1 CAN_Prescaler参数 = APB1设备总线时钟/(TS1 +1 + TS2 +1 +1)/CAN波特率

STM32开发中的随笔小记

波特率=1/每个bit占用的时间

每个bit占用的时间(NBT)=1*Tq+Tbs1+Tbs2

Tplk=1/Tapb1  ->表示传输1bit数据所需要花费的时间

根据上面的公式,可以得出

Tq =(BRP+1)/Tapb1

NBT = Tq*(1+TS1+1+TS2+1)

->

NBT=((BRP+1)*(1+1+1+TS1+TS2))/Tapb1

Rate=Tapb1/(BRP+1)/(1+1+1+TS1+TS2)

->

(BRP+1)=Tapb1/(1+1+1+TS1+TS2)/Rate

CAN_Prescaler参数 = APB1设备总线时钟/(TS1 +1 + TS2 +1 +1)/CAN波特率

值得注意的是,TS1和TS2是实际写入寄存器的值,而BS1=TS1+1,BS2=TS2+1。个中换算容易疏忽。


另:取样率=(TS1+1)/(TS1+TS2+1+1+1)

另2:CAN通信工具中提及的BTR0与BTR1的含义:

STM32开发中的随笔小记

其中:SJW为寄存器CAN_BTR.SJW

BRP为寄存器CAN_BTR.BRP

TSEG2为寄存器CAN_BTR.TS2

TSEG1为寄存器CAN_BTR.TS1


SAM 0 三倍:总线采样三次:建议在中/低速总线(A和B级)使用,有处于过滤总线上毛刺
1 单倍:总线采样一次;建议使用在高速总线上(SAEC级)


4.2在寄存器设置正确的前提下,进行发送,却发现了错误

4.2.1 CAN_ESR.LEC = 0x101 (显性错误)

         检查物理连线,以及Transmitor的设置是否正常

 

4.2.2 CAN_ESR.LEC=0x011 (ACK错误)

         确认是接收时的ACK错误还是发送时候的ACK错误

 ->发送时的ACK错误时,检查CAN的位时间设置(CAN_BTR)的设置是否正确,波特率是否正确。与接收端的设置是否匹配。


5.TIMx相关设置

5.1虽然手册中没有明确说明,但是编码器接口模式只适用于输入为TIMx的CH1与CH2.

5.2编码器模式中,如果TIM_CNT只在0与1之间跳变,则检查两个输入通道是否都接续正常。(是否有一个通道是没有产生波动的)

5.3如果想要达到正转由0到max,然后继续正转时保持max,反转由max到0,继续反转时保持0的效果,则在计数模式中选择*对齐模式。

5.4如果编码器接口的触发源选择的是“上升下降都触发”的话,计数得到的cnt会在旋转单个角度时产生4次cnt。

STM32开发中的随笔小记



6.关于STM32的延时操作。精确延时,还需要再调查一下。


To be continue...