本帖最后由 phpskycn 于 2014-6-16 03:53 编辑 第一次做板子完事了,这里先感谢猴子提供的封装库和支持。
这份代码也是做板子过程中的产物,之前用google没有搜到现成的代码,so就放在这里了。
代码通过测试,环境:Keil 5.1 + STM32F103C8T6
ST LIS302DL是一款ST推出的三轴数字加速度传感器,支持的量程为0.5-7.5g(手册提供的值,非宣传值)。
(图片来自淘宝)
使用LGA14封装(需要吹焊),淘宝价格在3-5元左右。
由于我的STM32F4 Discovery开发板上也使用了这块传感器,所以这份代码是从STM32F4 Discovery的官方固件库移植的。
原代码使用STM32F4XX FW1.1固件库,经修改后支持STM32F10X FW3.5固件库。
由于STM32F407(Cortex M4内核) 保持了一定的代码级向下兼容能力,所以移植到STM32F10X(Cortex-M3内核)并不需要进行太多的修改和测试。
要注意的几点有:
1.F4和F1的GPIO使用的总线的区别。
2.F4和F1对于管脚复用的处理的差异。
XXXXIO_InitTypeDef结构体的差异
事实上,主要修改的就这一个函数:
一个简单的例子,初始化后读取数据到缓存即可
uint8_t X_Offset;
uint8_t Y_Offset;
uint8_t Z_Offset;
RCC_Configuration();
GPIO_Configuration();
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
Delayms(1250);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
Delayms(200);
LCD_Init();
GPIO_SetBits(GPIOA,GPIO_Pin_10);
LCD_WriteString_en(1,1,\"STM32F103 \",0);
Accelerometer_MEMS_Test();
/*
while (1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
Delayms(200);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
Delayms(200);
}
*/
LIS302DL_InitStruct.Power_Mode = LIS302DL_LOWPOWERMODE_ACTIVE;
LIS302DL_InitStruct.Output_DataRate = LIS302DL_DATARATE_100;
LIS302DL_InitStruct.Axes_Enable = LIS302DL_XYZ_ENABLE;
LIS302DL_InitStruct.Full_Scale = LIS302DL_FULLSCALE_2_3;
LIS302DL_XXXXXXXXXXXXXlf_Test = LIS302DL_SELFTEST_NORMAL;
LIS302DL_Init(&LIS302DL_InitStruct);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
Delayms(200);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
LIS302DL_FilterStruct.HighPassFilter_Data_Selection = LIS302DL_FILTEREDDATASELECTION_OUTPUTREGISTER;
LIS302DL_FilterStruct.HighPassFilter_CutOff_Frequency = LIS302DL_HIGHPASSFILTER_LEVEL_1;
LIS302DL_FilterStruct.HighPassFilter_Interrupt = LIS302DL_HIGHPASSFILTERINTERRUPT_1_2;
LIS302DL_FilterConfig(&LIS302DL_FilterStruct);
while(1){
LIS302DL_Read(Buffer, LIS302DL_OUT_X_ADDR, 6);
X_Offset = Buffer[0];
Y_Offset = Buffer[2];
Z_Offset = Buffer[4];
LCD_WriteString_en(0,5,\"ST LIS302 MEMS\",0);
LCD_WriteString_en(0,0,\" X: \",0);
if( X_Offset <= 0x7f){
X_Offset *= 1.8;
LCD_WriteString_en(17,0,\"-\",0);
LCD_WriteNumber(26,0,X_Offset);
}
else{
X_Offset = ~X_Offset;
X_Offset *= 1.8;
LCD_WriteString_en(17,0,\"+\",0);
LCD_WriteNumber(26,0,X_Offset);
}
LCD_WriteString_en(0,2,\" Y: \",0);
if( Y_Offset <= 0x7f){
Y_Offset *= 1.8;
LCD_WriteString_en(17,2,\"-\",0);
LCD_WriteNumber(26,2,Y_Offset);
}
else{
Y_Offset = ~Y_Offset;
Y_Offset *= 1.8;
LCD_WriteString_en(17,2,\"+\",0);
LCD_WriteNumber(26,2,Y_Offset);
}
LCD_WriteString_en(0,4,\" Z: \",0);
if( Z_Offset <= 0x7f){
Z_Offset *= 1.8;
LCD_WriteString_en(17,4,\"-\",0);
LCD_WriteNumber(26,4,Z_Offset);
}
else{
Z_Offset = ~Z_Offset;
Z_Offset *= 1.8;
LCD_WriteString_en(17,4,\"+\",0);
LCD_WriteNumber(26,4 ,Z_Offset);
}
Delayms(50);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
Delayms(70);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
LCD_Clear();
}
}
ST的代码可读性还是挺高的,要修改也很容易。
如果要改变量程请写入LIS302DL_CLICK_THSY_X_REG_ADDR 和 LIS302DL_CLICK_THSZ_REG_ADDR 两个寄存器,寄存器定义和地址在头文件中。
代码:
lis302dl_lib.rar
9.78KB
RAR
23次下载
数据手册:
LIS302DL.attach
595.80KB
ATTACH
25次下载
附上我的原理图,如果懒到需要什么都不改就用的话,不过这里占用了BOOT1不太好:
200字以内,仅用于支线交流,主线讨论请采用回复功能。