驱动所有外设

This commit is contained in:
2026-07-14 18:17:00 +08:00
parent 2d0d000a38
commit d4112399c2
51 changed files with 126956 additions and 143 deletions

View File

@@ -13,6 +13,8 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
- `lcd.c/h` — 绘图模块(字符/字符串、线条、矩形、圆形)
- `lcd_data.c/h` — ASCII 8×16 字库
- `hz16_data.c/h` — CJK 16×16 字库
- `STM32F103C8T6/Drivers/BSP/AT24C02/` — AT24C02 EEPROM 驱动
- `at24c02.c/h` — I2C 读写(字节/页/连续,自动跨页)
## 硬件配置
- **MCU**: STM32F103C8T6 (LQFP48, 72MHz, 64KB Flash, 20KB RAM)
@@ -20,18 +22,20 @@ STM32CubeMX 生成的项目,使用 **Keil MDK-ARM V5.32** 工具链。
- **外设**:
- USART1: PA9 (TX), PA10 (RX) — 异步模式
- SPI2: PB13 (SCK), PB15 (MOSI) — 18MHz, DMA1_Channel5
- I2C1: PB8 (SCL), PB9 (SDA) — AT24C02 EEPROM
- LED: PC13 (低电平有效,上拉)
- 按键: PB3 (KEY1), PB4 (KEY2), PB5 (KEY3), PC14 (KEY4), PC15 (KEY5) — 下拉
- LCD: PB10 (DC), PB11 (CS), PB12 (RST), PB13 (SCK), PB15 (SDA) — ST7735S 128x160
- TIM4: PB6~9 四路 1kHz PWM
- TIM3: CH4 内部触发 ADC1 注入组
- ADC1: IN0~IN3 (PA0~PA3), 注入组, TIM3_CH4 触发
- TIM3: PA6~PB1 四路 1kHz PWMPA6 CH1, PA7 CH2, PB0 CH3, PB1 CH4
- TIM4: 仅做 ADC 触发源TRGO=Update 输出至 ADC11kHz无引脚占用
- ADC1: IN0~IN3 (PA0~PA3), 注入组, TIM4_TRGO 触发
## 初始化顺序main.c
```
HAL_Init → SystemClock_Config → MX_GPIO → MX_DMA → MX_USART1 → MX_SPI2
→ MX_TIM4 → MX_ADC1 → MX_TIM3
→ button_driver_init() → st7735s_init() → lcd_* draw → PWM start → ADC start
→ button_driver_init() → st7735s_init() → lcd_* draw
→ TIM3 PWM start (PA6~PB1) → TIM4 Base start (TRGO→ADC) → ADC injected start
```
## ADC 采坑记录(不可从 CubeMX 重新生成时光靠设置)
@@ -39,10 +43,15 @@ HAL_Init → SystemClock_Config → MX_GPIO → MX_DMA → MX_USART1 → MX_SPI2
```c
RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_ADCPRE) | RCC_CFGR_ADCPRE_DIV6;
```
- **TIM3_CH4 触发 ADC**: CubeMX 默认生成 `TIM_OCMODE_TIMING`,这不会产生 OC4REF 上升沿 → ADC 收不到触发。必须在 `tim.c` 中手动改为 `TIM_OCMODE_PWM1` + `Pulse = 500`。CubeMX 需选 CH4 为 "PWM Generation4 No Output" 并设 Pulse=500。
- **TIM4_TRGO 触发 ADC(当前方案)**: CubeMX 中 TIM4 无任何 PWM 通道,生成的 `MasterOutputTrigger` 为 `TIM_TRGO_RESET` → TRGO 无脉冲。必须在 `USER CODE TIM4_Init 2` 中写寄存器:
```c
TIM4->CR2 = (TIM4->CR2 & ~TIM_CR2_MMS) | TIM_CR2_MMS_1; /* TRGO = Update */
```
启动时用 `HAL_TIM_Base_Start(&htim4)` 即可。
- **旧方案(已废弃)**: TIM3_CH4 触发 ADC 已废弃PB8/PB9 改为 I2C
## printf 无 MicroLIB
在 `usart.c` 通过 `#pragma import(__use_no_semihosting)` + 提供 `_sys_exit()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use MicroLIB 即可。
在 `usart.c` 的 USER CODE 区通过 `#pragma import(__use_no_semihosting)` + `_sys_exit()` + `_ttywrch()` + `struct __FILE` + `FILE __stdout` 实现。Keil 取消勾选 Use MicroLIB 即可。
## SPI 注意事项
- LCD (ST7735S) 使用**硬件SPI2**PB13 SCK, PB15 MOSI18MHz**Mode 3**CPOL=HIGH, CPHA=2EDGE

620
AT24C02.md Normal file
View File

