本帖最后由 goodjob 于 2023-1-6 10:56 编辑
AT32系列单片机,SRAM普遍比较大,特别是新出的AT32F435/437系列,最大SRAM可达到512K,288MHz主频,可以用来处理稍复杂的图形。有幸收到F435的开发板,马上打样了一块测试板,在这里先测试一下硬件I2C、大容量SRAM的图形性能。
测试板带了一个ST7789的屏,分辨率为320*240,因SRAM充足,直接使用双帧缓冲,占用300K(SRAM大就是爽,想怎么玩就怎么玩)。
热成像用的MLX90640,使用I2C通信,在这里使用了I2C2,引脚为PH2和PH3。
I2C读写非常简单,直接使用I2C例程中的i2c_application即可。特别赞一下,官方AN0091文档提供了一个I2C时钟配置工具,非常方便。
MLX90640驱动也很简单,直接将I2C读写函数插入即可:
int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress,uint16_t nMemAddressRead, uint16_t *data)
{
uint8_t sa;
int ack = 0;
int cnt = 0;
int i = 0;
char cmd[2] = {0,0};
char i2cData[1664] = {0};
uint16_t *p;
p = data;
u16 len=nMemAddressRead*2;
ack=i2c_memory_read(&hi2cx,I2C_MEM_ADDR_WIDIH_16,slaveAddr<<1,startAddress,(uint8_t *)i2cData,nMemAddressRead<<1,I2C_TIMEOUT);
if(ack != 0)
{
return -1;
}
for(cnt=0; cnt < nMemAddressRead; cnt++)
{
i = cnt << 1;
*p++ = (int)i2cData[i]*256 + (int)i2cData[i+1];
}
return 0;
}
int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data)
{
uint8_t sa;
int ack = 0;
u8 cmd[4] = {0,0,0,0};
static uint16_t dataCheck;
cmd[0] = data >> 8;
cmd[1] = data & 0x00FF;
ack=i2c_memory_write(&hi2cx,I2C_MEM_ADDR_WIDIH_16,slaveAddr<<1,writeAddress,cmd,2,I2C_TIMEOUT);
if(ack != 0)
{
return -1;
}
MLX90640_I2CRead(slaveAddr,writeAddress,1, &dataCheck);
if ( dataCheck != data)
{
return -2;
}
else return 0;
}
然后在main函数中初始化MLX90640,之后 直接读取数据即可。
因为MLX90640分辨率为32*24,为了显示更清楚,充分利用AT32F435的高主频优势,将图像线性放大了8倍,最终实现了约16帧每秒的刷新速度。
因图像显示部分涉及本人项目,分享的代码中不含色卡及显示部分,仅提供读取温度数据相关代码。使用时需要将官方BSP包里面的相关文件夹按下图放在一起。
AT_START_435_90640.rar
(8.9 MB)
。
|
优秀!!