蓝桥杯--嵌入431RBT6(AT2402C篇)

蓝桥杯–嵌入431RBT6(AT2402C篇)

蓝桥杯–嵌入式STM32G431RBT6(AT2402C采集篇)

前言

为自己学习蓝桥杯嵌入式开发板做记录,方便以后的复习得心应手!!!我们再写程序前,必须要知道单片机的外设吧,所以我们第一步查阅官方开发板的硬件连接图。

官方开发板硬件连接图

由官方手册的硬件连接图可以看出来,相关连接IO口为PB6和PB7,所以我们接下来需要配置STM32CUBEMX软件,将IO口配置为普通的输出即可,因为IIC在使用过程中会用到读写操作,所以再使用过程也会被配置为输入模式。另外关于硬件IIC发现国信长天开发板无法使用,所以我们这里采用的是软件
在这里插入图片描述

工具

1、KEIL5软件
2、STM32CUBEMX

STM32CUBEMX软件配置

这里我们配置PB6,PB7为输出模式即可,然后我们就进入程序编写,编写程序最好用的东西就是官方的数据手册。
在这里插入图片描述

分析AT2402C芯片

简单来说AT2402C芯片就相当于一张储存卡,具有掉电存储功能,我们可以再其相关地址写入我们需要存储的程序,然后下次利用到直接读取相应地址的数据即可。

数据手册中的AT2402C的选型

AT2402中的数字也有其意义,最后一位表示内部的存储空间大小,再通过其型号发现其IIC地址为下图中第一个选项,然后A2,A1,A0分别代表着这款芯片外围电路的连接方式,再回到下图中可以看到A2,A1,A0分别与GND短接,说明这款芯片的地址为0xa0(表示写入数据),0xa1(表示读取数据),R/W表示是读取数据还是写入数据,写入为0,读取为1。

在这里插入图片描述在这里插入图片描述

数据手册中的AT2402C写数据操作
字节写入

一个字节一个字节写入,也就是一次性只能写入8位数字,复杂的箭头构成了这个操作完美的流水线,流程为:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→停止信号。
在这里插入图片描述

代码展示
void eeprom_write(uchar addr,uchar data)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(data);
	I2CWaitAck();
	I2CStop();
}
片区写入

一下子写入大于或等于8位数据,可以无限写入数据,直至发出停止信号,方可停止写入。流程为:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→写入想要写入的数据→等待应答→。。。。。。。。。。。→停止信号。(官方有提示说不要超过1K)
在这里插入图片描述

//EEPROM的写操作
void EEPROM_Write(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{
	I2CStart();
	I2CSendByte(0xa0);//写标志
	I2CWaitAck();
	
	I2CSendByte(ucAddr);//送到的目标地址	
	I2CWaitAck();
	
	while(ucNum--)
	{ 
		I2CSendByte(*pucBuf++);//不断发送buffer中的数据进入存储器
		I2CWaitAck();	
	}
	I2CStop();
	delay1(500);//短暂延时
}

字节读取

一个字节一个字节读取,也就是一次性只能读取8位数字,复杂的箭头构成了这个操作完美的流水线,流程为:开始信号→写入设备地址(读取模式)→等待应答→写入想要写入的地址→等待应答→写入想要写入的数据→等待应答→停止信号。字节读取有三种方式,这里我只写出最常见的两种,三种分别是读取当前地址(Current Address Read),随机读取( Random Read),顺序读取(Sequential Read)。

随机读取比较常用

传入需要读取的地址,读取对应地址的数据。参照数据手册列出如下数据流程:开始信号→写入设备地址(写入模式)→等待应答→写入想要写入的地址→等待应答(在此之前数据手册有说明是假写,我个人猜想是想把相关芯片指针指向想要读取的地址,然后对其进行读取(猜想))→开始信号→写入设备地址(读取模式)→等待应答→将读取的数据读出→(没有相应直接停止)停止信号。
在这里插入图片描述

uchar eeprom_read(uchar addr)
{
	uchar data = 0;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	data = I2CReceiveByte();
	I2CWaitAck();
	I2CStop();
	return data;
}
连续读取说明

顾名思义就是在读取一个字节的基础上进行连续读取操作,只要不发送数据可以一直读取在首地址后面的数据,当发生停止信号就会停止读取,操作流程与单独读取区别不大。(懒得复制啦!!!)
在这里插入图片描述

//EEPROM的读操作
void EEPROM_Read(unsigned char *pucBuf, unsigned char ucAddr, unsigned char ucNum)
{
	I2CStart();
	I2CSendByte(0xa0);//先要写数据
	I2CWaitAck();
	
	I2CSendByte(ucAddr);//指令送到的目标地址	
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xa1);//读数据的指令
	I2CWaitAck();
	
	while(ucNum--)
	{
		*pucBuf++ = I2CReceiveByte();//不断从存储器中读数据进入buffer
		if(ucNum)
			I2CSendAck();	
		else
			I2CSendNotAck();
	}
	I2CStop();	
}

主程序进行eeprom的数据读写操作

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();
	 MX_TIM16_Init();
	 MX_TIM17_Init();
	 MX_TIM2_Init();
	 MX_TIM4_Init();
	 MX_TIM3_Init();
	 MX_ADC1_Init();
	 MX_ADC2_Init();
	 /* USER CODE BEGIN 2 */
	 LED_Disp(0x8f);
	 /* USER CODE END 2 */
	
	 /* Infinite loop */
	 /* USER CODE BEGIN WHILE */
	 LCD_Init();
	
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	while (1)
	{
	  /* USER CODE END WHILE */
	
	  /* USER CODE BEGIN 3 */
	  uint eem_num = (eeprom_read(1)<<8) + eeprom_read(2);
	 sprintf(text,"    freq:%d    ",eem_num);
	LCD_DisplayStringLine(Line4, (uint8_t *)text);
	}
	/* USER CODE END 3 */
}

重点

①STM32CUBEMX软件对IIC的IO参数配置。
②KEIL5软件编写eeprom读写函数。
③认真仔细。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是使用蓝桥杯组委会提供的STM32G431RBT6控制LED灯闪烁的代码,您可以参考一下: ```c #include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 点亮LED HAL_Delay(500); // 延时一定时间 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEBypass = RCC_HSE_BYPASS_OFF; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 40; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` 这个代码使用了蓝桥杯组委会提供的STM32G431RBT6的GPIO模块控制了GPIOB.0口的LED灯的闪烁,每隔一定时间点亮LED灯,然后再熄灭LED灯,并且利用HAL提供的延时函数来控制LED灯亮灭的时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学好单片机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值