你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【stm32WB55】传感器和oled驱动

[复制链接]
银河帝国 发布时间:2023-7-27 18:45

本小节主要在上一次的代码框架基础上加上OLED和MPU6050的驱动,这两个模块都已经很成熟了,方便用来验证板子的功能。代码在江科大自化协老师提供的基础上进行了修改,OLED驱动部分的程序包含了三部分,OLED.h,OLED.c和OLED_font.h,MPU6050部分主要包含MPU6050_SI2C.h和MPU6050_SI2C.c两个部分,都是用软件I2C实现

oled.c

 #include "main.h"
 #include "OLED_Font.h"
 
 #define OLED_I2C_SDA_PORT (GPIOC)
 #define OLED_I2C_SDA_PIN  (GPIO_PIN_1)
 #define OLED_I2C_SCL_PORT (GPIOC)
 #define OLED_I2C_SCL_PIN  (GPIO_PIN_0)
 
 
 /*引脚配置*/
 #define OLED_W_SCL(x)   HAL_GPIO_WritePin(OLED_I2C_SCL_PORT, OLED_I2C_SCL_PIN,(x))
 #define OLED_W_SDA(x)   HAL_GPIO_WritePin(OLED_I2C_SDA_PORT, OLED_I2C_SDA_PIN,(x))
 
 /*引脚初始化*/
 void OLED_I2C_Init(void)
 {
     GPIO_InitTypeDef GPIO_InitStructure;
     
     __HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();
   
   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
   GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
     GPIO_InitStructure.Pull = GPIO_NOPULL;
   GPIO_InitStructure.Pin = OLED_I2C_SDA_PIN;
   HAL_GPIO_Init(OLED_I2C_SDA_PORT, &GPIO_InitStructure);
   GPIO_InitStructure.Pin = OLED_I2C_SCL_PIN;
   HAL_GPIO_Init(OLED_I2C_SCL_PORT, &GPIO_InitStructure);
   
   OLED_W_SCL(1);
   OLED_W_SDA(1);
 }
 
 /**
   * @brief  I2C开始
   * @param  无
   * @retval 无
   */
 void OLED_I2C_Start(void)
 {
   OLED_W_SDA(1);
   OLED_W_SCL(1);
   OLED_W_SDA(0);
   OLED_W_SCL(0);
 }
 
 /**
   * @brief  I2C停止
   * @param  无
   * @retval 无
   */
 void OLED_I2C_Stop(void)
 {
   OLED_W_SDA(0);
   OLED_W_SCL(1);
   OLED_W_SDA(1);
 }
 
 /**
   * @brief  I2C发送一个字节
   * @param  Byte 要发送的一个字节
   * @retval 无
   */
 void OLED_I2C_SendByte(uint8_t Byte)
 {
   uint8_t i;
   for (i = 0; i < 8; i++)
   {
     OLED_W_SDA(Byte & (0x80 >> i));
     OLED_W_SCL(1);
     OLED_W_SCL(0);
   }
   OLED_W_SCL(1);  //额外的一个时钟,不处理应答信号
   OLED_W_SCL(0);
 }
 
 /**
   * @brief  OLED写命令
   * @param  Command 要写入的命令
   * @retval 无
   */
 void OLED_WriteCommand(uint8_t Command)
 {
   OLED_I2C_Start();
   OLED_I2C_SendByte(0x78);    //从机地址
   OLED_I2C_SendByte(0x00);    //写命令
   OLED_I2C_SendByte(Command); 
   OLED_I2C_Stop();
 }
 
 /**
   * @brief  OLED写数据
   * @param  Data 要写入的数据
   * @retval 无
   */
 void OLED_WriteData(uint8_t Data)
 {
   OLED_I2C_Start();
   OLED_I2C_SendByte(0x78);    //从机地址
   OLED_I2C_SendByte(0x40);    //写数据
   OLED_I2C_SendByte(Data);
   OLED_I2C_Stop();
 }
 
 /**
   * @brief  OLED设置光标位置
   * @param  Y 以左上角为原点,向下方向的坐标,范围:0~7
   * @param  X 以左上角为原点,向右方向的坐标,范围:0~127
   * @retval 无
   */
 void OLED_SetCursor(uint8_t Y, uint8_t X)
 {
   OLED_WriteCommand(0xB0 | Y);          //设置Y位置
   OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));  //设置X位置高4位
   OLED_WriteCommand(0x00 | (X & 0x0F));     //设置X位置低4位
 }
 
 /**
   * @brief  OLED清屏
   * @param  无
   * @retval 无
   */
 void OLED_Clear(void)
 {  
   uint8_t i, j;
   for (j = 0; j < 8; j++)
   {
     OLED_SetCursor(j, 0);
     for(i = 0; i < 128; i++)
     {
       OLED_WriteData(0x00);
     }
   }
 }
 
 /**
   * @brief  OLED显示一个字符
   * @param  Line 行位置,范围:1~4
   * @param  Column 列位置,范围:1~16
   * @param  Char 要显示的一个字符,范围:ASCII可见字符
   * @retval 无
   */
 void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
 {       
   uint8_t i;
   OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);   //设置光标位置在上半部分
   for (i = 0; i < 8; i++)
   {
     OLED_WriteData(OLED_F8x16[Char - ' '][i]);      //显示上半部分内容
   }
   OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8); //设置光标位置在下半部分
   for (i = 0; i < 8; i++)
   {
     OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);    //显示下半部分内容
   }
 }
 
 /**
   * @brief  OLED显示字符串
   * @param  Line 起始行位置,范围:1~4
   * @param  Column 起始列位置,范围:1~16
   * @param  String 要显示的字符串,范围:ASCII可见字符
   * @retval 无
   */
 void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
 {
   uint8_t i;
   for (i = 0; String[i] != '\0'; i++)
   {
     OLED_ShowChar(Line, Column + i, String[i]);
   }
 }
 
 /**
   * @brief  OLED次方函数
   * @retval 返回值等于X的Y次方
   */
 uint32_t OLED_Pow(uint32_t X, uint32_t Y)
 {
   uint32_t Result = 1;
   while (Y--)
   {
     Result *= X;
   }
   return Result;
 }
 
 /**
   * @brief  OLED显示数字(十进制,正数)
   * @param  Line 起始行位置,范围:1~4
   * @param  Column 起始列位置,范围:1~16
   * @param  Number 要显示的数字,范围:0~4294967295
   * @param  Length 要显示数字的长度,范围:1~10
   * @retval 无
   */
 void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
 {
   uint8_t i;
   for (i = 0; i < Length; i++)          
   {
     OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
   }
 }
 
 /**
   * @brief  OLED显示数字(十进制,带符号数)
   * @param  Line 起始行位置,范围:1~4
   * @param  Column 起始列位置,范围:1~16
   * @param  Number 要显示的数字,范围:-2147483648~2147483647
   * @param  Length 要显示数字的长度,范围:1~10
   * @retval 无
   */
 void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
 {
   uint8_t i;
   uint32_t Number1;
   if (Number >= 0)
   {
     OLED_ShowChar(Line, Column, '+');
     Number1 = Number;
   }
   else
   {
     OLED_ShowChar(Line, Column, '-');
     Number1 = -Number;
   }
   for (i = 0; i < Length; i++)          
   {
     OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
   }
 }
 
 /**
   * @brief  OLED显示数字(十六进制,正数)
   * @param  Line 起始行位置,范围:1~4
   * @param  Column 起始列位置,范围:1~16
   * @param  Number 要显示的数字,范围:0~0xFFFFFFFF
   * @param  Length 要显示数字的长度,范围:1~8
   * @retval 无
   */
 void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
 {
   uint8_t i, SingleNumber;
   for (i = 0; i < Length; i++)          
   {
     SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;
     if (SingleNumber < 10)
     {
       OLED_ShowChar(Line, Column + i, SingleNumber + '0');
     }
     else
     {
       OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');
     }
   }
 }
 
 /**
   * @brief  OLED显示数字(二进制,正数)
   * @param  Line 起始行位置,范围:1~4
   * @param  Column 起始列位置,范围:1~16
   * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
   * @param  Length 要显示数字的长度,范围:1~16
   * @retval 无
   */
 void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
 {
   uint8_t i;
   for (i = 0; i < Length; i++)          
   {
     OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');
   }
 }
 
 /**
   * @brief  OLED初始化
   * @param  无
   * @retval 无
   */
 void OLED_Init(void)
 {
   uint32_t i, j;
   
   for (i = 0; i < 1000; i++)      //上电延时
   {
     for (j = 0; j < 1000; j++);
   }
   
   OLED_I2C_Init();      //端口初始化
   
   OLED_WriteCommand(0xAE);  //关闭显示
   
   OLED_WriteCommand(0xD5);  //设置显示时钟分频比/振荡器频率
   OLED_WriteCommand(0x80);
   
   OLED_WriteCommand(0xA8);  //设置多路复用率
   OLED_WriteCommand(0x3F);
   
   OLED_WriteCommand(0xD3);  //设置显示偏移
   OLED_WriteCommand(0x00);
   
   OLED_WriteCommand(0x40);  //设置显示开始行
   
   OLED_WriteCommand(0xA1);  //设置左右方向,0xA1正常 0xA0左右反置
   
   OLED_WriteCommand(0xC8);  //设置上下方向,0xC8正常 0xC0上下反置
 
   OLED_WriteCommand(0xDA);  //设置COM引脚硬件配置
   OLED_WriteCommand(0x12);
   
   OLED_WriteCommand(0x81);  //设置对比度控制
   OLED_WriteCommand(0xCF);
 
   OLED_WriteCommand(0xD9);  //设置预充电周期
   OLED_WriteCommand(0xF1);
 
   OLED_WriteCommand(0xDB);  //设置VCOMH取消选择级别
   OLED_WriteCommand(0x30);
 
   OLED_WriteCommand(0xA4);  //设置整个显示打开/关闭
 
   OLED_WriteCommand(0xA6);  //设置正常/倒转显示
 
   OLED_WriteCommand(0x8D);  //设置充电泵
   OLED_WriteCommand(0x14);
 
   OLED_WriteCommand(0xAF);  //开启显示
   
   OLED_Clear();       //OLED清屏
 }
 

