IIC协议采集温湿度

重庆交通大学信息科学与工程学院

《嵌入式系统基础A》课程

实验报告

班 级: 物联网工程2101

姓名-学号 : 江欣朋-632007060322

实验项目名称: IIC协议采集温湿度

实验项目性质: 设计性

实验所属课程: 《嵌入式系统基础A》

实验室(中心): 南岸校区语音大楼

指 导 教 师 : 娄路

完成时间: 2023 年 11 月 15 日

一、实验内容和任务

学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

参考:

stm32通过I2C接口实现温湿度(AHT20)的采集_aht21能够检测室内温度-CSDN博客 stm32通过I2C接口实现温湿度(AHT20)的采集

奥松AHT20传感器厂商资料

AHT20-21 DEMO V1_3(stm32).rar

AHT20产品手册a2.pdf


基于STM32的0.96寸OLED显示屏显示数据_stm32oled屏幕清除某个区域-CSDN博客

二、实验要求

1. 分组要求:每个学生独立完成,即1人1组。

2. 程序及报告文档要求:具有较好的可读性,如叙述准确、标注明确、截图清晰等。

3.把项目完整打包为zip文件,与实验报告(Markdown源码及PDF文件)、作业博客地址一起提交到学习通。

三. 实验过程介绍 (此处可以填博客内容)

学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

1、软件I2C 将芯片的两个GPIO引脚分别用作SCL及SDA,按照I2C的时序要求,直接控制引脚的输出信号(若是接收数据时则读取 SDA 电平),就可以实现I2C通讯。由于是直接控制GPIO引脚的高低电平产生通讯时序,需要由CPU控制每个时刻的引脚状态,所以称为“软件模拟协议”方式即软件I2C方式。

2、硬件I2C 硬件I2C对应芯片上的I2C外设,具有相应的I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C,但是程序较为繁琐。硬件I2C是直接调用内部寄存器进行配置。 对于硬件I2C来说,它需要I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生I2C的通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作负担,并且使软件开发更简单。

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

1.RCC设置

2.sys设置

3.usart1设置

4.GPIO设置

5.I2C

点击ADD 如下设置:

6.NIVC设置

7.时钟设置

8.打开keil 添加文件

9.设置路劲

10.修改AHT20.H

#ifndef _AHT20_DEMO_

#define _AHT20_DEMO_

#include "main.h"  

void Delay_N10us(uint32_t t);//延时函数

void SensorDelay_us(uint32_t t);//延时函数

void Delay_4us(void); //延时函数

void Delay_5us(void); //延时函数

void Delay_1ms(uint32_t t);

void AHT20_Clock_Init(void); //延时函数

void SDA_Pin_Output_High(void)  ; //将PB7配置为输出 , 并设置为高电平, PB7作为I2C的SDA

void SDA_Pin_Output_Low(void);  //将P7配置为输出  并设置为低电平

void SDA_Pin_IN_FLOATING(void);  //SDA配置为浮空输入

void SCL_Pin_Output_High(void); //SCL输出高电平,P6作为I2C的SCL

void SCL_Pin_Output_Low(void); //SCL输出低电平

void Init_I2C_Sensor_Port(void); //初始化I2C接口,输出为高电平

void I2C_Start(void);  //I2C主机发送START信号

void AHT20_WR_Byte(uint8_t Byte); //往AHT20写一个字节

uint8_t AHT20_RD_Byte(void);//从AHT20读取一个字节

uint8_t Receive_ACK(void);   //看AHT20是否有回复ACK

void Send_ACK(void) ;   //主机回复ACK信号

void Send_NOT_ACK(void); //主机不回复ACK

void Stop_I2C(void);   //一条协议结束

uint8_t AHT20_Read_Status(void);//读取AHT20的状态寄存器

uint8_t AHT20_Read_Cal_Enable(void);  //查询cal enable位有没有使能

void AHT20_SendAC(void); //向AHT20发送AC命令

uint8_t Calc_CRC8(uint8_t *message,uint8_t Num);

void AHT20_Read_CTdata(uint32_t *ct); //没有CRC校验,直接读取AHT20的温度和湿度数据

void AHT20_Read_CTdata_crc(uint32_t *ct); //CRC校验后,读取AHT20的温度和湿度数据

void AHT20_Init(void);   //初始化AHT20

void JH_Reset_REG(uint8_t addr);///重置寄存器

void AHT20_Start_Init(void);///上电初始化进入正常测量状态

#endif

11.修改AHT20.C

#include "main.h"

#include "AHT20-21_DEMO_V1_3.h"

#include "gpio.h"

#include "i2c.h"

void Delay_N10us(uint32_t t)//延时函数

