[mw_shl_code=c,true]#include "stm32f10x.h"
#include "I2C_MPU6050.h"
#include "usart1.h"
#include "delay.h"
/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
* 返回 :无
*/
int main(void)
{
/* 串口1初始化 */
USART1_Config();
/*IIC接口初始化*/
I2C_MPU6050_Init();
/*陀螺仪传感器初始化*/
InitMPU6050();
while(1)
{
printf("\r\n---------加速度X轴原始数据---------%d \r\n",GetData(ACCEL_XOUT_H));
printf("\r\n---------加速度Y轴原始数据---------%d \r\n",GetData(ACCEL_YOUT_H));
printf("\r\n---------加速度Z轴原始数据---------%d \r\n",GetData(ACCEL_ZOUT_H));
printf("\r\n---------陀螺仪X轴原始数据---------%d \r\n",GetData(GYRO_XOUT_H));
printf("\r\n---------陀螺仪Y轴原始数据---------%d \r\n",GetData(GYRO_YOUT_H));
printf("\r\n---------陀螺仪Z轴原始数据---------%d \r\n",GetData(GYRO_ZOUT_H));
delay_ms(500);
}
}
/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
[/mw_shl_code]
下边是I2C_MPU6050.c文件
[mw_shl_code=c,true]硬件连接:-----------------
* | |
* | PB10-I2C2_SCL |
* | PB11-I2C2_SDA |
* | |
* -----------------
* 作者 : Orange
**********************************************************************************/
#include "I2C_MPU6050.h"
/*
* 函数名:I2C_GPIO_Config
* 描述 :I2C1 I/O配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
/* PB6-I2C1_SCL、PB7-I2C1_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*
* 函数名:I2C_Mode_Config
* 描述 :I2C 工作模式配置
* 输入 :无
* 输出 :无
* 调用 :内部调用
*/
static void I2C_Mode_Config(void)
{
/* Initialize the I2C1 according to the I2C_InitStructure members */
I2C_InitTypeDef I2C_InitStructure;
/* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;
//I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
//I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 50000;
/* I2C1 初始化 */
I2C_Init(I2C2, &I2C_InitStructure);
/* 使能 I2C1 */
I2C_Cmd (I2C2,ENABLE);
/*允许应答模式*/
I2C_AcknowledgeConfig(I2C2, ENABLE);
}
/***************************************************************************************/
/*
* 函数名:I2C_MMA_Init
* 描述 :I2C 外设(MMA7455)初始化
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void I2C_MPU6050_Init(void)
{
I2C_GPIO_Config();
I2C_Mode_Config();
}
/*
* 函数名:I2C_ByteWrite
* 描述 :写一个字节到I2C设备寄存器中
* 输入 :REG_Address 接收数据的IIC设备寄存器的地址
* REG_data 待写入的数据
* 输出 :无
* 返回 :无
* 调用 :内部调用
*/
void I2C_ByteWrite(uint8_t REG_Address,uint8_t REG_data)
{
I2C_GenerateSTART(I2C2,ENABLE);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2,SlaveAddress,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2,REG_Address);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C2,REG_data);
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C2,ENABLE);
}
/*
* 函数名:I2C_ByteRead
* 描述 :从IIC设备寄存器中读取一个字节
* 输入 :REG_Address 读取数据的寄存器的地址
* 输出 :无
* 返回 :无
* 调用 :内部调用
*/
uint8_t I2C_ByteRead(uint8_t REG_Address)
{
uint8_t REG_data;
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2,ENABLE);//起始信号
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2,SlaveAddress,I2C_Direction_Transmitter);//发送设备地址+写信号
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//
I2C_Cmd(I2C2,ENABLE);
I2C_SendData(I2C2,REG_Address);//发送存储单元地址,从0开始
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C2,ENABLE);//起始信号
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2,SlaveAddress,I2C_Direction_Receiver);//发送设备地址+读信号
while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C2,DISABLE);
I2C_GenerateSTOP(I2C2,ENABLE);
while(!(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)));
REG_data=I2C_ReceiveData(I2C2);//读出寄存器数据
return REG_data;
}
/*
* 函数名:void InitMPU6050(void)
* 描述 :初始化Mpu6050
* 输入 :无
* 输出 :无
* 调用 :外部调用
*/
void InitMPU6050(void)
{
I2C_ByteWrite(PWR_MGMT_1,0x00);//解除休眠状态
I2C_ByteWrite(SMPLRT_DIV,0x07);
I2C_ByteWrite(CONFIG,0x06);
I2C_ByteWrite(GYRO_CONFIG,0x18);
I2C_ByteWrite(ACCEL_CONFIG,0x01);
}
/*
* 函数名:GetData
* 描述 :获得16位数据
* 输入 :REG_Address 寄存器地址
* 输出 :返回寄存器数据
* 调用 :外部调用
*/
unsigned int GetData(unsigned char REG_Address)
{
char H,L;
H=I2C_ByteRead(REG_Address);
L=I2C_ByteRead(REG_Address+1);
return (H<<8)+L; //合成数据
}
/******************* (C) COPYRIGHT 2012 *****END OF FILE************/
这个是
usart1.c文件
#include "usart1.h“
#include <stdarg.h>
/*
* 函数名:USART1_Config
* 描述 :USART1 GPIO 配置,工作模式配置。115200 8-N-1
* 输入 :无
* 输出 : 无
* 调用 :外部调用
*/
void USART1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* config USART1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
/* USART1 GPIO config */
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART1 mode config */
USART_InitStructure.USART_BaudRate = 56000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
/*
* 函数名:fputc
* 描述 :重定向c库函数printf到USART1
* 输入 :无
* 输出 :无
* 调用 :由printf调用
*/
int fputc(int ch, FILE *f)
{
/* 将Printf内容发往串口 */
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
/*
* 函数名:itoa
* 描述 :将整形数据转换成字符串
* 输入 :-radix =10 表示10进制,其他结果为0
* -value 要转换的整形数
* -buf 转换后的字符串
* -radix = 10
* 输出 :无
* 返回 :无
* 调用 :被USART1_printf()调用
*/
static char *itoa(int value, char *string, int radix)
{
int i, d;
int flag = 0;
char *ptr = string;
/* This implementation only works for decimal numbers. */
if (radix != 10)
{
*ptr = 0;
return string;
}
if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}
/* if this is a negative value insert the minus sign. */
if (value < 0)
{
*ptr++ = '-';
/* Make the value positive. */
value *= -1;
}
for (i = 10000; i > 0; i /= 10)
{
d = value / i;
if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}
/* Null terminate the string. */
*ptr = 0;
return string;
} /* NCL_Itoa */
/*
* 函数名:USART1_printf
* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入 :-USARTx 串口通道,这里只用到了串口1,即USART1
* -Data 要发送到串口的内容的指针
* -... 其他参数
* 输出 :无
* 返回 :无
* 调用 :外部调用
* 典型应用USART1_printf( USART1, "\r\n this is a demo \r\n" );
* USART1_printf( USART1, "\r\n %d \r\n", i );
* USART1_printf( USART1, "\r\n %s \r\n", j );
*/
void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
const char *s;
int d;
char buf[16];
va_list ap;
va_start(ap, Data);
while ( *Data != 0) // 判断是否到达字符串结束符
{
if ( *Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r': //回车符
USART_SendData(USARTx, 0x0d);
Data ++;
break;
case 'n': //换行符
USART_SendData(USARTx, 0x0a);
Data ++;
break;
default:
Data ++;
break;
}
}
else if ( *Data == '%')
{ //
switch ( *++Data )
{
case 's': //字符串
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;
case 'd': //十进制
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;
default:
Data++;
break;
}
} /* end of else if */
else USART_SendData(USARTx, *Data++);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
}
/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
[/mw_shl_code]
希望各位大神帮帮忙