oled.h

 #ifndef __OLED_H
 #define __OLED_H
 
 void OLED_Init(void);
 void OLED_Clear(void);
 void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
 void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
 void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
 void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
 void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
 void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
 
 #endif
 

OLED_font.h

 #ifndef __OLED_FONT_H
 #define __OLED_FONT_H
 
 /*OLED字模库,宽8像素,高16像素*/
 const uint8_t OLED_F8x16[][16]=
 {
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//  0
   
   0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
   
   0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
   
   0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
   0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
   
   0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,
   0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
   
   0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,
   0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
   
   0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
   0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
   
   0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
   
   0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,
   0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
   
   0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,
   0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
   
   0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
   0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
   
   0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,
   0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
   
   0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,
   0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
   
   0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
   0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
   
   0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
   0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
   
   0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
   0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
   
   0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
   0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
   
   0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
   0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
   
   0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
   0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
   
   0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
   0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
   
   0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
   0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
   
   0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
   0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
   
   0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
   0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
   
   0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
   0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
   
   0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
   0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
   
   0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
   0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
   
   0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
   0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
   
   0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
   0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
   
   0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,
   0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
   
   0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
   0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
   
   0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
   0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
   
   0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
   0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
   
   0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
   0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
   
   0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
   0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
   
   0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
   0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
   
   0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
   0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
   
   0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,
   0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
   
   0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
   0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
   
   0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
   0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
   
   0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,
   0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
   
   0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
   0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
   
   0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,
   0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
   
   0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,
   0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
   
   0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,
   0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
   
   0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
   0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
   
   0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
   0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
   
   0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
   0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
   
   0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,
   0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
   
   0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,
   0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
   
   0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,
   0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
   
   0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
   0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
   
   0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,
   0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
   
   0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,
   0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
   
   0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
   0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
   
   0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,
   0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
   
   0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,
   0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
   
   0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
   0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
   
   0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
   
   0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
   0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
   
   0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
   
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
   0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
   
   0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
   
   0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
   0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
   
   0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
   0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
   
   0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
   0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
   
   0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,
   0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
   
   0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
   0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
   
   0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,
   0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
   
   0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
   0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
   
   0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
   0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
   
   0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
   0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
   
   0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
   0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
   
   0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,
   0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
   
   0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,
   0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
   
   0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
   0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
   
   0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
   0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
   
   0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
   0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
   
   0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
   0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
   
   0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
   0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
   
   0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
   0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
   
   0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
   0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
   
   0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
   0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
   
   0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
   0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
   
   0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
   0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
   
   0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
   0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
   
   0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
   0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
   
   0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
   0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
   
   0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
   0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
   
   0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,
   0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
   
   0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,
   0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
   
   0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,
   0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
   
   0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,
   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
 };
 
 #endif
 

