| **银杏科技有限公司旗下技术文档发布平台** ||||
|技术支持电话|**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 模式,单步运行或设置断点验证程序逻辑。
==== 六、 实验现象 ====
用万用表测量各测试点电压与程序设定电压一致。