您的位置 首页 5G

STM32操控三轴加速度传感器完成剖析

买的stm32F107VC开发板,带三轴加速度传感器LIS302DL,附带的示例代码。学习了几天,总结如下。1。逻辑结构初始化各外设(RCC,GPIO,SPI,NVI…

买的stm32F107VC开发板,带三轴加速度传感器LIS302DL,顺便的示例代码。学习了几天,总结如下。

1。逻辑结构

初始化各外设(RCC,GPIO,SPI,NVIC,I2C,LCD)——检测MEMS并显现检测情况——在死循环中不断查询加速度值并描画。

2。硬件原理

与该程序相关的硬件衔接图:

MEMS衔接图

MEMS引出脚与MCU(左)、IO扩展(右下)衔接图

LCD衔接图

LCD引出脚与MCU(左)、IO扩展(右上)衔接图

从图中能够看出,MEMS运用I2C接口SCL和SDA衔接MCU;LCD运用SPI3接口衔接MCU。两者的其他引出脚(INT1, 2, TouchScreenXY+-)均衔接到IO扩展。IO扩展部分的原理图为:

它由两块touchScreen操控芯片组成,相同挂在I2C总线上。该部分的原理还没澄清,代码中怎样操控这两块芯片的动作,MEMS INT1,2衔接扩展口的含义安在,是怎么效果的,有待进一步研讨。

MEMS操控原理

在程序动作前,需求初始化体系中止向量表(运用NVIC_SetVectorTable函数),装备体系时钟、使能各外设时钟(SystemInit,RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd)。

1。GPIO

PB6,PB7别离作为SCL和SDA。查找STM32芯片手册的AFIO部分,

将PB6,PB7作为SCL和SDA运用不需求进行重映射,因而只需初始化其形式、速度。

2。I2C

(1)外设时钟频率

外设时钟频率fPCLK1需写入CR2寄存器的最低六位,写入值的单位为MHz。因而,把RCC中PCLK1的频率值除以1000,000后,放入CR2中。

(2)CCR (clock control register)

该值操控master形式下的I2C时钟。

I2C传输分为standard mode (fSCL = 100kHz) 和fast mode (fSCL = 400kHz)。fast mode分为 tlow/thigh = 2 和 tlow/thigh = 16/9 两种。图示如下。16/9类同。

CCR值的公式为:

standard mode:

Thigh= CCR * TPCLK1

Tlow = CCR * TPCLK1

fast mode:

份额为2:

Thigh = CCR * TPCLK1

Tlow = 2 * CCR * TPCLK1

份额为16/9:

Thigh = 9 * CCR * TPCLK1

Tlow = 16 * CCR * TPCLK1

因而,核算CCR值的办法为:

standard mode:

CCR = Thigh / TPCLK1 = 0.5 * TSCL / TPCLK1 = fPCLK1 / (2 * fSCL)

(代码中结构体的变量I2C_ClockSpeed即为fSCL)

fast mode:

份额为2:

CCR = Thigh / TPCLK1 = (1 / 3) * TSCL / TPCLK1 = fPCLK1 / (3 * fSCL)

份额为16/9:

CCR = fPCLK1 / (25 * fSCL)

在CCR中,standard mode下最小值为0x04,fast mode下为0x01。

(3)TRISE寄存器

该值设定master形式下的最大上升时刻。核算办法为答应的最大SCL上升时刻除以TPCLK1,所得商值加1。

在I2C bus specification中,standard mode 下最大时刻为1000ns,fast mode下为300ns。

因而,TRISE核算办法为:

standard mode:

TRISE = 1000 * (10^(-9)) / TPCLK1 + 1 = fPCLK1 + 1

fast mode:

TRISE = 300 * (10^(-9)) / TPCLK1 + 1 = 300 * fPCLK1 / 1000 + 1

3。读取MEMS中加速度数据

完成进程依照LIS302DL datasheet中给的时序

大致过程为:答应ACK,发送开始位,发送外设写地址,发送指令数据,发送开始位,发送外设读地址,(收到外设数据),禁用ACK,发送中止位,答应ACK,从DR寄存器读数据。

发送和接纳指令或地址数据的实质是读写DR寄存器。

每步履行之后需求查看SR1和SR2相应寄存器的情况,承认该步履行完成后才干进行下一步。

关于外设读写地址,LIS302DL datasheet中有阐明:当SDO接地时,外设地址SAD为00111010;master要发送的地址数据位SAD+W/R,W/R位,从MEMS读数据时为1,向MEMS写数据时为0。

在发送外设写地址后,对MEMS的操作为:经过I2C写入MEMS寄存器的地址,(经过I2C写入对该寄存器的操控字)。

在发送外设读地址后,对MEMS的操作为:封闭ACK,发送中止位,从DR读取数据。

程序中用到的MEMS寄存器有:0x20 CTRL_REG1,挑选电源形式,挑选加速度检测方向

0x27 STATUS_REG,各轴数据获取和溢出情况

0x29, 2B, 2D OUT_X,Y,Z 各轴输出数据。

剩下问题:在I2C驱动中,关于外设时钟频率的赋值,汇编代码中,MCU寄存器中为正确的值,但单步时发现,赋值给时钟频率变量的值显现不正确,无法赋给正确的值;最终核算结果为寄存器中数据的核算,因而是正确的。

若把变量声明为static,汇编代码中该变量的存储方位产生变化。需求学习code, RO data, RW data和ZI data的功用。

中止

设定某方向的加速度阈值,当传感器测量值超越该阈值时,传感器输出中止信号。信号经过IO扩展芯片的中止管脚与MCU的GPIO相连,从而能在传感器超越阈值时,体系进入ISR。

程序初始化时需求进行的与中止有关的设定如下,设定都是经过对寄存器的改写完成的:

MEMS:

设定输出给IO扩展芯片管脚的中止的高/低电平有用

设定中止为非锁存形式。(锁存形式即中止信号需求在读取某个寄存器后才干铲除)

设定中止的方向和阈值。

IO扩展芯片:

设定输出给MCU IO口的中止的高/低电平有用,及level/pulse方法

使能大局中止功用

使能芯片GPIO的中止功用

使能绑定某些管脚的中止功用

铲除当时中止寄存器各位情况

MCU:

装备与IO扩展芯片中止管脚衔接的GPIO的参数

将该GPIO与相应EXTI绑定

设定EXTI相应线的使能,上升下降沿触发

设定NV%&&&&&%优先级和使能

中止产生,ISR履行完成后需求进行的开释操作如下:

IO扩展芯片:

铲除GPIO中止的挂起情况

铲除GPIO详细管脚中止的挂起情况

铲除边际检测、上升下降沿检测情况

MCU:

铲除相应EXTI线上的挂起情况

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/275332.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部