@@ -0,0 +1,620 @@
## 1. 描述
24C02/04/08/16/32/64是电可擦除PROM分别采用256/512/1024/2048/4096/8192×8-bit的组织结构以及两线串行接口。电压可允许低至1.8V待机电流和工作电流分别为1μA和1mA。24C02/04/08/16/32/64具有页写能力每页分别为8/16/16/16/32/32字节。24C02/04/08/16/32/64具有8-pin PDIP和8-pin SOP和5-pin SOT 23-5三种封装形式
## 2. 特点
- 宽范围的工作电压1.8V\~5.5V
- 低电压技术
- 1mA典型工作电流
- 1μA 典型待机电流
\- 存储器组织结构
- 24C02, 256 X 8 (2K bits)
- 24C04, 512 X 8 (4K bits)
- 24C08, 1024 X 8 (8K bits)
- 24C16, 2048 X 8 (16K bits)
- 24C32, 4096 X 8 (32K bits)
- 24C64, 8192 X 8 (64K bits)
- 2线串行接口完全兼容I²C总线
- I²C时钟频率为1 MHz (5V), 400 kHz (1.8V, 2.5V, 2.7V)
- 施密特触发输入噪声抑制
- 硬件数据写保护
- 内部写周期 (最大5 ms)
- 可按字节写
- 页写:8字节页(24C02),16字节页(24C04/08/16),32字节页(24C32/64)
- 可按字节,随机和序列读
- 自动递增地址
- ESD保护大于2.5kV
- 高可靠性
- 擦写寿命100万次
- 数据保持时间100年
- 8-pin DIP和8-pin SOP封装
- 无铅工艺符合RoHS标准
## 3. 应用领域
- 智能仪器仪表
- 计算机 笔记本电脑
- 工业控制
- 汽车电子
- 家用电器
- 通信设备
引脚排列
封装:5L SOT-23-5
![](images/c419ed60d710663ed92d6c42974a1d8a9f7728dc3dae52d9e33750893f70908a.jpg)
封装: SOP-8
![](images/6ba0ea98276577ca5cfc1c2dcbc479ecca81b5eb3efc2e23962700ac3cbff822.jpg)
(顶视图)
5. 框图
![](images/a7d37d8cce73f3ed06fe00f80f893a1ecf54de1615ae2d59b2431ea03de5dc8e.jpg)
<details>
<summary>flowchart</summary>
```mermaid
graph TD
WP["WP"] --> SERIAL["SERIAL CONTROL LOGIC"]
SCL["SCL"] --> START["START STOP LOGIC"]
SDA["SDA"] --> START
START --> SERIAL
SERIAL -->|"EN"| HIGH["HIGH VOLTAGE PUMP/TIMING"]
HIGH --> DATA_RECOVERY["DATA RECOVERY"]
DATA_RECOVERY --> EEPROM["EEPROM"]
DATA_RECOVERY --> X_Decoder["X DECODER"]
XDecoder["X Decoder"] --> EEPROM
DATA_Word["DATA WORD ADDRESS COUNTER"] --> Y_Decoder["Y DECODER"]
YDecoder["Y Decoder"] --> EEPROM
EEPROM --> SERIAL_MUX["SERIAL MUX"]
SERIAL_MUX --> DOUT["DOUT/ACKNOWLEDGE"]
DOUT -->|"DIN"| SERIAL
SERIAL -->|"COMP"| DEVICE["DEVICE ADDRESS COMPARATOR"]
DEVICE -->|"LOAD"| SERIAL
DEVICE -->|"LOAD"| DATA
DATA -->|"LOAD"| SERIAL
SERIAL -->|"LOAD"| DATA
DATA -->|"LOAD"| DEVICE
DEVICE -->|"LOAD"| SERIAL
SERIAL -->|"LOAD"| DATA
DATA -->|"LOAD"| DEVICE
DATA -->|"LOAD"| SERIAL
SERIAL -->|"LOAD"| DATA
DATA -->|"LOAD"| SERIAL
SERIAL -->|"LOAD"| DATA
DATA -->|"LOAD"| SERIAL
```
</details>
图1 框图
## 6. 最大额定参数
(超出最大额定参数可能会导致器件损坏)
<table><tr><td>参数</td><td>符号</td><td>值</td><td>单位</td></tr><tr><td>直流供电电压</td><td> $V_{CC}$ </td><td>-0.3 ~ +6.5</td><td>V</td></tr><tr><td>直流输入电压</td><td> $V_{IN}$ </td><td>-0.3 ~ $V_{CC}$ +0.3</td><td>V</td></tr><tr><td>直流输出电压</td><td> $V_{OUT}$ </td><td>-0.3 ~ $V_{CC}$ +0.3</td><td>V</td></tr><tr><td>存储温度</td><td> $T_{STG}$ </td><td>-65 ~ +150</td><td>°C</td></tr><tr><td>ESD电压(人体模型)</td><td rowspan="2"> $V_{ESD}$ </td><td>2500</td><td>V</td></tr><tr><td>ESD电压(机器模型)</td><td>200</td><td>V</td></tr></table>
## 推荐工作条件
(7)应在推荐工作条件下实现功能)
<table><tr><td>参数</td><td>符号</td><td>最小值</td><td>最大值</td><td>单位</td></tr><tr><td>直流供电电压</td><td> $V_{CC}$ </td><td>1.8</td><td>5.5</td><td>V</td></tr><tr><td>工作温度</td><td> $T_{A}$ </td><td>-40</td><td>+85</td><td>°C</td></tr></table>
电话0755-82568886 82568883
邮箱idchip@indreamchip.com
传真0755-82568886
网址www.idchip.cn
公司地址深圳市福田区滨河大道联合广场A座1308
## 8. 引脚电容
(条件: $T_{A}=25^{\circ}C$ , f=1.0 MHz, $V_{CC}=+1.8V$ )
<table><tr><td>参数</td><td>符号</td><td>测试条件</td><td>最小值</td><td>最大值</td><td>单位</td></tr><tr><td>输入/输出电容(SDA)</td><td> $C_{I/O}$ </td><td> $V_{I/O} = 0V$ </td><td></td><td>8</td><td>pF</td></tr><tr><td>输入电容(A0, A1, A2, SCL)</td><td> $C_{IN}$ </td><td> $V_{IN} = 0V$ </td><td></td><td>6</td><td>pF</td></tr></table>
## 9. 直流电气特性
(条件: $T_{A}=0^{\circ}C\sim+70^{\circ}C,V_{CC}=+1.8V\sim+5.5V$ ,除非另有注释)
<table><tr><td>参数</td><td>符号</td><td colspan="2">测试条件</td><td>最小值</td><td>典型值</td><td>最大值</td><td>单位</td></tr><tr><td rowspan="2">供电电流</td><td rowspan="2"> $I_{CC}$ </td><td rowspan="2"> $V_{CC}=5V$ </td><td>100kHz读</td><td></td><td>0.4</td><td>1.0</td><td>mA</td></tr><tr><td>100kHz写</td><td></td><td>2.0</td><td>3.0</td><td>mA</td></tr><tr><td>待机电流</td><td> $I_{SB}$ </td><td colspan="2"> $V_{IN}=V_{CC}$ 或GND</td><td></td><td></td><td>1.0</td><td>μA</td></tr><tr><td>输入漏电流</td><td> $I_{LI}$ </td><td colspan="2"> $V_{IN}=V_{CC}$ 或GND</td><td></td><td></td><td>3.0</td><td>μA</td></tr><tr><td>输出漏电流</td><td> $I_{LO}$ </td><td colspan="2"> $V_{OUT}=V_{CC}$ 或GND</td><td></td><td>0.05</td><td>3.0</td><td>μA</td></tr><tr><td>输入低电平电压</td><td> $V_{IL}$ </td><td colspan="2"></td><td>-0.6</td><td></td><td> $V_{CC} \times 0.3$ </td><td>V</td></tr><tr><td>输入高电平电压</td><td> $V_{IH}$ </td><td colspan="2"></td><td> $V_{CC} \times 0.7$ </td><td></td><td> $V_{CC}+0.5$ </td><td>V</td></tr><tr><td rowspan="3">输出低电平电压</td><td> $V_{OL3}$ </td><td colspan="2"> $V_{CC}=5.0V, I_{OL}=3.0mA$ </td><td></td><td></td><td>0.4</td><td>V</td></tr><tr><td> $V_{OL2}$ </td><td colspan="2"> $V_{CC}=3.0V, I_{OL}=2.1mA$ </td><td></td><td></td><td>0.4</td><td>V</td></tr><tr><td> $V_{OL1}$ </td><td colspan="2"> $V_{CC}=1.8V, I_{OL}=0.15mA$ </td><td></td><td></td><td>0.2</td><td>V</td></tr></table>
## 10. 交流电气特性
(条件: $T_{A}=0^{\circ}C\sim+70^{\circ}C,V_{CC}=+1.8V\sim+5.5V,C_{L}=100pF$ ,除非另有注释)
<table><tr><td>参数</td><td>符号</td><td>测试条件</td><td>最小值</td><td>典型值</td><td>最大值</td><td>单位</td></tr><tr><td rowspan="2">时钟频率, SCL</td><td rowspan="2"> $f_{SCL}$ </td><td> $V_{CC}=1.8V$ </td><td></td><td></td><td>400</td><td rowspan="2">kHz</td></tr><tr><td> $V_{CC}=5V$ </td><td></td><td></td><td>1000</td></tr><tr><td rowspan="2">时钟低电平宽度</td><td rowspan="2"> $t_{LOW}$ </td><td> $V_{CC}=1.8V$ </td><td>1.2</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.6</td><td></td><td></td></tr><tr><td rowspan="2">时钟高电平宽度</td><td rowspan="2"> $t_{HIGH}$ </td><td> $V_{CC}=1.8V$ </td><td>0.6</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.4</td><td></td><td></td></tr><tr><td rowspan="2">噪声消除时间</td><td rowspan="2"> $t_{I}$ </td><td> $V_{CC}=1.8V$ </td><td></td><td></td><td>50</td><td rowspan="2">ns</td></tr><tr><td> $V_{CC}=5V$ </td><td></td><td></td><td>40</td></tr><tr><td rowspan="2">时钟下降沿到数据有效输出间隔时间</td><td rowspan="2"> $t_{AA}$ </td><td> $V_{CC}=1.8V$ </td><td>0.05</td><td></td><td>0.9</td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.05</td><td></td><td>0.55</td></tr><tr><td rowspan="2">总线释放时间</td><td rowspan="2"> $t_{BUF}$ </td><td> $V_{CC}=1.8V$ </td><td>1.2</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.5</td><td></td><td></td></tr></table>
## 交流电气特性
## 10. (续)
<table><tr><td>参数</td><td>符号</td><td>测试条件</td><td>最小值</td><td>典型值</td><td>最大值</td><td>单位</td></tr><tr><td rowspan="2">起始条件保持时间</td><td rowspan="2"> $t_{HD.STA}$ </td><td> $V_{CC}=1.8V$ </td><td>0.6</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.25</td><td></td><td></td></tr><tr><td rowspan="2">起始条件建立时间</td><td rowspan="2"> $t_{SU.STA}$ </td><td> $V_{CC}=1.8V$ </td><td>0.6</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.25</td><td></td><td></td></tr><tr><td>数据输入保持时间</td><td> $t_{HD.DAT}$ </td><td></td><td>0</td><td></td><td></td><td>μs</td></tr><tr><td>数据输入建立时间</td><td> $t_{SU.DAT}$ </td><td></td><td>100</td><td></td><td></td><td>ns</td></tr><tr><td>输入上升时间</td><td> $t_R$ </td><td></td><td></td><td></td><td>300</td><td>ns</td></tr><tr><td rowspan="2">输入下降时间</td><td rowspan="2"> $t_F$ </td><td> $V_{CC}=1.8V$ </td><td></td><td></td><td>300</td><td rowspan="2">ns</td></tr><tr><td> $V_{CC}=5V$ </td><td></td><td></td><td>100</td></tr><tr><td rowspan="2">停止条件建立时间</td><td rowspan="2"> $t_{SU.STO}$ </td><td> $V_{CC}=1.8V$ </td><td>0.6</td><td></td><td></td><td rowspan="2">μs</td></tr><tr><td> $V_{CC}=5V$ </td><td>0.25</td><td></td><td></td></tr><tr><td>数据输出保持时间</td><td> $t_{DH}$ </td><td></td><td>50</td><td></td><td></td><td>ns</td></tr><tr><td>写周期</td><td> $t_{WR}$ </td><td></td><td></td><td></td><td>5</td><td>ms</td></tr></table>
![](images/0d3af022a5406d9ac18fdf62751f04eed4735102054c52a20bfe3101e2b319b2.jpg)
<details>
<summary>flowchart</summary>
```mermaid
graph LR
subgraph SCL
SCL -->|tF| SCL
SCL -->|tLOW| SCL
SCL -->|tHIGH| SCL
SCL -->|tLOW| SCL
SCL -->|tR| SCL
end
subgraph SDA_IN
SDA_IN -->|tSU.STO| SDA_OUT
SDA_IN -->|tHD.DAT| SDA_OUT
SDA_IN -->|tHD.DAT| SDA_OUT
SDA_IN -->|tSU.DAT| SDA_OUT
SDA_IN -->|tAA| SDA_OUT
SDA_OUT -->|tBUF| SDA_OUT
end
SCL -.->|tSU.STA| SDA_IN
SCL -.->|tHD.STA| SDA_IN
SCL -.->|tSU.DAT| SDA_IN
SCL -.->|tSU.DAT| SDA_OUT
```
</details>
图2 总线时序
![](images/921b907b53b015ce42701e7092a87c140cd5f09427e4bb78249c9a8373fc7d70.jpg)
<details>
<summary>text_image</summary>
SCL
SDA
8th BIT ACK
STOP CONDITION
tWR(1)
START CONDITION
</details>
注1. 写周期时间 $t_{WR}$ 是指从一个写序列的有效停止条件开始至内部写周期结束的时间。
电话0755-82568886 82568883
图3 写周期时序
邮箱idchip@indreamchip.com
传真0755-82568886
网址www.idchip.cn
公司地址深圳市福田区滨河大道联合广场A座1308
11. 引脚说明
<table><tr><td>引脚号</td><td>引脚名称</td><td>功能说明</td></tr><tr><td>1</td><td>A0</td><td rowspan="3">地址输入。A2、A1和A0是器件地址输入引脚。24C02/32/64使用A2、A1和A0输入引脚作为硬件地址,总线上可同时级联8个24C02/32/64器件(详见器件寻址)。24C04使用A2和A1输入引脚作为硬件地址,总线上可同时级联4个24C04器件,A0为空脚,可接地。24C08使用A2输入引脚作为硬件地址,总线上可同时级联2个24C08器件,A0和A1为空脚,可接地。24C16未使用器件地址引脚,总线上最多只可连接一个16K器件,A2、A1和A0为空脚,可接地。</td></tr><tr><td>2</td><td>A1</td></tr><tr><td>3</td><td>A2</td></tr><tr><td>5</td><td>SDA</td><td>串行地址和数据输入/输出。SDA是双向串行数据传输引脚,漏极开路,需外接上拉电阻到Vcc(典型值10kΩ)。</td></tr><tr><td>6</td><td>SCL</td><td>串行时钟输入。SCL同步数据传输,上升沿数据写入,下降沿数据读出。</td></tr><tr><td>7</td><td>WP</td><td>写保护。WP引脚提供硬件数据保护。当WP接地时,允许数据正常读写操作;当WP接Vcc时,写保护,只读。</td></tr><tr><td>4</td><td>GND</td><td>地</td></tr><tr><td>8</td><td>Vcc</td><td>正电源</td></tr></table>
12. 存储结构
<table><tr><td>器件</td><td>总容量(位)</td><td>总页数</td><td>字节/页</td><td>字地址长度</td></tr><tr><td>24C02</td><td>2K</td><td>32</td><td>8</td><td>8位</td></tr><tr><td>24C04</td><td>4K</td><td>32</td><td>16</td><td>9位</td></tr><tr><td>24C08</td><td>8K</td><td>64</td><td>16</td><td>10位</td></tr><tr><td>24C16</td><td>16K</td><td>128</td><td>16</td><td>11位</td></tr><tr><td>24C32</td><td>32K</td><td>128</td><td>32</td><td>12位</td></tr><tr><td>24C64</td><td>64K</td><td>256</td><td>32</td><td>13位</td></tr></table>
24CXX支持I²C总线传输协议。I²C是一种双向、两线串行通讯接口分别是串行数据线SDA和串行时钟线SCL。两根线都必须通过一个上拉电阻接到电源。典型的总线配置如图4所示
![](images/f5f3264751412418266380c70af5ffe56c644e6ae0abd6e9b5a7a87a25415275.jpg)
<details>
<summary>text_image</summary>
SDA
SCL
MPU
24Cxx
其他外围
RP
RP
Vcc
两线串行
数据总线
</details>
图4 典型两线总线配置
总线上发送数据的器件被称作发送器接收数据的器件被称作接收器。控制信息交换的器件被称作主器件受主器件控制的器件则被称作从器件。主器件产生串行时钟SCL控制总线的访问状态、产生START和STOP条件。24CXX在I²C总线中作为从器件工作。
只有当总线处于空闲状态时才可以启动数据传输。每次数据传输均开始于START条件结束于STOP条件二者之间的数据字节数是没有限制的由总线上的主器件决定。信息以字节8位为单位传输第9位时由接收器产生应答。
## 起始和停止条件
数据和时钟线都为高则称总线处在空闲状态。当SCL为高电平时SDA的下降沿高到低叫做起始条件START简写为SSDA的上升沿低到高则叫做停止条件STOP简写为P。参见图5。
![](images/c0321b84d9cfb979fb70a5923d30f6a9c3a4c7d8cfc969bcfe39ade6362885f5.jpg)
<details>
<summary>text_image</summary>
S S
</details>
起始条件
图5 起始条件和停止条件的定义
## 13. 详细操作说明(续)
## 位传输
每个时钟脉冲传送一位数据。SCL为高时SDA必须保持稳定因为此时SDA的改变被认为是控制信号。位传输参见图6。
![](images/11780fff236471cef48d4b80a3b7f791103d8ba0c1cb0e53b01f4369f1a3beb6.jpg)
<details>
<summary>flowchart</summary>
This diagram illustrates the signal processing logic for SDA and SCL channels, showing how data lines are optimized based on data validity and data reform.
</details>
图6 位传输
## 应答
总线上的接收器每接收到一个字节就产生一个应答主器件必须产生一个对应的额外的时钟脉冲见图7。
![](images/450b53ad10191dd10963296165304cd9b46c5c4211e2e14326f9d94ef984387c.jpg)
<details>
<summary>flowchart</summary>
```mermaid
graph LR
subgraph Sender_Data
A["发送器输出的数据"] --> B{"信号波形"}
B --> C["接收器输出的数据"]
C --> D["非应答"]
D --> E["应答"]
E --> F["应答时钟脉冲"]
end
subgraph Main_Device
G["主器件发出的SCL"] --> H{"脉冲大小"}
H --> I["1"]
H --> J["2"]
H --> K["8"]
H --> L["9"]
I --> M["起始条件"]
J --> M
K --> M
L --> M
end
```
</details>
图7 I²C总线的应答
接收器拉低SDA线表示应答并在应答脉冲期间保持稳定的低电平。当主器件作接收器时必须发出数据传输结束的信号给发送器即它在最后一个字节之后的应答脉冲期间不会产生应答信号不拉低SDA。这种情况下发送器必须释放SDA线为高以便主器件产生停止条件。
## 器件寻址
起始条件使能芯片读写操作后EEPROM都要求有8位的器件地址信息见图8
器件地址信息由"1"、"0"序列组成前4位如图中所示对于所有串行EEPROM都是一样的。
对于24C02/32/64随后3位A2、A1和A0为器件地址位必须与硬件输入引脚保持一致。
对于24C04随后2位A2和A1为器件地址位另1位为页地址位。A2和A1必须与硬件输入引脚保持一致而A0是空脚。
对于24C08随后1位A2为器件地址位另2位为页地址位。A2必须与硬件输入引脚保持一致而A1和A0是空脚。
对于24C16无器件地址位3位都为页地址位而A2、A1和A0是空脚。
器件地址信息的LSB为读/写操作选择位,高为读操作,低为写操作。
若比较器件地址一致EEPROM将输出应答"0"。如果不一致,则返回到待机状态。
![](images/6f8cd9135f965151ed61693b94671cef0953207dba231451a79a5375ef1615a1.jpg)
图8 器件地址
## 器件操作
## 待机模式
EEPROM具有低功耗待机的特点条件为1电源上电2接收停止条件及完成任何内部操作后。
## 存储复位
当协议中产生中断、掉电或系统复位后, $I^{2}C$ 总线可通过以下步骤复位:
1产生9个时钟周期。
(2) 当SCL为高时SDA也为高。
(3) 产生一个起始条件。
## 写操作
## 1. 字节写
写操作要求在接收器件地址和ACK应答后接收8位的字地址。接收到这个地址后EEPROM应答"0"然后是一个8位数据。在接收8位数据后EEPROM应答"0",接着必须由主器件发送停止条件来终止写序列。
此时EEPROM进入内部写周期tWR数据写入非易失性存储器中在此期间所有输入都无效。直到写周期完成EEPROM才会有应答见图9
![](images/30a2090ab8d9403170895ca4117fc242a9e71da171288cba693a081a4539c776.jpg)
图9 字节写
电话0755-82568886 82568883
邮箱idchip@indreamchip.com
传真0755-82568886
网址www.idchip.cn
公司地址深圳市福田区滨河大道联合广场A座1308
## 13. 详细操作说明(续)
## 2. 页写
24C02器件按8字节/页执行页写24C04/08/16器件按16字节/页执行页写24C32/64器件按32字节/页执行页写。
页写初始化与字节写相同只是主器件不会在第一个数据后发送停止条件而是在EEPROM EEPROM收到每个数据后都应答“0”。最后仍需由主器件发送停止条件终止写序列见图10
接收到每个数据后字地址的低3位24C02或4位24C04/08/16或5位24C32/64内部自动加1高位地址位不变维持在当前页内。当内部产生的字地址达到该页边界地址时随后的数据将写入该页的页首。如果超过8个24C02或16个24C04/08/16或32个24C32/64数据传送给了EEPROM字地址将回转到该页的首字节先前的字节将会被覆盖。
![](images/8c22849289aa48205d253e2f4156315e5ff2c0e035c2a755ac563598d2f8870e.jpg)
图10页写
## 3. 应答查询
一旦内部写周期启动EEPROM输入无效此时即可启动应答查询发送起始条件和器件地址读/写位为期望的操作。只有内部写周期完成EEPROM才应答"0"。之后可继续读/写操作。
应答查询流程见图11。
![](images/8870eab0a63a479c4183441b9a4beceed35a6e9cca4cfbeb087ac48c7f81b2d8.jpg)
<details>
<summary>flowchart</summary>
```mermaid
graph TD
A["发送写命令"] --> B["发送停止条件\n启动写周期"]
B --> C["发送起始条件"]
C --> D["发送控制字节\nR/W = 0"]
D --> E{"器件是否应答\n(ACK = 0)?"}
E -->|否| C
E -->|是| F["下一操作"]
```
</details>
图11 应答查询流程
电话0755-82568886 82568883
邮箱idchip@indreamchip.com
传真0755-82568886
网址www.idchip.cn
公司地址深圳市福田区滨河大道联合广场A座1308
## 读操作
读操作与写操作初始化相同,只是器件地址中的读/写选择位应为"1"。有三种不同的读操作方式:当前地址读,随机读和顺序读。
## 1. 当前地址读
内部地址计数器保存着上次访问时最后一个地址加1的值。只要芯片有电该地址就一直保存。当读到最后页的最后字节地址会回转到0当写到某页尾的最后一个字节地址会回转到该页的首字节。
接收器件地址(读/写选择位为"1"、EEPROM应答ACK后当前地址的数据就随时钟送出。主器件无需应答"0"但需发送停止条件见图12
![](images/d9bfeedc4bcce65f4b0f1efdffd5284b1333d300c9ea79d7c2f0f9a3af90462d.jpg)
图12 当前地址读
## 2. 随机读
随机读需先写一个目标字地址一旦EEPROM接收器件地址和字地址并应答了ACK主器件就产生一个重复的起始条件。
然后,主器件发送器件地址(读/写选择位为"1"EEPROM应答ACK并随时钟送出数据。主器件无需应答"0"但需发送停止条件见图13
![](images/421790c202a01919147c762730b1d01863bf27b2b014a9cd06750cb98e7aa039.jpg)
图13 随机读
## 3. 顺序读
顺序读可以通过“当前地址读”或“随机读”启动。主器件接收到一个数据后应答ACK。只要EEPROM接收到ACK将自动增加字地址并继续随时钟发送后面的数据。若达到存储器地址末尾地址自动回转到0仍可继续顺序读取数据。
主器件不应答"0"而发送停止条件即可结束顺序读操作见图14
![](images/273cc9c991c594ec12065b7f1899338388085d1759f6e8c5b79a7fb11d9c6903.jpg)
图14 顺序读
电话0755-82568886 82568883
邮箱idchip@indreamchip.com
传真0755-82568886
网址www.idchip.cn
公司地址深圳市福田区滨河大道联合广场A座1308
## 14. 典型应用
![](images/475b4becc6ae83e4697a215910157bf2489b3a3af187fff9454f40609bc1a065.jpg)
<details>
<summary>text_image</summary>
U1 24C02
A0 VCC
1
A1 SCL
2
A2 SDA
3
GND WP
4
器件地址: 0xA2
U2 24C02
A0 VCC
1
A1 SCL
2
A2 SDA
3
GND WP
4
器件地址: 0xA0
Vcc
R1
10K
R2
10K
SCL
SDA
7
7
8
6
5
5
7
Vcc
</details>
图15 EEPROM的级联
## 15. 封装尺寸
## SOP8L
![](images/eba51943bd5f2beda585f8e9279369cb57b7a774eec360973f2a6882a32f1433.jpg)
<details>
<summary>text_image</summary>
A3
A1
A2
B1
B
A
</details>
![](images/b046e1014232d347dcf75379befa873d3977114c2ec09489907dae8d752b799f.jpg)
<details>
<summary>text_image</summary>
C1
C2
C
C3
</details>
![](images/6f745019aa2594536cb033d2faa05f065d5a1b4e091c66235a870986ff711441.jpg)
<details>
<summary>text_image</summary>
R2
θ4
θ1
θ2
θ3
R1
B2
D1
D
</details>
<table><tr><td rowspan="2">符号</td><td colspan="2">尺寸(mm)</td><td rowspan="2">符号</td><td colspan="2">尺寸(mm)</td></tr><tr><td>最小值</td><td>最大值</td><td>最小值</td><td>最大值</td></tr><tr><td>A</td><td>4.95</td><td>5.15</td><td>C3</td><td>0.05</td><td>0.20</td></tr><tr><td>A1</td><td>0.37</td><td>0.47</td><td>C4</td><td colspan="2">0.20(典型值)</td></tr><tr><td>A2</td><td colspan="2">1.27(典型值)</td><td>D</td><td colspan="2">1.05(典型值)</td></tr><tr><td>A3</td><td colspan="2">0.41(典型值)</td><td>D1</td><td>0.40</td><td>0.60</td></tr><tr><td>B</td><td>5.80</td><td>6.20</td><td>R1</td><td colspan="2">0.07(典型值)</td></tr><tr><td>B1</td><td>3.80</td><td>4.00</td><td>R2</td><td colspan="2">0.07(典型值)</td></tr><tr><td>B2</td><td colspan="2">5.0(典型值)</td><td>θ1</td><td colspan="2">17°(典型值)</td></tr><tr><td>C</td><td>1.30</td><td>1.50</td><td>θ2</td><td colspan="2">13°(典型值)</td></tr><tr><td>C1</td><td>0.55</td><td>0.65</td><td>θ3</td><td colspan="2">4°(典型值)</td></tr><tr><td>C2</td><td>0.55</td><td>0.65</td><td>θ4</td><td colspan="2">12°(典型值)</td></tr></table>
DIP8L
![](images/a1baeeedb5248a7f40711c629ce1e47c224edd5e73dd3379d68349d3a5da55cb.jpg)
<details>
<summary>text_image</summary>
A
B
</details>
![](images/a274c63a6a8b3ff4db32535684cc40cde6c819e4d726c47497edad6db437ace0.jpg)
<details>
<summary>text_image</summary>
D2
θ1
θ2
θ3
D1
D
</details>
![](images/8b7ea40276e71ed888a9d2098c54354ea79a2cdce9786de72368a6448ede2569.jpg)
<details>
<summary>text_image</summary>
C
C1
C2
C3
A5
A3
A1
A4
A2
C4
</details>
<table><tr><td rowspan="2">符号</td><td colspan="2">尺寸(mm)</td><td rowspan="2">符号</td><td colspan="2">尺寸(mm)</td></tr><tr><td>最小值</td><td>最大值</td><td>最小值</td><td>最大值</td></tr><tr><td>A</td><td>9.30</td><td>9.50</td><td>C2</td><td colspan="2">0.5(典型值)</td></tr><tr><td>A1</td><td colspan="2">1.524(典型值)</td><td>C3</td><td colspan="2">3.3(典型值)</td></tr><tr><td>A2</td><td>0.39</td><td>0.53</td><td>C4</td><td colspan="2">1.57(典型值)</td></tr><tr><td>A3</td><td colspan="2">2.54(典型值)</td><td>D</td><td>8.20</td><td>8.80</td></tr><tr><td>A4</td><td colspan="2">0.66(典型值)</td><td>D1</td><td>0.20</td><td>0.35</td></tr><tr><td>A5</td><td colspan="2">0.99(典型值)</td><td>D2</td><td>7.62</td><td>7.87</td></tr><tr><td>B</td><td>6.3</td><td>6.5</td><td>θ1</td><td colspan="2">8°(典型值)</td></tr><tr><td>C</td><td colspan="2">7.20(典型值)</td><td>θ2</td><td colspan="2">8°(典型值)</td></tr><tr><td>C1</td><td>3.30</td><td>3.50</td><td>θ3</td><td colspan="2">5°(典型值)</td></tr></table>
TSOT-23-5 PACKAGE OUTLINE DIMENSIONS
![](images/b4fcf3b07d9f62ea2a6c5352c8fec08881df2aff873b3988a3290866f45e1b8f.jpg)
<details>
<summary>text_image</summary>
D
b
E
E1
e
e1
</details>
![](images/47a06a68bc533e64ed9450794c00cb1ab7181ca88c7904f18bfd1117748a5a6a.jpg)
<details>
<summary>text_image</summary>
θ
0.2
L
c
</details>
![](images/c2f579a2e71a198b40cac5453045c0d8c4f22a2c4ccafb4bb876095b5a66efee.jpg)
<details>
<summary>text_image</summary>
A1
A2
A
</details>
<table><tr><td rowspan="2">Symbol</td><td colspan="2">Dimensions In Millimeters</td><td colspan="2">Dimensions In Inches</td></tr><tr><td>Min</td><td>Max</td><td>Min</td><td>Max</td></tr><tr><td>A</td><td>0.700</td><td>0.900</td><td>0.028</td><td>0.035</td></tr><tr><td>A1</td><td>0.000</td><td>0.100</td><td>0.000</td><td>0.004</td></tr><tr><td>A2</td><td>0.700</td><td>0.800</td><td>0.028</td><td>0.031</td></tr><tr><td>b</td><td>0.350</td><td>0.500</td><td>0.014</td><td>0.020</td></tr><tr><td>c</td><td>0.080</td><td>0.200</td><td>0.003</td><td>0.008</td></tr><tr><td>D</td><td>2.820</td><td>3.020</td><td>0.111</td><td>0.119</td></tr><tr><td>E</td><td>1.600</td><td>1.700</td><td>0.063</td><td>0.067</td></tr><tr><td>E1</td><td>2.650</td><td>2.950</td><td>0.104</td><td>0.116</td></tr><tr><td>e</td><td colspan="2">0.95 (BSC)</td><td colspan="2">0.037 (BSC)</td></tr><tr><td>e1</td><td colspan="2">1.90 (BSC)</td><td colspan="2">0.075 (BSC)</td></tr><tr><td>L</td><td>0.300</td><td>0.600</td><td>0.012</td><td>0.024</td></tr><tr><td>θ</td><td>0°</td><td>8°</td><td>0°</td><td>8°</td></tr></table>

115340
AT24C02.pdf Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,52 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.h
* @brief This file contains all the function prototypes for
* the i2c.c file
******************************************************************************
* @attention
*
* Copyright (c) 2026 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __I2C_H__
#define __I2C_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern I2C_HandleTypeDef hi2c1;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_I2C1_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __I2C_H__ */

View File

@@ -46,7 +46,7 @@
/*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
/*#define HAL_I2C_MODULE_ENABLED */
#define HAL_I2C_MODULE_ENABLED
/*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */

View File

@@ -71,7 +71,7 @@ void MX_ADC1_Init(void)
sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
sConfigInjected.InjectedNbrOfConversion = 4;
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_41CYCLES_5;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T3_CC4;
sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T4_TRGO;
sConfigInjected.AutoInjectedConv = DISABLE;
sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
sConfigInjected.InjectedOffset = 0;

View File

@@ -0,0 +1,117 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.c
* @brief This file provides code for the configuration
* of the I2C instances.
******************************************************************************
* @attention
*
* Copyright (c) 2026 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "i2c.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
I2C_HandleTypeDef hi2c1;
/* I2C1 init function */
void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
/* USER CODE END I2C1_Init 2 */
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C1 GPIO Configuration
PB8 ------> I2C1_SCL
PB9 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_AFIO_REMAP_I2C1_ENABLE();
/* I2C1 clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspDeInit 0 */
/* USER CODE END I2C1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration
PB8 ------> I2C1_SCL
PB9 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9);
/* USER CODE BEGIN I2C1_MspDeInit 1 */
/* USER CODE END I2C1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@@ -20,6 +20,7 @@
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "i2c.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
@@ -31,6 +32,7 @@
#include "button_driver.h"
#include "st7735s.h"
#include "lcd.h"
#include "at24c02.h"
/* USER CODE END Includes */
@@ -102,6 +104,7 @@ int main(void)
MX_TIM4_Init();
MX_ADC1_Init();
MX_TIM3_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
printf("\r\nSTM32F103C8T6 Boot OK\r\n");
button_driver_init();
@@ -115,17 +118,17 @@ int main(void)
lcd_draw_chinese_string(0, 32, "\xE9\x98\x9C\xE9\x98\xB3\xE5\xB8\x88\xE8\x8C\x83\xE5\xA4\xA7\xE5\xAD\xA6", COLOR_WHITE, COLOR_BLACK); /*阜阳师范大学*/
lcd_draw_chinese_string(0, 48, "\xE7\x94\xB5\xE5\xAD\x90\xE8\xAE\xBE\xE8\xAE\xA1\xE7\xAB\x9E\xE8\xB5\x9B", COLOR_WHITE, COLOR_BLACK); /*电子设计竞赛*/
/* 启动 TIM4 四路 PWM */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); /* PB6 */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); /* PB7 */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3); /* PB8 */
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4); /* PB9 */
/* 启动 TIM3 四路 PWMPA6 CH1, PA7 CH2, PB0 CH3, PB1 CH4 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);
/* 设置占空比0~999 对应 0%~100% */
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 500); /* 50% */
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, 250); /* 25% */
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 750); /* 75% */
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_4, 999); /* 100% */
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500); /* 50% */
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, 250); /* 25% */
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, 750); /* 75% */
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, 999); /* 100% */
/* === 测试:常规组软件触发,确认 ADC 硬件正常 === */
HAL_ADC_Start(&hadc1);
@@ -134,12 +137,51 @@ int main(void)
}
HAL_ADC_Stop(&hadc1);
/* 启动 TIM3 CH4产生 ADC 触发信号 */
HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_4);
/* 启动 TIM4TRGO = Update1kHz 触发 ADC1 注入组 */
HAL_TIM_Base_Start(&htim4);
/* 启动 ADC 注入组TIM3 每触发一次,自动采一轮 PA0~PA3 */
/* 启动 ADC 注入组TIM4 每触发一次,自动采一轮 PA0~PA3 */
HAL_ADCEx_InjectedStart(&hadc1);
/* === AT24C02 EEPROM 测试 === */
{
uint8_t wbuf[] = {0x11, 0x22, 0x33, 0x44, 0x55};
uint8_t rbuf[8];
int i, ret;
ret = at24c02_scan();
if (ret == AT24C02_OK) {
lcd_draw_string(0, 64, "AT24C02 OK", COLOR_GREEN, COLOR_BLACK);
} else {
lcd_draw_string(0, 64, "AT24C02 FAIL", COLOR_RED, COLOR_BLACK);
}
/* 在地址 0 写入 5 个字节 */
ret = at24c02_write_buf(0, wbuf, 5);
printf("AT24C02 write: %d\r\n", ret);
/* 从地址 0 读回 8 个字节 */
ret = at24c02_read_buf(0, rbuf, 8);
printf("AT24C02 read[%d]:", ret);
for (i = 0; i < 8; i++) {
printf(" %02X", rbuf[i]);
}
printf("\r\n");
/* 验证 */
lcd_draw_string(0, 80, "EEPROM:", COLOR_WHITE, COLOR_BLACK);
for (i = 0; i < 5; i++) {
if (rbuf[i] != wbuf[i]) {
printf("AT24C02 ERR: addr %d expect %02X got %02X\r\n",
i, wbuf[i], rbuf[i]);
break;
}
}
if (i == 5) {
printf("AT24C02 verify OK\r\n");
}
}
/* USER CODE END 2 */
/* Infinite loop */
@@ -152,7 +194,7 @@ int main(void)
HAL_Delay(1000);
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
/* 读取 ADC 注入组结果TIM3 以 1kHz 触发,每秒打印一次最新值) */
/* 读取 ADC 注入组结果TIM4 以 1kHz 触发,每秒打印一次最新值) */
uint16_t adc0 = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1);
uint16_t adc1 = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_2);
uint16_t adc2 = HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_3);
@@ -201,7 +243,7 @@ void SystemClock_Config(void)
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();

