文号
t65666
阅读
6878
回复
3
收藏
2
【原创】ST LIS302DL MEMS 驱动for STM32F10X
2014/06/16
IP:浙江
本帖最后由 phpskycn 于 2014-6-16 03:53 编辑

第一次做板子完事了,这里先感谢猴子提供的封装库和支持。
这份代码也是做板子过程中的产物,之前用google没有搜到现成的代码,so就放在这里了。
代码通过测试,环境:Keil 5.1 + STM32F103C8T6
ST LIS302DL是一款ST推出的三轴数字加速度传感器,支持的量程为0.5-7.5g(手册提供的值,非宣传值)。
lis302dl.png
(图片来自淘宝)
使用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对于管脚复用的处理的差异。
3.GPIO_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_InitStruct.Self_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 两个寄存器,寄存器定义和地址在头文件中。
代码:

attachment icon lis302dl_lib.rar 9.78KB RAR 26次下载
数据手册:

attachment icon LIS302DL.pdf 595.80KB PDF 116次下载 预览
附上我的原理图,如果懒到需要什么都不改就用的话,不过这里占用了BOOT1不太好:
lis302sch.png
+200
科创币
ry7740kptv
2014/06/16
再接再励
phpskycn作者
12年6个月前IP:未同步
695657
1楼
2L征用,有可能上一些测试之类的
引用
评论
12年6个月前IP:未同步
695758
2楼
代码 收了谢谢
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的