STM32 IIC 状态机 DMA 控制MPU60x0和burst读取MPU6050 FIFO

  • o5_398095
    了解作者
  • 29.5KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-15 04:27
    上传日期
STM32状态机架构 通过 硬件IIC外设 和DMA burst 读取MPU6050的 FIFO, 每10ms Timer触发一次routine work trigger进行数据采集。DMA直接读取MPU6050的FIFO并对三轴加速度和三轴陀螺仪的数据取平均值,高速,高效,剩下的系统资源可以拿来做姿态运算; 稍微加入IIC rescure 便可商业应用,当然如果有硬件IIC rescure更好 附送模拟IO操作IIC控制MPU6050,只需要重新define一下; 附送UART硬件DMA print 附送LM75A的硬件IIC操作,只需要在Timer的中断里面根据你的需要时间间隔触发一下
STM32_IIC_MPU6050_LM75A.rar
  • USER
  • stm32f10x_conf.h
    3.2KB
  • Gesture_Pub.h
    61B
  • USART.h
    666B
  • LCD_Display.c
    6.3KB
  • Initialization.h
    78B
  • LM75_MPU60x0_States.h
    3.2KB
  • LM75_MPU60x0.c~RF285a21.TMP
    26.3KB
  • stm32f10x_it.c
    5.5KB
  • Initialization.c
    5.6KB
  • LCD_Display.h
    622B
  • USART.c
    5.7KB
  • LM75_MPU60x0_Pub.h
    214B
  • LCD_Display_Static.h
    3.9KB
  • LM75_MPU60x0.h
    13.4KB
  • Initialization_Pub.h
    385B
  • ZuloloIII_Remote_Global.h
    4.3KB
  • USART_Pub.h
    74B
  • LM75_MPU60x0.c
    47.1KB
  • Gesture.h
    59B
  • stm32f10x_it.h
    2KB
  • Gesture.c
    50B
  • main.c
    5.8KB
