中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

企業(yè)網(wǎng)站建設(shè)話術(shù)/營(yíng)銷網(wǎng)站

企業(yè)網(wǎng)站建設(shè)話術(shù),營(yíng)銷網(wǎng)站,做全景圖二維碼的網(wǎng)站,蘇州招聘網(wǎng)站制作本專欄記錄STM32開發(fā)各個(gè)功能的詳細(xì)過程,方便自己后續(xù)查看,當(dāng)然也供正在入門STM32單片機(jī)的兄弟們參考; 本小節(jié)的目標(biāo)是,系統(tǒng)主頻64 MHZ,采用高速外部晶振,實(shí)現(xiàn)PB11,PB10 引腳模擬I2C 時(shí)序,對(duì)M24C08 的EEPRO…

本專欄記錄STM32開發(fā)各個(gè)功能的詳細(xì)過程,方便自己后續(xù)查看,當(dāng)然也供正在入門STM32單片機(jī)的兄弟們參考;

本小節(jié)的目標(biāo)是,系統(tǒng)主頻64 MHZ,采用高速外部晶振,實(shí)現(xiàn)PB11,PB10 引腳模擬I2C 時(shí)序,對(duì)M24C08 的EEPROM 進(jìn)行讀。
原理:通過模擬I2C接(PB10:CLK,PB11:DTA)與M24C08 EEPROM進(jìn)行讀寫實(shí)驗(yàn)。
涉及到的知識(shí):配置I2C通信,STM32CubeMX的使用

文章目錄

  • 1 新建工程
  • 2 配置SWD下載引腳
  • 3 配置RCC
  • 4 設(shè)置系統(tǒng)主頻
  • 5 生成工程
  • 6 增加代碼實(shí)現(xiàn)PB10,PB11 模擬I2C 時(shí)序,從而實(shí)現(xiàn)EEPROM數(shù)據(jù)讀寫

1 新建工程

點(diǎn)擊File 菜單下的New Project

在這里插入圖片描述

選擇芯片型號(hào),如下圖所示先輸入芯片型號(hào),目前這邊輸入STM32G030C8,

在這里插入圖片描述

雙擊選擇,就確定了芯片型號(hào),界面會(huì)變成如下圖所示

在這里插入圖片描述

2 配置SWD下載引腳

如下圖所示,在Pinout&Configuration 欄目的System Core 下,先點(diǎn)擊SYS,再勾選Serial Wire 框,
配置好SWD 下載引腳設(shè)置:

在這里插入圖片描述

3 配置RCC

如下圖,先點(diǎn)擊RCC,在HSE 配置中選擇Crystal/Ceramic Resonator 外部晶振設(shè)

在這里插入圖片描述

4 設(shè)置系統(tǒng)主頻

如下圖, 先點(diǎn)擊Clock Configuration 欄目,按下圖的1,2,3,4 步驟完成系統(tǒng)64MHZ 主頻設(shè)置:

在這里插入圖片描述

5 生成工程

按照下圖的步驟,進(jìn)行項(xiàng)目配置,項(xiàng)目名稱和路徑設(shè)置等,生成項(xiàng)目的類型選擇STM32CubeIDE(我這里以STM32CubeIDE為例,如果你要試用keil5,那就選擇MDK-RAM,如果要使用makefile,就選擇Makefile),注意項(xiàng)目名稱和路徑不要有中文名;
在這里插入圖片描述

最后全部設(shè)置完畢后點(diǎn)擊create code,生成項(xiàng)目代碼:

在這里插入圖片描述

生成的工程如下圖所示:
在這里插入圖片描述

6 增加代碼實(shí)現(xiàn)PB10,PB11 模擬I2C 時(shí)序,從而實(shí)現(xiàn)EEPROM數(shù)據(jù)讀寫

如下圖所示,在Core/Src下面增加24C08.c 文件,里面是用I/O 口模擬I2C 總線實(shí)現(xiàn)EEPROM讀寫驅(qū)動(dòng)。

在這里插入圖片描述

