1、通读STM32F1xx前10章,阅读ARM Cortex-M3 内核编程手册的主要部分,对内核运行方式有所了解,但对解决I2C问题帮助不大。使用标准库的主要问题是:一、不能很好的解决I2C初始化死锁;二、不知道如何结合ADXL345的I2C时序和STM32标准库对I2C的操作。虽然掌握了C8051F的I2C中断状态机方法,但对掌握STM32的I2C没太大指导作用。 2、网上经常见同好们讲STM32的I2C有问题,这个芯片系列出了很长时间了,应用广泛,这个说法不太可能是正确的。得到的可运行的示例都是模拟IO的,没有使用I2C硬件机制,水平不高,资源浪费。 在此感谢wgsxsm的分享! //读ADXL345器件ID void ADXL345_Read_ID(uint8_t* a) { HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DEVICE_ID, 1, a, 1, 35); } //ADXL345初始化 uint8_t ADXL345_Init( void ) { uint8_t data; //测试I2C是否通畅 HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DEVICE_ID, 1, &data, 1, 35); if( data == 0xE5 ) { //量程16g,右对齐,13位全分辨率 data = 0x0B; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, DATA_FORMAT, 1, &data, 1, 35); //输出速率25Hz data = 0x08; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, BW_RATE, 1, &data, 1, 35); //使能测量 data = 0x08; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, POWER_CTL, 1, &data, 1, 35); //不使用中断 data = 0x00; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, INT_ENABLE, 1, &data, 1, 35); //X偏置 data = 0x00; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSX, 1, &data, 1, 35); //Y偏置 data = 0x00; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSY, 1, &data, 1, 35); //Z偏置 data = 0x00; HAL_I2C_Mem_Write(&hi2c2, ADXL345ADD, OFSZ, 1, &data, 1, 35); return 0; } return 1; } //读加速度值 void ADXL345_ReadXYZ( uint16_t* xyz ) { uint8_t temp[6]; HAL_I2C_Mem_Read(&hi2c2, ADXL345ADD, DATA_X0, 1, temp, 6, 35); for( uint8_t i=0;i<3;i++) { xyz = (uint16_t)(temp[i*2+1]<<8) + temp[i*2]; } } 6 、STM32Cube与LabVIEW、Visual Stdio C++等的工程配置过程很相像,简单方便,重要的是ST生成的代码不会出现I2C初始化死锁问题,使开发STM32的固件与开发应用软件一样简单。从wgsxsm的方法(https://bbs.21ic.com/forum.html?mo ... p;highlight=ADXL345)和HAL_I2C_Mem_Read 、HAL_I2C_Mem_Write的用法可见,比使用标准库或51单片机软件开发节省了大量时间和精力。建议各位同好们考虑使用STM32Cube。后附ST的STM32Cube RoadShow。我只是一个单片机爱好者,但做过多年的测控软件开发,只是将学习STM32Cube的经验和大家分享,没有任何商业宣传的意思。
|