View File

@@ -71,15 +71,26 @@ void MX_TIM3_Init(void)
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 0;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* 注意:若从 CubeMX 重新生成,务必在 TIM3 CH4 的 OC Mode 选 PWM1Pulse 设 500
否则 ADC 注入组外部触发无法工作。
此处手动修改 sConfigOC.OCMode 和 sConfigOC.Pulse 为 PWM1/500 */
/* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
/* TIM4 init function */
@@ -92,7 +103,6 @@ void MX_TIM4_Init(void)
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM4_Init 1 */
@@ -112,42 +122,14 @@ void MX_TIM4_Init(void)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 0;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
sConfigOC.Pulse = 500;
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM4_Init 2 */
/* USER CODE END TIM4_Init 2 */
HAL_TIM_MspPostInit(&htim4);
}
@@ -181,27 +163,33 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM4)
if(timHandle->Instance==TIM3)
{
/* USER CODE BEGIN TIM4_MspPostInit 0 */
/* USER CODE BEGIN TIM3_MspPostInit 0 */
/* USER CODE END TIM4_MspPostInit 0 */
/* USER CODE END TIM3_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM4 GPIO Configuration
PB6 ------> TIM4_CH1
PB7 ------> TIM4_CH2
PB8 ------> TIM4_CH3
PB9 ------> TIM4_CH4
/**TIM3 GPIO Configuration
PA6 ------> TIM3_CH1
PA7 ------> TIM3_CH2
PB0 ------> TIM3_CH3
PB1 ------> TIM3_CH4
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN TIM4_MspPostInit 1 */
/* USER CODE BEGIN TIM3_MspPostInit 1 */
/* USER CODE END TIM4_MspPostInit 1 */
/* USER CODE END TIM3_MspPostInit 1 */
}
}

