介绍:基于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