| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2019-02-19 | gingko | 初次建立 | ===== STM32CubeMX教程八——I2C实验 ===== 1. 在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR {{ :icore4t:icore4t_cube_8_1.png?direct |}} 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 {{ :icore4t:icore4t_cube_8_2.png?direct |}} 3. 配置RCC,使用外部时钟源 {{ :icore4t:icore4t_cube_8_3.png?direct |}} 4. 时基源选择SysTick {{ :icore4t:icore4t_cube_8_4.png?direct |}} 5. 将PA10,PB7,PB8设置为GPIO_Output {{ :icore4t:icore4t_cube_8_5.png?direct |}} 6. 引脚模式配置 {{ :icore4t:icore4t_cube_8_6.png?direct |}} {{ :icore4t:icore4t_cube_8_7.png?direct |}} 7. 时钟源设置,选择外部高速时钟源,配置为最大主频 {{ :icore4t:icore4t_cube_8_8.png?direct |}} 8. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 {{ :icore4t:icore4t_cube_8_9.png?direct |}} 9. 点击Code Generator,进行进一步配置 {{ :icore4t:icore4t_cube_8_10.png?direct |}} * **Copy all used libraries into the project folder** * **将HAL库的所有.C和.H都复制到所建工程中** * **优点**:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便 * **缺点**:体积大,编译时间很长 * **Copy only the necessary library files** * **只复制所需要的.C和.H(推荐)** * **优点**:体积相对小,编译时间短,并且工程可复制拷贝 * **缺点**:新增外设时需要重新用STM32CubeMX导入 * **Add necessary library files as reference in the toolchain project configuration file** * **不复制文件,直接从软件包存放位置导入.C和.H** * **优点**:体积小,比较节约硬盘空间 * **缺点**:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 自行选择方式即可 10. 然后点击GENERATE CODE 创建工程 {{ :icore4t:icore4t_cube_8_11.png?direct |}} 创建成功,打开工程。 \\ \\ \\ ===== 实验八:I2C通信实验——配置板载电源 ===== ==== 一、 实验目的与意义 ==== - 了解STM32 I2C结构 - 了解STM32 I2C特征 - 掌握I2C的使用方法 - 掌握STM32 HAL库中I2C属性的配置方法 - 掌握KEILMDK 集成开发环境使用方法 ==== 二、 实验设备及平台 ==== - iCore4T 双核心板 - JLINK(或相同功能)仿真器 - Micro USB线缆 - Keil MDK 开发平台 - STM32CubeMX开发平台 - 装有WIN XP(及更高版本)系统的计算机 ==== 三、 实验原理 ==== === 1.AXP152简介 === * AXP152是一款高度集成的电源管理芯片,包含 4 路高效 DCDC、7 路 LDO,输出电压可灵活配置。AXP152用于需要多路电源转换的应用场景,并可与本公司其它 PMU 配合构成完整的单芯或多芯锂电池(锂离子或锂聚合物)应用场景电源解决方案,充分满足目前日益复杂的应用处理器系统对于电源多输出、大电流、高精度的要求。 * AXP152 内部集成了过压欠压保护(OVP/UVP)、过温保护(OTP)等保护功能,可充分保障供电的安全稳定。 * AXP152 提供了一个两线串行通信接口:Two Wire Serial Interface (TWSI),应用处理器可以通过这个接口设置各路输出的电压,打开/关闭某些电源输出,以及配置中断和睡眠唤醒系统。 * **特性:** * 4路同步降压转换器 (DC-DC): * DC-DC1:PFM/PWM 两种工作模式,可在1.7-3.5V 之间部分调节,驱动能力 1A * DC-DC2:PFM/PWM 两种工作模式,可在0.7-2.275V 之间调节, 25mV/step,驱动能力 2A,支持 DVM * DC-DC3:PFM/PWM 两种工作模式,可在0.7-3.5V 之间调节, 50mV/step, 驱动能力 1.2A * DC-DC4:PFM/PWM 两种工作模式,可在0.7-3.5V 之间调节, 25mV/step, 驱动能力 1.2A * 7 路线性稳压器 (LDO): * LDO0:输出电压可调,驱动能力 1.5A,内部500/900/1500mA 限流 * RTCLDO:1 路 RTC31,输出 3.1V(可外灌)。1 路 RTC13,输出电压 1.3/1.8V 可选 * ALDO1:Analog LDO, 1.2-3.3V 部分可调,驱动能力 300mA * ALDO2:Analog LDO, 1.2-3.3V 部分可调,驱动能力 300mA * DLDO1:Digtal LDO 或 Swtich, 0.7-3.5V 可调,100mV/step,驱动能力 300mA * DLDO2:Digtal LDO 或 Swtich, 0.7-3.5V 可调,25mV/step,驱动能力 300mA * GPIOLDO:low noise LDO, 1.8-3.3V 可调节,100mV/step, 驱动能力 20mA * 系统管理(System Management): * 支持软关机和硬关机 * 支持外部触发源唤醒 * 支持输出电压监测 * 输出 PWROK,用于系统复位或关机指示 * 过/欠压保护 (OVP/UVP) * 过温保护 (OTP) * 可定制时序和输出电压 * DC-DC1/2/3/4: * DCDC1 输出电压范围为 1.7-3.5V, DCDC2 输出电压为 0.7-2.275V, DCDC3/4 输出电压范围为 0.7-3.5V可由寄存器设置。 * ALDO1/2: * ALDO1/2 采用了低噪声设计,可以为应用系统的模拟电路提供电源,其驱动能力为300mA。 * DLDO1/2: * DLDO1/2 可以为应用系统的数字电路提供电源,其驱动能力为 300mA。 * GPIOLDO: * GPIOLDO 也采用了低噪声的设计,输出驱动能力为 20mA。 * 自诊断:负载监测与限流保护: * 所有 DC-DC 和 LDO 都有负载监测和限流功能,当负载电流超过其驱动能力时,各输出电压都会下降,以保护内部电路。 4 个 DC-DC 输出电压低于设定电压的 85%时,AXP152 自动关机。 管脚定义: {{ :icore4t:icore4t_arm_hal_8_1.png?direct |}} 原理图如下所示: {{ :icore4t:icore4t_arm_hal_8_2.png?direct |}} === 2.AXP152读写时序图 === 单次读写: {{ :icore4t:icore4t_arm_hal_8_3.png?direct |}} 多次读写: {{ :icore4t:icore4t_arm_hal_8_4.png?direct |}} === 3.AXP152部分寄存器介绍 === {{ :icore4t:icore4t_arm_hal_8_5.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_6.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_7.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_8.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_9.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_10.png?direct |}} {{ :icore4t:icore4t_arm_hal_8_11.png?direct |}} ==== 四、 实验程序 ==== === 1. 主函数 === int main(void) { HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] axp152.set_dcdc2(1200);//[FPGA INT & PLL D] axp152.set_aldo1(2500);//[FPGA PLL A] axp152.set_dcdc4(3300);//[POWER_OUTPUT] axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] MX_GPIO_Init(); while (1) { } } === 2. AXP152常量定义 === //定义常量的寄存器地址 #define AXP152_CHIP_VERSION 0x03 #define AXP152_DCDC1_VOLTAGE 0x26 //DC-DC1 电压设置寄存器 #define AXP152_DCDC2_VOLTAGE 0x23 //DC-DC2 电压设置寄存器 #define AXP152_DCDC3_VOLTAGE 0x27 //DC-DC3 电压设置寄存器 #define AXP152_DCDC4_VOLTAGE 0x2B //DC-DC4 电压设置寄存器 #define AXP152_DLDO1_VOLTAGE 0x29 //DLDO1 电压设置寄存器 #define AXP152_DLDO2_VOLTAGE 0x2A //DLDO2 电压设置寄存器 #define AXP152_ALDO1_ALD02_VOLTAGE 0x28 //ALDO1/2 电压设置寄存器 #define AXP152_SHUTDOWN 0x32 //关机和关机时序控制寄存器 #define AXP152_POWEROFF (1 << 7) #define AXP152_I2C_ADDR 0x60 //I2C设备地址 === 3.AXP152各路输出电压设定函数 === //axp152_mvolt_to_target 电压范围调整函数 static unsigned char axp152_mvolt_to_target(int mvolt, int min, int max, int div) { if (mvolt < min) mvolt = min; else if (mvolt > max) mvolt = max; return (mvolt - min) / div; //set_dcdc1 设定dcdc1输出电压 int set_dcdc1(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 1700, 3500, 100); if(mvolt >= 2400 || mvolt <= 2800)target = target - 2; if(mvolt >= 3000 || mvolt <= 3500)target = target - 3; return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DCDC1_VOLTAGE,&target,1); } //set_dcdc2 设定dcdc2输出电压 int set_dcdc2(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 2275, 25); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DCDC2_VOLTAGE,&target,1); } //set_dcdc3 设定dcdc3输出电压 int set_dcdc3(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 3500, 50); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DCDC3_VOLTAGE,&target,1); } //set_dcdc4 设定dcdc4输出电压 int set_dcdc4(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 3500, 25); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DCDC4_VOLTAGE,&target,1); } //set_dldo1 设定dldo1输出电压 int set_dldo1(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 3500, 100); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DLDO1_VOLTAGE,&target,1); } //set_dldo2 设定dldo2输出电压 int set_dldo2(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 3500, 100); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DLDO2_VOLTAGE,&target,1); } //set_aldo1 设定aldo1输出电压 int set_aldo1(unsigned int mvolt) { unsigned char data; unsigned char target; if(mvolt >= 1200 && mvolt <= 2000){ target = axp152_mvolt_to_target(mvolt, 1200, 2000, 100); }else if(mvolt == 2500){ target = 0x09; }else if(mvolt == 2700){ target = 0x0A; }else if(mvolt == 2800){ target = 0x0B; }else if(mvolt >= 3000 || mvolt <= 3300){ target = axp152_mvolt_to_target(mvolt, 3000, 3300, 100); target += 0x0C; } i2c.read_nbyte(AXP152_I2C_ADDR,AXP152_ALDO1_ALD02_VOLTAGE,&data,1); data &= 0x0F; target = target << 4; target &= 0xF0; target = data | target; return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_ALDO1_ALD02_VOLTAGE,&target,1); } //set_aldo2 设定aldo2输出电压 int set_aldo2(unsigned int mvolt) { unsigned char data; unsigned char target; if(mvolt >= 1200 && mvolt <= 2000){ target = axp152_mvolt_to_target(mvolt, 1200, 2000, 100); }else if(mvolt == 2500){ target = 0x09; }else if(mvolt == 2700){ target = 0x0A; }else if(mvolt == 2800){ target = 0x0B; }else if(mvolt >= 3000 || mvolt <= 3300){ target = axp152_mvolt_to_target(mvolt, 3000, 3300, 100); target += 0x0C; } i2c.read_nbyte(AXP152_I2C_ADDR,AXP152_ALDO1_ALD02_VOLTAGE,&data,1); data &= 0xF0; target = target & 0x0F; target = data | target; return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_ALDO1_ALD02_VOLTAGE,&target,1); } ==== 五、 实验步骤 ==== - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连); - 把iCore4T通过Micro USB线与计算机相连,为iCore4T供电; - 打开Keil MDK 开发环境,并打开本实验工程; - 烧写程序到iCore4T上; - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 ==== 六、 实验现象 ==== 用万用表测量各测试点电压与程序设定电压一致。