正点原子F429IGT6例程IIC实验的CubeMX工程移植

Created: April 23, 2023 10:20 AM
Created by: Luser
Type: MCU

本次实验MDK工程下载地址:点击下载

实验向导

实验器材:

阿波罗STM32F429开发板

实验目的:

学习STM32模拟IIC的使用,驱动24C02实现EEPROM数据读写.

硬件资源:

  1. DS0(连接在PB1)
  2. 串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
  3. ALIENTEK 2.8/3.5/4.3/7寸LCD模块(包括MCU屏和RGB屏,都支持)
  4. 按键KEY0(PH3)/KEY1(PH2)
  5. 24C02(IIC连接在PH4/PH5上面)

实验现象:

本实验通过KEY1按键来控制24C02的写入,通过另外一个按键KEY0来控制24C02的读取。并在LCD模块上面显示相关信息。由于缺少LCD屏,故使用SPI接口的OLED屏对实验内容进行显示

硬件接线

首先将七脚的SPI OLED屏接到下图所示位置:

01
02

之所以接到这是因为这里刚好有GND和VDD引脚与OLED的GND和VCC相对应,其余的引脚则只需要将对应的GPIO口设置为相应功能就可以直接将OLED屏插上去进行使用了。

对应的引脚需要查看主板的原理图,这里列出引脚对应的GPIO:

OLED引脚名 功能 主板上对应引脚名 对应的GPIO口 User Label
D0 spi(CLK) [SCL] BL PB5 OLED_SCL
D1 spi(MOSI) [SDA] D15 PD10 OLED_SDA
RES 复位引脚拉高 D13 PD8 OLED_RES
DC 低电平写命令, 高电平写数据 D11 PE14 OLED_DC
CS 片选 D6 PE9 OLED_CS

CubeMX初始化配置

设置各个GPIO引脚

OLED、开关KEY0、KEY1、KEY_UP、LED0、LED1

03

注意KEY0和KEY1是上拉电阻,KEY_UP是下拉电阻

设置IIC

一定要对应到PH4/PH5上,因为稍后要对24C02进行驱动,而它的IIC连接在PH4/PH5上面

注意例程中使用的是软件模拟的IIC,并没有开启硬件IIC,所以在CubeMX中只要设置为输出

04

设置RCC与时钟频率

05

程序移植

直接将例程中的头文件和源文件移植到工程中就可以使用,当然也可以只移植部分代码,比如sys.c中的宏定义可以直接在main.c中进行定义,之后就只需要把#include “sys.h”换成#include “main.h”就好了,至于delay.c中的函数则可以在用到其中的延时函数时直接用HAL_Delay()函数平替掉,这里为了省事就不进行这些操作,直接移植库:

06

主函数编写

//main.c文件部分代码
//只包含宏定义与main函数
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "sys.h"
#include "key.h"
#include "delay.h"
#include "oled.h"
#include "24cxx.h"
#define LED0 PBout(1)   //LED0
#define LED1 PBout(0)   //LED1
/* USER CODE END Includes */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

//要写入到24c02的字符串数组
const u8 TEXT_Buffer[]={"STM32 IIC TEST"};
#define T_SIZE sizeof(TEXT_Buffer)

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  delay_init(180);                //初始化delay
  OLED_Init();	                //初始化OLED
  AT24CXX_Init();				    //初始化IIC
  u8 key;
	u16 i=0;
	u8 datatemp[T_SIZE];
  OLED_Clear();
  OLED_ShowString(0,0,"F429 IIC TEST",12);
  OLED_ShowString(0,1,"KEY1:Write",12);	
  OLED_ShowString(0,2,"KEY0:Read",12);	
  while(AT24CXX_Check())//检测不到24c02
	{
		OLED_ShowString(0,3,"24C02 Check Failed!",12);
		delay_ms(500);
		OLED_ShowString(0,3,"Please Check!",12);
		delay_ms(500);
		LED0=!LED0;//DS0闪烁
	}
	OLED_ShowString(0,3,"24C02 Ready!",12); 
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		key=KEY_Scan(0);
		if(key==KEY1_PRES)//KEY1按下,写入24C02
		{
			OLED_Clear();
			OLED_ShowString(0,0,"Start Write....",12);
			AT24CXX_Write(0,(u8*)TEXT_Buffer,T_SIZE);
			OLED_ShowString(0,1,"Write Finished!",12);//提示传送完成
		}
		if(key==KEY0_PRES)//KEY0按下,读取字符串并显示
		{
      OLED_Clear();
			OLED_ShowString(0,0,"Start Read...",12);
			AT24CXX_Read(0,datatemp,T_SIZE);
			OLED_ShowString(0,1,"The Data Is:",12);//提示传送完成
			OLED_ShowString(0,2,datatemp,12);//显示读到的字符串
		}
		i++;
		delay_ms(10);
		if(i==20)
		{
			LED0=!LED0;//提示系统正在运行
			i=0;
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实验现象

  1. 检测到24c02

    06
  2. 按下KEY1,写入数据

    Untitled
  3. 按下KEY0,读取数据

    Untitled
    https://files.catbox.moe/3n3dve.gif