{

  uint32_t k;

   while(t--)

  {

    for (k = 0; k < 2; k++);//110

  }

}

void SensorDelay_us(uint32_t t)//延时函数

{

for(t = t-2; t>0; t--)

{

Delay_N10us(1);

}

}

void Delay_4us(void) //延时函数

{

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

}

void Delay_5us(void) //延时函数

{

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

Delay_N10us(1);

}

void Delay_1ms(uint32_t t) //延时函数

{

   while(t--)

  {

    SensorDelay_us(1000);//延时1ms

  }

}

//void AHT20_Clock_Init(void) //延时函数

//{

// RCC_APB2PeriphClockCmd(CC_APB2Periph_GPIOB,ENABLE);

//}

void SDA_Pin_Output_High(void)   //将PB7配置为输出 , 并设置为高电平, PB7作为I2C的SDA

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出

GPIO_InitStruct.Pin = SDA_Pin;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOB,SDA_Pin,GPIO_PIN_SET);

}

void SDA_Pin_Output_Low(void)  //将P7配置为输出  并设置为低电平

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出

GPIO_InitStruct.Pin = SDA_Pin;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOB,SDA_Pin,GPIO_PIN_RESET);

}

void SDA_Pin_IN_FLOATING(void)  //SDA配置为浮空输入

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//浮空

GPIO_InitStruct.Pin = SDA_Pin;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init( GPIOB,&GPIO_InitStruct);

}

void SCL_Pin_Output_High(void) //SCL输出高电平,P14作为I2C的SCL

{

HAL_GPIO_WritePin(GPIOB,SCL_Pin,GPIO_PIN_SET);

}

void SCL_Pin_Output_Low(void) //SCL输出低电平

{

HAL_GPIO_WritePin(GPIOB,SCL_Pin,GPIO_PIN_RESET);

}

void Init_I2C_Sensor_Port(void) //初始化I2C接口,输出为高电平

{

GPIO_InitTypeDef  GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出

GPIO_InitStruct.Pin = SDA_Pin;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOB,SDA_Pin,GPIO_PIN_SET);

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出

GPIO_InitStruct.Pin = SCL_Pin;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

HAL_GPIO_Init(GPIOB,& GPIO_InitStruct);

HAL_GPIO_WritePin(GPIOB,SDA_Pin,GPIO_PIN_SET);

}

void I2C_Start(void)  //I2C主机发送START信号

{

SDA_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);   

}

void AHT20_WR_Byte(uint8_t Byte) //往AHT20写一个字节

{

uint8_t Data,N,i;

Data=Byte;

i = 0x80;

for(N=0;N<8;N++)

{

SCL_Pin_Output_Low();

Delay_4us();

if(i&Data)

{

SDA_Pin_Output_High();

}

else

{

SDA_Pin_Output_Low();

}

    SCL_Pin_Output_High();

Delay_4us();

Data <<= 1;

}

SCL_Pin_Output_Low();

SensorDelay_us(8);   

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

}

uint8_t AHT20_RD_Byte(void)//从AHT20读取一个字节

{

uint8_t Byte,i,a;

Byte = 0;

SCL_Pin_Output_Low();

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

for(i=0;i<8;i++)

{

    SCL_Pin_Output_High();

Delay_5us();

a=0;

//if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)) a=1;

if(HAL_GPIO_ReadPin(GPIOB,SDA_Pin)) a=1;

Byte = (Byte<<1)|a;

//SCL_Pin_Output_Low();

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);

Delay_5us();

}

  SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

return Byte;

}

uint8_t Receive_ACK(void)   //看AHT20是否有回复ACK

{

uint16_t CNT;

CNT = 0;

SCL_Pin_Output_Low();

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

while((HAL_GPIO_ReadPin(GPIOB,SDA_Pin))  && CNT < 100)

CNT++;

if(CNT == 100)

{

return 0;

}

  SCL_Pin_Output_Low();

SensorDelay_us(8);

return 1;

}

void Send_ACK(void)   //主机回复ACK信号

{

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_IN_FLOATING();

SensorDelay_us(8);

}

void Send_NOT_ACK(void) //主机不回复ACK

{

SCL_Pin_Output_Low();

SensorDelay_us(8);

SDA_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SCL_Pin_Output_Low();

SensorDelay_us(8);

    SDA_Pin_Output_Low();

SensorDelay_us(8);

}

void Stop_I2C(void)   //一条协议结束

{

SDA_Pin_Output_Low();

SensorDelay_us(8);

SCL_Pin_Output_High();

SensorDelay_us(8);

SDA_Pin_Output_High();

SensorDelay_us(8);

}

uint8_t AHT20_Read_Status(void)//读取AHT20的状态寄存器