View File

@@ -0,0 +1,225 @@
/*
* 模块名称AT24C02 EEPROM 驱动
* 模块功能提供AT24C02的读写操作接口基于STM32 HAL I2C
* 适用平台STM32F103C8T6
* 作者:王建锋
* 创建日期2026-07-14
* 修改记录:
* 2026-07-14 王建锋 创建初始版本
*/
#include "at24c02.h"
#include <stdio.h>
/* 引用CubeMX生成的I2C句柄 */
extern I2C_HandleTypeDef hi2c1;
/*
* 函数功能AT24C02字节写入
* 入口参数addr - 目标地址0~255
* data - 要写入的数据
* 返回值: 0=成功,负值=错误码
* 函数说明:先发送写命令,再等待内部写周期完成
*/
int at24c02_write_byte(uint8_t addr, uint8_t data)
{
uint8_t buf[2];
HAL_StatusTypeDef hal_ret;
buf[0] = addr;
buf[1] = data;
hal_ret = HAL_I2C_Master_Transmit(&hi2c1, AT24C02_ADDR_WRITE,
buf, 2, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
/* 等待内部写周期完成 */
return at24c02_wait_ready();
}
/*
* 函数功能AT24C02随机读取
* 入口参数addr - 目标地址0~255
* 返回值:>=0=读取的数据,负值=错误码
* 函数说明:假写操作设定地址,再重新发送读命令读取
*/
int at24c02_read_byte(uint8_t addr)
{
uint8_t data;
HAL_StatusTypeDef hal_ret;
/* 假写:发送设备地址 + 字地址 */
hal_ret = HAL_I2C_Master_Transmit(&hi2c1, AT24C02_ADDR_WRITE,
&addr, 1, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
/* 重发起始条件 + 读 */
hal_ret = HAL_I2C_Master_Receive(&hi2c1, AT24C02_ADDR_READ,
&data, 1, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
return data;
}
/*
* 函数功能AT24C02页写入
* 入口参数addr - 起始地址0~255
* p_data - 数据缓冲区指针
* len - 写入长度≤8
* 返回值: 0=成功,负值=错误码
* 函数说明:页写入,自动等待写周期完成
*/
int at24c02_write_page(uint8_t addr, const uint8_t *p_data, uint8_t len)
{
uint8_t buf[AT24C02_PAGE_SIZE + 1];
HAL_StatusTypeDef hal_ret;
uint8_t i;
/* 参数校验 */
if ((p_data == NULL) || (len == 0) || (len > AT24C02_PAGE_SIZE)) {
return AT24C02_ERR_PARAM;
}
if (addr + len > AT24C02_SIZE) {
return AT24C02_ERR_PARAM;
}
buf[0] = addr;
for (i = 0; i < len; i++) {
buf[i + 1] = p_data[i];
}
hal_ret = HAL_I2C_Master_Transmit(&hi2c1, AT24C02_ADDR_WRITE,
buf, len + 1, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
/* 等待内部写周期完成 */
return at24c02_wait_ready();
}
/*
* 函数功能AT24C02连续写入跨页自动拆分
* 入口参数addr - 起始地址0~255
* p_data - 数据缓冲区指针
* len - 写入长度
* 返回值: 0=成功,负值=错误码
* 函数说明:自动处理跨页边界,逐页写入
*/
int at24c02_write_buf(uint8_t addr, const uint8_t *p_data, uint16_t len)
{
uint8_t page_remaining;
int ret;
if ((p_data == NULL) || (len == 0)) {
return AT24C02_ERR_PARAM;
}
if (addr + len > AT24C02_SIZE) {
return AT24C02_ERR_PARAM;
}
while (len > 0) {
/* 当前页剩余空间 */
page_remaining = AT24C02_PAGE_SIZE - (addr % AT24C02_PAGE_SIZE);
if (page_remaining > len) {
page_remaining = (uint8_t)len;
}
ret = at24c02_write_page(addr, p_data, page_remaining);
if (ret != AT24C02_OK) {
return ret;
}
addr += page_remaining;
p_data += page_remaining;
len -= page_remaining;
}
return AT24C02_OK;
}
/*
* 函数功能AT24C02连续读取
* 入口参数addr - 起始地址0~255
* p_buf - 接收缓冲区指针
* len - 读取长度
* 返回值: 0=成功,负值=错误码
* 函数说明:从指定地址开始顺序读取多个字节
*/
int at24c02_read_buf(uint8_t addr, uint8_t *p_buf, uint16_t len)
{
HAL_StatusTypeDef hal_ret;
if ((p_buf == NULL) || (len == 0)) {
return AT24C02_ERR_PARAM;
}
if (addr + len > AT24C02_SIZE) {
return AT24C02_ERR_PARAM;
}
/* 假写:设定读起始地址 */
hal_ret = HAL_I2C_Master_Transmit(&hi2c1, AT24C02_ADDR_WRITE,
&addr, 1, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
/* 顺序读 */
hal_ret = HAL_I2C_Master_Receive(&hi2c1, AT24C02_ADDR_READ,
p_buf, len, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
return AT24C02_ERR_I2C;
}
return AT24C02_OK;
}
/*
* 函数功能检测AT24C02设备是否存在
* 入口参数:无
* 返回值: 0=检测到设备,-1=未响应
* 函数说明通过I2C发送设备地址检查是否有ACK应答
*/
int at24c02_scan(void)
{
HAL_StatusTypeDef hal_ret;
hal_ret = HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_ADDR_WRITE,
3, AT24C02_I2C_TIMEOUT);
if (hal_ret != HAL_OK) {
printf("AT24C02: no device found\r\n");
return AT24C02_ERR_DEVICE;
}
printf("AT24C02: device detected\r\n");
return AT24C02_OK;
}
/*
* 函数功能:等待内部写周期完成(应答查询)
* 入口参数:无
* 返回值: 0=完成,-3=超时
* 函数说明:发送设备地址(写模式),直到器件应答
*/
int at24c02_wait_ready(void)
{
HAL_StatusTypeDef hal_ret;
uint16_t trials = 50;
while (trials--) {
hal_ret = HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_ADDR_WRITE,
1, 1);
if (hal_ret == HAL_OK) {
return AT24C02_OK;
}
HAL_Delay(1);
}
return AT24C02_ERR_TIMEOUT;
}

View File

@@ -0,0 +1,102 @@
/*
* 模块名称AT24C02 EEPROM 驱动
* 模块功能提供AT24C02的读写操作接口基于STM32 HAL I2C
* 适用平台STM32F103C8T6
* 作者:王建锋
* 创建日期2026-07-14
* 修改记录:
* 2026-07-14 王建锋 创建初始版本
*/
#ifndef __AT24C02_H
#define __AT24C02_H
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
/* AT24C02 器件参数 */
#define AT24C02_ADDR_WRITE 0xA0 /* 写设备地址 (A2=A1=A0=GND) */
#define AT24C02_ADDR_READ 0xA1 /* 读设备地址 */
#define AT24C02_SIZE 256 /* 总字节数 */
#define AT24C02_PAGE_SIZE 8 /* 页大小 */
#define AT24C02_PAGE_NUM 32 /* 总页数 */
#define AT24C02_I2C_TIMEOUT 100 /* I2C 通讯超时 (ms) */
/* AT24C02 操作返回值 */
#define AT24C02_OK 0 /* 操作成功 */
#define AT24C02_ERR_DEVICE -1 /* 设备未响应 */
#define AT24C02_ERR_I2C -2 /* I2C通讯错误 */
#define AT24C02_ERR_TIMEOUT -3 /* 写周期超时 */
#define AT24C02_ERR_PARAM -4 /* 参数错误 */
/*
* 函数功能检测AT24C02设备是否存在
* 入口参数:无
* 返回值: 0=检测到设备,-1=未响应
* 函数说明通过I2C发送设备地址检查是否有ACK应答
*/
int at24c02_scan(void);
/*
* 函数功能AT24C02字节写入
* 入口参数addr - 目标地址0~255
* data - 要写入的数据
* 返回值: 0=成功,负值=错误码
* 函数说明:先发送写命令,再等待内部写周期完成
*/
int at24c02_write_byte(uint8_t addr, uint8_t data);
/*
* 函数功能AT24C02随机读取
* 入口参数addr - 目标地址0~255
* 返回值:>=0=读取的数据,负值=错误码
* 函数说明:假写操作设定地址,再重新发送读命令读取
*/
int at24c02_read_byte(uint8_t addr);
/*
* 函数功能AT24C02页写入不超过页边界
* 入口参数addr - 起始地址0~255
* p_data - 数据缓冲区指针
* len - 写入长度≤8
* 返回值: 0=成功,负值=错误码
* 函数说明:页写入,自动等待写周期完成
*/
int at24c02_write_page(uint8_t addr, const uint8_t *p_data, uint8_t len);
/*
* 函数功能AT24C02连续写入跨页自动拆分
* 入口参数addr - 起始地址0~255
* p_data - 数据缓冲区指针
* len - 写入长度
* 返回值: 0=成功,负值=错误码
* 函数说明:自动处理跨页边界,逐页写入
*/
int at24c02_write_buf(uint8_t addr, const uint8_t *p_data, uint16_t len);
/*
* 函数功能AT24C02连续读取
* 入口参数addr - 起始地址0~255
* p_buf - 接收缓冲区指针
* len - 读取长度
* 返回值: 0=成功,负值=错误码
* 函数说明:从指定地址开始顺序读取多个字节
*/
int at24c02_read_buf(uint8_t addr, uint8_t *p_buf, uint16_t len);
/*
* 函数功能:等待内部写周期完成(应答查询)
* 入口参数:无
* 返回值: 0=完成,-3=超时
* 函数说明:发送设备地址(写模式),直到器件应答
*/
int at24c02_wait_ready(void);
#ifdef __cplusplus
}
#endif
#endif /* __AT24C02_H */

View File

@@ -0,0 +1,738 @@
/**
******************************************************************************
* @file stm32f1xx_hal_i2c.h
* @author MCD Application Team
* @brief Header file of I2C HAL module.
******************************************************************************
* @attention
*
* Copyright (c) 2016 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_HAL_I2C_H
#define __STM32F1xx_HAL_I2C_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal_def.h"
/** @addtogroup STM32F1xx_HAL_Driver
* @{
*/
/** @addtogroup I2C
* @{
*/
/* Exported types ------------------------------------------------------------*/
/** @defgroup I2C_Exported_Types I2C Exported Types
* @{
*/
/** @defgroup I2C_Configuration_Structure_definition I2C Configuration Structure definition
* @brief I2C Configuration Structure definition
* @{
*/
typedef struct
{
uint32_t ClockSpeed; /*!< Specifies the clock frequency.
This parameter must be set to a value lower than 400kHz */
uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle.
This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
uint32_t OwnAddress1; /*!< Specifies the first device own address.
This parameter can be a 7-bit or 10-bit address. */
uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected.
This parameter can be a value of @ref I2C_addressing_mode */
uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected.
This parameter can be a value of @ref I2C_dual_addressing_mode */
uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected
This parameter can be a 7-bit address. */
uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected.
This parameter can be a value of @ref I2C_general_call_addressing_mode */
uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected.
This parameter can be a value of @ref I2C_nostretch_mode */
} I2C_InitTypeDef;
/**
* @}
*/
/** @defgroup HAL_state_structure_definition HAL state structure definition
* @brief HAL State structure definition
* @note HAL I2C State value coding follow below described bitmap :
* b7-b6 Error information
* 00 : No Error
* 01 : Abort (Abort user request on going)
* 10 : Timeout
* 11 : Error
* b5 Peripheral initialization status
* 0 : Reset (Peripheral not initialized)
* 1 : Init done (Peripheral initialized and ready to use. HAL I2C Init function called)
* b4 (not used)
* x : Should be set to 0
* b3
* 0 : Ready or Busy (No Listen mode ongoing)
* 1 : Listen (Peripheral in Address Listen Mode)
* b2 Intrinsic process state
* 0 : Ready
* 1 : Busy (Peripheral busy with some configuration or internal operations)
* b1 Rx state
* 0 : Ready (no Rx operation ongoing)
* 1 : Busy (Rx operation ongoing)
* b0 Tx state
* 0 : Ready (no Tx operation ongoing)
* 1 : Busy (Tx operation ongoing)
* @{
*/
typedef enum
{
HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */
HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */
HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */
HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */
HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */
HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */
HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission
process is ongoing */
HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception
process is ongoing */
HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */
HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */
HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */
} HAL_I2C_StateTypeDef;
/**
* @}
*/
/** @defgroup HAL_mode_structure_definition HAL mode structure definition
* @brief HAL Mode structure definition
* @note HAL I2C Mode value coding follow below described bitmap :\n
* b7 (not used)\n
* x : Should be set to 0\n
* b6\n
* 0 : None\n
* 1 : Memory (HAL I2C communication is in Memory Mode)\n
* b5\n
* 0 : None\n
* 1 : Slave (HAL I2C communication is in Slave Mode)\n
* b4\n
* 0 : None\n
* 1 : Master (HAL I2C communication is in Master Mode)\n
* b3-b2-b1-b0 (not used)\n
* xxxx : Should be set to 0000
* @{
*/
typedef enum
{
HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */
HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */
HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */
HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */
} HAL_I2C_ModeTypeDef;
/**
* @}
*/
/** @defgroup I2C_Error_Code_definition I2C Error Code definition
* @brief I2C Error Code definition
* @{
*/
#define HAL_I2C_ERROR_NONE 0x00000000U /*!< No error */
#define HAL_I2C_ERROR_BERR 0x00000001U /*!< BERR error */
#define HAL_I2C_ERROR_ARLO 0x00000002U /*!< ARLO error */
#define HAL_I2C_ERROR_AF 0x00000004U /*!< AF error */
#define HAL_I2C_ERROR_OVR 0x00000008U /*!< OVR error */
#define HAL_I2C_ERROR_DMA 0x00000010U /*!< DMA transfer error */
#define HAL_I2C_ERROR_TIMEOUT 0x00000020U /*!< Timeout Error */
#define HAL_I2C_ERROR_SIZE 0x00000040U /*!< Size Management error */
#define HAL_I2C_ERROR_DMA_PARAM 0x00000080U /*!< DMA Parameter Error */
#define HAL_I2C_WRONG_START 0x00000200U /*!< Wrong start Error */
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
#define HAL_I2C_ERROR_INVALID_CALLBACK 0x00000100U /*!< Invalid Callback error */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition
* @brief I2C handle Structure definition
* @{
*/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
typedef struct __I2C_HandleTypeDef
#else
typedef struct
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
{
I2C_TypeDef *Instance; /*!< I2C registers base address */
I2C_InitTypeDef Init; /*!< I2C communication parameters */
uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */
uint16_t XferSize; /*!< I2C transfer size */
__IO uint16_t XferCount; /*!< I2C transfer counter */
__IO uint32_t XferOptions; /*!< I2C transfer options */
__IO uint32_t PreviousState; /*!< I2C communication Previous state and mode
context for internal usage */
DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */
DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */
HAL_LockTypeDef Lock; /*!< I2C locking object */
__IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */
__IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode */
__IO uint32_t ErrorCode; /*!< I2C Error code */
__IO uint32_t Devaddress; /*!< I2C Target device address */
__IO uint32_t Memaddress; /*!< I2C Target memory address */
__IO uint32_t MemaddSize; /*!< I2C Target memory address size */
__IO uint32_t EventCount; /*!< I2C Event counter */
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Tx Transfer completed callback */
void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Master Rx Transfer completed callback */
void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Tx Transfer completed callback */
void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Slave Rx Transfer completed callback */
void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Listen Complete callback */
void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Tx Transfer completed callback */
void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Memory Rx Transfer completed callback */
void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Error callback */
void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Abort callback */
void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< I2C Slave Address Match callback */
void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp Init callback */
void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*!< I2C Msp DeInit callback */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
} I2C_HandleTypeDef;
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
/**
* @brief HAL I2C Callback ID enumeration definition
*/
typedef enum
{
HAL_I2C_MASTER_TX_COMPLETE_CB_ID = 0x00U, /*!< I2C Master Tx Transfer completed callback ID */
HAL_I2C_MASTER_RX_COMPLETE_CB_ID = 0x01U, /*!< I2C Master Rx Transfer completed callback ID */
HAL_I2C_SLAVE_TX_COMPLETE_CB_ID = 0x02U, /*!< I2C Slave Tx Transfer completed callback ID */
HAL_I2C_SLAVE_RX_COMPLETE_CB_ID = 0x03U, /*!< I2C Slave Rx Transfer completed callback ID */
HAL_I2C_LISTEN_COMPLETE_CB_ID = 0x04U, /*!< I2C Listen Complete callback ID */
HAL_I2C_MEM_TX_COMPLETE_CB_ID = 0x05U, /*!< I2C Memory Tx Transfer callback ID */
HAL_I2C_MEM_RX_COMPLETE_CB_ID = 0x06U, /*!< I2C Memory Rx Transfer completed callback ID */
HAL_I2C_ERROR_CB_ID = 0x07U, /*!< I2C Error callback ID */
HAL_I2C_ABORT_CB_ID = 0x08U, /*!< I2C Abort callback ID */
HAL_I2C_MSPINIT_CB_ID = 0x09U, /*!< I2C Msp Init callback ID */
HAL_I2C_MSPDEINIT_CB_ID = 0x0AU /*!< I2C Msp DeInit callback ID */
} HAL_I2C_CallbackIDTypeDef;
/**
* @brief HAL I2C Callback pointer definition
*/
typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*!< pointer to an I2C callback function */
typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*!< pointer to an I2C Address Match callback function */
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/**
* @}
*/
/* Exported constants --------------------------------------------------------*/
/** @defgroup I2C_Exported_Constants I2C Exported Constants
* @{
*/
/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode
* @{
*/
#define I2C_DUTYCYCLE_2 0x00000000U
#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY
/**
* @}
*/
/** @defgroup I2C_addressing_mode I2C addressing mode
* @{
*/
#define I2C_ADDRESSINGMODE_7BIT 0x00004000U
#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | 0x00004000U)
/**
* @}
*/
/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode
* @{
*/
#define I2C_DUALADDRESS_DISABLE 0x00000000U
#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL
/**
* @}
*/
/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode
* @{
*/
#define I2C_GENERALCALL_DISABLE 0x00000000U
#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC
/**
* @}
*/
/** @defgroup I2C_nostretch_mode I2C nostretch mode
* @{
*/
#define I2C_NOSTRETCH_DISABLE 0x00000000U
#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH
/**
* @}
*/
/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size
* @{
*/
#define I2C_MEMADD_SIZE_8BIT 0x00000001U
#define I2C_MEMADD_SIZE_16BIT 0x00000010U
/**
* @}
*/
/** @defgroup I2C_XferDirection_definition I2C XferDirection definition
* @{
*/
#define I2C_DIRECTION_RECEIVE 0x00000000U
#define I2C_DIRECTION_TRANSMIT 0x00000001U
/**
* @}
*/
/** @defgroup I2C_XferOptions_definition I2C XferOptions definition
* @{
*/
#define I2C_FIRST_FRAME 0x00000001U
#define I2C_FIRST_AND_NEXT_FRAME 0x00000002U
#define I2C_NEXT_FRAME 0x00000004U
#define I2C_FIRST_AND_LAST_FRAME 0x00000008U
#define I2C_LAST_FRAME_NO_STOP 0x00000010U
#define I2C_LAST_FRAME 0x00000020U
/* List of XferOptions in usage of :
* 1- Restart condition in all use cases (direction change or not)
*/
#define I2C_OTHER_FRAME (0x00AA0000U)
#define I2C_OTHER_AND_LAST_FRAME (0xAA000000U)
/**
* @}
*/
/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition
* @brief I2C Interrupt definition
* Elements values convention: 0xXXXXXXXX
* - XXXXXXXX : Interrupt control mask
* @{
*/
#define I2C_IT_BUF I2C_CR2_ITBUFEN
#define I2C_IT_EVT I2C_CR2_ITEVTEN
#define I2C_IT_ERR I2C_CR2_ITERREN
/**
* @}
*/
/** @defgroup I2C_Flag_definition I2C Flag definition
* @{
*/
#define I2C_FLAG_OVR 0x00010800U
#define I2C_FLAG_AF 0x00010400U
#define I2C_FLAG_ARLO 0x00010200U
#define I2C_FLAG_BERR 0x00010100U
#define I2C_FLAG_TXE 0x00010080U
#define I2C_FLAG_RXNE 0x00010040U
#define I2C_FLAG_STOPF 0x00010010U
#define I2C_FLAG_ADD10 0x00010008U
#define I2C_FLAG_BTF 0x00010004U
#define I2C_FLAG_ADDR 0x00010002U
#define I2C_FLAG_SB 0x00010001U
#define I2C_FLAG_DUALF 0x00100080U
#define I2C_FLAG_GENCALL 0x00100010U
#define I2C_FLAG_TRA 0x00100004U
#define I2C_FLAG_BUSY 0x00100002U
#define I2C_FLAG_MSL 0x00100001U
/**
* @}
*/
/**
* @}
*/
/* Exported macros -----------------------------------------------------------*/
/** @defgroup I2C_Exported_Macros I2C Exported Macros
* @{
*/
/** @brief Reset I2C handle state.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \
(__HANDLE__)->State = HAL_I2C_STATE_RESET; \
(__HANDLE__)->MspInitCallback = NULL; \
(__HANDLE__)->MspDeInitCallback = NULL; \
} while(0)
#else
#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
#endif
/** @brief Enable or disable the specified I2C interrupts.
* @param __HANDLE__ specifies the I2C Handle.
* @param __INTERRUPT__ specifies the interrupt source to enable or disable.
* This parameter can be one of the following values:
* @arg I2C_IT_BUF: Buffer interrupt enable
* @arg I2C_IT_EVT: Event interrupt enable
* @arg I2C_IT_ERR: Error interrupt enable
* @retval None
*/
#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__))
#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->CR2, (__INTERRUPT__))
/** @brief Checks if the specified I2C interrupt source is enabled or disabled.
* @param __HANDLE__ specifies the I2C Handle.
* @param __INTERRUPT__ specifies the I2C interrupt source to check.
* This parameter can be one of the following values:
* @arg I2C_IT_BUF: Buffer interrupt enable
* @arg I2C_IT_EVT: Event interrupt enable
* @arg I2C_IT_ERR: Error interrupt enable
* @retval The new state of __INTERRUPT__ (TRUE or FALSE).
*/
#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
/** @brief Checks whether the specified I2C flag is set or not.
* @param __HANDLE__ specifies the I2C Handle.
* @param __FLAG__ specifies the flag to check.
* This parameter can be one of the following values:
* @arg I2C_FLAG_OVR: Overrun/Underrun flag
* @arg I2C_FLAG_AF: Acknowledge failure flag
* @arg I2C_FLAG_ARLO: Arbitration lost flag
* @arg I2C_FLAG_BERR: Bus error flag
* @arg I2C_FLAG_TXE: Data register empty flag
* @arg I2C_FLAG_RXNE: Data register not empty flag
* @arg I2C_FLAG_STOPF: Stop detection flag
* @arg I2C_FLAG_ADD10: 10-bit header sent flag
* @arg I2C_FLAG_BTF: Byte transfer finished flag
* @arg I2C_FLAG_ADDR: Address sent flag
* Address matched flag
* @arg I2C_FLAG_SB: Start bit flag
* @arg I2C_FLAG_DUALF: Dual flag
* @arg I2C_FLAG_GENCALL: General call header flag
* @arg I2C_FLAG_TRA: Transmitter/Receiver flag
* @arg I2C_FLAG_BUSY: Bus busy flag
* @arg I2C_FLAG_MSL: Master/Slave flag
* @retval The new state of __FLAG__ (TRUE or FALSE).
*/
#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16U)) == 0x01U) ? \
(((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET) : \
(((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET))
/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit.
* @param __HANDLE__ specifies the I2C Handle.
* @param __FLAG__ specifies the flag to clear.
* This parameter can be any combination of the following values:
* @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
* @arg I2C_FLAG_AF: Acknowledge failure flag
* @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
* @arg I2C_FLAG_BERR: Bus error flag
* @retval None
*/
#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK))
/** @brief Clears the I2C ADDR pending flag.
* @param __HANDLE__ specifies the I2C Handle.
* This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral.
* @retval None
*/
#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \
do{ \
__IO uint32_t tmpreg = 0x00U; \
tmpreg = (__HANDLE__)->Instance->SR1; \
tmpreg = (__HANDLE__)->Instance->SR2; \
UNUSED(tmpreg); \
} while(0)
/** @brief Clears the I2C STOPF pending flag.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \
do{ \
__IO uint32_t tmpreg = 0x00U; \
tmpreg = (__HANDLE__)->Instance->SR1; \
SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE); \
UNUSED(tmpreg); \
} while(0)
/** @brief Enable the specified I2C peripheral.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
/** @brief Disable the specified I2C peripheral.
* @param __HANDLE__ specifies the I2C Handle.
* @retval None
*/
#define __HAL_I2C_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup I2C_Exported_Functions
* @{
*/
/** @addtogroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions
* @{
*/
/* Initialization and de-initialization functions******************************/
HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);
/* Callbacks Register/UnRegister functions ***********************************/
#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);
HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */
/**
* @}
*/
/** @addtogroup I2C_Exported_Functions_Group2 Input and Output operation functions
* @{
*/
/* IO operation functions ****************************************************/
/******* Blocking mode: Polling */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
/******* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);
/******* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
/**
* @}
*/
/** @addtogroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks
* @{
*/
/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */
void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);
void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);
/**
* @}
*/
/** @addtogroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions
* @{
*/
/* Peripheral State, Mode and Error functions *********************************/
HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);
HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);
/**
* @}
*/
/**
* @}
*/
/* Private types -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private constants ---------------------------------------------------------*/
/** @defgroup I2C_Private_Constants I2C Private Constants
* @{
*/
#define I2C_FLAG_MASK 0x0000FFFFU
#define I2C_MIN_PCLK_FREQ_STANDARD 2000000U /*!< 2 MHz */
#define I2C_MIN_PCLK_FREQ_FAST 4000000U /*!< 4 MHz */
/**
* @}
*/
/* Private macros ------------------------------------------------------------*/
/** @defgroup I2C_Private_Macros I2C Private Macros
* @{
*/
#define I2C_MIN_PCLK_FREQ(__PCLK__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__PCLK__) < I2C_MIN_PCLK_FREQ_STANDARD) : ((__PCLK__) < I2C_MIN_PCLK_FREQ_FAST))
#define I2C_CCR_CALCULATION(__PCLK__, __SPEED__, __COEFF__) (((((__PCLK__) - 1U)/((__SPEED__) * (__COEFF__))) + 1U) & I2C_CCR_CCR)
#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000U)
#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000U) ? ((__FREQRANGE__) + 1U) : ((((__FREQRANGE__) * 300U) / 1000U) + 1U))
#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) ((I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U) < 4U)? 4U:I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 2U))
#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 3U) : (I2C_CCR_CALCULATION((__PCLK__), (__SPEED__), 25U) | I2C_DUTYCYCLE_16_9))
#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000U)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \
((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0U)? 1U : \
((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS))
#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (uint8_t)(~I2C_OAR1_ADD0)))
#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0))
#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)0x00F0)))
#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0x0300)) >> 7) | (uint16_t)(0x00F1))))
#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)0xFF00)) >> 8)))
#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)0x00FF)))
/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters
* @{
*/
#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \
((CYCLE) == I2C_DUTYCYCLE_16_9))
#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \
((ADDRESS) == I2C_ADDRESSINGMODE_10BIT))
#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \
((ADDRESS) == I2C_DUALADDRESS_ENABLE))
#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \
((CALL) == I2C_GENERALCALL_ENABLE))
#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \
((STRETCH) == I2C_NOSTRETCH_ENABLE))
#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
((SIZE) == I2C_MEMADD_SIZE_16BIT))
#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0U) && ((SPEED) <= 400000U))
#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & 0xFFFFFC00U) == 0U)
#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & 0xFFFFFF01U) == 0U)
#define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \
((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \
((REQUEST) == I2C_NEXT_FRAME) || \
((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \
((REQUEST) == I2C_LAST_FRAME) || \
((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \
IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
#define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \
((REQUEST) == I2C_OTHER_AND_LAST_FRAME))
#define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
#define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)
/**
* @}
*/
/**
* @}
*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup I2C_Private_Functions I2C Private Functions
* @{
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* __STM32F1xx_HAL_I2C_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -340,7 +340,7 @@
<MiscControls></MiscControls>
<Define>USE_HAL_DRIVER,STM32F103xB</Define>
<Undefine></Undefine>
<IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Drivers/BSP/MultiButton;../Drivers/BSP/LCD</IncludePath>
<IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;../Drivers/BSP/MultiButton;../Drivers/BSP/LCD;..\Drivers\BSP\AT24C02</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -516,6 +516,62 @@
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>i2c.c</FileName>
<FileType>1</FileType>
<FilePath>../Core/Src/i2c.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>0</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>spi.c</FileName>
<FileType>1</FileType>
@@ -815,6 +871,62 @@
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c</FilePath>
</File>
<File>
<FileName>stm32f1xx_hal_i2c.c</FileName>
<FileType>1</FileType>
<FilePath>../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c</FilePath>
<FileOption>
<CommonProperty>
<UseCPPCompiler>2</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
<StopOnExitCode>11</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<FileArmAds>
<Cads>
<interw>2</interw>
<Optim>0</Optim>
<oTime>2</oTime>
<SplitLS>2</SplitLS>
<OneElfS>2</OneElfS>
<Strict>2</Strict>
<EnumInt>2</EnumInt>
<PlainCh>2</PlainCh>
<Ropi>2</Ropi>
<Rwpi>2</Rwpi>
<wLevel>0</wLevel>
<uThumb>2</uThumb>
<uSurpInc>2</uSurpInc>
<uC99>2</uC99>
<uGnu>2</uGnu>
<useXO>2</useXO>
<v6Lang>0</v6Lang>
<v6LangP>0</v6LangP>
<vShortEn>2</vShortEn>
<vShortWch>2</vShortWch>
<v6Lto>2</v6Lto>
<v6WtE>2</v6WtE>
<v6Rtti>2</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
</FileArmAds>
</FileOption>
</File>
<File>
<FileName>stm32f1xx_hal_spi.c</FileName>
<FileType>1</FileType>
@@ -1033,6 +1145,11 @@
<FileType>1</FileType>
<FilePath>..\Drivers\BSP\MultiButton\multi_button.c</FilePath>
</File>
<File>
<FileName>at24c02.c</FileName>
<FileType>1</FileType>
<FilePath>..\Drivers\BSP\AT24C02\at24c02.c</FilePath>
</File>
</Files>
</Group>
<Group>

View File

@@ -4,6 +4,7 @@
"stm32f103c8t6\gpio.o"
"stm32f103c8t6\adc.o"
"stm32f103c8t6\dma.o"
"stm32f103c8t6\i2c.o"
"stm32f103c8t6\spi.o"
"stm32f103c8t6\tim.o"
"stm32f103c8t6\usart.o"
@@ -22,6 +23,7 @@
"stm32f103c8t6\stm32f1xx_hal_flash.o"
"stm32f103c8t6\stm32f1xx_hal_flash_ex.o"
"stm32f103c8t6\stm32f1xx_hal_exti.o"
"stm32f103c8t6\stm32f1xx_hal_i2c.o"
"stm32f103c8t6\stm32f1xx_hal_spi.o"
"stm32f103c8t6\stm32f1xx_hal_tim.o"
"stm32f103c8t6\stm32f1xx_hal_tim_ex.o"
@@ -33,6 +35,7 @@
"stm32f103c8t6\st7735s_1.o"
"stm32f103c8t6\button_driver_1.o"
"stm32f103c8t6\multi_button_1.o"
"stm32f103c8t6\at24c02.o"
--strict --scatter "STM32F103C8T6\STM32F103C8T6.sct"
--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols
--info sizes --info totals --info unused --info veneers

Binary file not shown.

Binary file not shown.

View File

@@ -5,7 +5,7 @@ ADC1.Channel-2\#ChannelInjectedConversion=ADC_CHANNEL_1
ADC1.Channel-3\#ChannelInjectedConversion=ADC_CHANNEL_2
ADC1.Channel-4\#ChannelInjectedConversion=ADC_CHANNEL_3
ADC1.EnableInjectedConversion=ENABLE
ADC1.ExternalTrigInjecConv=ADC_EXTERNALTRIGINJECCONV_T3_CC4
ADC1.ExternalTrigInjecConv=ADC_EXTERNALTRIGINJECCONV_T4_TRGO
ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,master,EnableInjectedConversion,InjectedRank-1\#ChannelInjectedConversion,Channel-1\#ChannelInjectedConversion,SamplingTime-1\#ChannelInjectedConversion,InjectedOffset-1\#ChannelInjectedConversion,InjectedRank-2\#ChannelInjectedConversion,Channel-2\#ChannelInjectedConversion,SamplingTime-2\#ChannelInjectedConversion,InjectedOffset-2\#ChannelInjectedConversion,InjectedRank-3\#ChannelInjectedConversion,Channel-3\#ChannelInjectedConversion,SamplingTime-3\#ChannelInjectedConversion,InjectedOffset-3\#ChannelInjectedConversion,InjectedRank-4\#ChannelInjectedConversion,Channel-4\#ChannelInjectedConversion,SamplingTime-4\#ChannelInjectedConversion,InjectedOffset-4\#ChannelInjectedConversion,InjNumberOfConversion,ExternalTrigInjecConv
ADC1.InjNumberOfConversion=4
ADC1.InjectedOffset-1\#ChannelInjectedConversion=0
@@ -45,46 +45,48 @@ Mcu.CPN=STM32F103C8T6
Mcu.Family=STM32F1
Mcu.IP0=ADC1
Mcu.IP1=DMA
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=SPI2
Mcu.IP5=SYS
Mcu.IP6=TIM3
Mcu.IP7=TIM4
Mcu.IP8=USART1
Mcu.IPNb=9
Mcu.IP2=I2C1
Mcu.IP3=NVIC
Mcu.IP4=RCC
Mcu.IP5=SPI2
Mcu.IP6=SYS
Mcu.IP7=TIM3
Mcu.IP8=TIM4
Mcu.IP9=USART1
Mcu.IPNb=10
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PC14-OSC32_IN
Mcu.Pin10=PB11
Mcu.Pin11=PB12
Mcu.Pin12=PB13
Mcu.Pin13=PB15
Mcu.Pin14=PA9
Mcu.Pin15=PA10
Mcu.Pin16=PA13
Mcu.Pin17=PA14
Mcu.Pin18=PB3
Mcu.Pin19=PB4
Mcu.Pin10=PA7
Mcu.Pin11=PB0
Mcu.Pin12=PB1
Mcu.Pin13=PB10
Mcu.Pin14=PB11
Mcu.Pin15=PB12
Mcu.Pin16=PB13
Mcu.Pin17=PB15
Mcu.Pin18=PA9
Mcu.Pin19=PA10
Mcu.Pin2=PC15-OSC32_OUT
Mcu.Pin20=PB5
Mcu.Pin21=PB6
Mcu.Pin22=PB7
Mcu.Pin23=PB8
Mcu.Pin24=PB9
Mcu.Pin25=VP_SYS_VS_Systick
Mcu.Pin26=VP_TIM3_VS_ClockSourceINT
Mcu.Pin27=VP_TIM3_VS_no_output4
Mcu.Pin28=VP_TIM4_VS_ClockSourceINT
Mcu.Pin20=PA13
Mcu.Pin21=PA14
Mcu.Pin22=PB3
Mcu.Pin23=PB4
Mcu.Pin24=PB5
Mcu.Pin25=PB8
Mcu.Pin26=PB9
Mcu.Pin27=VP_SYS_VS_Systick
Mcu.Pin28=VP_TIM3_VS_ClockSourceINT
Mcu.Pin29=VP_TIM4_VS_ClockSourceINT
Mcu.Pin3=PD0-OSC_IN
Mcu.Pin4=PD1-OSC_OUT
Mcu.Pin5=PA0-WKUP
Mcu.Pin6=PA1
Mcu.Pin7=PA2
Mcu.Pin8=PA3
Mcu.Pin9=PB10
Mcu.PinsNb=29
Mcu.Pin9=PA6
Mcu.PinsNb=30
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103C8Tx
@@ -116,8 +118,16 @@ PA2.Locked=true
PA2.Signal=ADCx_IN2
PA3.Locked=true
PA3.Signal=ADCx_IN3
PA6.Locked=true
PA6.Signal=S_TIM3_CH1
PA7.Locked=true
PA7.Signal=S_TIM3_CH2
PA9.Mode=Asynchronous
PA9.Signal=USART1_TX
PB0.Locked=true
PB0.Signal=S_TIM3_CH3
PB1.Locked=true
PB1.Signal=S_TIM3_CH4
PB10.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label
PB10.GPIO_Label=LCD_DC
PB10.GPIO_PuPd=GPIO_PULLUP
@@ -158,14 +168,12 @@ PB5.GPIO_Label=KEY2
PB5.GPIO_PuPd=GPIO_PULLDOWN
PB5.Locked=true
PB5.Signal=GPIO_Input
PB6.Locked=true
PB6.Signal=S_TIM4_CH1
PB7.Locked=true
PB7.Signal=S_TIM4_CH2
PB8.Locked=true
PB8.Signal=S_TIM4_CH3
PB8.Mode=I2C
PB8.Signal=I2C1_SCL
PB9.Locked=true
PB9.Signal=S_TIM4_CH4
PB9.Mode=I2C
PB9.Signal=I2C1_SDA
PC13-TAMPER-RTC.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label
PC13-TAMPER-RTC.GPIO_Label=LED
PC13-TAMPER-RTC.GPIO_PuPd=GPIO_PULLUP
@@ -229,7 +237,8 @@ ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_TIM4_Init-TIM4-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true
RCC.ADCFreqValue=36000000
RCC.ADCFreqValue=12000000
RCC.ADCPresc=RCC_ADCPCLK2_DIV6
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
RCC.APB1Freq_Value=36000000
@@ -239,7 +248,7 @@ RCC.APB2TimFreq_Value=72000000
RCC.FCLKCortexFreq_Value=72000000
RCC.FamilyName=M
RCC.HCLKFreq_Value=72000000
RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
RCC.IPParameters=ADCFreqValue,ADCPresc,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value
RCC.MCOFreq_Value=72000000
RCC.PLLCLKFreq_Value=72000000
RCC.PLLMCOFreq_Value=36000000
@@ -258,14 +267,14 @@ SH.ADCx_IN2.0=ADC1_IN2,IN2
SH.ADCx_IN2.ConfNb=1
SH.ADCx_IN3.0=ADC1_IN3,IN3
SH.ADCx_IN3.ConfNb=1
SH.S_TIM4_CH1.0=TIM4_CH1,PWM Generation1 CH1
SH.S_TIM4_CH1.ConfNb=1
SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2
SH.S_TIM4_CH2.ConfNb=1
SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3
SH.S_TIM4_CH3.ConfNb=1
SH.S_TIM4_CH4.0=TIM4_CH4,PWM Generation4 CH4
SH.S_TIM4_CH4.ConfNb=1
SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1
SH.S_TIM3_CH1.ConfNb=1
SH.S_TIM3_CH2.0=TIM3_CH2,PWM Generation2 CH2
SH.S_TIM3_CH2.ConfNb=1
SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3
SH.S_TIM3_CH3.ConfNb=1
SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4
SH.S_TIM3_CH4.ConfNb=1
SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
SPI2.CLKPhase=SPI_PHASE_2EDGE
SPI2.CLKPolarity=SPI_POLARITY_HIGH
@@ -275,30 +284,28 @@ SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
SPI2.Mode=SPI_MODE_MASTER
SPI2.VirtualType=VM_MASTER
TIM3.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM3.Channel-PWM\ Generation4\ No\ Output=TIM_CHANNEL_4
TIM3.IPParameters=Prescaler,Period,AutoReloadPreload,Channel-PWM Generation4 No Output,Pulse-PWM Generation4 No Output
TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM3.IPParameters=Prescaler,Period,AutoReloadPreload,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Pulse-PWM Generation2 CH2,Pulse-PWM Generation1 CH1,Pulse-PWM Generation3 CH3
TIM3.Period=999
TIM3.Prescaler=71
TIM3.Pulse-PWM\ Generation4\ No\ Output=500
TIM3.Pulse-PWM\ Generation1\ CH1=500
TIM3.Pulse-PWM\ Generation2\ CH2=500
TIM3.Pulse-PWM\ Generation3\ CH3=500
TIM4.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM4.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM4.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4
TIM4.IPParameters=Prescaler,Period,AutoReloadPreload,Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Pulse-PWM Generation4 CH4,Pulse-PWM Generation1 CH1,Pulse-PWM Generation2 CH2
TIM4.IPParameters=Prescaler,Period,AutoReloadPreload,TIM_MasterSlaveMode,TIM_MasterOutputTrigger
TIM4.Period=999
TIM4.Prescaler=71
TIM4.Pulse-PWM\ Generation1\ CH1=500
TIM4.Pulse-PWM\ Generation2\ CH2=500
TIM4.Pulse-PWM\ Generation4\ CH4=500
TIM4.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE
TIM4.TIM_MasterSlaveMode=TIM_MASTERSLAVEMODE_ENABLE
USART1.IPParameters=VirtualMode
USART1.VirtualMode=VM_ASYNC
VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM3_VS_no_output4.Mode=PWM Generation4 No Output
VP_TIM3_VS_no_output4.Signal=TIM3_VS_no_output4
VP_TIM4_VS_ClockSourceINT.Mode=Internal
VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT
board=custom