STM32L031 BMI160 陀螺仪检测到移动向单片机发送中断
开发环境:
电路板硬件:stm32L031+BMI160
软件环境:keil5.27+stm32cubemx6.2.0
开发库: HAL库
问题点:
BMI160是一个微小型的陀螺仪芯片,经过两天的调试,终于搞定了移动或晃动电路板,使BMI160芯片的INT1向单片机发出中断信号,BMI160的配置,还是挺麻烦的,特此记录一下,防止记性太差。stm32L301与BMI160 通信使用的I2C。
直接上代码:
// 0x68 << 1 = 0xD0
#define MBI160_ADDRESS 0xD0#define AM_DEVICES_BMI160_CMD 0x7e
#define AM_DEVICES_BMI160_INT_MOTION_3 0x62
#define AM_DEVICES_BMI160_INT_MOTION_2 0x61
#define AM_DEVICES_BMI160_INT_MOTION_1 0x60
#define AM_DEVICES_BMI160_INT_MOTION_0 0x5F
#define AM_DEVICES_BMI160_INT_MAP_1 0x56
#define AM_DEVICES_BMI160_INT_MAP_0 0x55
#define AM_DEVICES_BMI160_INT_LATCH 0x54
#define AM_DEVICES_BMI160_INT_OUT_CTRL 0x53
#define AM_DEVICES_BMI160_INT_EN_2 0x52
#define AM_DEVICES_BMI160_INT_EN_1 0x51
#define AM_DEVICES_BMI160_INT_EN_0 0x50
#define AM_DEVICES_BMI160_PMU_STATUS 0x03
#define AM_DEVICES_BMI160_ERR_REG 0x02// 写指令 buffer
uint8_t I2C_Buffer_Write[16] = {0};// 定义变量
int gyr_x = 0, gyr_y = 0, gyr_z = 0, \acc_x = 0, acc_y = 0, acc_z = 0;void BMI160_Write_Reg(uint8_t reg, uint8_t val)
{I2C_Buffer_Write[0] = reg ; ;I2C_Buffer_Write[1] = val;HAL_I2C_Master_Transmit(&hi2c1, MBI160_ADDRESS, I2C_Buffer_Write, 2, 1000);HAL_Delay(50);}void BMI160_Read_Reg(uint8_t reg, uint16_t data_len)
{ I2C_Buffer_Write[0] = reg;I2C_Buffer_Write[1] = 0x0c;HAL_I2C_Master_Transmit(&hi2c1, MBI160_ADDRESS, I2C_Buffer_Write, 1, 1000);HAL_Delay(5);memset(I2C_Buffer_Write, 0, sizeof(I2C_Buffer_Write));HAL_I2C_Master_Receive(&hi2c1, MBI160_ADDRESS, I2C_Buffer_Write, data_len, 1000);
}// 初始化一下BMI160 若有晃动,移动,INT1 发出中断信号
void init_bmi160()
{uint8_t ui8Attempts = 20;uint8_t ui8Status = 0;// 重启 BMI160BMI160_Write_Reg(AM_DEVICES_BMI160_CMD, 0xB6);while (ui8Status != 0x24 && ui8Attempts--){// BMI160 陀螺仪 通用模式BMI160_Write_Reg(AM_DEVICES_BMI160_CMD, 0x15);// BMI160 加速器 low powerBMI160_Write_Reg(AM_DEVICES_BMI160_CMD, 0x12);BMI160_Read_Reg(AM_DEVICES_BMI160_PMU_STATUS, 1);ui8Status = I2C_Buffer_Write[0];#if GYROSCOPE_DEBUG printf ("PMU_STATUS=%02Xr\n", I2C_Buffer_Write[0]);
#endif}BMI160_Read_Reg(AM_DEVICES_BMI160_ERR_REG, 1);
#if GYROSCOPE_DEBUG printf ("_ERR_REG=%02X\r\n", I2C_Buffer_Write[0]);
#endifBMI160_Write_Reg(AM_DEVICES_BMI160_INT_MOTION_0, 0x00);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MOTION_1, 0x14);//BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MOTION_2, 0xFF);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MOTION_3, 0x02);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_OUT_CTRL, 0x0A);//BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MAP_2, 0x07);//BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MAP_1, 0x07);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_MAP_0, 0x07);// INT_EN_0BMI160_Write_Reg(AM_DEVICES_BMI160_INT_EN_0, 0x07);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_EN_1, 0x07);BMI160_Write_Reg(AM_DEVICES_BMI160_INT_EN_2, 0x07);}// 读取I2c数据。
void i2c_read_data()
{HAL_Delay(100);I2C_Buffer_Write[0] = 0x0c;I2C_Buffer_Write[1] = 0x0c;HAL_I2C_Master_Transmit(&hi2c1, MBI160_ADDRESS, I2C_Buffer_Write, 1, 1000);HAL_Delay(5);memset(I2C_Buffer_Write, 0, sizeof(I2C_Buffer_Write));HAL_I2C_Master_Receive(&hi2c1, MBI160_ADDRESS, I2C_Buffer_Write, 6, 1000);gyr_x = I2C_Buffer_Write[0] | (I2C_Buffer_Write[1] << 8);if(gyr_x > 0x7fff){gyr_x = -(0xffff - gyr_x);}gyr_x = (gyr_x * 2000) / 0x8000;gyr_y = I2C_Buffer_Write[2] | (I2C_Buffer_Write[3] << 8);if(gyr_y > 0x7fff){gyr_y = -(0xffff - gyr_y);}gyr_y = (gyr_y * 2000) / 0x8000;gyr_z = I2C_Buffer_Write[4] | (I2C_Buffer_Write[5] << 8);if(gyr_z > 0x7fff){gyr_z = -(0xffff - gyr_z);}gyr_z = (gyr_z * 2000) / 0x8000;#if GYROSCOPE_DEBUGprintf("read i2c=\r\n %02x, %02x, %02x, %02x, %02x, %02x\r\n",I2C_Buffer_Write[0], I2C_Buffer_Write[1], I2C_Buffer_Write[2],I2C_Buffer_Write[3], I2C_Buffer_Write[4], I2C_Buffer_Write[5]);printf("gyr_x=%d, gyr_y=%d, gyr_z=%d\r\n", gyr_x, gyr_y, gyr_z);
#endifif (abs(gyr_z) + abs(gyr_x) + abs(gyr_y) >= 5){
#if GYROSCOPE_DEBUGprintf("warnning REMOVE \r\n");
#endif}
}
参考:
https://blog.csdn.net/wangyijieonline/article/details/52925908
<完毕>
STM32L031 BMI160 陀螺仪检测到移动向单片机发送中断相关推荐
- 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
目录 一.实验要求 二.知识要点 (一)数码管 (二)八段数码管的字形编码 (三)C51变量定义的四要素 (四)中断源 (五)相关的特殊功能寄存器 1.定时器/计数器控制寄存器TCON 2.中断允许控 ...
- 51单片机按键控制数码管0~9_51单片机外部中断
前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...
- PIC16F877A单片机 (中断与定时器Timer1)
PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...
- PIC16F877A单片机 (中断与定时器Timer2)
PIC16F877A单片机 (中断与定时器Timer2) 1 基本原理 2 实现代码 1 基本原理 2 实现代码 主要根据定时器2的逻辑框图和中断的逻辑框图来编写代码,这样代码的可读性强,也便于理解. ...
- 51单片机串口中断功能的设置
51单片机的串口功能就是和外界进行通讯,所谓的"外界"也就是与单片机进行交互的媒介,最常用的就是我们经常使用的计算机.平板或者其他设备(比如另一个单片机配合显示模块使用). 既然和 ...
- 单片机外部中断触发方式:电平触发和边沿触发两者说明
单片机外部中断触发方式:电平触发和边沿触发两者说明 51单片机的外部中断有两种触发方式可选:电平触发和边沿触发.选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向 ...
- 51单片机 | 外部中断实验
文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象 51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...
- c语言51单片机外部中断,51单片机外部中断0实例详解
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...
- 【毕业设计教程】单片机发送短信消息(GMS模块) - 物联网 嵌入式 stm32
文章目录 1 简介 2 GMS模块 3 技术规格 3.1 适应性 4 arduino + GMS 示例代码 5 实现效果 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍如何使用GMS ...
- 单片机c51中断 — 中断扫描法行列式键盘
项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断 在第4章中已介绍过行列式键盘的工作原理,并编写了相应的键盘扫描程序.但应注意的是,在单片机应用系统中,键盘扫描只是 CP ...
最新文章
- Android 10 中有关限制非 SDK 接口的更新
- android自定义url协议,Android自定义URL方案…?
- USACO 3.3.2 Shopping Offers解题报告
- Java高级 —— 泛型
- Vue里引入three.js
- 使用DistroTweaks复制您的自定义Linux设置
- 关闭线程的的三种方法
- android 拖动进度,Android 可拖动的seekbar自定义进度值
- Selenium 特点
- linux系统编程综合练习-实现一个小型的shell程序(四)
- Linux下的JAVA命令参数_以java命令为例解析linux命令行调用语句
- 在OS X 10.9上安装Java(Mavericks)
- linux救援模式使用yum,linux学习笔记-第二课-yum,救援模式,单用户模式,运行级别...
- oracle jde优势介绍,Oracle JDE EnterpriseOne模块的详细功能介绍
- win7计算机的蓝牙,win7电脑蓝牙怎么开
- 小程序 - canvas绘制海报
- C语言程序设计精髓(MOOC第12周 )题
- js购物车选中商品实现计算商品总价格
- 汉字 字库压缩ttf
- 什么是字长(百度百科)