STM32CUBEMX 工程添加 软件iic读取mpu6050

本文介绍了如何在STM32F103C8T6核心板上,使用STM32CubeMX和Keil开发环境,添加MPU6050的I2C驱动,并在定时器中断中读取加速度和角速度值。通过参考链接的教程,逐步添加GPIO、定时器中断、串口发送、ADC采集等功能,最后将MPU6050的驱动代码整合进工程。
摘要由CSDN通过智能技术生成

介绍:基于stm32f103c8t6 核心板(淘宝上到处都是的开发板),使用 STM32CubeMX软件和Keil进行开发,实现了 GPIO输出,Timer Interrupt 定时器中断,USART串口 DMA发送,ADC采集,定时器中断中进行ADC采集和USART串口发送,mpu6050代码迁移适配从而在定时器中断中读取acc和gyro值 ---> 串口发送加速度和角速度值

github代码:https://github.com/wangpengabc/STM32CubeMX_MPU6050

 

实验平台:stm32f103c8t6 核心板

 

2020.11.22

stm32cube IDE 不要安装,不好使用,只能够用 stm32cube IDE 编辑代码,无法和Keil 联合使用

 

stm32cubeMX 安装:

在官网下载 cube软件

点击cube安装包,会提示安装某一个版本的JRE ,一定要安装和它提示的版本一样的 JRE,否则cubemx 运行生成代码的时候会报错!!!

安装JRE

安装 cubeMX

README: 如果遇到问题,上网搜索,一般都会有答案。

 

各个实验下都贴了链接,跟着链接中的方法做肯定没问题

2020.11.23

GPIO toggle实验:

https://blog.csdn.net/zhanglifu3601881/article/details/88839590

 

Timer Interrupt 实验:

https://deepbluembedded.com/stm32-timer-interrupt-hal-example-timer-mode-lab/

 

USAR 实验,只有发送:

https://blog.csdn.net/toopoo/article/details/79750698

DMA(未实现验证):https://blog.csdn.net/as480133937/article/details/104827639

 

ADC 采集:

https://www.cnblogs.com/xingboy/p/10212308.html

记录: 刚开始参考其他文章配置DMA模式进行ADC采集未成功,后续采用上边链接的方法成功了。

 

添加mpu6050的驱动,读取acc 和 gyro:

https://blog.csdn.net/dengrengong/article/details/39831463

 

详细介绍  MPU6050驱动的添加:

1)根据上边的链接,目前工程已经完成的工作:GPIO 输出(PC13),Timer Interrupt 定时器中断,USART 串口发送(在定时器中调用串口发送函数),ADC采集(在定时器中断中采集,采集完成之后通过串口发送出去);后续工作是基于以上已经完成的工程来做的,一步一步按照我给出的中的方法来做,一定可以实现所有功能的。

2)根据参考链接中的mpu6050的代码,在已有的工程中新建mpu6050.h 和 mpu6050.c,位置分别为 \Core\Inc  和  \Core\Src, 将上文链接中对应的代码粘贴到相应的文件中即可;然后“Add exsiting files to Group Core ”将文件"mpu6050.c"添加到Core中;(可以点击一下编译,是会报错的)

3)在  \Core\Inc 中新建  sys.h, 将我附录中的  sys.h 的代码粘贴到sys.h 中即可。

4) 更改和添加部分代码到  mpu6050.h 和  mpu6050.c 中,我在附录中也粘贴除了代码。(感兴趣的可以使用Bcompare或者其他代码对比工具,对比一下和原始代码做了那些更改,核心思想就是添加了 部分代码来对 IO寄存器进行操作)

附录:

sys.h 代码:

#ifndef __SYS_H
#define __SYS_H	

#include "core_cm3.h"
#include "system_stm32f10x.h"
#include <stdint.h>


#define SET_BIT(REG, BIT)     ((REG) |= (BIT))

#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))

#define READ_BIT(REG, BIT)    ((REG) & (BIT))

#define CLEAR_REG(REG)        ((REG) = (0x0))

#define WRITE_REG(REG, VAL)   ((REG) = (VAL))

#define READ_REG(REG)         ((REG))

#define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))


//λ´ø²Ù×÷,ʵÏÖ51ÀàËƵÄGPIO¿ØÖƹ¦ÄÜ
//¾ßÌåʵÏÖ˼Ïë,²Î¿¼<<CM3ȨÍþÖ¸ÄÏ>>µÚÎåÕÂ(87Ò³~92Ò³).
//IO¿Ú²Ù×÷ºê¶¨Òå
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO¿ÚµØÖ·Ó³Éä
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!
//È·±£nµÄֵСÓÚ16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //Êä³ö 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //ÊäÈë 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //Êä³ö 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ÊäÈë 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //Êä³ö 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ÊäÈë 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //Êä³ö 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ÊäÈë 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //Êä³ö 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ÊäÈë

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //Êä³ö 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //ÊäÈë

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //Êä³ö 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //ÊäÈë


#endif

mpu6050.h ,对 https://blog.csdn.net/dengrengong/article/details/39831463   中的代码进行更改:

#ifndef __MPU6050_H_
#define __MPU6050_H_
 
//#include "common.h"
//#include "ioremap.h"
//#include "stm32f10x.h"
//#include "delay.h"
//#include "uart.h"

#include "main.h"
 
#define MPU_ACK_WAIT_TIME	200	//us
 
#define MPU6050_ADDRESS_AD0_LOW     0xD0 // AD0为低的时候设备的写地址
#define MPU6050_ADDRESS_AD0_HIGH    0XD1 // AD0为高的时候设备的写地址
#define	MPU_ADDR	0xD0	//IIC写入时的地址字节数据
 
 
#define MPU_DEBUG		1
 
//技术文档未公布的寄存器 主要用于官方DMP操作
#define MPU6050_RA_XG_OFFS_TC       0x00 //[bit7] PWR_MODE, [6:1] XG_OFFS_TC, [bit 0] OTP_BNK_VLD
#define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
//bit7的定义,当设置为1,辅助I2C总线高电平是VDD。当设置为0,辅助I2C总线高电平是VLOGIC
 
#define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
#define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
#define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
 
#define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS 两个寄存器合在一起
#define MPU6050_RA_XA_OFFS_L_TC     0x07
 
  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值