24C08.h:
/*
**------------------------------------------------------------------------------------------------------
** Modified by:			
** Modified date:	
** Version:
** Descriptions:		
********************************************************************************************************/
#ifndef __24C02_H
#define __24C02_H/* Includes ------------------------------------------------------------------*//* Private define ------------------------------------------------------------*/
#define AT24C01A		/* 24C01A,I2C時(shí)序和往后的24C02一樣 */
//#define AT24C01		/* 24C01,I2C的時(shí)序和普通的有點(diǎn)不同 */#define ADDR_24LC02		0xA0
#define I2C_PAGESIZE	4		/* 24C01/01A頁緩沖是4個(gè) *//* Private function prototypes -----------------------------------------------*/
void I2C_Configuration(void);
uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t *buf,uint16_t num);
uint8_t I2C_Write(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t *buf,uint16_t num);#endif /*********************************************************************************************************END FILE
*********************************************************************************************************/
24C08.c/***************************************************************************//**文件: 24C08.c作者: Zhengyu https://gzwelink.taobao.com版本: V1.0.0時(shí)間: 20200401平臺(tái):MINI-G030C8T6*******************************************************************************/#include "main.h"#define	EE_ADDR 0xa0//EEPROM地址,地址管腳全接地,為0xA0
#define EE_SCL_PIN  GPIO_PIN_10   //模擬IIC的SCL信號(hào)  1.修改引腳即可修改IIC接口
#define EE_SDA_PIN  GPIO_PIN_11   //模擬IIC的SDA信號(hào)
#define EE_IIC_SCL(val)         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10,val)                    //SCL 輸出高或者低     2.修改引腳即可修改IIC接口        
#define EE_IIC_SDA(val)         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11,val)                    //SDA 輸出高或者低 void EE_SDA_IN(void) 	//PB11配置成輸入  {  __HAL_RCC_GPIOB_CLK_ENABLE();//GPIO時(shí)鐘使能GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
} 
void EE_SDA_OUT(void)//PB11配置成開漏輸出
{__HAL_RCC_GPIOB_CLK_ENABLE();//GPIO時(shí)鐘使能GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}void EE_SCK_OUT(void) //PB10配置成開漏輸出
{__HAL_RCC_GPIOB_CLK_ENABLE();//GPIO時(shí)鐘使能GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}//讀DATA引腳狀態(tài)
unsigned char EE_READ_SDA(void)
{
return HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11);
}	/******************************************************************************
*函  數(shù):void EE_IIC_Delay(void)
*功 能:IIC延時(shí)
*參  數(shù):無
*返回值:無
*備  注: 移植時(shí)只需要將EE_IIC_Delay()換成自己的延時(shí)即可,目前是在16M主頻下運(yùn)行,大約等待10us
*******************************************************************************/	
void EE_IIC_Delay(uint16_t us)
{uint16_t j;for(j=0;j<us;j++){for(int i = 0; i < 20; i++)    {__asm("NOP");//等待1個(gè)指令周期,系統(tǒng)主頻16M}}}
/******************************************************************************
*函  數(shù):void IIC_Init(void)
*功 能:IIC初始化
*參  數(shù):無
*返回值:無
*備  注:無
*******************************************************************************/void EE_IIC_Init(void)
{			EE_SCK_OUT();//CLK引腳配置成輸出EE_SDA_OUT();//DATA引腳配置成輸出EE_IIC_SCL(1);//CLK引腳輸出高EE_IIC_SDA(1);//DATA引腳輸出高   
}
//開始	
void EE_IIC_Start(void)
{EE_SDA_OUT(); //DATA引腳配置成輸出EE_IIC_SDA(1);//DATA引腳輸出高	EE_IIC_SCL(1);//CLK引腳輸出高EE_IIC_Delay(4);//等待大約40usEE_IIC_SDA(0); //DATA引腳輸出低EE_IIC_Delay(4);//等待大約40usEE_IIC_SCL(0); //CLK引腳輸出低,鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) 
}//停止	  
void EE_IIC_Stop(void)
{EE_SDA_OUT(); //DATA引腳配置成輸出EE_IIC_SCL(0);//CLK引腳輸出低EE_IIC_SDA(0); //DATA引腳輸出低EE_IIC_Delay(4);//等待大約40usEE_IIC_SCL(1); //CLK引腳輸出高EE_IIC_SDA(1); //DATA引腳輸出高,發(fā)送I2C總線結(jié)束信號(hào)EE_IIC_Delay(4);//等待大約40us							   	
}//等待應(yīng)答
uint8_t EE_IIC_WaitAck(void)
{uint8_t ucErrTime=0;EE_SDA_IN(); //DATA引腳配置成輸入  (從機(jī)給一個(gè)低電平做為應(yīng)答) EE_IIC_SDA(1);EE_IIC_Delay(1);	   EE_IIC_SCL(1);EE_IIC_Delay(1);//等待約10us while(EE_READ_SDA())//一直讀,直到讀取到低電平應(yīng)答{ucErrTime++;if(ucErrTime>250){EE_IIC_Stop();return 1;}}EE_IIC_SCL(0); //時(shí)鐘輸出0 	   return 0;  
} //發(fā)送應(yīng)答
void EE_IIC_Ack(void)
{EE_IIC_SCL(0);EE_SDA_OUT();EE_IIC_SDA(0);EE_IIC_Delay(1);EE_IIC_SCL(1);EE_IIC_Delay(2);EE_IIC_SCL(0);
}//發(fā)送非應(yīng)答
void EE_IIC_NAck(void)
{EE_IIC_SCL(0);EE_SDA_OUT();EE_IIC_SDA(1);EE_IIC_Delay(1);EE_IIC_SCL(1);EE_IIC_Delay(1);EE_IIC_SCL(0);
}					 				     //發(fā)送一個(gè)字節(jié)	  
void EE_IIC_SendByte(uint8_t data)
{                        uint8_t t;   EE_SDA_OUT(); 	    EE_IIC_SCL(0); //拉低時(shí)鐘開始數(shù)據(jù)傳輸for(t=0;t<8;t++){              EE_IIC_SDA((data&0x80)>>7);//發(fā)送數(shù)據(jù)EE_IIC_Delay(1);			EE_IIC_SCL(1);data<<=1;EE_IIC_Delay(1);EE_IIC_SCL(0);	   }EE_IIC_Delay(1);
} 	 //讀取1字節(jié)	
uint8_t EE_IIC_ReadByte(uint8_t ack)
{uint8_t i,receive=0;EE_SDA_IN(); //SDA設(shè)置為輸入模式 等待接收從機(jī)返回?cái)?shù)據(jù)for(i=0;i<8;i++ ){EE_IIC_SCL(0); EE_IIC_Delay(1);EE_IIC_SCL(1);receive<<=1;if(EE_READ_SDA())receive++; //讀取從機(jī)發(fā)送的電平,如果是高,就記錄高EE_IIC_Delay(1); }					 if(ack)EE_IIC_Ack(); //發(fā)送ACK elseEE_IIC_NAck(); //發(fā)送nACK  return receive;
}//從EE指定地址讀取一個(gè)字節(jié)
uint8_t EE_IIC_ReadByteFromSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t *buf)
{EE_IIC_Start();	EE_IIC_SendByte(I2C_Addr);	 //發(fā)送從機(jī)地址if(EE_IIC_WaitAck()) //如果從機(jī)未應(yīng)答則數(shù)據(jù)發(fā)送失敗{EE_IIC_Stop();return 1;}EE_IIC_SendByte(reg); //發(fā)送寄存器地址EE_IIC_WaitAck();	  EE_IIC_Start();EE_IIC_SendByte(I2C_Addr+1); //進(jìn)入接收模式			   EE_IIC_WaitAck();*buf=EE_IIC_ReadByte(0);	   EE_IIC_Stop(); //產(chǎn)生一個(gè)停止條件return 0;
}//發(fā)送一個(gè)字節(jié)內(nèi)容到EE指定地址
uint8_t EE_EE_IIC_SendByteToSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t data)
{EE_IIC_Start();EE_IIC_SendByte(I2C_Addr); //發(fā)送從機(jī)地址if(EE_IIC_WaitAck()){EE_IIC_Stop();return 1; //從機(jī)地址寫入失敗}EE_IIC_SendByte(reg); //發(fā)送寄存器地址EE_IIC_WaitAck();	  EE_IIC_SendByte(data); if(EE_IIC_WaitAck()){EE_IIC_Stop(); return 1; //數(shù)據(jù)寫入失敗}EE_IIC_Stop(); //產(chǎn)生一個(gè)停止條件return 0;
}

然后如下圖所示,24C08.c 文件,主要是把SCL 引腳改成PB10,SDA引腳改成PB11,還有EEPROM 驅(qū)動(dòng)所需的基本I/O 操作函數(shù),還有實(shí)現(xiàn)時(shí)序所需的等待函數(shù)。

然后打開main.c文件,按照下圖操作添加代碼:

在這里插入圖片描述

extern void EE_IIC_Init(void);
extern uint8_t EE_EE_IIC_SendByteToSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t data);
extern uint8_t EE_IIC_ReadByteFromSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t *buf);
unsigned char EEDATA;//存放EEPROM讀取出來的數(shù)據(jù),1個(gè)字節(jié)