mpu6050_si2c.c

 #include "stm32wbxx_hal.h"
 #include "MPU6050_SI2C.h"
 #define SCL_PORT GPIOC
 #define SCL_PIN GPIO_PIN_3
 
 #define SDA_PORT GPIOC
 #define SDA_PIN GPIO_PIN_2
 
 void MPU6050_W_SCL(uint8_t BitValue)
 {
     HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, (GPIO_PinState) BitValue);
     //HAL_Delay(1);
 }
 void MPU6050_W_SDA(uint8_t BitValue)
 {
     HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, (GPIO_PinState) BitValue);
     //HAL_Delay(1);
 }
 uint8_t MPU6050_R_SDA(void)
 {
     uint8_t bitValue;
     bitValue = HAL_GPIO_ReadPin( SDA_PORT, SDA_PIN);
     //HAL_Delay(1);
     return bitValue;
 }
 
 void MPU6050_GPIO_Init(void)
 {
     
     GPIO_InitTypeDef GPIO_InitStructure;
     
     __HAL_RCC_GPIOC_CLK_ENABLE();
   
   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
   GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;
     GPIO_InitStructure.Pull = GPIO_NOPULL;
   GPIO_InitStructure.Pin = SDA_PIN;
   HAL_GPIO_Init(SDA_PORT, &GPIO_InitStructure);
   GPIO_InitStructure.Pin = SCL_PIN;
   HAL_GPIO_Init(SCL_PORT, &GPIO_InitStructure);
   
   MPU6050_W_SCL(1);
   MPU6050_W_SDA(1);
 }
     
 void MPU6050_Start(void)
 {
     MPU6050_W_SDA(1);
     MPU6050_W_SCL(1);
     MPU6050_W_SDA(0);
     MPU6050_W_SCL(0);
 }
 void MPU6050_Stop(void)
 {
     MPU6050_W_SCL(0);
     MPU6050_W_SDA(0);
     MPU6050_W_SCL(1);
     MPU6050_W_SDA(1);
 }
 void MPU6050_SendByte(uint8_t byte)
 {
     uint8_t i;
     for( i=0; i<8; i++)
     {
         MPU6050_W_SDA(byte & ( 0x80 >> i)); //高位先行   
         MPU6050_W_SCL(1);
         MPU6050_W_SCL(0); 
     }
 }
 
 uint8_t MPU6050_ReceiveByte(void)
 {
     uint8_t byte = 0x00,i;
     MPU6050_W_SDA(1); //释放总线
     for(i=0;i<8;i++)
     {
         MPU6050_W_SCL(1); // read
         if(MPU6050_R_SDA() == 1){
             byte |= (0x80 >> i);
         }
         MPU6050_W_SCL(0); // prepare
     }
     return byte;
 }
 void MPU6050_SendAck(uint8_t ack)
 {
     MPU6050_W_SDA(ack); //高位先行   
     MPU6050_W_SCL(1);
     MPU6050_W_SCL(0); 
 }
 
 uint8_t MPU6050_ReceiveAck(void)
 {
     uint8_t ack;
     MPU6050_W_SDA(1); //释放总线
     MPU6050_W_SCL(1); // read
     ack = MPU6050_R_SDA();
     MPU6050_W_SCL(0); // prepare
     
     return ack;
 }
 /*******************************************************************
  * extern MPU6050 Function
 *******************************************************************/
 
 
 void MPU6050_Init(void)
 {
     MPU6050_GPIO_Init();
 
     MPU6050_Write(PWR_MGMT_1, 0x00); // 解除睡眠模式
     MPU6050_Write(SMPLRT_DIV, 0x07); //陀螺仪采样率 0x07
     MPU6050_Write(CONFIG, 0x1A); //低通滤波器 0x06 - 5Hz
     MPU6050_Write(GYRO_CONFIG, 0x18); //陀螺仪不自检 陀螺仪测量范围2000deg/s
     MPU6050_Write(ACCEL_CONFIG, 0x01);// 不自检,陀螺仪减速度计范围 2G,5Hz
 }
 
 void MPU6050_Write(uint8_t address, uint8_t data)
 {
     MPU6050_Start();
     MPU6050_SendByte(MPU6050_I2C_SLAVE_ADDRESS);
     MPU6050_ReceiveAck();
     MPU6050_SendByte(address);
     MPU6050_ReceiveAck();
     MPU6050_SendByte(data);
     MPU6050_ReceiveAck();
     MPU6050_Stop();
 }
 
 uint8_t MPU6050_Read(uint8_t address)
 {
     uint8_t ret = 0x00;
 
     MPU6050_Start();
     MPU6050_SendByte(MPU6050_I2C_SLAVE_ADDRESS);
     MPU6050_ReceiveAck();
     MPU6050_SendByte(address);
     MPU6050_ReceiveAck();
     MPU6050_Start();
     MPU6050_SendByte(MPU6050_I2C_SLAVE_ADDRESS | 0x01);
     MPU6050_ReceiveAck();
     ret = MPU6050_ReceiveByte();
     MPU6050_SendAck(0); //给0 给从机应答,结束
     MPU6050_Stop();
     return ret;
 }
 
 void MPU6050_GetData(struct tag_MPU6050_Data_Struct *pMPU6050_Data)
 {
     uint16_t data_h, data_l;
     data_h = MPU6050_Read(ACCEL_XOUT_H);
     data_l = MPU6050_Read(ACCEL_XOUT_L);
     pMPU6050_Data->acc_x = (data_h << 8) | data_l;
 
     data_h = MPU6050_Read(ACCEL_YOUT_H);
     data_l = MPU6050_Read(ACCEL_YOUT_L);
     pMPU6050_Data->acc_y = (data_h << 8) | data_l;
 
     data_h = MPU6050_Read(ACCEL_ZOUT_H);
     data_l = MPU6050_Read(ACCEL_ZOUT_L);
     pMPU6050_Data->acc_z = (data_h << 8) | data_l;
 
     data_h = MPU6050_Read(GYRO_XOUT_H);
     data_l = MPU6050_Read(GYRO_XOUT_L);
     pMPU6050_Data->gyro_x = (data_h << 8) | data_l;
 
     data_h = MPU6050_Read(GYRO_YOUT_H);
     data_l = MPU6050_Read(GYRO_YOUT_L);
     pMPU6050_Data->gyro_y = (data_h << 8) | data_l;
 
     data_h = MPU6050_Read(GYRO_ZOUT_H);
     data_l = MPU6050_Read(GYRO_ZOUT_L);
     pMPU6050_Data->gyro_z = (data_h << 8) | data_l;
 }
 