{

uint8_t Byte_first;

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

Byte_first = AHT20_RD_Byte();

Send_NOT_ACK();

Stop_I2C();

return Byte_first;

}

uint8_t AHT20_Read_Cal_Enable(void)  //查询cal enable位有没有使能

{

uint8_t val = 0;//ret = 0,

  val = AHT20_Read_Status();

 if((val & 0x68)==0x08)

 return 1;

   else  return 0;

 }

void AHT20_SendAC(void) //向AHT20发送AC命令

{

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xac);//0xAC采集命令

Receive_ACK();

AHT20_WR_Byte(0x33);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

}

//CRC校验类型:CRC8/MAXIM

//多项式:X8+X5+X4+1

//Poly:0011 0001  0x31

//高位放到后面就变成 1000 1100 0x8c

//C现实代码:

uint8_t Calc_CRC8(uint8_t *message,uint8_t Num)

{

uint8_t i;

uint8_t byte;

uint8_t crc=0xFF;

  for(byte=0; byte<Num; byte++)

  {

    crc^=(message[byte]);

    for(i=8;i>0;--i)

    {

      if(crc&0x80) crc=(crc<<1)^0x31;

      else crc=(crc<<1);

    }

  }

        return crc;

}

void AHT20_Read_CTdata(uint32_t *ct) //没有CRC校验,直接读取AHT20的温度和湿度数据

{

volatile uint8_t  Byte_1th=0;

volatile uint8_t  Byte_2th=0;

volatile uint8_t  Byte_3th=0;

volatile uint8_t  Byte_4th=0;

volatile uint8_t  Byte_5th=0;

volatile uint8_t  Byte_6th=0;

 uint32_t RetuData = 0;

uint16_t cnt = 0;

AHT20_SendAC();//向AHT10发送AC命令

Delay_1ms(80);//延时80ms左右

    cnt = 0;

while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态

{

SensorDelay_us(1508);

if(cnt++>=100)

{

 break;

 }

}

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0

Send_ACK();

Byte_2th = AHT20_RD_Byte();//湿度

Send_ACK();

Byte_3th = AHT20_RD_Byte();//湿度

Send_ACK();

Byte_4th = AHT20_RD_Byte();//湿度/温度

Send_ACK();

Byte_5th = AHT20_RD_Byte();//温度

Send_ACK();

Byte_6th = AHT20_RD_Byte();//温度

Send_NOT_ACK();

Stop_I2C();

RetuData = (RetuData|Byte_2th)<<8;

RetuData = (RetuData|Byte_3th)<<8;

RetuData = (RetuData|Byte_4th);

RetuData =RetuData >>4;

ct[0] = RetuData;//湿度

RetuData = 0;

RetuData = (RetuData|Byte_4th)<<8;

RetuData = (RetuData|Byte_5th)<<8;

RetuData = (RetuData|Byte_6th);

RetuData = RetuData&0xfffff;

ct[1] =RetuData; //温度

}

void AHT20_Read_CTdata_crc(uint32_t *ct) //CRC校验后,读取AHT20的温度和湿度数据

{

volatile uint8_t  Byte_1th=0;

volatile uint8_t  Byte_2th=0;

volatile uint8_t  Byte_3th=0;

volatile uint8_t  Byte_4th=0;

volatile uint8_t  Byte_5th=0;

volatile uint8_t  Byte_6th=0;

volatile uint8_t  Byte_7th=0;

 uint32_t RetuData = 0;

 uint16_t cnt = 0;

// uint8_t  CRCDATA=0;

 uint8_t  CTDATA[6]={0};//用于CRC传递数组

AHT20_SendAC();//向AHT10发送AC命令

Delay_1ms(80);//延时80ms左右

    cnt = 0;

while(((AHT20_Read_Status()&0x80)==0x80))//直到状态bit[7]为0,表示为空闲状态,若为1,表示忙状态

{

SensorDelay_us(1508);

if(cnt++>=100)

{

 break;

}

}

I2C_Start();

AHT20_WR_Byte(0x71);

Receive_ACK();

CTDATA[0]=Byte_1th = AHT20_RD_Byte();//状态字,查询到状态为0x98,表示为忙状态,bit[7]为1;状态为0x1C,或者0x0C,或者0x08表示为空闲状态,bit[7]为0

Send_ACK();

CTDATA[1]=Byte_2th = AHT20_RD_Byte();//湿度

Send_ACK();

CTDATA[2]=Byte_3th = AHT20_RD_Byte();//湿度

Send_ACK();

CTDATA[3]=Byte_4th = AHT20_RD_Byte();//湿度/温度

Send_ACK();

CTDATA[4]=Byte_5th = AHT20_RD_Byte();//温度

Send_ACK();

CTDATA[5]=Byte_6th = AHT20_RD_Byte();//温度

Send_ACK();

Byte_7th = AHT20_RD_Byte();//CRC数据

Send_NOT_ACK();                           //注意: 最后是发送NAK

Stop_I2C();

if(Calc_CRC8(CTDATA,6)==Byte_7th)

{

RetuData = (RetuData|Byte_2th)<<8;

RetuData = (RetuData|Byte_3th)<<8;

RetuData = (RetuData|Byte_4th);

RetuData =RetuData >>4;

ct[0] = RetuData;//湿度

RetuData = 0;

RetuData = (RetuData|Byte_4th)<<8;

RetuData = (RetuData|Byte_5th)<<8;

RetuData = (RetuData|Byte_6th);

RetuData = RetuData&0xfffff;

ct[1] =RetuData; //温度

}

else

{

ct[0]=0x00;

ct[1]=0x00;//校验错误返回值,客户可以根据自己需要更改

}//CRC数据

}