在這里插入圖片描述

EE_IIC_Init();//EEPROM管腳初始化,配置管腳
EE_EE_IIC_SendByteToSlave(0xA0,0x00,0x55);//0地址存儲(chǔ)0x55
HAL_Delay(10);//等待10ms
EE_IIC_ReadByteFromSlave(0xA0,0x00,&EEDATA);//從0地址讀取1字節(jié)內(nèi)容到EEDATA變量

然后編譯,調(diào)試,查看EEDATA變量的值,結(jié)果如下圖所示:

在這里插入圖片描述
我們寫進(jìn)去的值時(shí)0x55,最后讀出來的值是85'U',查一下ASCII碼:

在這里插入圖片描述
0x55對(duì)應(yīng)的就是85'U',證明我們的結(jié)果是對(duì)的,證明此EEPROM讀寫實(shí)驗(yàn)成功。

http://www.risenshineclean.com/news/272.html

相關(guān)文章:

  • wordpress pdf生成/手機(jī)端網(wǎng)站優(yōu)化
  • 工信部外國(guó)網(wǎng)站備案/b站在線觀看人數(shù)在哪
  • wordpress 時(shí)尚主題/駐馬店百度seo
  • 嘉興網(wǎng)站排名優(yōu)化價(jià)格/北京網(wǎng)站
  • 網(wǎng)站建設(shè)部門/網(wǎng)站軟件下載
  • 建立收費(fèi)網(wǎng)站/網(wǎng)絡(luò)銷售面試問題有哪些
  • 做搞基視頻網(wǎng)站/網(wǎng)絡(luò)營(yíng)銷的案例有哪些
  • 網(wǎng)站怎么做下載連接/百度長(zhǎng)尾關(guān)鍵詞挖掘
  • 網(wǎng)站彈窗客服代碼/刷推廣鏈接
  • 政府網(wǎng)站公眾號(hào)建設(shè)方案/谷歌瀏覽器 安卓下載2023版
  • wordpress tutorial/seo優(yōu)化排名服務(wù)
  • 網(wǎng)站被谷歌降權(quán)/廣州seo招聘網(wǎng)
  • 網(wǎng)站聊天怎么做/最新軍事報(bào)道
  • 成都微信端網(wǎng)站建/蘇州seo按天扣費(fèi)
  • 網(wǎng)站沒有百度快照/全網(wǎng)絡(luò)品牌推廣
  • 制作企業(yè)網(wǎng)站需要注意的事項(xiàng)/地推是什么
  • 資料填寫網(wǎng)站類型怎么做/新聞發(fā)稿公司
  • 免費(fèi)建網(wǎng)站撫順/win10優(yōu)化大師有用嗎
  • 萬盛網(wǎng)站建設(shè)公司/當(dāng)下最流行的營(yíng)銷方式
  • 下載好看影視大全極速版/seo是什么工作內(nèi)容
  • 重慶響應(yīng)式網(wǎng)站建設(shè)公司/哪個(gè)軟件可以自動(dòng)排名
  • python源碼分享網(wǎng)站/深度搜索
  • 龍華網(wǎng)站建設(shè)方案表/免費(fèi)海報(bào)模板網(wǎng)站
  • 關(guān)鍵詞seo優(yōu)化/優(yōu)化大師官方免費(fèi)下載
  • 百度指數(shù) 網(wǎng)站/杭州優(yōu)化公司哪家好
  • 哈爾濱市建設(shè)網(wǎng)站/寧波網(wǎng)絡(luò)推廣產(chǎn)品服務(wù)
  • 湛江網(wǎng)站建設(shè)哪家好/網(wǎng)絡(luò)營(yíng)銷公司全網(wǎng)推廣公司
  • 個(gè)人可以做淘寶客網(wǎng)站嗎/網(wǎng)絡(luò)營(yíng)銷首先要進(jìn)行
  • 免費(fèi)制作單頁的網(wǎng)站/媒體推廣
  • 嘉興網(wǎng)站搭建/軟文發(fā)布平臺(tái)哪個(gè)好