mpu6050_si2c.h

 #ifndef _MPU6050_SI2C_H
 #define _MPU6050_SI2C_H
 #include "stdint.h"
 void MPU6050_GPIO_Init(void);
 void MPU6050_Start(void);
 void MPU6050_Stop(void);
 void MPU6050_SendByte(uint8_t byte);
 uint8_t MPU6050_ReceiveByte(void);
 void MPU6050_SendAck(uint8_t ack);
 uint8_t MPU6050_ReceiveAck(void);
 
 #define SMPLRT_DIV                0x19 // 陀螺仪采样率,典型值:0x07(125Hz)
 #define CONFIG                    0x1A // 低通滤波频率,典型值:0x06(5Hz)
 #define GYRO_CONFIG               0x1B // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
 #define ACCEL_CONFIG              0x1C // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
 #define ACCEL_XOUT_H              0x3B
 #define ACCEL_XOUT_L              0x3C
 #define ACCEL_YOUT_H              0x3D
 #define ACCEL_YOUT_L              0x3E
 #define ACCEL_ZOUT_H              0x3F
 #define ACCEL_ZOUT_L              0x40
 #define TEMP_OUT_H                0x41
 #define TEMP_OUT_L                0x42
 #define GYRO_XOUT_H               0x43
 #define GYRO_XOUT_L               0x44
 #define GYRO_YOUT_H               0x45
 #define GYRO_YOUT_L               0x46
 #define GYRO_ZOUT_H               0x47
 #define GYRO_ZOUT_L               0x48
 #define PWR_MGMT_1                0x6B // 电源管理,典型值:0x00(正常启用)
 #define WHO_AM_I                  0x75 // IIC地址寄存器(默认数值0x68,只读)
 #define MPU6050_I2C_SLAVE_ADDRESS 0xD0
 struct tag_MPU6050_Data_Struct{
     int16_t acc_x;
     int16_t acc_y;
     int16_t acc_z;
     int16_t gyro_x;
     int16_t gyro_y;
     int16_t gyro_z;
 };
 
 uint8_t MPU6050_Read(uint8_t address);
 void MPU6050_Write(uint8_t address, uint8_t data);
 void MPU6050_Init(void);
 void MPU6050_GetData(struct tag_MPU6050_Data_Struct *pMPU6050_Data);
 #endif
 