内容介绍
/* Zulolo Reserved */ /* dodoleon@gmail.com */ #include "ZuloloIII_Remote_Global.h" #include "LM75_MPU60x0.h" #ifdef IIC_IO_SIMU_TEST #define bit FlagStatus //************************************** //延时5微秒(STC90C52RC@12M) //不同的工作环境,需要调整此函数 //当改用1T的MCU时,请调整此延时函数 //************************************** void Delay5us(void) { __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); __NOP();__NOP();__NOP();__NOP(); } //************************************** //I2C起始信号 //************************************** void I2C_Start(void) { GPIO_SetBits(GPIOB, GPIO_Pin_11); //拉高数据线 GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 GPIO_ResetBits(GPIOB, GPIO_Pin_11); //产生下降沿 Delay5us(); //延时 GPIO_ResetBits(GPIOB, GPIO_Pin_10); //拉低时钟线 } //************************************** //I2C停止信号 //************************************** void I2C_Stop(void) { GPIO_ResetBits(GPIOB, GPIO_Pin_11); //拉低数据线 GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 GPIO_SetBits(GPIOB, GPIO_Pin_11); //产生上升沿 Delay5us(); //延时 } //************************************** //I2C发送应答信号 //入口参数:ack (0:ACK 1:NAK) //************************************** void I2C_SendACK(bit ack) { GPIO_WriteBit(GPIOB, GPIO_Pin_11, ack); //写应答信号 GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 GPIO_ResetBits(GPIOB, GPIO_Pin_10); //拉低时钟线 Delay5us(); //延时 } //************************************** //I2C接收应答信号 //************************************** bit I2C_RecvACK(void) { bit CY; GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 CY = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11); //读应答信号 GPIO_ResetBits(GPIOB, GPIO_Pin_10); //拉低时钟线 Delay5us(); //延时 return CY; } //************************************** //向I2C总线发送一个字节数据 //************************************** void I2C_SendByte(uint8_t dat) { uint8_t i; for (i=0; i<8; i++) //8位计数器 { GPIO_WriteBit(GPIOB, GPIO_Pin_11, ((dat & 0x80) >> 7)); //送数据口 dat <<= 1; //移出数据的最高位 GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 GPIO_ResetBits(GPIOB, GPIO_Pin_10); //拉低时钟线 Delay5us(); //延时 } I2C_RecvACK(); } //************************************** //从I2C总线接收一个字节数据 //************************************** uint8_t I2C_RecvByte(void) { uint8_t i; uint8_t dat = 0; GPIO_SetBits(GPIOB, GPIO_Pin_11); //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat <<= 1; GPIO_SetBits(GPIOB, GPIO_Pin_10); //拉高时钟线 Delay5us(); //延时 dat |= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11); //读数据 GPIO_ResetBits(GPIOB, GPIO_Pin_10); //拉低时钟线 Delay5us(); //延时 } return dat; } //************************************** //向I2C设备写入一个字节数据 //************************************** void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data) { I2C_Start(); //起始信号 I2C_SendByte(MPU_6050_IIC2_ADDR); //发送设备地址+写信号 I2C_SendByte(REG_Address); //内部寄存器地址, I2C_SendByte(REG_data); //内部寄存器数据, I2C_Stop(); //发送停止信号 } //************************************** //从I2C设备读取一个字节数据 //************************************** uint8_t Single_ReadI2C(uint8_t REG_Address) { uint8_t REG_data; I2C_Start(); //起始信号 I2C_SendByte(MPU_6050_IIC2_ADDR); //发送设备地址+写信号 I2C_SendByte(REG_Address); //发送存储单元地址,从0开始 I2C_Start(); //起始信号 I2C_SendByte(MPU_6050_IIC2_ADDR+1); //发送设备地址+读信号 REG_data=I2C_RecvByte(); //读出寄存器数据 I2C_SendACK(SET); //接收应答信号 I2C_Stop(); //停止信号 return REG_data; } //************************************** //初始化MPU6050 //************************************** void InitMPU6050(void) { uint32_t i; Single_WriteI2C(MPU_60X0_PWR_MGMT_1_REG_ADDR, MPU_60X0_RESET_REG_VALU); for (i = 0; i < 20000; i++) { Delay5us(); //上电延时 } Single_WriteI2C(MPU_60X0_PWR_MGMT_1_REG_ADDR, MPU_60X0_PWR_MGMT_1_REG_VALU); Single_WriteI2C(MPU_60X0_USER_CTRL_REG_ADDR, MPU_60X0_USER_CTRL_REG_VALU); Single_WriteI2C(MPU_60X0_SMPLRT_DIV_REG_ADDR, MPU_60X0_SMPLRT_DIV_REG_VALU); Single_WriteI2C(MPU_60X0_CONFIG_REG_ADDR, MPU_60X0_CONFIG_REG_VALU); Single_WriteI2C(MPU_60X0_GYRO_CONFIG_REG_ADDR, MPU_60X0_GYRO_CONFIG_REG_VALU); Single_WriteI2C(MPU_60X0_ACCEL_CONFIG_REG_ADDR, MPU_60X0_ACCEL_CONFIG_REG_VALU); Single_WriteI2C(MPU_60X0_FIFO_EN_REG_ADDR, MPU_60X0_FIFO_EN_REG_VALU); } //************************************** //合成数据 //************************************** uint16_t GetData(uint8_t REG_Address) { uint8_t H,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return ((((uint16_t)H)<<8)|L); //合成数据 } #endif void LM75_MPU60x0_TIMER_Init(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_TIMER_LM75_MPU60X0_CLK, ENABLE); /* Enable the LM75_MPU_60x0_TIMER_IRQn Interrupt for communication timeout */ NVIC_InitStructure.NVIC_IRQChannel = LM75_MPU_60X0_TIMER_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //Disabel interrupt TIM_ITConfig(LM75_MPU60X0_TIMER, TIM_IT_Update, DISABLE); //LM75_MPU60X0 TIMER Disable TIM_Cmd(LM75_MPU60X0_TIMER, DISABLE); //LM75_MPU60X0 TIMER use internal clock TIM_InternalClockConfig(LM75_MPU60X0_TIMER); TIM_DeInit(LM75_MPU60X0_TIMER); /*--------========= LM75 MPU60X0 TIMER Initialization =========---------*/ //LM75_MPU60X0 TIMER basic setting //APB1=36MHz with APB1 prescaler = 2, so LM75_MPU60X0 Timer clock=2*36M=72M //LM75_MPU60X0 TIMER Prescaler = 72, CK_CNT = 72000000/72 = 1000000 means counter add 1 per 1us //TIM_Period(TIM2_ARR)=20,Up count mode, 20us interval as default //TIM_RepetitionCounter(TIM2_RCR)=0,each overflow will cause an interrupt TIM_BaseInitStructure.TIM_Period = 20; //Initialed to 2ms interval interrupt TIM_BaseInitStructure.TIM_Prescaler = (72 - 1); TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_BaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(LM75_MPU60X0_TIMER, &TIM_BaseInitStructure); //Clear Interrupt flag, in case interrupt will be entered once interrupt is enabled TIM_ClearFlag(LM75_MPU60X0_TIMER, TIM_FLAG_Update); //Disabel int
评论
    相关推荐
    • HAL库 STM32F4__CANopen架构
      基于HAL库的, STM32F4,CANopen架构
    • STM32资料整理
      STM32F10x常见应用解析》、《STM32中断优先级》、《STM32中使用GPIO的总结》
    • stm32串口通信
      串口通信,串口实现原理,实现方法。熟悉在cotex-m3架构下如何实现串口通信的。
    • stm32官方固件
      STM32固件库使用方法实例,中文说明手册,stm32寄存器与库函数!
    • STM32F207原理图
      Cortex-M3架构处理器的基本外设原理图,对新手有帮助!
    • stm32加密库.zip
      stm32加密库,适用于cortex m1,m3和m4架构的处理器,包含aes等常用的加密接口,编译成静态库方便调用
    • stm32F4手册
      stm32F4系列中文数据手册。方便初学者阅读,后期还是建议大家读英文的
    • STM32 开发架构
      STM32 开发架构 can总线 uart
    • STM32开发指南
      压缩包里有 STM32开发指南文档说明还有官方 3.5固件库,欢迎下载,有问题,请留言!
    • STM32面向对象_程序架构 整个工程DEMO 我自己常用的
      STM32面向对象_程序架构 整个工程DEMO,我自己常用的;很多初学STM32编程的同学,常常对多任务调度、全局变量处理、编程规范处理的不专业或者很乱,本demo是我自己做STM32项目常用的编程架构,内含面向对象思想,...