void AHT20_Init(void)   //初始化AHT20

{

Init_I2C_Sensor_Port();

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xa8);//0xA8进入NOR工作模式

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(10);//延时10ms左右

I2C_Start();

AHT20_WR_Byte(0x70);

Receive_ACK();

AHT20_WR_Byte(0xbe);//0xBE初始化命令,AHT20的初始化命令是0xBE,   AHT10的初始化命令是0xE1

Receive_ACK();

AHT20_WR_Byte(0x08);//相关寄存器bit[3]置1,为校准输出

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(10);//延时10ms左右

}

void JH_Reset_REG(uint8_t addr)

{

uint8_t Byte_first,Byte_second,Byte_third;

I2C_Start();

AHT20_WR_Byte(0x70);//原来是0x70

Receive_ACK();

AHT20_WR_Byte(addr);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

AHT20_WR_Byte(0x00);

Receive_ACK();

Stop_I2C();

Delay_1ms(5);//延时5ms左右

I2C_Start();

AHT20_WR_Byte(0x71);//

Receive_ACK();

Byte_first = AHT20_RD_Byte();

Send_ACK();

Byte_second = AHT20_RD_Byte();

Send_ACK();

Byte_third = AHT20_RD_Byte();

Send_NOT_ACK();

Stop_I2C();

  Delay_1ms(10);//延时10ms左右

I2C_Start();

AHT20_WR_Byte(0x70);///

Receive_ACK();

AHT20_WR_Byte(0xB0|addr);寄存器命令

Receive_ACK();

AHT20_WR_Byte(Byte_second);

Receive_ACK();

AHT20_WR_Byte(Byte_third);

Receive_ACK();

Stop_I2C();

Byte_second=0x00;

Byte_third =0x00;

}

void AHT20_Start_Init(void)

{

JH_Reset_REG(0x1b);

JH_Reset_REG(0x1c);

JH_Reset_REG(0x1e);

}

12.修改main.c

#include "main.h"

#include "dma.h"

#include "i2c.h"

#include "usart.h"

#include "gpio.h"

/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include<stdio.h>

#include "AHT20-21_DEMO_V1_3.h"

void SystemClock_Config(void);

int fputc(int ch,FILE *f)

{

    HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);    

//等待发送结束

while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET){

}

    return ch;

}

int main(void)

{

  /* USER CODE BEGIN 1 */

uint32_t CT_data[2]={0,0};

volatile int  c1,t1;

Delay_1ms(500);

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_DMA_Init();

MX_USART1_UART_Init();

//初始化AHT20

AHT20_Init();

Delay_1ms(500);

  while (1)

  {

    /* USER CODE END WHILE */

AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次

//AHT20_Read_CTdata_crc(CT_data);  //crc校验后,读取AHT20的温度和湿度数据

c1 = CT_data[0]*1000/1024/1024;  //计算得到湿度值c1(放大了10倍)

t1 = CT_data[1]*2000/1024/1024-500;//计算得到温度值t1(放大了10倍)

printf("正在检测");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

printf("\r\n");

HAL_Delay(1000);

printf("温度:%d%d.%d",t1/100,(t1/10)%10,t1%10);

printf("湿度:%d%d.%d",c1/100,(c1/10)%10,c1%10);

printf("\r\n");

printf("等待");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

HAL_Delay(100);

printf(".");

printf("\r\n");

HAL_Delay(1000);

  /* USER CODE END 3 */

}

}

/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

  RCC_OscInitStruct.HSIState = RCC_HSI_ON;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

  {

    Error_Handler();

  }

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}

#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

13.烧录调试

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值