修改task.c中的配置

 #define TASK_TIMER_CNT 5  //任务定时器个数,增加任务时须修改该宏值
 //...
 void oled_test_task_callback(void);//任务回调函数声明
 //...
 task_timer_parameter task_timer_para[TASK_TIMER_CNT] =
  {
    /*{timeout_cb,       timeout(ms),    repeat(ms)}*/
    {led0_task_timer_callback, 1000,         1000},
    {led1_task_timer_callback, 500,          500},
    {led2_task_timer_callback, 200,          200},
      {uart_task_timer_callback, 1000,               1000},
      {oled_test_task_callback,  1000,               120},
    /*{timeout_cb,       timeout(ms),    repeat(ms)}*/ 
  };
 
 void oled_test_task_callback(void){
     static uint32_t oled_excute_time = 0;
     static char oled_str[32];
     //OLED_Clear();       //OLED清屏
 //    sprintf(oled_str,"timer=%d",oled_excute_time++);
 //    OLED_ShowString(1, 3, "HelloWorld!");
 //    OLED_ShowString(2, 1, oled_str);
     static struct tag_MPU6050_Data_Struct MPU6050_Data;
     MPU6050_GetData(&MPU6050_Data);
     OLED_ShowSignedNum(2,1,MPU6050_Data.acc_x,5);
     OLED_ShowSignedNum(3,1,MPU6050_Data.acc_y,5);
     OLED_ShowSignedNum(4,1,MPU6050_Data.acc_z,5);
     OLED_ShowSignedNum(2,8,MPU6050_Data.gyro_x,5);
     OLED_ShowSignedNum(3,8,MPU6050_Data.gyro_y,5);
     OLED_ShowSignedNum(4,8,MPU6050_Data.gyro_z,5);
 }

代码链接:https://pan.baidu.com/s/1XIL05fENVazx1zorvdAJ1g 提取码:g7ck --来自百度网盘超级会员V5的分享****

收藏 评论0 发布时间:2023-7-27 18:45

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版