最近做了一个项目使用Cube自动生成代码,然后利用HAL库进行编程。芯片为STM32F103C8T6进行编程。
I2C读写
1. 地址需要自己左移1位(stm32中需要,但是NXP中不需要),LPC系列的以前用过一款,函数内部自动左移了。
2. SCL,SDA通信时需要接上拉电阻,然后接到高电平,否则通信不同,显示I2C处于busy状态。
FLASH读写
1. 注意Flash保存数据的起始地址,还要注意内存大小,是1KB,还是2KB,还是128KB
2. Flash擦除时有方法,不要统一擦除,比如:128KB,可以分为128个1KB的区域,每次写1KB,写满后再统一擦除。而且写入Flash时第一个地址要写入自己设定的值,判断擦除时需要判断第一个地址的内容是否相同。
定时器多通道捕获PWM脉冲数
HAL_TIM_IC_Start_DMA()这个函数,如果只用了定时器的一个通道,那使用没有问题。如果使用了个通道,那就需要改HAL库里这个函数的程序。如下图所示
注释掉之后,定时器多通道捕获PWM脉冲数就可以正常使用。要不然只有一个通道可以正常使用,另一个通道调用这个函数的状态就是HAL_TIM_STATE_BUSY。
CAN总线(CAN_MODE_LOOPBACK)
1. 使用CAN总线协议进行发送接收数据时,经常会发生HAL_TIMEOUT的现象。但是以前1.31的版本就不会有,我用的1.60版本,对比发现是下图中的CAN_TSR_TX0K2被省略了。
2. 再进行多次测试时,我们发现了另外一个问题,CAN回调函数接收数据只能接收一次。
发现在调用HAL_CAN_Receive_IT()函数时,第二次时CAN的状态就变成LOCK的,没有进入__HAL_CAN_ENABLE_IT函数,导致中断只进入一次。可以在回调函数中加入这个函数。如下图:
3. 双机通信不需要修改修改上面的2点。就CAN_MODE_LOOPBACK模式需要修改。
其他还没有发现HAL库什么问题,有问题我会继续补充。
*转自CSDN,https://blog.csdn.net/tingfenghanlei/article/details/80481578