开发环境:
电路板硬件: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 陀螺仪检测到移动向单片机发送中断相关推荐

  1. 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)数码管 (二)八段数码管的字形编码 (三)C51变量定义的四要素 (四)中断源 (五)相关的特殊功能寄存器 1.定时器/计数器控制寄存器TCON 2.中断允许控 ...

  2. 51单片机按键控制数码管0~9_51单片机外部中断

    前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...

  3. PIC16F877A单片机 (中断与定时器Timer1)

    PIC16F877A单片机 (中断与定时器Timer1) 1 基本原理 2 实现代码 1 基本原理 上图中,如果RC0左边外接了外部的晶振,那么T1OSCEN必须置一.这个外部的晶振频率一般都比较低. ...

  4. PIC16F877A单片机 (中断与定时器Timer2)

    PIC16F877A单片机 (中断与定时器Timer2) 1 基本原理 2 实现代码 1 基本原理 2 实现代码 主要根据定时器2的逻辑框图和中断的逻辑框图来编写代码,这样代码的可读性强,也便于理解. ...

  5. 51单片机串口中断功能的设置

    51单片机的串口功能就是和外界进行通讯,所谓的"外界"也就是与单片机进行交互的媒介,最常用的就是我们经常使用的计算机.平板或者其他设备(比如另一个单片机配合显示模块使用). 既然和 ...

  6. 单片机外部中断触发方式:电平触发和边沿触发两者说明

    单片机外部中断触发方式:电平触发和边沿触发两者说明 51单片机的外部中断有两种触发方式可选:电平触发和边沿触发.选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向 ...

  7. 51单片机 | 外部中断实验

    文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象    51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...

  8. c语言51单片机外部中断,51单片机外部中断0实例详解

    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...

  9. 【毕业设计教程】单片机发送短信消息(GMS模块) - 物联网 嵌入式 stm32

    文章目录 1 简介 2 GMS模块 3 技术规格 3.1 适应性 4 arduino + GMS 示例代码 5 实现效果 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍如何使用GMS ...

  10. 单片机c51中断 — 中断扫描法行列式键盘

    项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断 在第4章中已介绍过行列式键盘的工作原理,并编写了相应的键盘扫描程序.但应注意的是,在单片机应用系统中,键盘扫描只是 CP ...

最新文章

  1. Android 10 中有关限制非 SDK 接口的更新
  2. android自定义url协议,Android自定义URL方案…?
  3. USACO 3.3.2 Shopping Offers解题报告
  4. Java高级 —— 泛型
  5. Vue里引入three.js
  6. 使用DistroTweaks复制您的自定义Linux设置
  7. 关闭线程的的三种方法
  8. android 拖动进度,Android 可拖动的seekbar自定义进度值
  9. Selenium 特点
  10. linux系统编程综合练习-实现一个小型的shell程序(四)
  11. Linux下的JAVA命令参数_以java命令为例解析linux命令行调用语句
  12. 在OS X 10.9上安装Java(Mavericks)
  13. linux救援模式使用yum,linux学习笔记-第二课-yum,救援模式,单用户模式,运行级别...
  14. oracle jde优势介绍,Oracle JDE EnterpriseOne模块的详细功能介绍
  15. win7计算机的蓝牙,win7电脑蓝牙怎么开
  16. 小程序 - canvas绘制海报
  17. C语言程序设计精髓(MOOC第12周 )题
  18. js购物车选中商品实现计算商品总价格
  19. 汉字 字库压缩ttf
  20. 什么是字长(百度百科)

热门文章

  1. 上传文件到云服务器一般用什么软件?
  2. 有线异步通信原理_【对讲机的那点事】揭秘对讲机系统集群网关的应用原理
  3. Android蓝牙打印机打印图片文字
  4. html在线围棋对战,闲情奕趣(基于html5的围棋应用)
  5. Python自制成语接龙小游戏
  6. [ERP/鼎捷E10][生产管理]指定完工
  7. android黑色半透明dialog背景,Dialog背景半透明
  8. fiddler软件抓包工具超详细配置方法
  9. 项目中将orl改为pgsql函数
  10. Spring拦截器和过滤器的区别