用户手册
AG32 MCU
参考手册
1.2
1 设备概述¶
1.1 简介¶
AG32系列32位微控制器旨在为MCU用户提供更高的灵活性和丰富的兼容外设,同时保持引脚和功能的兼容性。AG32产品系列具有优异的质量、稳定性和极具竞争力的性价比。
1.1.1 系统概览¶
- 基于RISC-V内核,支持RV32IMAFC指令集
- 最多1MB闪存
- 128KB SRAM
- 16KB指令缓存
1.1.2 时钟、复位与电源管理¶
- 工作电压范围:3.135V ~ 3.465V,适用于主芯片和I/O
- POR(上电复位)、PDR(电压监测复位)
- 支持4~26 MHz的晶体振荡器
- 内部20MHz振荡器
- RTC使用的32kHz振荡器
- 内部40kHz振荡器
1.1.3 低功耗运行模式¶
- 支持Sleep、Stop和Standby模式
- RTC可由VBAT独立供电
1.1.4 模数转换器(ADC)/数模转换器(DAC)/比较器(CMP)/直接存储器访问(DMA)/定时器/通用输入输出(GPIO)¶
- 3个12位、1.0 MSPS的ADC(模数转换器):最多支持16通道,三路交错模式下总采样率达3 MSPS
- 2个10位DAC(数模转换器)
- 2个轨到轨模拟比较器(CMP)
- 通用DMA控制器
- 高级定时器(Advanced-control Timers)
- 最多支持78个通用I/O端口
1.1.5 通信接口¶
- 支持I²C接口
- 支持UART接口
- 支持SPI接口
- 支持CAN接口
1.1.6 其他功能¶
- 调试模式:支持串行线调试(SWD)和JTAG接口
- USB 2.0全速设备/主机控制器,内置PHY
- 支持MII/RMII的10/100以太网MAC,带专用DMA
- 实时时钟(RTC):支持亚秒级精度
- 每颗芯片具备唯一的128位ID
1.2 产品参数¶
产品 / 参数 | AG32VF303KCU6 | AG32VF303CCT6 | AG32VF303VCT6 | AG32VH407RCT6 | AG32VF407RGT6 | AG32VF407VGT6 |
---|---|---|---|---|---|---|
Flash存储器(KB) | 256K | 256K | 256K | 256K | 1024K | 1024K |
SRAM(KB) | 128K | 128K | 128K | 128K | 128K | 128K |
PSRAM | / | / | / | 8MB | / | / |
以太网 | 是 | 是 | 是 | 是 | 是 | 是 |
定时器 | 2×基本定时器 + 5×高级定时器 | 2×基本定时器 + 5×高级定时器 | 2×基本定时器 + 5×高级定时器 | 2×基本定时器 + 5×高级定时器 | 2×基本定时器 + 5×高级定时器 | 2×基本定时器 + 5×高级定时器 |
SPI/I²C | 2 | 2 | 2 | 2 | 2 | 2 |
UART | 5 | 5 | 5 | 5 | 5 | 5 |
USB(FS) | 是 | 是 | 是 | 是 | 是 | 是 |
CAN | 1× CAN2.0 | 1× CAN2.0 | 1× CAN2.0 | 1× CAN2.0 | 1× CAN2.0 | 1× CAN2.0 |
12位ADC | 3 | 3 | 3 | 3 | 3 | 3 |
ADC通道数 | 9 | 10 | 16 | 11 | 16 | 16 |
10位DAC | 2 | 2 | 2 | 2 | 2 | 2 |
DAC通道数 | 2 | 2 | 2 | 2 | 2 | 2 |
轨到轨模拟比较器 | 2 | 2 | 2 | 2 | 2 | 2 |
最大CPU频率 | 248 MHz | 248 MHz | 248 MHz | 248 MHz | 248 MHz | 248 MHz |
工作电压范围 | 3.135V ~ 3.465V | 3.135V ~ 3.465V | 3.135V ~ 3.465V | 3.135V ~ 3.465V | 3.135V ~ 3.465V | 3.135V ~ 3.465V |
封装形式 | QFN32 | LQFP48 | LQFP100 | LQFP64 | LQFP64 | LQFP100 |
AG32VH407RCT6:AG32 + PSRAM
- MCU + 2K CPLD + 8MB PSRAM
- 支持HyperRAM高速接口
- 提供DMA与FIFO读/写参考设计
1.3 芯片架构¶
1.4 存储器映射(Memory Map)¶
区域 | 地址范围 | 描述 |
---|---|---|
ROM | 0x0001_0000 – 0x0001_1FFF | 只读存储器 |
System Control | 0x0300_0000 – 0x0300_0FFF | 系统控制 |
PLIC | 0x0C00_0000 – 0x0C20_FFFF | 平台级中断控制器 |
SRAM | 0x2000_0000 – 0x2001_FFFF | 片上SRAM |
FLASH (XIP) | 0x8000_0000 – 0x80FF_FFFF | 通过XIP方式访问的Flash |
Option Bytes | 0x8100_0000 – 0x8100_003F | 选项字节配置区 |
RTC | 0x4000_0000 – 0x4000_007F | 实时时钟 |
Flash Control | 0x4000_1000 – 0x4000_1FFF | Flash控制寄存器 |
APB Peripherals | 0x4001_0000 – 0x40FF_FFFF | APB总线外设 |
AHB Peripherals | 0x4100_0000 – 0x41FF_FFFF | AHB总线外设 |
External AHB | 0x6000_0000 – 0x7FFF_FFFF | 外部AHB接口地址空间 |
1.5 系统控制 (System Control)¶
设备启动模式(BOOT_MODE)¶
地址偏移量:0x00
31–2 | 1 | 0 | |
---|---|---|---|
Reserved | BOOT_MODE | BOOT_MODE | |
RO | RO |
Bit [1:0]:Device boot mode
BOOT0和 BOOT1引脚的数值在复位后的第4个SYSCLK上升沿被锁存。
复位控制(RST_CNTL)¶
地址偏移量: 0x04
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
31 | RSTF_LPWR | 低功耗复位标志 | 0 | 未检测到复位 |
1 | 检测到低功耗复位 | |||
30 | RSTF_WDOG | 看门狗复位标志 | 0 | 未检测到复位 |
1 | 检测到看门狗复位 | |||
29 | RSTF_IWDG | 独立看门狗复位标志 | 0 | 未检测到复位 |
1 | 检测到独立看门狗复位 | |||
28 | RSTF_SFT | 软件复位标志 | 0 | 未检测到复位 |
1 | 检测到软件复位 | |||
27 | RSTF_POR | 上电复位标志 | 0 | 未检测到复位 |
1 | 检测到上电复位 | |||
26 | RSTF_PIN | NRST引脚复位标志 | 0 | 未检测到复位 |
1 | 检测到NRST引脚复位 | |||
25 | RSTF_EXT | 外部逻辑复位标志 | 0 | 未检测到复位 |
1 | 检测到外部逻辑复位 | |||
24 | RST_REMOVE | 清除复位标志 | - | 写入1清除所有复位标志 |
1 | RST_EXT_EN | 外部逻辑复位使能 | 0 | 禁用外部逻辑复位 |
1 | 启用外部逻辑复位 | |||
0 | RST_SFT | 软件复位 | - | 写入1触发软件复位 |
电源控制(PWR_CNTL)¶
地址偏移量: 0x08
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[1:0] | LPWR_MODE | 低功耗模式 | 00 | 进入睡眠模式,使用WFI(等待中断)指令 |
01 | 进入停止模式,使用WFI指令 | |||
11 | 进入待机模式,使用WFI指令 |
时钟控制(CLK_CNTL)¶
地址偏移量: 0x0C
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[15:12] | SCLK_DIV_HIGH | Flash SPI时钟分频高位 | 0-15 | Flash SPI时钟由SYS_CLK分频(SCLK_DIV_HIGH + 1),有效范围从0(分频 1)到15(分频16) |
[11:8] | SCLK_DIV_LOW | Flash SPI时钟分频低位 | - | 必须设置为与SCLK_DIV_HIGH相同的值 |
6 | PLL_RDY | PLL准备就绪标志 | 0 | PLL未准备好 |
1 | PLL已准备好 | |||
5 | PLL_ON | PLL开启标志 | 0 | PLL关闭 |
1 | PLL开启 | |||
4 | HSE_RDY | HSE准备就绪标志 | 0 | HSE未准备好 |
1 | HSE已准备好 | |||
3 | HSE_BYP | HSE旁路标志 | 0 | HSE振荡器未旁路 |
1 | HSE振荡器已旁路 | |||
2 | HSE_ON | HSE开启标志 | 0 | HSE振荡器关闭 |
1 | HSE振荡器开启 |
JTAG控制(SWJ_CNTL)¶
地址偏移量: 0x14
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
4 | NJTRST | NJTRST引脚配置 | 0 | NJTRST用作专用引脚 |
1 | NJTRST用作用户引脚 | |||
3 | JTDO | JTDO引脚配置 | 0 | JTDO用作专用引脚 |
1 | JTDO用作用户引脚 | |||
2 | JTDI | JTDI引脚配置 | 0 | JTDI用作专用引脚 |
1 | JTDI用作用户引脚 | |||
1 | JTMS | JTMS引脚配置 | 0 | JTMS用作专用引脚 |
1 | JTMS用作用户引脚 | |||
0 | JTCK | JTCK引脚配置 | 0 | JTCK用作专用引脚 |
1 | JTCK用作用户引脚 |
调试控制(DBG_CNTL)¶
地址偏移量: 0x1C
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
4 | DBG_RTC_STOP | 在调试期间停止RTC | - | - |
3 | DBG_IWDG_STOP | 在调试期间停止独立看门狗(IWDG) | - | - |
唤醒上升触发器(WKP_RISE_TRG)¶
地址偏移量: 0x20
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[7:0] | EXT_INTO-7 | 使用EXT_INTO-7从停止模式唤醒设备,触发条件为上升沿 | - | - |
8 | ALARM | 使用RTC闹钟从停止模式唤醒设备 | - | - |
唤醒下降触发器(WKP_FALL_TRG)¶
地址偏移量: 0x24
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[7:0] | EXT_INTO-7 | 使用EXT_INTO-7从停止模式唤醒设备,触发条件为下降沿 | - | - |
8 | ALARM | 使用RTC闹钟从停止模式唤醒设备 | - | - |
唤醒待处理寄存器(WKP_PENDING)¶
地址偏移量: 0x28
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[8:0] | - | 当选择的触发事件发生时,相应的位被置为 1 | - | - |
PBUS时钟分频器(PBUS_DIVIDER)¶
地址偏移量: 0x38
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[3:0] | PBUS_DIV | APB 时钟由SYS_CLK分频(PBUS_DIV + 1),有效范围从0(分频1)到15(分频16) | - | - |
APB外设复位(APB_RESET)¶
地址偏移量: 0x40
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[28] | 12C1 | 复位12C1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[27] | 12C0 | 复位12C0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[26] | CAN0 | 复位CAN0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[25] | UART4 | 复位UART4外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[24] | UART3 | 复位UART3外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[23] | UART2 | 复位UART2外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[22] | UART1 | 复位UART1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[21] | UART0 | 复位UART0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[20] | GPTIMER4 | 复位GPTIMER4外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[19] | GPTIMER3 | 复位GPTIMER3外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[18] | GPTIMER2 | 复位GPTIMER2外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[17] | GPTIMER1 | 复位GPTIMER1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[16] | GPTIMER0 | 复位GPTIMER0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[15] | TIMER1 | 复位TIMER1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[14] | TIMER0 | 复位TIMER0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[13] | GPIO9 | 复位GPIO9外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[12] | GPIO8 | 复位GPIO8外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[11] | GPIO7 | 复位GPIO7外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[10] | GPIO6 | 复位GPIO6外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[9] | GPIO5 | 复位GPIO5外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[8] | GPIO4 | 复位GPIO4外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[7] | GPIO3 | 复位GPIO3外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[6] | GPIO2 | 复位GPIO2外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[5] | GPIO1 | 复位GPIO1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[4] | GPIO0 | 复位GPIO0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[3] | SPI1 | 复位SPI1外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[2] | SPI0 | 复位SPI0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[1] | WATCHDOG0 | 复位看门狗0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[0] | FCBO | 复位FCBO外设 | 0 | 复位未被置位 |
1 | 复位已被置位 |
AHB外设复位(AHB_RESET)¶
地址偏移量: 0x50
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[3] | MAC0 | 复位MAC0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[2] | CRC0 | 复位CRC0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[1] | USB0 | 复位USB0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 | |||
[0] | DMAC0 | 复位DMAC0外设 | 0 | 复位未被置位 |
1 | 复位已被置位 |
APB外设时钟使能(APB_CLKENABLE)¶
地址偏移量: 0x60
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[n] | - | 启用或禁用对应外设的时钟 | 0 | 外设时钟被禁用 |
1 | 外设时钟被启用 |
时钟使能位的分配与 APB_RESET
寄存器相同,您可以根据实际情况参考 APB_RESET
的对应位进行设置。
AHB外设时钟使能(AHB_CLKENABLE)¶
地址偏移量: 0x70
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[n] | - | 启用或禁用对应外设的时钟 | 0 | 外设时钟被禁用 |
1 | 外设时钟被启用 |
时钟使能位的分配与 AHB_RESET
寄存器相同,您可以根据实际情况参考 AHB_RESET
的对应位进行设置。
APB外设时钟在调试期间停止(APB_CLKSTOP)¶
地址偏移量: 0x80
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[n] | - | 在调试期间停止对应外设的时钟 | 0 | 在调试期间时钟未停止 |
1 | 在调试期间时钟已停止 |
时钟停止位的分配与 APB_RESET
寄存器相同,您可以根据实际情况参考 APB_RESET
的对应位进行设置。涉及的外设包括 WATCHDOG、TIMER、GPTIMER和CAN。
设备ID代码(DEVICE_ID)¶
地址偏移量: 0x100
位 | 名称 | 描述 | 值 | 含义 |
---|---|---|---|---|
[31:0] | - | 返回芯片设备ID | 0x40200001 | 芯片设备ID |
返回的是芯片的设备ID,且为只读寄存器。
2 引脚定义(Pin Definition)¶
2.1 LQFP-100¶
引脚号 | 引脚名称 | 功能描述(中英文) |
---|---|---|
1 | PIN_1 | IO |
2 | PIN_2 | IO |
3 | PIN_3 | IO |
4 | PIN_4 | IO |
5 | PIN_5 | IO |
6 | VBAT | VBAT 供电引脚 |
7 | PIN_7 | IO / RTC |
8 | OSC32_IN | 32kHz 晶振输入 |
9 | OSC32_OUT | 32kHz 晶振输出 |
10 | VSS33 | 地(GND) |
11 | VDD33 | 3.3V 电源 |
12 | OSC_IN | 主晶振输入 |
13 | OSC_OUT | 主晶振输出 |
14 | NRST | 复位输入 |
15 | PIN_15 | IO / ADC_IN10 |
16 | PIN_16 | IO / ADC_IN11 |
17 | PIN_17 | IO / ADC_IN12 |
18 | PIN_18 | IO / ADC_IN13 |
19 | NC | 不连接(NC) |
20 | VSSA | 模拟地(GNDA) |
21 | VREFP | 模拟参考电压输入 |
22 | VDDA | 模拟电源 |
23 | PIN_23 | IO / WKUP / ADC_IN0 / CMP_PA0 |
24 | PIN_24 | IO / ADC_IN1 / CMP_PA1 |
25 | PIN_25 | IO / ADC_IN2 / CMP_PA2 |
26 | PIN_26 | IO / ADC_IN3 / CMP_PA3 |
27 | VSS33 | 地(GND) |
28 | VDD33 | 3.3V 电源 |
29 | PIN_29 | IO / ADC_IN4 / CMP_PA4 / DAC0 |
30 | PIN_30 | IO / ADC_IN5 / CMP_PA5 / DAC1 |
31 | PIN_31 | IO / ADC_IN6 |
32 | PIN_32 | IO / ADC_IN7 |
33 | PIN_33 | IO / ADC_IN14 |
34 | PIN_34 | IO / ADC_IN15 |
35 | PIN_35 | IO / ADC_IN8 |
36 | PIN_36 | IO / ADC_IN9 |
37 | PIN_37 | IO / BOOT1 |
38~48 | PIN_38~48 | IO |
49 | NC | 不连接(NC) |
50 | VDD33 | 3.3V 电源 |
51~67 | PIN_51~67 | IO |
68 | PIN_68 | IO / UART0_TX |
69 | PIN_69 | IO / UART0_RX |
70 | PIN_70 | IO / USBDM |
71 | PIN_71 | IO / USBDP |
72 | PIN_72 | IO / JTMS |
73 | NC | 不连接(NC) |
74 | VSS33 | 地(GND) |
75 | VDD33 | 3.3V 电源 |
76 | PIN_76 | IO / JTCK |
77 | PIN_77 | IO / JTDI |
78~88 | PIN_78~88 | IO |
89 | PIN_89 | IO / JTDO |
90 | PIN_90 | IO / JNTRST |
91~92 | PIN_91~92 | IO |
93 | PIN_93 | IO |
94 | BOOT0 | 启动模式选择 |
95~98 | PIN_95~98 | IO |
99 | VSS33 | 地(GND) |
100 | VDD33 | 3.3V 电源 |
2.2 LQFP-64¶
引脚号 | 引脚名称 | 功能描述(中英文) |
---|---|---|
1 | VBAT | VBAT 电源输入 |
2 | PIN_2 | IO / RTC |
3 | OSC32_IN | 32kHz 晶振输入 |
4 | OSC32_OUT | 32kHz 晶振输出 |
5 | OSC_IN | 主晶振输入 |
6 | OSC_OUT | 主晶振输出 |
7 | NRST | 复位引脚 |
8 | PIN_8 | IO / ADC_IN10 |
9 | PIN_9 | IO / ADC_IN11 |
10 | PIN_10 | IO / ADC_IN12 |
11 | PIN_11 | IO / ADC_IN13 |
12 | VSSA | 模拟地(GNDA) |
13 | VDDA | 模拟电源 |
14 | PIN_14 | IO / WKUP / ADC_IN0 / CMP_PA0 |
15 | PIN_15 | IO / ADC_IN1 / CMP_PA1 |
16 | PIN_16 | IO / ADC_IN2 / CMP_PA2 |
17 | PIN_17 | IO / ADC_IN3 / CMP_PA3 |
18 | VSS33 | 地(GND) |
19 | VDD33 | 3.3V 电源 |
20 | PIN_20 | IO / ADC_IN4 / CMP_PA4 / DAC0 |
21 | PIN_21 | IO / ADC_IN5 / CMP_PA5 / DAC1 |
22 | PIN_22 | IO / ADC_IN6 |
23 | PIN_23 | IO / ADC_IN7 |
24 | PIN_24 | IO / ADC_IN14 |
25 | PIN_25 | IO / ADC_IN15 |
26 | PIN_26 | IO / ADC_IN8 |
27 | PIN_27 | IO / ADC_IN9 |
28 | PIN_28 | IO / BOOT1 |
29 | PIN_29 | IO |
30 | PIN_30 | IO |
31 | PIN_31 | IO |
32 | VDD33 | 3.3V 电源 |
33 | PIN_33 | IO |
34 | PIN_34 | IO |
35 | PIN_35 | IO |
36 | PIN_36 | IO |
37 | PIN_37 | IO |
38 | PIN_38 | IO |
39 | PIN_39 | IO |
40 | PIN_40 | IO |
41 | PIN_41 | IO |
42 | PIN_42 | IO / UART0_TX |
43 | PIN_43 | IO / UART0_RX |
44 | PIN_44 | IO / USBDM |
45 | PIN_45 | IO / USBDP |
46 | PIN_46 | IO / JTMS |
47 | PIN_47 | IO |
48 | VDD33 | 3.3V 电源 |
49 | PIN_49 | IO / JTCK |
50 | PIN_50 | IO / JTDI |
51 | PIN_51 | IO |
52 | PIN_52 | IO |
53 | PIN_53 | IO |
54 | PIN_54 | IO |
55 | PIN_55 | IO / JTDO |
56 | PIN_56 | IO / JNTRST |
57 | PIN_57 | IO |
58 | PIN_58 | IO |
59 | PIN_59 | IO |
60 | BOOT0 | 启动引脚 BOOT0 |
61 | PIN_61 | IO |
62 | PIN_62 | IO |
63 | VSS33 | 地(GND) |
64 | VDD33 | 3.3V 电源 |
2.3 LQFP-48¶
Pin | Pin Name | Function 中文说明 |
---|---|---|
1 | VBAT | VBAT 电池供电引脚 |
2 | PIN_2 | IO/RTC 实时时钟/通用IO |
3 | OSC32_IN | 32kHz低速晶振输入 |
4 | OSC32_OUT | 32kHz低速晶振输出 |
5 | OSC_IN | 主晶振输入 |
6 | OSC_OUT | 主晶振输出 |
7 | NRST | 复位引脚 |
8 | VSSA | 模拟地 |
9 | VDDA | 模拟电源 |
10 | PIN_10 | IO/WKUP/ADC_IN0/CMP_PA0 唤醒/ADC/比较器 |
11 | PIN_11 | IO/ADC_IN1/CMP_PA1 |
12 | PIN_12 | IO/ADC_IN2/CMP_PA2 |
13 | PIN_13 | IO/ADC_IN3/CMP_PA3 |
14 | PIN_14 | IO/ADC_IN4/CMP_PA4/DAC0 |
15 | PIN_15 | IO/ADC_IN5/CMP_PA5/DAC1 |
16 | PIN_16 | IO/ADC_IN6 |
17 | PIN_17 | IO/ADC_IN7 |
18 | PIN_18 | IO/ADC_IN8 |
19 | PIN_19 | IO/ADC_IN9 |
20 | PIN_20 | IO/BOOT1 启动配置 |
21 | PIN_21 | IO |
22 | PIN_22 | IO |
23 | VSS33 | 数字地 |
24 | VDD33 | 数字电源 |
25 | PIN_25 | IO |
26 | PIN_26 | IO |
27 | PIN_27 | IO |
28 | PIN_28 | IO |
29 | PIN_29 | IO |
30 | PIN_30 | IO/UART0_TX 串口发送 |
31 | PIN_31 | IO/UART0_RX 串口接收 |
32 | PIN_32 | IO/USBDM USB负差分线 |
33 | PIN_33 | IO/USBDP USB正差分线 |
34 | PIN_34 | IO/JTMS JTAG模式选择 |
35 | PIN_35 | IO |
36 | VDD33 | 数字电源 |
37 | PIN_37 | IO/JTCK JTAG时钟 |
38 | PIN_38 | IO/JTDI JTAG数据输入 |
39 | PIN_39 | IO/JTDO JTAG数据输出 |
40 | PIN_40 | IO/JNTRST JTAG复位 |
41 | PIN_41 | IO |
42 | PIN_42 | IO |
43 | PIN_43 | IO |
44 | BOOT0 | 启动配置引脚 |
45 | PIN_45 | IO |
46 | PIN_46 | IO |
47 | VSS33 | 数字地 |
48 | VDD33 | 数字电源 |
2.4 QFN-32¶
Pin | Pin Name | Function 中文说明 |
---|---|---|
1 | PIN_1 | IO/RTC 实时时钟/通用IO |
2 | PIN_2 | IO/OSC_IN 主晶振输入 |
3 | PIN_3 | IO/OSC_OUT 主晶振输出 |
4 | NRST | 复位引脚 |
5 | PIN_5 | IO/ADC_IN12 模拟输入 |
6 | VDDA33 | 模拟电源 |
7 | PIN_7 | IO/WKUP/ADC_IN0/CMP_PA0 唤醒/ADC/比较器 |
8 | PIN_8 | IO/ADC_IN1/CMP_PA1 |
9 | PIN_9 | IO/ADC_IN2/CMP_PA2 |
10 | PIN_10 | IO/ADC_IN3/CMP_PA3 |
11 | PIN_11 | IO/ADC_IN4/CMP_PA4/DAC0 |
12 | PIN_12 | IO/ADC_IN5/CMP_PA5/DAC1 |
13 | PIN_13 | IO/ADC_IN6 |
14 | PIN_14 | IO/ADC_IN7 |
15 | PIN_15 | IO/BOOT1 启动配置 |
16 | VDD33 | 数字电源 |
17 | GND | 地 |
18 | PIN_18 | IO |
19 | PIN_19 | IO |
20 | PIN_20 | IO/UART0_TX 串口发送 |
21 | PIN_21 | IO/UART0_RX 串口接收 |
22 | PIN_22 | IO/USBDM USB负差分线 |
23 | PIN_23 | IO/USBDP USB正差分线 |
24 | PIN_24 | IO/JTMS JTAG模式选择 |
25 | PIN_25 | IO/JTCK JTAG时钟 |
26 | PIN_26 | IO/JTDI JTAG数据输入 |
27 | PIN_27 | IO/JTDO JTAG数据输出 |
28 | PIN_28 | IO/JNTRST JTAG复位 |
29 | PIN_29 | IO |
30 | BOOT0 | 启动配置引脚 |
31 | PIN_31 | IO |
32 | VDD33 | 数字电源 |
2.5 AG32VH407RCT6 与 AG32VF407RGT6¶
Pin | AG32VH407RCT6 引脚名 | 功能描述 | AG32VF407RGT6 引脚名 | 功能描述 |
---|---|---|---|---|
1 | VBAT | VBAT | VBAT | VBAT |
2 | PIN_2 | IO_RTC | PIN_2 | IO_RTC |
3 | OSC32_IN | OSC32_IN | OSC32_IN | OSC32_IN |
4 | OSC32_OUT | OSC32_OUT | OSC32_OUT | OSC32_OUT |
5 | OSC_IN | OSC_IN | OSC_IN | OSC_IN |
6 | OSC_OUT | OSC_OUT | OSC_OUT | OSC_OUT |
7 | NRST | NRST | NRST | NRST |
8 | RWDS | RWDS | PIN_8 | IO_ADC_IN10 |
9 | PIN_9 | IO_ADC_IN11 | PIN_9 | IO_ADC_IN11 |
10 | PIN_10 | IO_ADC_IN12 | PIN_10 | IO_ADC_IN12 |
11 | PIN_11 | IO_ADC_IN13 | PIN_11 | IO_ADC_IN13 |
12 | GND | GND | GND | GND |
13 | VDD33 | VDD33 | VDD33 | VDD33 |
14 | PIN_14 | IO_WKUP_ADC_IN0_CMP_PA0 | PIN_14 | IO_WKUP_ADC_IN0_CMP_PA0 |
15 | PIN_15 | IO_ADC_IN1_CMP_PA1 | PIN_15 | IO_ADC_IN1_CMP_PA1 |
16 | PIN_16 | IO_ADC_IN2_CMP_PA2 | PIN_16 | IO_ADC_IN2_CMP_PA2 |
17 | PIN_17 | IO_ADC_IN3_CMP_PA3 | PIN_17 | IO_ADC_IN3_CMP_PA3 |
18 | GND | GND | GND | GND |
19 | VDD33 | VDD33 | VDD33 | VDD33 |
20 | PIN_20 | IO_ADC_IN5_CMP_PA5_DAC1 | PIN_20 | IO_ADC_IN4_CMP_PA4_DAC0 |
21 | PIN_21 | IO_ADC_IN7 | PIN_21 | IO_ADC_IN5_CMP_PA5_DAC1 |
22 | RWDS | RWDS | PIN_22 | IO_ADC_IN6 |
23 | PIN_23 | IO_ADC_IN15 | PIN_23 | IO_ADC_IN7 |
24 | PIN_24 | IO_ADC_IN9 | PIN_24 | IO_ADC_IN14 |
25 | PIN_25 | IO_BOOT1 | PIN_25 | IO_ADC_IN15 |
26 | PIN_26 | IO | PIN_26 | IO_ADC_IN8 |
27 | PIN_27 | IO | PIN_27 | IO_ADC_IN9 |
28 | PIN_28 | IO | PIN_28 | IO_BOOT1 |
29 | PIN_29 | IO | PIN_29 | IO |
30 | VDD33 | VDD33 | PIN_30 | IO |
31 | GND | GND | PIN_31 | IO |
32 | VDD33 | VDD33 | VDD33 | VDD33 |
33 | PIN_33 | IO | PIN_33 | IO |
34 | PIN_34 | IO | PIN_34 | IO |
35 | PIN_35 | IO | PIN_35 | IO |
36 | PIN_36 | IO | PIN_36 | IO |
37 | PIN_37 | IO | PIN_37 | IO |
38 | PIN_38 | IO | PIN_38 | IO |
39 | PIN_39 | IO | PIN_39 | IO |
40 | PIN_40 | IO | PIN_40 | IO |
41 | PIN_41 | IO | PIN_41 | IO |
42 | PIN_42 | IO_UART0_TX | PIN_42 | IO_UART0_TX |
43 | PIN_43 | IO_UART0_RX | PIN_43 | IO_UART0_RX |
44 | PIN_44 | IO_USBDM | PIN_44 | IO_USBDM |
45 | PIN_45 | IO_USBDP | PIN_45 | IO_USBDP |
46 | PIN_46 | IO_JTMS | PIN_46 | IO_JTMS |
47 | PIN_47 | IO | PIN_47 | IO |
48 | VDD33 | VDD33 | VDD33 | VDD33 |
49 | PIN_49 | IO_JTCK | PIN_49 | IO_JTCK |
50 | PIN_50 | IO_JTDI | PIN_50 | IO_JTDI |
51 | PIN_51 | IO | PIN_51 | IO |
52 | PIN_52 | IO | PIN_52 | IO |
53 | PIN_53 | IO | PIN_53 | IO |
54 | PIN_54 | IO | PIN_54 | IO |
55 | PIN_55 | IO_JTDO | PIN_55 | IO_JTDO |
56 | PIN_56 | IO_JNTRST | PIN_56 | IO_JNTRST |
57 | PIN_57 | IO | PIN_57 | IO |
58 | PIN_58 | IO | PIN_58 | IO |
59 | PIN_59 | IO | PIN_59 | IO |
60 | BOOT0 | BOOT0 | BOOT0 | BOOT0 |
61 | PIN_61 | IO | PIN_61 | IO |
62 | PIN_62 | IO | PIN_62 | IO |
63 | GND | GND | GND | GND |
64 | VDD33 | VDD33 | VDD33 | VDD33 |
注意:
- RWDS(引脚8和引脚22)需要在外部短接。
- VDD33需通过磁珠与PCB上的其他电源单独隔离。
3 时钟系统¶
3.1 时钟源¶
系统时钟(SYSCLK)可由以下几种时钟源驱动:
- HSI 振荡器时钟
- HSE 振荡器时钟
- PLL 时钟
- 互联全局时钟(FPGA 内核)
设备还提供以下两种辅助时钟源:
-
40 kHz 低速内部 RC 振荡器(LSI)
用于驱动独立看门狗(IWDG),并可选用于从停止/待机模式下自动唤醒的 RTC。
-
32.768 kHz 低速外部晶体(LSE 晶体)
可选用于驱动实时时钟(RTCCLK)。
每个时钟源在未使用时都可以独立开启或关闭,以优化功耗。
3.2 HSE 时钟¶
高速外部时钟信号(HSE)可以由以下两种时钟源生成:
- HSE 外部晶体/陶瓷谐振器
- HSE 用户外部时钟
谐振器和负载电容器必须尽可能靠近振荡器引脚,以减少输出失真和启动稳定时间。负载电容的值必须根据所选振荡器进行调整。
外部源(HSE Bypass)¶
在此模式下,必须提供外部时钟源,频率最高可达 100 MHz。
通过在时钟控制寄存器(RCC_CR)中设置 HSEBYP 和 HSEON 位来选择此模式。
外部时钟信号(方波、正弦波或三角波)必须驱动 OSC_IN 引脚,且 OSC_OUT 引脚应保持高阻态(hi-Z)。
外部晶体/陶瓷谐振器(HSE 晶体)¶
4 至 24 MHz 的外部振荡器具有在主时钟上产生非常准确频率的优势。
HSERDY 标志指示高速外部振荡器是否稳定。启动时,时钟直到此位被硬件设置后才会释放。
可以使用 HSEON 位打开或关闭 HSE 晶体。
3.3 HSI 时钟¶
HSI 时钟信号由内部振荡器生成,可以直接作为系统时钟使用。
HSI 内部振荡器的优势在于提供了一种低成本的时钟源(无需外部组件)。它的启动时间也比 HSE 晶体振荡器更快。
3.4 PLL 时钟¶
内部 PLL 可用于倍增 HSE 晶体输出时钟频率。
如果在应用中使用 USB 接口,则必须将 PLL 配置为输出 48 MHz 的时钟。这是为了提供 48 MHz 的 USBCLK 时钟。
3.5 LSE 时钟¶
LSE 晶体是一种 32.768 kHz 的低速外部晶体或陶瓷谐振器。它的优势在于为实时时钟外设(RTC)提供低功耗且高度精确的时钟源,用于时钟/日历或其他定时功能。
LSE 晶体通过在备份域控制寄存器中设置 LSEON 位来打开和关闭。
备份域控制寄存器中的 LSERDY 标志指示 LSE 晶体是否稳定。启动时,LSE 晶体输出的时钟信号在硬件设置此位之前不会释放。
外部源(LSE Bypass)¶
在此模式下,必须提供外部时钟源,频率最高可达 1 MHz。
外部时钟信号(方波、正弦波或三角波)必须驱动 OSC32_IN 引脚,且 OSC32_OUT 引脚应保持高阻态(Hi-Z)。
3.6 LSI 时钟¶
LSI 时钟是将 HSI 时钟除以 256 得到的。它可以在停止模式下继续运行,用于独立看门狗(IWDG)和自动唤醒单元。时钟频率大约为 40 kHz(在 30 kHz 和 60 kHz 之间)。
3.7 系统时钟(SYSCLK)选择¶
系统复位后,HSI 振荡器被选择为系统时钟。当时钟源直接或通过 PLL 用作系统时钟时,无法停止它。
从一个时钟源切换到另一个时钟源,只有在目标时钟源准备就绪时才会发生(时钟在启动延迟后稳定或 PLL 锁定)。
3.8 RTC 时钟¶
RTCCLK 时钟源可以是以下之一:CLKLOCAL(来自 FPGA 核心逻辑)、LSE 或 LSI 时钟。
通过在备份域控制寄存器(RCC_BDCR)中编程 RTCSEL[1:0] 位来选择时钟源。
此选择在没有重置备份域的情况下无法修改。
LSE 时钟位于备份域中,而 HSE 和 LSI 时钟不在备份域中。因此:
-
如果选择 LSE 作为 RTC 时钟:
即使 VDD 电源关闭,只要 VBAT 电源保持,RTC 仍然继续工作。
-
如果选择 LSI 作为自动唤醒单元(AWU)时钟:
如果 VDD 电源关闭,AWU 状态不保证。
-
如果选择 CLKLOCAL 作为 RTC 时钟:
如果 VDD 电源关闭或内部电压调节器关闭(移除 1.2V 域的电源),RTC 状态不保证。
在电源控制寄存器中,DPB 位(禁用备份域写保护)必须设置为 1。
3.9 看门狗时钟¶
如果独立看门狗(IWDG)通过硬件选项或软件访问启动:
-
在运行模式或停止模式下:
通过在备份域控制寄存器(RCC_BDCR)中设置 IWDG_STOP_CLKSEL 位来选择 LSE 或 LSI 作为时钟源。
-
在待机模式下:
硬件将选择 LSE 作为 IWDG 的时钟源。
4 复位¶
有三种类型的复位:系统复位、电源复位和备份域复位。
4.1 系统复位¶
当发生以下事件之一时,会生成系统复位:
- NRST 引脚上的低电平(外部复位)
- 窗口看门狗计数结束条件(WWDG 复位)
- 独立看门狗计数结束条件(IWDG 复位)
- 软件复位(SW 复位)
- 低功耗管理复位
可以通过检查控制/状态寄存器(RCC_CSR)中的复位标志来识别复位源。
软件复位¶
必须在 MCU 应用程序中断和复位控制寄存器中的 SYSRESETREQ 位设置为 1,才能强制设备进行软件复位。
低功耗管理复位¶
有两种方式可以生成低功耗管理复位:
-
进入待机模式时生成复位:
通过重置用户选项字节中的 nRST_STDBY 位来启用此复位。在这种情况下,每当成功执行待机模式入口序列时,设备将复位,而不是进入待机模式。
-
进入停止模式时生成复位:
通过重置用户选项字节中的 nRST_STOP 位来启用此复位。在这种情况下,每当成功执行停止模式入口序列时,设备将复位,而不是进入停止模式。
4.2 电源复位¶
当发生以下事件之一时,会生成电源复位:
- 上电/断电复位(POR/PDR 复位)
- 退出待机模式时
4.3 备份域复位¶
备份域有两个特定的复位,只影响备份域。
当发生以下事件之一时,会生成备份域复位:
- 软件复位。
- 如果 VDD33 或 VBAT 电源之前被断电,则在电源恢复时生成复位。
5 电源控制¶
5.1 电源供应¶
AG32VF 需要一个 3.135V 到 3.465V 的工作电压供应(VDD33)。使用嵌入式电压调节器为内部 1.2V 数字电源供电。当主 VDD33 电源断电时,实时时钟(RTC)和备份寄存器可以通过 VBAT 电压供电。
5.2 独立的 ADC 和 DAC 转换器供电及参考电压¶
为了提高转换精度,ADC 和 DAC 具有独立的电源,可以单独进行滤波并避免 PCB 上的噪声干扰。
- ADC 和 DAC 电压供应输入通过单独的 VDDA 引脚提供。
- 提供隔离的电源接地连接在 VSSA 引脚上。
为了确保在低电压输入和输出上的更高精度,用户可以将外部参考电压连接到 VREFP 引脚。
VREFP 是模拟输入(ADC)或输出(DAC)信号的最高电压,表示满刻度值。VREFP 上的电压范围为 3.135V 到 VDDA。
5.3 电池备份域¶
为了在 VDD33 断电时保持备份寄存器的内容并提供 RTC 功能,VBAT 引脚可以连接到由电池或其他来源提供的可选待机电压。
VBAT 引脚为 RTC 单元、LSE 振荡器以及 OSC32_IN 和 OSC32_OUT 引脚供电,使得 RTC 即使在主数字电源(VDD33)关闭时也能正常工作。
如果应用中未使用外部电池,建议将 VBAT 外部连接至 VDD33,并加装一个 100nF 外部陶瓷去耦电容器。
当备份域由 VDD33 供电时(模拟开关连接到 VDD33)。
5.4 电压调节器¶
电压调节器在复位后始终启用。根据应用模式,电压调节器有两种不同的工作模式。
- 在运行模式和停止模式下,调节器为 1.2V 域(核心、存储器、数字外设和互联逻辑)提供全功率。
- 在待机模式下,电压调节器关闭。除了待机电路和备份域外,寄存器和 SRAM 的内容将丢失。
5.5 上电复位(POR)/断电复位(PDR)¶
该设备具有集成的 POR/PDR 电路,允许设备从 2.2V 开始正常工作。当 VDD33/VDDA 低于指定的阈值 VPOR/PDR 时,设备将保持在复位模式,无需外部复位电路。
5.6 低功耗模式¶
默认情况下,微控制器在系统复位或电源复位后处于运行模式。当 CPU 不需要持续运行时,可以使用几种低功耗模式来节省电能。用户需要选择一种在低功耗消耗、短启动时间和可用唤醒源之间达到最佳平衡的模式。
AG32VF 设备具有三种低功耗模式:
- 睡眠模式(CPU 时钟关闭,所有外设,包括核心外设,保持运行)
- 停止模式(所有时钟停止)
- 待机模式(1.2V 域断电)
此外,可以通过以下方式之一减少运行模式下的功耗:
- 降低系统时钟速度。
- 在不使用时,将 APB 和 AHB 外设的时钟关闭。
5.6.1 降低系统时钟速度¶
在运行模式下,系统时钟的速度可以降低。同时,在进入睡眠模式之前,也可以降低外设的时钟速度。
5.6.2 外设时钟门控¶
在运行模式下,单个外设和存储器的时钟可以随时停止,以减少功耗。
为了在睡眠模式下进一步降低功耗,可以在执行 WFI 或 WFE 指令之前禁用外设时钟。
5.6.3 睡眠模式¶
进入睡眠模式¶
通过执行 WFI(等待中断)或 WFE(等待事件)指令进入睡眠模式。根据系统控制寄存器中的 SLEEPONEXIT 位,可以选择两种进入睡眠模式的机制:
- 立即睡眠:如果 SLEEPONEXIT 位被清除,微控制器在执行 WFI 或 WFE 指令后立即进入睡眠模式。
- 退出后睡眠:如果 SLEEPONEXIT 位被设置,微控制器在退出最低优先级的中断服务程序(ISR)后立即进入睡眠模式。
在睡眠模式下,所有 I/O 引脚保持与运行模式相同的状态。
退出睡眠模式¶
- 如果使用 WFI 指令进入睡眠模式,任何由嵌套矢量中断控制器(NVIC)确认的外设中断都可以唤醒设备。
-
如果使用 WFE 指令进入睡眠模式,微控制器在发生事件时退出睡眠模式。唤醒事件可以通过以下方式生成:
-
在外设控制寄存器中启用中断,但不在 NVIC 中启用,并在系统控制寄存器中启用 SEVONPEND 位。当微控制器从 WFE 恢复时,必须清除外设中断挂起位和外设 NVIC IRQ 通道挂起位(在 NVIC 中断清除挂起寄存器中)。
-
或者配置外部或内部 EXTI 线路为事件模式。当 CPU 从 WFE 恢复时,无需清除外设中断挂起位或 NVIC IRQ 通道挂起位,因为与事件线对应的挂起位没有被设置。此模式提供最低的唤醒时间,因为在中断进入/退出过程中不会浪费时间。
-
表 1. 立即睡眠模式(Sleep-now)
模式 | 描述 |
---|---|
模式入口 | 使用 WFI(等待中断)或 WFE(等待事件),同时: – SLEEPDEEP = 0 和 – SLEEPONEXIT = 0 参考系统控制寄存器。 |
模式退出 | 如果使用 WFI 进入模式: 中断:参考:中断和异常向量。 如果使用 WFE 进入模式: 唤醒事件:参考:唤醒事件管理。 |
唤醒延迟 | 无 |
表 2. 退出后睡眠模式(Sleep-on-exit)
模式 | 描述 |
---|---|
模式入口 | 使用 WFI(等待中断),同时: – SLEEPDEEP = 0 和 – SLEEPONEXIT = 1 参考系统控制寄存器。 |
模式退出 | 中断:参考:中断和异常向量。 |
唤醒延迟 | 无 |
5.6.4 停止模式(Stop mode)¶
停止模式基于 MCU 深度睡眠模式,并结合外设时钟门控。
在停止模式下,1.2V 域中的所有时钟都停止,PLL、HSI 和 HSE 振荡器被禁用。SRAM 和寄存器的内容被保留。
在停止模式下,所有 I/O 引脚保持与运行模式相同的状态。
进入停止模式¶
参考表 3,了解如何进入停止模式的详细信息。
如果闪存编程正在进行,进入停止模式会延迟,直到内存访问完成。
如果正在访问 APB 域,进入停止模式也会延迟,直到 APB 访问完成。
在停止模式下,可以通过编程单独的控制位来选择以下功能:
- 独立看门狗(IWDG):通过写入其使能寄存器或硬件选项启动 IWDG。一旦启动,除非复位,否则无法停止。
- 实时时钟(RTC):通过备份域控制寄存器中的 RTCEN 位进行配置。
- 外部 32.768 kHz 振荡器(LSE OSC):通过备份域控制寄存器中的 LSEON 位进行配置。
除非在进入停止模式之前将其禁用,否则 ADC 或 DAC 在停止模式下也可能会消耗功耗。
退出停止模式¶
参考表 3,了解如何退出停止模式的详细信息。
当通过中断或唤醒事件退出停止模式时,HSI RC 振荡器被选择为系统时钟。
表 3. 停止模式(Stop mode)
模式 | 描述 |
---|---|
模式入口 | 使用 WFI(等待中断)或 WFE(等待事件),同时: – 在系统控制寄存器中设置 SLEEPDEEP 位 – 在电源控制寄存器(PWR_CR)中清除 PDDS 位。 注意:为了进入停止模式,所有 EXTI 线路挂起位(在挂起寄存器(EXTI_PR)中)、所有外设中断挂起位和 RTC 闹钟标志必须被重置。否则,停止模式入口过程会被忽略,程序执行将继续。 |
模式退出 | 如果使用 WFI 进入模式: 任何配置为中断模式的 EXTI 线路(对应的 EXTI 中断向量必须在 NVIC 中启用)。 参考:中断和异常向量。 如果使用 WFE 进入模式: 任何配置为事件模式的 EXTI 线路。 参考:唤醒事件管理。 |
唤醒延迟 | HSI RC 唤醒时间 |
5.6.5 待机模式(Standby mode)¶
待机模式允许实现最低的功耗。它基于深度睡眠模式,并且禁用了电压调节器。因此,1.2V 域断电,PLL、HSI 振荡器和 HSE 振荡器也被关闭。除备份域中的寄存器和待机电路外,SRAM 和寄存器内容丢失。
进入待机模式¶
参考表 4,了解如何进入待机模式的详细信息。
在待机模式下,可以通过编程单独的控制位来选择以下功能:
- 独立看门狗(IWDG):通过写入其使能寄存器或硬件选项启动 IWDG。一旦启动,除非复位,否则无法停止。
- 实时时钟(RTC):通过备份域控制寄存器中的 RTCEN 位进行配置。
- 外部 32.768 kHz 振荡器(LSE OSC):通过备份域控制寄存器中的 LSEON 位进行配置。
退出待机模式¶
微控制器在以下事件发生时退出待机模式:
- 外部复位(NRST 引脚)
- IWDG 复位
- WKUP 引脚上的上升沿或下降沿
- RTC 闹钟的上升沿
从待机模式唤醒后,所有寄存器将被复位。
唤醒后,程序执行将以与复位后的方式相同的方式重新启动。
电源控制/状态寄存器(PWR_CSR)中的 SBF 状态标志指示 MCU 曾处于待机模式。
参考表 4,了解如何退出待机模式的详细信息。
表 4. 待机模式(Standby mode)
模式 | 描述 |
---|---|
模式入口 | 使用 WFI(等待中断)或 WFE(等待事件),同时: – 在系统控制寄存器中设置 SLEEPDEEP 位 – 在电源控制寄存器(PWR_CR)中设置 PDDS 位 – 在电源控制/状态寄存器(PWR_CSR)中清除 WUF 位 – 没有中断(对于 WFI)或事件(对于 WFE)挂起 |
模式退出 | WKUP 引脚的上升沿,RTC 闹钟事件的上升沿,外部复位(NRST 引脚),IWDG 复位 |
唤醒延迟 | 复位阶段 |
待机模式中的 I/O 状态¶
在待机模式下,除以下引脚外,所有 I/O 引脚都是高阻态:
- 复位引脚(仍然可用)
- CLKRTCOUT 引脚(如果配置为校准输出)
- WKUP 引脚(如果启用)
5.6.6 低功耗模式下的自动唤醒(AWU)¶
RTC 可用于在无需依赖外部中断的情况下从低功耗模式唤醒 MCU(自动唤醒模式)。RTC 提供了一个可编程的时间基准,用于在固定间隔后从停止模式或待机模式唤醒。为此,可以通过编程备份域控制寄存器(RCC_BDCR)中的 RTCSEL[1:0] 位,选择三种备用 RTC 时钟源中的两种:
-
低功耗 32.768 kHz 外部晶体振荡器(LSE OSC)
该时钟源提供精确的时间基准,并具有非常低的功耗。
-
低功耗内部 RC 振荡器(LSI RC)
该时钟源的优势在于节省了 32.768 kHz 晶体的成本。
6 中断控制器¶
AG32 设备嵌入了一个嵌套矢量中断控制器(NVIC),能够管理 16 个优先级级别,并处理最多 44 个可屏蔽的中断通道以及 RISC-V 核心的 16 个中断线路。
6.1 本地中断¶
4 个本地中断(LOCAL_INT0-3)直接连接到核心,并具有较低的延迟。它们具有固定的优先级。
6.2 外部中断¶
外部中断通过平台级中断控制器(PLIC)进行路由。它们具有可编程的优先级和阈值。中断号如下所示:
中断名称 | 中断编号 | 备注 |
---|---|---|
FLASH | 1 | |
RTC | 2 | |
FCB0 | 3 | |
WATCHDOG0 | 4 | |
SPI0 | 5 | |
SPI1 | 6 | |
GPIO0 | 7 | |
GPIO1 | 8 | |
GPIO2 | 9 | |
GPIO3 | 10 | |
GPIO4 | 11 | |
GPIO5 | 12 | |
GPIO6 | 13 | |
GPIO7 | 14 | |
GPIO8 | 15 | |
GPIO9 | 16 | |
TIMER0 | 17 | |
TIMER1 | 18 | |
GPTIMER0 | 19 | |
GPTIMER1 | 20 | |
GPTIMER2 | 21 | |
GPTIMER3 | 22 | |
GPTIMER4 | 23 | |
UART0 | 24 | |
UART1 | 25 | |
UART2 | 26 | |
UART3 | 27 | |
UART4 | 28 | |
CAN0 | 29 | |
I2C0 | 30 | |
I2C1 | 31 | |
DMAC0_INTR | 32 | DMA 合并中断 |
DMAC0_INTTC | 33 | DMA 终端计数中断 |
DMAC0_INTERR | 34 | DMA 错误中断 |
USB0 | 35 | |
MAC0 | 36 | |
EXT_INT0 | 37 | |
EXT_INT1 | 38 | |
EXT_INT2 | 39 | |
EXT_INT3 | 40 | |
EXT_INT4 | 41 | |
EXT_INT5 | 42 | |
EXT_INT6 | 43 | |
EXT_INT7 | 44 |
6.3 总体优先级¶
从最高优先级到最低优先级:
- LOCAL_INT3
- LOCAL_INT2
- LOCAL_INT1
- LOCAL_INT0
- 来自 PLIC 的外部中断
- 机器软件中断
- 机器定时器中断
6.4 中断使能¶
- 必须设置 RISC-V 机器状态寄存器(mstatus)中的机器中断使能(MIE)位,作为所有中断的全局使能。
-
必须为每种类型的中断设置 RISC-V 机器中断使能寄存器(mie)中的相应位,以使中断生效:
- MEIE 位:用于外部中断。
- MSIE 位:用于机器软件中断。
- MTIE 位:用于机器定时器中断。
- 位 16-19:分别用于 LOCAL_INT0-3 中断。
6.5 中断寄存器¶
-
机器软件中断挂起(MSIP)
- 地址:0x2000000
-
位 0:
- 写入 1 以触发机器软件中断
- 写入 0 以清除挂起状态
-
机器定时器比较低(MTIMECMP_LO)
- 地址:0x2004000
- 位 [31:0]:机器定时器比较寄存器的低 32 位
-
机器定时器比较高(MTIMECMP_HI)
- 地址:0x2004004
- 位 [31:0]:机器定时器比较寄存器的高 32 位
-
机器定时器低(MTIME_LO)
- 地址:0x200bFF8
- 位 [31:0]:机器定时器寄存器的低 32 位
-
机器定时器高(MTIME_HI)
- 地址:0x200bFFC
- 位 [31:0]:机器定时器寄存器的高 32 位
-
外部中断优先级(PRIORITY)
- 地址:0xC000000 + (中断号 * 4)
- 每个优先级寄存器存储对应中断的优先级级别
- 有效的优先级范围从 0(最低,禁用中断)到 15(最高)
-
外部中断挂起(PENDING)
- 地址:0xC001000
- 每个中断有 1 位挂起状态。位偏移由中断号决定。
- 当对应的中断触发时,硬件会自动设置该位,并在对应中断具有最高优先级时,通过读取 CLAIM_COMPLETE 寄存器自动清除该位。
-
外部中断使能(ENABLE)
- 地址:0xC002000
- 每个中断有 1 位使能。位偏移由中断号决定。
- 每个位可以由软件设置或清除。
-
外部中断阈值(THRESHOLD)
- 地址:0xC200000
- 位 [3:0]:由软件设置,用于确定外部中断阈值。只有优先级高于阈值的外部中断才会触发中断到 CPU 核心。
-
外部中断声明与完成(CLAIM_COMPLETE)
- 地址:0xC200004
- 读取该寄存器会返回具有最高优先级的挂起中断号,并清除对应的挂起位(仅对于使能且优先级高于阈值的中断)。由于中断从 1 开始编号,读取值为 0 表示没有活动中断。写入该寄存器将完成中断,并使写入的中断号准备好再次响应。
7 双定时器(基本定时器)¶
7.1 介绍¶
双定时器模块由两个可编程的 32 位/16 位向下计数器组成,这些计数器在达到零时可以生成中断。
- 两个 32 位/16 位向下计数器,支持自由运行、周期性和单次模式。
- 共享时钟,并且每个定时器有独立的时钟使能,提供灵活的定时器间隔控制。
- 在定时器计数到零时生成中断输出。
- 唯一标识双定时器模块的标识寄存器,软件可以使用这些寄存器来自动配置自身。
下图显示了该模块的简化框图。
7.2 功能概述¶
7.2.1 概述¶
双定时器模块由两个相同的可编程自由运行计数器(FRC)组成,这些计数器可以配置为 32 位或 16 位操作,并支持三种定时器模式之一:
- 自由运行模式
- 周期性模式
- 单次模式
FRCs 共享一个公共定时器时钟 TIMCLK,每个 FRC 拥有自己的时钟使能输入 TIMCLKEN1 和 TIMCLKEN2。每个 FRC 还具有一个预分频器,可以将启用的 TIMCLK 时钟频率分频为 1、16 或 256,从而使每个 FRC 的计数速率可以通过其独立的时钟使能和预分频器来独立控制。
TIMCLK 可以等于或是 PCLK 频率的子倍频。然而,TIMCLK 和 PCLK 的正向沿必须是同步和平衡的。
每个定时器模块的操作是相同的。通过控制寄存器,可以将定时器模块编程为 32 位或 16 位计数器大小,并选择三种定时器模式之一。这三种模式为:
- 自由运行模式:计数器连续运行,每当计数器达到零时,它会回绕至其最大值。
- 周期性模式:计数器连续运行,每当计数器达到零时,从加载寄存器重新加载值。
- 单次模式:通过写入加载寄存器,计数器加载新值,计数器递减到零后停止,直到重新编程。
定时器计数通过写入加载寄存器进行加载,并且如果启用了定时器,计数器将按照由 TIMCLK、TIMCLKENX 和预分频器设置确定的速率递减。当定时器计数已经在运行时,写入加载寄存器将使计数器立即从新值重新启动。
加载定时器计数的另一种方式是通过写入后台加载寄存器。这不会立即影响当前计数,但计数器会继续递减。当计数器达到零时,如果处于周期性模式,定时器计数将从新加载值重新加载。
当定时器计数达到零时,会生成中断。通过写入中断清除寄存器可以清除该中断。外部中断信号可以通过中断屏蔽寄存器进行屏蔽。
当前计数器值可以随时从 值寄存器 读取。
7.2.2 功能描述¶
双定时器模块的框图如下所示。
7.2.2.1 AMBA APB 接口¶
AMBA APB 从接口为双定时器模块中的所有寄存器的访问生成读写解码。
7.2.2.2 自由运行计数器块¶
这两个 FRC 是相同的,并包含 32 位/16 位向下计数器和中断功能。计数器逻辑由 TIMCLK 时钟驱动,并且独立于 PCLK 工作,同时配合时钟使能 TIMCLKENX,尽管 PCLK 和 TIMCLK 之间存在约束。
虽然两个 FRC 都由共享时钟 TIMCLK 驱动,但每个定时器的计数速率可以通过各自的时钟使能 TIMCLKEN1 和 TIMCLKEN2 独立控制。每个 FRC 中的预分频器进一步独立地控制每个 FRC 的计数速率。
7.2.2.3 接口复位¶
双定时器模块由全局复位信号 PRESETn 复位。
PRESETn 可以异步于 PCLK 触发,但必须与 PCLK 的上升沿同步释放。PRESETn 用于重置双定时器模块寄存器的状态。双定时器模块要求 PRESETn 至少在 PCLK 的一个周期内保持低电平。总之,定时器在复位后初始化为以下状态:
- 计数器被禁用
- 选择自由运行模式
- 选择 16 位计数器模式
- 预分频器设置为 1
- 中断被清除但仍然使能
- 加载寄存器设置为零
- 计数器值设置为 0xFFFFFFFF
7.2.2.4 时钟信号和时钟使能¶
双定时器模块使用两个输入时钟:
- PCLK 用于计时所有对双定时器模块寄存器的 APB 访问。
- TIMCLK 通过时钟使能 TIMCLKEN1 和 TIMCLKEN2 进行有效性验证,并用于驱动预分频器、计数器及其相关的中断逻辑。此有效的 TIMCLK 时钟频率称为实际定时器时钟频率。预分频器计数器仅在 TIMCLKENX 为高时,在 TIMCLK 的上升沿递减。定时器计数器仅在 TIMCLKENX 为高且预分频器计数器生成使能时,才在 TIMCLK 的上升沿递减。
TIMCLK 和 PCLK 之间的关系必须满足以下约束:
- TIMCLK 的上升沿必须与 PCLK 的上升沿同步和平衡。
- TIMCLK 的频率不能大于 PCLK 的频率。
TIMCLK、TIMCLKEN1 和 TIMCLKEN2 可以按以下方式使用:
- TIMCLK 等于 PCLK 且 TIMCLKENX 等于 1
- TIMCLK 等于 PCLK 且 TIMCLKENX 为脉冲信号
- TIMCLK 小于 PCLK 且 TIMCLKENX 等于 1
- TIMCLK 小于 PCLK 且 TIMCLKENX 为脉冲信号
注:除非另有说明,这些示例使用的预分频设置为分频 1。这些示例适用于模块中的 Timer1 或 Timer2。TIMCLKENX 指代 TIMCLKEN1 或 TIMCLKEN2。
TIMCLK 等于 PCLK 且 TIMCLKENX 等于 1
下图展示了 TIMCLK 与 PCLK 相同且 TIMCLKENX 始终使能的情况。在这种情况下,计数器会在每个 TIMCLK 上升沿递减。
TIMCLK 等于 PCLK 且 TIMCLKENX 为脉冲信号
下图展示了 TIMCLK 与 PCLK 相同,但 TIMCLKENX 仅在每两个 TIMCLK 上升沿时使能的情况。在这种情况下,计数器会在每两个 TIMCLK 上升沿中的第二个递减。
TIMCLK 小于 PCLK 且 TIMCLKENX 等于 1
下图展示了 TIMCLK 的频率是 PCLK 频率的子倍数,但 TIMCLK 的上升沿与 PCLK 的上升沿是同步且平衡的情况。TIMCLKENX 始终使能。在这种情况下,计数器会在每个 TIMCLK 上升沿递减。
TIMCLK 小于 PCLK 且 TIMCLKENX 为脉冲信号
下图展示了 TIMCLK 的频率是 PCLK 频率的子倍数,但 TIMCLK 的上升沿与 PCLK 的上升沿是同步且平衡的情况。TIMCLKENX 仅在每两个 TIMCLK 上升沿时使能。在这种情况下,计数器会在每两个 TIMCLK 上升沿中的第二个递减。
7.2.2.5 预分频器操作¶
预分频器生成一个定时器时钟使能,用于以以下速率启用定时器计数器的递减:
- 有效的定时器时钟速率,其中 TIMCLK 通过 TIMCLKENX 进行有效性验证
- 有效的定时器时钟速率除以 16
- 有效的定时器时钟速率除以 256
下图展示了预分频器如何生成定时器时钟使能。
下图展示了预分频器如何生成定时器时钟使能,假设预分频器设置为分频 16 的情况。
7.2.2.6 定时器操作¶
在初始应用和 PRESETn 释放之后,定时器状态初始化如下:
- 计数器被禁用,TimerEn=0
- 选择自由运行模式,TimerMode=0 且 OneShot=0
- 选择 16 位计数器模式,TimerSize=0
- 预分频器设置为分频 1,TimerPre=0x0
- 中断被清除但已使能,IntEnable=1
- 加载寄存器设置为零
- 计数器值设置为 0xFFFFFFFF
三种定时器模式中的每种操作描述如下:
- 自由运行模式
- 周期性模式
- 单次模式
自由运行模式¶
自由运行模式通过在 TimerControl Register 中设置以下位来选择:
- 设置 TimerMode 位为 1
- 设置 OneShot 位为 0
32 位或 16 位计数器操作通过在 TimerControl Register 中适当设置 TimerSize 位来选择。
在复位时,定时器值初始化为 0xFFFFFFFF,如果计数器已启用,则计数器会在每个 TIMCLK 正向沿时递减,前提是 TIMCLKENX 为高且预分频器生成使能脉冲。或者,可以通过写入 TimerXLoad Register 来加载新的初始计数器值,若计数器已启用,计数器将从该值开始递减。
在 32 位模式下,当计数器值达到零(0x00000000)时,会生成一个中断,计数器无论 TimerXLoad Register 中的值如何都会回绕到 0xFFFFFFFF。计数器重新开始递减,整个周期会一直重复,直到计数器被禁用。
在 16 位模式下,只有计数器的最低有效 16 位会递减,当计数值达到 0x0000 时,会生成一个中断,计数器无论 TimerXLoad Register 中的值如何都会回绕到 0xFFFF。
如果通过清除 TimerEn 位来禁用计数器,则计数器会停止并保持当前值。如果计数器重新启用,则计数器将从当前值继续递减。
计数器值可以通过读取 TimerXValue Register 在任何时间被读取。
周期性模式¶
周期性模式通过在 TimerControl Register 中设置以下位来选择:
- 设置 TimerMode 位为 0
- 设置 OneShot 位为 0
32 位或 16 位计数器操作通过在 TimerControl Register 中适当设置 TimerSize 位来选择。
可以通过写入 TimerXLoad Register 来加载初始计数器值,如果计数器已启用,则计数器将从该值开始递减。
在 32 位模式下,计数器的全部 32 位都会递减,当计数器值达到零(0x00000000)时,会生成一个中断,计数器会用 TimerXLoad Register 中的值重新加载。计数器重新开始递减,整个周期会一直重复,直到计数器被禁用。
在 16 位模式下,只有计数器的最低有效 16 位会递减,当计数器值达到 0x0000 时,会生成一个中断,计数器会用 TimerXLoad Register 中的值重新加载。计数器重新开始递减,整个周期会一直重复,直到计数器被禁用。
如果计数器在运行时通过写入 TimerXLoad Register 加载了一个新值,则计数器将在下一个 TIMCLK 上升沿(当 TIMCLKENX 为高时)切换到新加载的值。
如果计数器在运行时通过写入后台加载寄存器 TimerXBGLoad 加载了一个新值,则 TimerXLoad Register 也会更新为相同的加载值,但计数器会继续递减至零。当计数器达到零时,它会用新加载的值重新加载,并且在周期性模式下每次重新加载时都使用这个新加载值,直到定时器被禁用。
如果通过清除 TimerEn 位来禁用计数器,则计数器会停止并保持当前值。如果计数器重新启用,则计数器将从当前值继续递减。
单次模式¶
单次定时器模式通过在 TimerControl Register 中将 OneShot 位设置为 1 来选择。在单次模式下,TimerMode 位没有作用。
32 位或 16 位计数器操作通过在 TimerControl Register 中适当设置 TimerSize 位来选择。
要在单次模式下启动计数倒计时序列,可以向 TimerXLoad Register 写入新的加载值,如果计数器已启用,则计数器将从该值开始递减。
在 32 位模式下,计数器的全部 32 位都会递减,当计数器值达到零(0x00000000)时,会生成一个中断,计数器停止。
在 16 位模式下,只有计数器的最低有效 16 位会递减,当计数器值达到 0x0000 时,会生成一个中断,计数器停止。
单次模式可以通过向 TimerXLoad Register 写入新值来重新触发。计数器将在下一个 TIMCLK 上升沿(当 TIMCLKENX 为高时)切换到新加载的值。
7.2.2.7 中断行为¶
当 IntEnable = 1
且在 32 位模式下计数器达到 0x00000000
,或在 16 位模式下计数器达到 0xXXXX0000
时,会生成中断。
在 16 位模式下,计数器的高 16 位将被忽略。
当定时器模块通过拉高 TIMINTX
信号来发起中断时,该信号的时序是基于由 TIMCLKENX
启用的 TIMCLK
的上升沿生成的。
当通过写入中断清除寄存器 TimerXIntClr
来清除中断时,TIMINTX
信号将在 PCLK
时钟域内立即被拉低,而不会等待下一个被启用的 TIMCLK
上升沿。
下图展示了一个中断触发与清除时序的示例。
由定时器模块生成的中断信号 TIMINT1
和 TIMINT2
,可以通过将 TimerXControl 寄存器中的 IntEnable
位设置为 0
来屏蔽。
在屏蔽之前的原始中断状态可以通过 TimerXRIS
寄存器读取,而屏蔽后的中断状态可以通过 TimerXMIS
寄存器读取。
下图展示了如何访问原始和屏蔽后的中断状态。
7.2.2.8 定时器间隔的编程¶
下表展示了用于计算每种定时器模式下生成的定时器间隔的公式,涉及以下参数:
TIMCLKFREQ
:TIMCLK
的频率。TIMCLKENXDIV
:由时钟使能信号TIMCLKENX
引起的TIMCLK
有效分频。例如,如果TIMCLKENX
每四个TIMCLK
边沿使能一次,则TIMCLKENXDIV = 4
。PRESCALEDIV
:预分频因子,可为 1、16 或 256。由控制寄存器的位[3:2]
决定。TimerXLoad
:加载寄存器中的值。
例如,若 TIMCLK = 100MHz
、TIMCLKENXDIV = 1
且 PRESCALEDIV = 1
,则为了实现 1ms 周期性间隔,所需的 TimerXLoad
值如下例所示计算。
7.3 编程模型(Programmer’s Model)¶
7.3.1 寄存器概览(Summary of Registers)¶
地址偏移 | 类型 | 位宽 | 复位值 | 名称 | 描述 |
---|---|---|---|---|---|
Base+0x00 | 读/写 | 32 | 0x00000000 | Timer1Load | 参见第 3.2.1 节的加载寄存器 TimerXLoad |
Base+0x04 | 只读 | 32 | 0xFFFFFFFF | Timer1Value | 参见第 3.2.2 节的当前值寄存器 TimerXValue |
Base+0x08 | 读/写 | 8 | 0x20 | Timer1Control | 参见第 3.2.3 节的控制寄存器 TimerXControl |
Base+0x0C | 写 | - | - | Timer1IntClr | 参见第 3.2.4 节的中断清除寄存器 TimerXIntClr |
Base+0x10 | 只读 | 1 | 0x0 | Timer1RIS | 参见第 3.2.5 节的原始中断状态寄存器 TimerXRIS |
Base+0x14 | 只读 | 1 | 0x0 | Timer1MIS | 参见第 3.2.6 节的屏蔽中断状态寄存器 TimerXMIS |
Base+0x18 | 读/写 | 32 | 0x00000000 | Timer1BGLoad | 参见第 3.2.7 节的后台加载寄存器 TimerXBGLoad |
Base+0x20 | 读/写 | 32 | 0x00000000 | Timer2Load | 参见第 3.2.1 节的加载寄存器 TimerXLoad |
Base+0x24 | 只读 | 32 | 0xFFFFFFFF | Timer2Value | 参见第 3.2.2 节的当前值寄存器 TimerXValue |
Base+0x28 | 读/写 | 8 | 0x20 | Timer2Control | 参见第 3.2.3 节的控制寄存器 TimerXControl |
Base+0x2C | 写 | - | - | Timer2IntClr | 参见第 3.2.4 节的中断清除寄存器 TimerXIntClr |
Base+0x30 | 只读 | 1 | 0x0 | Timer2RIS | 参见第 3.2.5 节的原始中断状态寄存器 TimerXRIS |
Base+0x34 | 只读 | 1 | 0x0 | Timer2MIS | 参见第 3.2.6 节的屏蔽中断状态寄存器 TimerXMIS |
Base+0x38 | 读/写 | 32 | 0x00000000 | Timer2BGLoad | 参见第 3.2.7 节的后台加载寄存器 TimerXBGLoad |
7.4 寄存器描述¶
7.4.1 加载寄存器(Load Register),TimerXLoad¶
TimerXLoad
寄存器是一个 32 位的寄存器,包含计数器将要递减的起始值。当启用了周期模式(Periodic mode)且当前计数值减至零时,该值会被用于重新加载计数器。
当该寄存器被直接写入新值时,在下一个由 TIMCLKENX
使能的 TIMCLK
上升沿,当前计数器值将立即重置为该新值。
注意:
TimerXLoad
的最小有效值为 1。如果设置为 0,则会立即触发一次中断。
当写入 TimerXBGLoad
寄存器时,该值也会覆盖 TimerXLoad
寄存器的内容,但不会立即影响当前计数值。
如果在某一由 TIMCLKENX
使能的 TIMCLK
上升沿之前,同时对 TimerXLoad
和 TimerXBGLoad
寄存器进行了写入操作,则在下一个 TIMCLK
上升沿时,写入 TimerXLoad
的值会取代当前计数值。随后,每次计数器归零时,当前计数值将重置为 TimerXBGLoad
中写入的值。
在上述两个写操作完成后,任何时刻读取 TimerXLoad
寄存器,将返回写入 TimerXBGLoad
的值。也就是说,读取 TimerXLoad
始终返回下一个周期内周期模式将生效的值。
7.4.2 当前值寄存器(Current Value Register),TimerXValue¶
TimerXValue
寄存器是一个 32 位的只读寄存器,用于提供当前递减计数器的数值。
当通过写入 TimerXLoad
设定了新的加载值后,TimerXValue
会立即在 PCLK 时钟域 中反映该新加载值,而无需等待由 TIMCLKENX
使能的下一个 TIMCLK
上升沿。
注意:
当处于 16 位定时器模式 时,TimerXValue
的高 16 位不会被自动清零。如果定时器之前处于 32 位模式,而在切换为 16 位模式后尚未对TimerXLoad
进行写操作,则TimerXValue
的高 16 位可能包含非零值。
7.4.3 控制寄存器(Control Register),TimerXControl¶
控制寄存器的位分配如下面的表格所示。
⚠️ 注意:
在定时器模块运行时,不得更改计数模式、计数器位宽或预分频器设置。
如果需要应用新的配置,必须遵循以下流程:
- 禁用定时器模块;
- 向相关寄存器写入新的配置值;
- 完成配置更改后,再重新使能定时器模块。
如果不按照此顺序操作,可能会导致器件行为不可预测。
7.4.4 中断清除寄存器(Interrupt Clear Register),TimerXIntClr¶
对该寄存器的任意写操作都会清除来自计数器的中断输出。
7.4.5 原始中断状态寄存器(Raw Interrupt Status Register),TimerXRIS¶
TimerXRIS 寄存器用于指示来自计数器的原始中断状态。
位分配详见下表。
7.4.6 屏蔽中断状态寄存器(Masked Interrupt Status Register),TimerXMIS¶
TimerXMIS 寄存器用于指示来自计数器的屏蔽中断状态。
该值是原始中断状态与控制寄存器中的定时器中断使能位(Interrupt Enable bit)的逻辑与(AND)运算结果,
并且与输出至中断引脚 TIMINTX 的值一致。
位分配详见下表。
7.4.7 背景装载寄存器(Background Load Register),TimerXBGLoad¶
TimerXBGLoad 是一个 32 位寄存器,包含计数器用于递减的初始值。
当启用周期模式(Periodic mode)并且当前计数器值减至零时,将使用该寄存器中的值重新装载计数器。
该寄存器提供了一种间接访问 TimerXLoad 寄存器的方式。不同之处在于:
- 写入 TimerXBGLoad 并不会立即使计数器从新值开始重计。
从该寄存器读取时,返回的值与读取 TimerXLoad 时相同。
详细信息请参见前文的装载寄存器(TimerXLoad)。
8 高级控制定时器¶
8.1 简介¶
高级控制定时器包含一个由可编程预分频器驱动的 32 位自动重载计数器。
它可用于多种目的,包括:
- 测量输入信号的脉冲长度(输入捕获)
- 生成输出波形(输出比较、PWM、带死区时间插入的互补 PWM)
通过定时器预分频器和 RCC 时钟控制器的分频器,可以将脉冲长度和波形周期调节为从几微秒到数毫秒的范围。
高级控制定时器和通用定时器是完全独立的,不共享任何资源。
8.2 主要特性¶
定时器的主要功能包括:
- 32 位自动重载计数器,支持向上计数、向下计数、向上/向下计数模式。
- 16 位可编程预分频器,允许将计数器时钟频率划分为 1 到 65536 之间的任意因数(支持动态更改)。
-
最多 4 个独立通道,可用于:
- 输入捕获(Input Capture)
- 输出比较(Output Compare)
- PWM 生成(边沿对齐或中心对齐模式)
- 单脉冲模式输出(One-Pulse Mode)
-
互补输出,支持可编程死区时间插入(Dead-time Insertion)
- 同步电路,用于通过外部信号控制定时器或将多个定时器互联。
- 重复计数器,允许在计数器经历指定次数周期后才更新定时器寄存器。
- 断路输入(Break Input),用于将定时器输出信号置于复位状态或已知状态。
-
中断/DMA 生成,可响应以下事件:
- 更新事件(计数器溢出/下溢、通过软件或内部/外部触发器初始化)
- 触发事件(计数器开始、停止、初始化,或通过内部/外部触发器进行计数)
- 输入捕获事件
- 输出比较事件
- 断路输入事件
-
支持增量式(正交)编码器和霍尔传感器,用于位置检测。
- 触发输入,可用于外部时钟或逐周期电流管理。
图 1:高级控制定时器框图
8.3 功能描述¶
8.3.1 时间基准单元¶
可编程高级控制定时器的主要模块是一个 16 位计数器及其相关的自动重载寄存器。该计数器可以向上计数、向下计数或向上/向下计数。计数器时钟可以通过预分频器进行分频。
计数器、自动重载寄存器和预分频器寄存器可以由软件读取或写入,即使计数器正在运行。
时间基准单元包括:
- 计数器寄存器(TCNT)
- 预分频器寄存器(PSC)
- 自动重载寄存器(ARR)
- 重复计数器寄存器(RCR)
自动重载寄存器是预加载的。写入或读取自动重载寄存器时访问的是预加载寄存器。预加载寄存器的内容会根据 CR1 寄存器中的 ARPE 位 传输到影子寄存器中,传输的时机有以下两种:
- 永久传输
- 在每次更新事件(UEV)时传输
更新事件在计数器溢出(向上计数)或下溢(向下计数)时发生,且 CR1 寄存器中的 UDIS 位 为 0 时触发。它也可以由软件触发。每种配置下更新事件的生成方式在后续有详细描述。
计数器由预分频器输出 CK_CNT 提供时钟,只有当 CR1 寄存器中的 CEN 位 被设置时,CK_CNT 才会启用(请参见从属模式控制器描述,获取更多关于计数器启用的详细信息)。注意,计数器将在设置 CEN 位后的下一个时钟周期开始计数。
预分频器描述¶
预分频器可以将计数器时钟频率按任意因数从 1 到 65536 进行分频。它基于一个 16 位计数器,通过一个 16 位寄存器(在 PSC 寄存器中)控制。由于该控制寄存器是缓冲的,因此可以动态修改预分频比,新的预分频比将在下一个更新事件时生效。
图 2 和图 3 给出了在动态修改预分频器比值时,计数器行为的一些示例:
图 2:预分频器从 1 更改为 2 时的计数器时序图
图 3:预分频器从 1 更改为 4 时的计数器时序图
8.3.2 计数器模式¶
向上计数模式¶
在向上计数模式中,计数器从 0 计数到自动重装值(即 ARR 寄存器中的内容),然后从 0 重新开始计数,并生成一个计数器溢出事件。
- 如果使用了重复计数器(repetition counter),则在重复计数达到重复计数器寄存器中设定的值加一(
RCR+1
)次后,会生成一次更新事件(UEV)。否则,每次计数器溢出都会生成一个更新事件。 - 通过软件或使用从模式控制器设置
EGR
寄存器中的UG
位,也会生成一个更新事件。 - 可以通过软件设置
CR1
寄存器中的UDIS
位来禁用更新事件 UEV。这是为了在向预装寄存器中写入新值时避免更新影子寄存器。在UDIS
位被设置为 0 之前,将不会发生更新事件。不过,计数器仍从 0 重新开始,同时预分频器的计数器也会重置(但预分频率不变)。
如果
CR1
寄存器中的URS
位(更新请求选择)被设置,则设置UG
位会生成更新事件UEV
,但不会设置UIF
标志位(因此不会产生中断或 DMA 请求)。这样做是为了在捕获事件清除计数器时避免同时生成更新和捕获中断。
当更新事件发生时,所有寄存器都会被更新,并设置更新标志(SR
寄存器中的 UIF
位),具体取决于 URS
位的设置:
- 重复计数器会重新加载
RCR
寄存器的内容, - 自动重装影子寄存器会用预装值(
ARR
)进行更新, - 预分频器的缓冲器会用预装值(
PSC
寄存器的内容)重新加载。
接下来的图示展示了在 ARR =
0x36
时,在不同时钟频率下计数器的行为示例。图4:计数器时序图,内部时钟不分频(除以1)
图5:计数器时序图,内部时钟除以2
图6:计数器时序图,内部时钟除以4
图7:计数器时序图,内部时钟除以N
图8:计数器时序图,ARPE=0 时的更新事件(ARR 未预装载)
图9:计数器时序图,ARPE=1 时的更新事件(ARR 已预装载)
倒计数模式(Downcounting mode)¶
在倒计数模式下,计数器从自动重装值(ARR寄存器的内容)开始向下计数至0,然后重新从自动重装值开始,并生成一个计数器下溢事件。
如果使用了重复计数器,则在重复计数器寄存器中设定的次数加一(RCR+1)次倒计数完成后,才会生成一次更新事件(UEV)。如果未使用重复计数器,则每次计数器下溢时都会生成一次更新事件。
通过软件或从模式控制器设置EGR寄存器中的UG位,也会生成一次更新事件。
可以通过设置CR1寄存器中的UDIS位来禁止软件生成更新事件(UEV),以避免在向预装载寄存器写入新值时更新影子寄存器。此时不会产生任何更新事件,直到将UDIS位重新写为0。然而,计数器仍会从当前的自动重装值重新开始,而预分频器的计数器从0开始(但预分频比率保持不变)。
此外,如果CR1寄存器中的URS位(更新请求选择)被设置,那么设置UG位会生成一个更新事件(UEV),但不会设置UIF标志位(即不会触发中断或DMA请求)。这样可以避免在捕获事件清除计数器时同时生成更新中断和捕获中断。
当发生更新事件时,所有寄存器将被更新,并设置更新标志(SR寄存器中的UIF位,具体取决于URS位):
- 重复计数器将被RCR寄存器的内容重新加载;
- 预分频器的缓冲器将被PSC寄存器的预装值重新加载;
- 自动重装活动寄存器将被ARR寄存器的预装值更新。注意:自动重装寄存器会在计数器重载之前更新,从而确保下一周期是预期值。
💡 后续图示展示了在不同时钟频率下,当ARR=0x36时计数器的行为示例。
图 10. 计数器时序图,内部时钟除以 1
图 11. 计数器时序图,内部时钟除以 2
图 12. 计数器时序图,内部时钟除以 4
图 13. 计数器时序图,内部时钟除以 N
图 14. 计数器时序图,未使用重复计数器时的更新事件
中心对齐模式(向上/向下计数)¶
在中心对齐模式下,计数器从 0 计数到自动重载值(ARR 寄存器的内容)减去 1,产生计数器溢出事件,然后从自动重载值向下计数到 1,产生计数器下溢事件。然后,计数器重新从 0 开始计数。
当 CR1 寄存器中的 CMS 位不等于 '00' 时,中心对齐模式处于激活状态。配置为输出的通道的输出比较中断标志在以下情况下被置位:
- 计数器向下计数(中心对齐模式 1,CMS = "01")
- 计数器向上计数(中心对齐模式 2,CMS = "10")
- 计数器向上和向下计数(中心对齐模式 3,CMS = "11")
在此模式下,CR1 寄存器中的 DIR 方向位无法写入。它由硬件更新,并给出计数器的当前方向。
更新事件可以在每次计数器溢出和每次计数器下溢时产生,或者通过设置 EGR 寄存器中的 UG 位(通过软件或使用从模式控制器)也会产生更新事件。在这种情况下,计数器将重新从 0 开始计数,预分频器的计数器也会重新开始计数。
可以通过软件设置 CR1 寄存器中的 UDIS 位来禁用 UEV 更新事件。这是为了避免在写入新值到预装载寄存器时更新影像寄存器。此时,直到 UDIS 位被写入 0,更新事件才会发生。然而,计数器仍将根据当前的自动重载值继续上下计数。
此外,如果 CR1 寄存器中的 URS 位(更新请求选择)被设置,则设置 UG 位将生成 UEV 更新事件,但不会设置 UIF 标志(因此不会发送中断或 DMA 请求)。这是为了避免在捕获事件清除计数器时生成更新和捕获中断。
当发生更新事件时,所有寄存器将被更新,并且更新标志(SR 寄存器中的 UIF 位)将被置位(根据 URS 位的不同):
- 重复计数器被重新加载为 RCR 寄存器的内容
- 预分频器的缓冲区被重新加载为预装载值(PSC 寄存器的内容)
- 自动重载激活寄存器被更新为预装载值(ARR 寄存器的内容)。需要注意的是,如果更新源是计数器溢出,自动重载将在计数器重新加载之前更新,以确保下一个周期是预期的(计数器将加载新值)。
💡 以下图示展示了不同时钟频率下计数器行为的一些示例。
图 15. 计数器时序图,内部时钟除以 1,ARR = 0x6
图 16. 计数器时序图,内部时钟除以 2
图 17. 计数器时序图,内部时钟除以 4,ARR = 0x36
图 18. 计数器时序图,内部时钟除以 N
图 19. 计数器时序图,更新事件,当 ARPE = 1 时(计数器下溢)
图 20. 计数器时序图,更新事件,当 ARPE = 1 时(计数器溢出)
8.3.3 重复计数器¶
时间基准单元描述了如何根据计数器的溢出/下溢生成更新事件(UEV)。实际上,只有当重复计数器的值达到零时,更新事件才会被生成。这在生成 PWM 信号时非常有用。
这意味着数据将在每 N+1 次计数器溢出或下溢时从预装载寄存器传输到影像寄存器(ARR 自动重载寄存器、PSC 预分频器寄存器,还包括在比较模式下的 CCRx 捕获/比较寄存器),其中 N 是 RCR 重复计数器寄存器中的值。
重复计数器的值会在以下情况下递减:
- 在向上计数模式下的每次计数器溢出时
- 在向下计数模式下的每次计数器下溢时
- 在中心对齐模式下的每次计数器溢出和计数器下溢时
尽管这限制了最大重复次数为 128 个 PWM 周期,但它使得可以在每个 PWM 周期内更新两次占空比。在中心对齐模式下,每个 PWM 周期只刷新一次比较寄存器时,最大分辨率为 2xTck,这是由于模式的对称性。
重复计数器是自动重载类型;重复率保持为 RCR 寄存器值定义的值(参见图 21)。当更新事件由软件生成(通过设置 EGR 寄存器中的 UG 位)或通过从模式控制器硬件生成时,它会立即发生,无论重复计数器的值是多少,并且重复计数器将被重新加载为 RCR 寄存器的内容。
在中心对齐模式下,对于 RCR 的奇数值,更新事件要么在溢出时发生,要么在下溢时发生,具体取决于 RCR 寄存器何时写入以及计数器何时启动。如果在启动计数器之前写入 RCR,则 UEV 会在溢出时发生。如果在启动计数器之后写入 RCR,则 UEV 会在下溢时发生。例如,对于 RCR = 3,UEV 会在每第 4 次溢出或下溢事件中生成,具体取决于 RCR 是何时写入的。
图 21. 根据模式和 RCR 寄存器设置的更新率示例
8.3.4 时钟选择¶
计数器时钟可以由以下时钟源提供:
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入引脚
- 外部时钟模式2:外部触发输入 ETR
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,例如,用户可以配置定时器 1 作为定时器 2 的预分频器。有关更多详细信息,请参见“使用一个定时器作为另一个定时器的预分频器”。
内部时钟源(CK_INT)¶
如果从模式控制器被禁用(SMS=000),则 CEN、DIR(在 CR1 寄存器中)和 UG 位(在 EGR 寄存器中)为实际控制位,且只能通过软件更改(除非 UG 位,它会自动被清除)。一旦 CEN 位被写入 1,预分频器就会由内部时钟 CK_INT 驱动。
💡 图 22 显示了在正常模式下,无预分频器时控制电路和向上计数器的行为。
图 22. 正常模式下的控制电路,内部时钟除以 1
外部时钟源模式 1¶
当 SMCR 寄存器中的 SMS=111 时,选择此模式。计数器可以在选定输入的每个上升沿或下降沿进行计数。
图 23. TI2 外部时钟连接示例
注意:例如,要配置向上计数器以响应 TI2 输入的上升沿进行计数,请按照以下步骤操作:
- 通过在 CCMR1 寄存器中写入 CC2S = ‘01’,配置通道 1 以检测 TI2 输入的上升沿。
- 通过在 CCMR1 寄存器中写入 IC2F[3:0] 位来配置输入滤波器持续时间(如果不需要滤波器,则保持 IC2F=0000)。
- 通过在 CCER 寄存器中写入 CC2P=0,选择上升沿极性。
- 通过在 SMCR 寄存器中写入 SMS=111,配置定时器为外部时钟模式 1。
- 通过在 SMCR 寄存器中写入 TS=110,选择 TI2 作为触发输入源。
- 通过在 CR1 寄存器中写入 CEN=1,启用计数器。
捕获预分频器不用于触发,因此用户不需要配置它。
当 TI2 上发生上升沿时,计数器计数一次,并设置 TIF 标志。
TI2 上的上升沿与计数器的实际时钟之间的延迟是由于 TI2 输入的重同步电路。
图 24. 外部时钟模式 1 下的控制电路
外部时钟源模式 2¶
通过在 SMCR 寄存器中写入 ECE=1 来选择此模式。计数器可以在外部触发输入 ETR 的每个上升沿或下降沿进行计数。
图 25 给出了外部触发输入块的概述。
图 25. 外部触发输入块
例如,要配置向上计数器以在每 2 个 ETR 上升沿上进行计数,请按照以下步骤操作:
- 由于在此示例中不需要滤波器,在 SMCR 寄存器中写入 ETF[3:0]=0000。
- 通过在 SMCR 寄存器中写入 ETPS[1:0]=01 来设置预分频器。
- 通过在 SMCR 寄存器中写入 ETP=0,选择 ETR 引脚上的上升沿检测。
- 通过在 SMCR 寄存器中写入 ECE=1,启用外部时钟模式 2。
- 通过在 CR1 寄存器中写入 CEN=1,启用计数器。
计数器在每 2 个 ETR 上升沿时计数一次。
ETR 上的上升沿与计数器的实际时钟之间的延迟是由于 ETRP 信号上的重同步电路。
图 26. 外部时钟模式 2 下的控制电路
8.3.5 捕获/比较通道¶
每个捕获/比较通道由一个捕获/比较寄存器(包括影像寄存器)、一个用于捕获的输入阶段(带有数字滤波器、多路复用和预分频器)以及一个输出阶段(带有比较器和输出控制)组成。
图 27 到图 30 给出了一个捕获/比较通道的概述。
输入阶段对相应的 TIx 输入进行采样,以生成滤波后的信号 TIxF。然后,带有极性选择的边缘检测器生成一个信号(TIxFPx),该信号可用作从模式控制器的触发输入或作为捕获命令。在捕获寄存器之前进行预分频(ICxPS)。
图 27. 捕获/比较通道(示例:通道 0 输入阶段)
输出阶段生成一个中间波形,然后用作参考: OCxRef(有效高)。极性在链条的末端起作用。
图 28. 捕获/比较通道 0 主电路
图 29. 捕获/比较通道的输出阶段(通道 1 至 3)
图 30. 捕获/比较通道的输出阶段(通道 4)
捕获/比较模块由一个预装载寄存器和一个影像寄存器组成。写入和读取始终访问预装载寄存器。
在捕获模式下,捕获实际上发生在影像寄存器中,捕获内容被复制到预装载寄存器。
在比较模式下,预装载寄存器的内容被复制到影像寄存器中,并与计数器进行比较。
8.3.6 输入捕获模式¶
在输入捕获模式下,捕获/比较寄存器(CCRx)用于在检测到相应的 ICx 信号过渡后锁存计数器的值。当捕获发生时,相应的 CCXIF 标志(SR 寄存器)会被置位,并且如果启用了中断或 DMA 请求,可以发送它们。如果在 CCxIF 标志已经为高时发生捕获,则会设置溢出捕获标志 CCxOF(SR 寄存器)。可以通过软件将 CCxIF 写为 '0' 或读取存储在 CCRx 寄存器中的捕获数据来清除 CCxIF。写入 '0' 时,CCxOF 被清除。
以下示例展示了如何在 TI1 输入上升沿时捕获 CCR1 中的计数器值。为此,请按照以下步骤操作:
- 选择有效输入:CCR1 必须连接到 TI1 输入,因此在 CCMR1 寄存器中将 CC1S 位写为 01。只要 CC1S 不再为 00,通道就会配置为输入,CCR1 寄存器变为只读。
- 根据连接到定时器的信号编程所需的输入滤波器持续时间(如果输入是 TIx 输入,则在 CCMRx 寄存器中编程 ICxF 位)。假设在翻转时,输入信号在至少五个内部时钟周期内不稳定。我们必须编程一个比这五个时钟周期更长的滤波持续时间。我们可以在检测到 8 个连续的样本后确认 TI1 上的过渡(以 fDTS 频率采样)。然后在 CCMR1 寄存器中将 IC1F 位写为 0011。
- 通过在 CCER 寄存器中写入 CC1P 位为 0(此时为上升沿),选择 TI1 通道的有效过渡边缘。
- 编程输入预分频器。在我们的示例中,我们希望在每个有效过渡时执行捕获,因此禁用预分频器(在 CCMR1 寄存器中将 IC1PS 位写为 ‘00’)。
- 通过在 CCER 寄存器中设置 CC1E 位启用从计数器到捕获寄存器的捕获。
- 如果需要,通过在 DIER 寄存器中设置 CC1IE 位启用相关的中断请求,和/或通过在 DIER 寄存器中设置 CC1DE 位启用 DMA 请求。
当发生输入捕获时:
- CCR1 寄存器将获得计数器在有效过渡时的值。
- CC1IF 标志被置位(中断标志)。如果至少发生了两个连续的捕获且标志未被清除,CC1OF 也会被置位。
- 根据 CC1IE 位生成中断。
- 根据 CC1DE 位生成 DMA 请求。
为了处理溢出捕获,建议在溢出捕获标志之前读取数据。这样可以避免在读取标志后和读取数据之前错过溢出捕获。
注意:可以通过软件设置相应的 CCxG 位在 EGR 寄存器中生成 IC 中断和/或 DMA 请求。
8.3.7 PWM 输入模式¶
此模式是输入捕获模式的一个特殊情况。步骤与输入捕获模式相同,区别如下:
- 两个 ICx 信号映射到同一个 TIx 输入。
- 这两个 ICx 信号在具有相反极性的边缘上处于激活状态。
- 选择其中一个 TIxFP 信号作为触发输入,并将从模式控制器配置为复位模式。
例如,用户可以使用以下步骤测量应用于 TI1 上的 PWM 的周期(存储在 CCR1 寄存器中)和占空比(存储在 CCR2 寄存器中)(取决于 CK_INT 频率和预分频器值):
- 选择 CCR1 的有效输入:在 CCMR1 寄存器中将 CC1S 位写为 01(选择 TI1)。
- 选择 TI1FP1 的有效极性(用于 CCR1 中的捕获和计数器清除):将 CC1P 位写为 ‘0’(在上升沿有效)。
- 选择 CCR2 的有效输入:在 CCMR1 寄存器中将 CC2S 位写为 10(选择 TI1)。
- 选择 TI1FP2 的有效极性(用于 CCR2 中的捕获):将 CC2P 位写为 ‘1’(在下降沿有效)。
- 选择有效的触发输入:在 SMCR 寄存器中将 TS 位写为 101(选择 TI1FP1)。
- 将从模式控制器配置为复位模式:在 SMCR 寄存器中将 SMS 位写为 100。
- 启用捕获:在 CCER 寄存器中将 CC1E 和 CC2E 位写为 ‘1’。
图 31. PWM 输入模式时序
- 由于仅有 TI1FP1 和 TI2FP2 连接到从模式控制器,因此 PWM 输入模式只能与 CH1/CH2 信号一起使用。
8.3.8 强制输出模式¶
在输出模式下(CCxS 位在 CCMRx 寄存器中设置为 00),每个输出比较信号(OCxREF 然后是 OCx/OCxN)可以通过软件直接强制为激活或非激活状态,独立于输出比较寄存器与计数器之间的任何比较。
要强制将输出比较信号(OCxREF/OCx)设为激活状态,用户只需要在相应的 CCMRx 寄存器中将 OCxM 位写为 101。因此,OCxREF 会被强制为高电平(OCxREF 始终为有效高),并且 OCx 的值与 CCxP 极性位相反。
例如:CCxP=0(OCx 有效高)=> OCx 被强制为高电平。
通过在 CCMRx 寄存器中将 OCxM 位写为 100,可以将 OCxREF 信号强制为低电平。
无论如何,CCRx 影像寄存器与计数器之间的比较仍然会进行,并允许设置标志。中断和 DMA 请求可以相应地发送。这将在下面的输出比较模式部分中描述。
8.3.9 输出比较模式¶
此功能用于控制输出波形或指示某段时间已过去。
当捕获/比较寄存器与计数器匹配时,输出比较功能:
- 将相应的输出引脚分配为由输出比较模式(CCxM 位在 CCMRx 寄存器中)和输出极性(CCxP 位在 CCER 寄存器中)定义的可编程值。输出引脚可以保持其电平(OCxM=000)、设为激活状态(OCxM=001)、设为非激活状态(OCxM=010)或在匹配时切换(OCxM=011)。
- 在中断状态寄存器中设置标志(SR 寄存器中的 CCxIF 位)。
- 如果相应的中断掩码被设置,则生成中断(DIER 寄存器中的 CCxIE 位)。
- 如果相应的启用位被设置,则发送 DMA 请求(DIER 寄存器中的 CCxDE 位,CR2 寄存器中的 CCDS 位用于 DMA 请求选择)。
CCRx 寄存器可以通过 CCMRx 寄存器中的 OCxPE 位进行编程,决定是否使用预装载寄存器。
在输出比较模式下,更新事件 UEV 对 OCxREF 和 OCx 输出没有影响。
计时分辨率为计数器的一个计数。输出比较模式还可以用于输出单个脉冲(在单脉冲模式下)。
操作步骤:
- 选择计数器时钟(内部、外部、预分频器)。
- 在 ARR 和 CCRx 寄存器中写入所需数据。
- 如果要生成中断请求,则设置 CCxIE 位。
-
选择输出模式。例如:
- 写 OCxM = 011,当 CNT 与 CCRx 匹配时切换 OCx 输出引脚。
- 写 OCxPE = 0 禁用预装载寄存器 – 高极性。
- 写 CCxE = 1 启用输出。
- 写 CCxP = 0 选择激活。
-
通过在 CR1 寄存器中设置 CEN 位启用计数器。
只要预装载寄存器未启用(OCxPE = '0',否则只有在下一个更新事件 UEV 时才会更新 CCRx 影像寄存器),CCRx 寄存器可以随时由软件更新,以控制输出波形。图 32 给出了一个示例。
图 32. 输出比较模式,在 OC1 上切换。
8.3.10 PWM 模式¶
脉宽调制(PWM)模式允许生成一个频率由 ARR 寄存器的值决定、占空比由 CCRx 寄存器的值决定的信号。
PWM 模式可以通过在 CCMRx 寄存器中的 OCxM 位写入 ‘110’(PWM 模式 1)或 ‘111’(PWM 模式 2)独立地选择在每个通道上(每个 OCx 输出一个 PWM)。相应的预装载寄存器必须通过在 CCMRx 寄存器中设置 OCxPE 位来启用,最终通过在 CR1 寄存器中设置 ARPE 位来启用自动重装载预装载寄存器(在向上计数或中心对齐模式下)。
由于预装载寄存器仅在更新事件发生时才会传输到影像寄存器,因此在启动计数器之前,用户必须通过在 EGR 寄存器中设置 UG 位来初始化所有寄存器。
OCx 极性可以通过 CCxP 位在 CCER 寄存器中进行软件编程。它可以编程为有效高或有效低。OCx 输出通过 CCxE、CCxNE、MOE、OSSI 和 OSSR 位的组合(CCER 和 BDTR 寄存器)启用。有关更多详细信息,请参阅 CCER 寄存器的描述。
在 PWM 模式(1 或 2)下,CNT 和 CCRx 始终进行比较,以确定是 CCRx < CNT 还是 CNT < CCRx(取决于计数器的方向)。
定时器能够在边缘对齐模式或中心对齐模式下生成 PWM,具体取决于 CR1 寄存器中的 CMS 位。
PWM 边缘对齐模式¶
向上计数配置
当 CR1 寄存器中的 DIR 位为低时,向上计数模式是激活的。请参阅向上计数模式。
在以下示例中,我们考虑 PWM 模式 1。参考 PWM 信号 OCxREF 在 CNT < CCRx 时为高,否则变为低。如果 CCRx 中的比较值大于自动重装载值(在 ARR 中),则 OCxREF 保持为 ‘1’。如果比较值为 0,则 OCxREF 保持为 ‘0’。图 33 显示了一个 ARR=8 的边缘对齐 PWM 波形示例。
图 33. 边缘对齐 PWM 波形(ARR=8)
向下计数配置
当 CR1 寄存器中的 DIR 位为高时,向下计数模式是激活的。请参阅向下计数模式。
在 PWM 模式 1 中,参考信号 OCxREF 在 CNT > CCRx 时为低,否则变为高。如果 CCRx 中的比较值大于 ARR 中的自动重装载值,则 OCxREF 保持为 ‘1’。在此模式下,0% PWM 是不可用的。
PWM 中心对齐模式¶
当 CR1 寄存器中的 CMS 位不等于 ‘00’ 时,中心对齐模式激活(其余配置对 OCxRef/OCx 信号有相同效果)。根据 CMS 位的配置,计数器在向上计数、向下计数或上下计数时都会设置比较标志。CR1 寄存器中的方向位(DIR)由硬件更新,不能由软件更改。请参阅中心对齐模式(向上/向下计数)。
图 34 显示了一个 ARR=8 的中心对齐 PWM 波形示例,其中:
- ARR=8,
- PWM 模式为 PWM 模式 1,
- 选择了 CMS=01 的中心对齐模式 1 时,当计数器向下计数时设置标志。
图 34. 中心对齐 PWM 波形(ARR=8)
使用中心对齐模式的提示:
- 当启动中心对齐模式时,将使用当前的向上/向下配置。这意味着计数器根据 CR1 寄存器中 DIR 位的值向上或向下计数。此外,DIR 和 CMS 位不能同时由软件更改。
-
在运行中心对齐模式时,建议不要写入计数器,因为这可能导致意外结果。特别是:
- 如果用户写入计数器的值大于自动重装载值(CNT > ARR),则方向不会更新。例如,如果计数器正在向上计数,它将继续向上计数。
- 如果用户写入 0 或将 ARR 值写入计数器,则方向会更新,但不会生成更新事件(UEV)。
-
使用中心对齐模式的最安全方法是在启动计数器之前通过软件生成一次更新(在 EGR 寄存器中设置 UG 位),并且不要在计数器运行时写入计数器。
8.3.11 互补输出与死区时间插入¶
高级控制定时器可以输出两个互补信号,并管理输出的关闭和开启时刻。这个时间通常被称为死区时间,需要根据连接到输出的设备及其特性(例如电平转换器的固有延迟、功率开关的延迟等)进行调整。
用户可以独立选择每个输出的极性(主输出 OCx 或互补输出 OCxN)。这是通过在 CCER 寄存器中写入 CCxP 和 CCxNP 位来实现的。
互补信号 OCx 和 OCxN 通过多个控制位的组合激活:CCER 寄存器中的 CCxE 和 CCxNE 位,以及 BDTR 和 CR2 寄存器中的 MOE、OISx、OISxN、OSSI 和 OSSR 位。特别是,当切换到空闲状态时(MOE 下降至 0),死区时间会被激活。
通过设置 CCxE 和 CCxNE 位,并在断开电路存在时设置 MOE 位来启用死区时间插入。BDTR 寄存器中的 DTG[7:0] 位用于控制所有通道的死区时间生成。从参考波形 OCxREF,它生成 2 个输出 OCx 和 OCxN。如果 OCx 和 OCxN 是有效高:
- OCx 输出信号与参考信号相同,但上升沿相对于参考上升沿有所延迟。
- OCxN 输出信号与参考信号相反,但上升沿相对于参考下降沿有所延迟。
如果延迟大于活动输出(OCx 或 OCxN)的宽度,则不会生成相应的脉冲。
以下图示展示了死区时间生成器输出信号与参考信号 OCxREF 之间的关系(我们假设在这些示例中 CCxP=0,CCxNP=0,MOE=1,CCxE=1 和 CCxNE=1)。
图 35. 带死区时间插入的互补输出。
图 36. 死区时间波形(延迟大于负脉冲)。
图 37. 死区时间波形(延迟大于正脉冲)。
死区时间延迟对每个通道都是相同的,并且可以通过 BDTR 寄存器中的 DTG 位进行编程。有关延迟计算的详细信息,请参考断开和死区时间寄存器(BDTR)。
将 OCxREF 重定向到 OCx 或 OCxN¶
在输出模式下(强制、输出比较或 PWM),通过配置 CCER 寄存器中的 CCxE 和 CCxNE 位,OCxREF 可以重定向到 OCx 输出或 OCxN 输出。这允许用户在一个输出上发送特定的波形(例如 PWM 或静态激活电平),而互补输出保持在非激活电平。其他可能的配置是将两个输出都保持在非激活电平,或者将两个输出都设置为激活并互补,带有死区时间。
注意:当仅启用 OCxN(CCxE=0,CCxNE=1)时,它不会进行互补,当 OCxREF 为高时它就变为激活状态。例如,如果 CCxNP=0,则 OCxN=OCxRef。另一方面,当同时启用 OCx 和 OCxN(CCxE=CCxNE=1)时,OCx 在 OCxREF 为高时激活,而 OCxN 进行互补,在 OCxREF 为低时激活。
8.3.12 使用断开功能¶
在使用断开功能时,输出使能信号和非激活电平会根据额外的控制位进行修改(BDTR 寄存器中的 MOE、OSSI 和 OSSR 位,CR2 寄存器中的 OISx 和 OISxN 位)。无论如何,OCx 和 OCxN 输出不能在任何给定时刻同时设为激活电平。
断开源可以是断开输入引脚或由时钟安全系统(CSS)生成的时钟故障事件,后者由复位时钟控制器生成。有关时钟安全系统的更多信息,请参阅相关文档。
当从复位退出时,断开电路被禁用,MOE 位为低。用户可以通过在 BDTR 寄存器中设置 BKE 位来启用断开功能。断开输入极性可以通过配置同一寄存器中的 BKP 位来选择。BKE 和 BKP 可以同时修改。当写入 BKE 和 BKP 位时,会应用 1 个 APB 时钟周期的延迟,然后写入生效。因此,在写操作之后,必须等待 1 个 APB 时钟周期才能正确读取该位。
由于 MOE 下降沿可能是异步的,因此在实际信号(作用于输出)和同步控制位(通过 BDTR 寄存器访问)之间插入了重同步电路。这样会导致异步信号与同步信号之间存在一些延迟。特别是,如果 MOE 被写为 1 而之前为低,则在正确读取之前必须插入延迟(虚拟指令)。这是因为用户写入了一个异步信号,但读取的是一个同步信号。
当发生断开事件时(断开输入的选定电平):
- MOE 位被异步清除,将输出设置为非激活状态、空闲状态或复位状态(由 OSSI 位选择)。即使 MCU 振荡器关闭,这个功能也会生效。
- 每个输出通道在 MOE=0 时会根据 CR2 寄存器中的 OISx 位的值进行驱动。如果 OSSI=0,则定时器释放输出使能,否则输出使能保持高电平。
-
当使用互补输出时:
- 输出首先被置于复位状态或非激活状态(取决于极性)。这一步是异步进行的,因此即使定时器没有时钟输入,它也能正常工作。
- 如果定时器时钟仍然存在,则死区时间生成器被重新激活,以在死区时间后使用 OISx 和 OISxN 位编程的电平驱动输出。即便如此,OCx 和 OCxN 不能同时被驱动到激活电平。请注意,由于 MOE 上的重同步,死区时间略长(大约 2 个 ck_tim 时钟周期)。
- 如果 OSSI=0,则定时器释放输出使能,否则一旦 CCxE 或 CCxNE 位为高,输出使能会保持或变为高。
-
断开状态标志(SR 寄存器中的 BIF 位)被置位。如果 DIER 寄存器中的 BIE 位被设置,则可以生成中断。如果 DIER 寄存器中的 BDE 位被设置,则可以发送 DMA 请求。
- 如果 BDTR 寄存器中的 AOE 位被设置,则 MOE 位将在下一个更新事件(UEV)时自动重新设置。这可以用于执行调节。例如,可以用于安全功能,断开输入可以连接到电源驱动器、温度传感器或其他安全组件的警报。
- 否则,MOE 保持低电平,直到再次写入 ‘1’。在这种情况下,它可以用于安全功能,断开输入可以连接到来自电源驱动器、热传感器或任何安全组件的警报。
注意:断开输入作用于电平。因此,当断开输入处于激活状态时,MOE 无法被设置(既不能自动设置,也不能通过软件设置)。与此同时,状态标志 BIF 不能被清除。
断开功能可以通过 BRK 输入生成,BRK 输入具有可编程的极性和 BDTR 寄存器中的启用位 BKE。
生成断开的两种方式:
- 使用具有可编程极性和启用位 BKE 的 BRK 输入,在 BDTR 寄存器中配置。
- 通过软件使用 EGR 寄存器中的 BG 位。
除了断开输入和输出管理外,断开电路内还实现了写保护,以保障应用安全。它允许冻结多个参数的配置(死区时间、OCx/OCxN 极性和禁用时的状态、OCxM 配置、断开使能和极性)。用户可以选择由 BDTR 寄存器中的 LOCK 位选择的三种保护级别。有关详细信息,请参考 "断开和死区时间寄存器(BDTR)"。LOCK 位只能在 MCU 重置后写入一次。
图 38 显示了断开响应时输出行为的示例。
图 38. 断开响应时的输出行为。
8.3.13 外部事件清除 OCxREF 信号¶
通过对 ETRF 输入施加高电平(将相应 CCMRx 寄存器的 OCxCE 启用位设置为 ‘1’),可以将给定通道的 OCxREF 信号驱动为低电平。OCxREF 信号将保持为低电平,直到下一个更新事件(UEV)发生。
此功能仅可在输出比较和 PWM 模式中使用,在强制模式下不可用。
例如,ETR 信号可以连接到比较器的输出,用于电流处理。在这种情况下,ETR 必须按以下方式配置:
- 外部触发预分频器应保持关闭:将 SMCR 寄存器的 ETPS[1:0] 位设置为 ‘00’。
- 必须禁用外部时钟模式 2:将 SMCR 寄存器的 ECE 位设置为 ‘0’。
- 外部触发极性(ETP)和外部触发滤波器(ETF)可以根据用户需要进行配置。
图 39 显示了当 ETRF 输入变为高电平时,OCxREF 信号的行为,适用于 OCxCE 启用位的两种值。在此示例中,定时器已配置为 PWM 模式。
图 39. 清除 OCxREF
8.3.14 6 步 PWM 生成¶
当通道上使用互补输出时,OCxM、CCxE 和 CCxNE 位上会有预装载位。预装载位会在 COM 换向事件发生时被传输到影像位。用户可以提前编程配置,以便为下一个步骤进行配置,并且可以同时更改所有通道的配置。COM 事件可以通过软件设置 COM 位在 EGR 寄存器中触发,或者通过硬件触发(在 TRGI 上升沿时触发)。
当 COM 事件发生时,会设置一个标志(SR 寄存器中的 COMIF 位),这可以生成中断(如果 DIER 寄存器中的 COMIE 位被设置)或 DMA 请求(如果 DIER 寄存器中的 COMDE 位被设置)。
图 40 描述了当 COM 事件发生时,OCx 和 OCxN 输出的行为,在三种不同的已编程配置示例中。
图 40. 6 步生成,COM 示例(OSSR=1)
8.3.15 单脉冲模式¶
单脉冲模式(OPM)是前述模式的一个特例。它允许计数器在响应一个刺激后启动,并在可编程的延迟后生成一个具有可编程长度的脉冲。
计数器的启动可以通过从模式控制器进行控制。生成波形可以在输出比较模式或 PWM 模式中完成。通过在 CR1 寄存器中设置 OPM 位来选择单脉冲模式。这使得计数器在下一个更新事件(UEV)时自动停止。
只有当比较值与计数器初始值不同的时候,才能正确生成脉冲。在启动之前(当定时器等待触发时),配置必须为:
- 在向上计数时:CNT < CCRx
- 在向下计数时:CNT > CCRx
- ARR(特别是,0 < CCRx)
图 41. 单脉冲模式示例。
例如,用户可能希望在 TI2 输入引脚上检测到一个上升沿后,在 OC1 上生成一个时长为 tPULSE 的正脉冲,并延迟 tDELAY。我们使用 TI2FP2 作为触发信号:
- 将 TI2FP2 映射到 TI2,通过在 CCMR1 寄存器中写入 CC2S=’01’。
- TI2FP2 必须检测上升沿,通过在 CCER 寄存器中写入 CC2P=’0’。
- 通过在 SMCR 寄存器中写入 TS=’110’ 将 TI2FP2 配置为从模式控制器(TRGI)的触发源。
- 通过在 SMCR 寄存器中将 SMS 写为 ‘110’ 使用 TI2FP2 启动计数器(触发模式)。
OPM 波形由比较寄存器定义(考虑时钟频率和计数器预分频器)。
- tDELAY 由写入 CCR1 寄存器的值定义。
- tPULSE 由自动重装载值和比较值之间的差值(ARR - CCR1)定义。
- 假设用户希望构建一个波形,在比较匹配时从 ‘0’ 变为 ‘1’,并在计数器达到自动重装载值时从 ‘1’ 变为 ‘0’。为此,通过在 CCMR1 寄存器中写入 OC1M=111 启用 PWM 模式 2。用户还可以通过在 CCMR1 寄存器中写入 OC1PE=’1’ 和在 CR1 寄存器中设置 ARPE 来启用预装载寄存器。在这种情况下,比较值必须写入 CCR1 寄存器,自动重装载值写入 ARR 寄存器,生成一个更新事件通过设置 UG 位,并等待 TI2 上的外部触发事件。在此示例中,CC1P 被写为 ‘0’。
在我们的示例中,CR1 寄存器中的 DIR 和 CMS 位应该为低。
用户只需要一个脉冲(单次模式),因此必须在 CR1 寄存器中将 OPM 位写为 '1',以便在下一个更新事件时停止计数器(当计数器从自动重装载值回滚到 0 时)。当 CR1 寄存器中的 OPM 位设置为 '0' 时,将选择重复模式。
特殊情况:OCx 快速使能:
在单脉冲模式中,TIx 输入上的边缘检测设置 CEN 位,从而启用计数器。然后,计数器与比较值之间的比较使得输出发生切换。但这些操作需要几个时钟周期,这限制了我们能得到的最小延迟 tDELAY min。
如果用户希望输出具有最小延迟的波形,则必须在 CCMRx 寄存器中设置 OCxFE 位。然后,OCxRef(和 OCx)会响应刺激而被强制输出,而不考虑比较操作。它的新电平与发生比较匹配时的电平相同。OCxFE 仅在通道配置为 PWM1 或 PWM2 模式时生效。
8.3.16 编码器接口模式(Encoder Interface Mode)¶
要选择编码器接口模式(Encoder Interface mode),应在 SMCR 寄存器中设置 SMS
位为:
001
:仅在 TI2 边沿触发计数;010
:仅在 TI1 边沿触发计数;011
:在 TI1 和 TI2 的边沿触发计数。
使用 CCER 寄存器中的 CC1P
和 CC2P
位配置 TI1 和 TI2 的极性。如有需要,用户还可以配置输入滤波器(Input Filter)。
TI1 和 TI2 输入用于连接增量式编码器(incremental encoder)。当计数器已启用(即 CR1 寄存器中的 CEN=1
),则在 TI1FP1 或 TI2FP2 的每一个有效跳变上计数。
注:TI1FP1 和 TI2FP2 是 TI1 和 TI2 经过输入滤波器与极性控制后的信号。若未启用滤波和极性翻转,则 TI1FP1=TI1,TI2FP2=TI2。
两路输入的跳变顺序会被识别,用于生成计数脉冲及方向信号。根据跳变的顺序,计数器会递增或递减。此时 CR1 寄存器中的 DIR
位会被硬件自动更新。
无论是在 TI1、TI2 或同时在 TI1 和 TI2 上进行计数,每当任一输入发生跳变时,都会重新计算 DIR
位。
编码器接口模式本质上是一个带方向检测的外部时钟输入模式,意味着计数器将在 0 和自动重载寄存器 ARR 中的值之间循环计数。因此,用户在启动前必须正确配置 ARR。
此外,捕获、比较、预分频器、重复计数器和触发输出功能依旧正常工作。编码器模式与外部时钟模式 2(External clock mode 2)不兼容,不能同时启用。
在该模式下,计数器会自动跟随增量式编码器的速度和方向更新,其内容始终代表编码器的位置。计数方向与所连接传感器的旋转方向一致。
表 1:编码器信号与计数方向关系
活跃边沿 | 对端信号电平 | TI1FP1 信号 | TI2FP2 信号 | 计数模式 | 方向 |
---|---|---|---|---|---|
上升沿 | 高 | TI1 计数 | 向下 | ||
上升沿 | 低 | TI1 计数 | 向上 | ||
下降沿 | 高 | TI1 计数 | 向上 | ||
下降沿 | 低 | TI1 计数 | 向下 | ||
上升沿 | 高 | TI2 计数 | 向上 | ||
上升沿 | 低 | TI2 计数 | 向下 | ||
下降沿 | 高 | TI2 计数 | 向下 | ||
下降沿 | 低 | TI2 计数 | 向上 | ||
上升沿 | 高 | TI1+TI2 计数 | 向下 | ||
上升沿 | 低 | TI1+TI2 计数 | 向上 | ||
下降沿 | 高 | TI1+TI2 计数 | 向上 | ||
下降沿 | 低 | TI1+TI2 计数 | 向下 |
注:此表假设 TI1 和 TI2 不会在同一时刻同时变化。
一个外部增量编码器可以直接连接至 MCU,不需要额外的接口逻辑。但通常建议使用比较器将编码器的差分信号转换为数字信号,以显著提高抗干扰能力。
编码器的第三个输出(表示机械零位)可以连接至 MCU 的外部中断引脚,用于触发计数器复位。
图 42:展示了计数器在编码器接口模式下的工作原理,包括计数信号的生成和方向控制;同时演示了如何在选择双边沿时进行输入抖动的补偿(当传感器接近切换点时可能出现该现象)。
示例配置如下:
CC1S = 01
(CCMR1 寄存器中,TI1FP1 映射为 TI1)CC2S = 01
(CCMR2 寄存器中,TI2FP2 映射为 TI2)CC1P = 0
且IC1F = 0000
(TI1 未翻转,无滤波)CC2P = 0
且IC2F = 0000
(TI2 未翻转,无滤波)SMS = 011
(SMCR 寄存器中,TI1 与 TI2 均在上升沿和下降沿激活)CEN = 1
(CR1 寄存器中,计数器启用)
图 43:展示了在与上述相同配置下,仅将
CC1P
设置为1
(TI1 极性翻转)的情况下,编码器接口模式的行为变化。
当定时器配置为编码器接口模式后,可通过以下方式获取动态信息(如速度、加速度、减速度):
- 使用第二个定时器配置为捕获模式(Input Capture)以测量两个编码器事件之间的周期;
- 利用编码器输出的“机械零位”信号作为触发捕获;
- 也可以定期读取计数器值,如使用第三个输入捕获寄存器锁存(如可用);
- 还可以通过DMA 请求读取该值,该请求可由实时时钟(RTC)生成。
8.3.17 定时器输入 XOR 功能¶
CR2 寄存器中的 TI1S 位允许通道 0 的输入滤波器连接到一个 XOR 门的输出,该 XOR 门将三个输入引脚 CH1、CH2 和 CH3 进行组合。
XOR 输出可用于所有定时器输入功能,例如触发或输入捕获。
8.3.18 与霍尔传感器接口¶
这通过使用高级控制定时器生成用于驱动电机的 PWM 信号,以及另一个定时器(在图 44 中称为“接口定时器”)来实现。“接口定时器”通过 XOR 门连接 3 个定时器输入引脚(CH1、CH2 和 CH3)到 TI1 输入通道(通过在 CR2 寄存器中设置 TI1S 位来选择)。
从属模式控制器配置为复位模式;从属输入为 TI1F_ED。因此,每当 3 个输入中的任意一个发生翻转时,计数器从 0 开始重新计数。这创建了一个由霍尔输入上的任何变化触发的时间基准。
在“接口定时器”中,捕获/比较通道 0 被配置为捕获模式,捕获信号为 TRC(见图 27)。捕获的值表示输入发生两次变化之间的时间,反映电机的转速信息。
“接口定时器”还可以在输出模式下使用,以生成一个脉冲,该脉冲用于更改高级控制定时器通道的配置(通过触发 COM 事件)。定时器用于生成用于驱动电机的 PWM 信号。为此,接口定时器通道必须被编程为在一个预定延迟后生成一个正脉冲(以输出比较或 PWM 模式)。该脉冲通过 TRGO 输出发送到高级控制定时器。
示例:用户希望在霍尔输入连接的某个定时器上发生变化时,在一个预定延迟后更改高级控制定时器的 PWM 配置。
- 通过将 CR2 寄存器中的 TI1S 位设置为 ‘1’,配置 3 个定时器输入经 OR 连接至 TI1 输入通道;
- 编程时间基准:将 ARR 写为最大值(计数器必须由 TI1 的变化清零),设置预分频器,使最大计数周期长于两个传感器变化之间的时间;
- 将通道 0 配置为捕获模式(选择 TRC):将 CCMR1 寄存器中的 CC1S 位写为 ‘11’。用户还可以在需要时配置数字滤波器;
- 将通道 1 配置为带所需延迟的 PWM 模式 2:将 CCMR1 寄存器中的 OC2M 位写为 ‘111’,将 CC2S 位写为 ‘00’;
- 在 TRGO 上选择 OC2REF 作为触发输出:将 CR2 寄存器中的 MMS 位写为 ‘101’;
在高级控制定时器中,必须选择正确的 ITR 输入作为触发输入,定时器配置为生成 PWM 信号,捕获/比较控制信号被预加载(CR2 寄存器中的 CCPC=1),COM 事件由触发输入控制(CR2 寄存器中的 CCUS=1)。PWM 控制位(CCxE、OCxM)在下一步的 COM 事件后被写入(这可以在由 OC2REF 上升沿产生的中断子程序中完成)。
图 44 描述了该示例。
图 44. 霍尔传感器接口示例
8.3.19 外部触发同步¶
定时器可以通过多种模式与外部触发信号进行同步:复位模式、门控模式和触发模式。
从模式:复位模式
计数器及其预分频器可以在触发输入上发生事件时被重新初始化。此外,如果 CR1 寄存器中的 URS 位为低电平,则会生成一个更新事件 UEV。随后所有预加载的寄存器(ARR,CCRx)都会被更新。
在以下示例中,向上计数器在 TI1 输入的上升沿被清零:
- 配置通道 0 以检测 TI1 上的上升沿。配置输入滤波器的持续时间(在本例中不需要滤波器,因此保持 IC1F=0000)。捕获预分频器在触发中不起作用,因此无需配置它。CC1S 位仅选择输入捕获源,在 CCMR1 寄存器中写入 CC1S=01。为了使能极性(仅检测上升沿),在 CCER 寄存器中写入 CC1P=0。
- 通过在 SMCR 寄存器中写入 SMS=100,将定时器配置为复位模式。通过在 SMCR 寄存器中写入 TS=101,选择 TI1 作为输入源。
- 通过在 CR1 寄存器中写入 CEN=1,启动计数器。
计数器在内部时钟上开始计数,然后正常运行直到 TI1 出现上升沿。当 TI1 上升沿发生时,计数器被清零并从 0 重新开始计数。与此同时,触发标志被置位(SR 寄存器中的 TIF 位),如果启用了中断或 DMA(由 DIER 寄存器中的 TIE 和 TDE 位决定),则可发出中断请求或 DMA 请求。
下图展示了当自动重载寄存器 ARR=0x36 时的该行为。TI1 输入上升沿与计数器实际复位之间的延迟是由 TI1 输入的重同步电路引起的。
图 45. 复位模式下的控制电路
从模式:门控模式
计数器可以根据所选输入的电平来启用。
在以下示例中,向上计数器仅在 TI1 输入为低电平时进行计数:
- 配置通道 0 以检测 TI1 上的低电平。配置输入滤波器的持续时间(在本例中不需要滤波器,因此保持 IC1F=0000)。捕获预分频器在触发中不起作用,因此用户无需配置它。CC1S 位仅用于选择输入捕获源,在 CCMR1 寄存器中写入 CC1S=01。在 CCER 寄存器中写入 CC1P=1,以确认极性(并仅检测低电平)。
- 通过在 SMCR 寄存器中写入 SMS=101,将定时器配置为门控模式。通过在 SMCR 寄存器中写入 TS=101,选择 TI1 作为输入源。
- 通过在 CR1 寄存器中写入 CEN=1 来使能计数器(在门控模式中,如果 CEN=0,则无论触发输入电平如何,计数器都不会启动)。
计数器在内部时钟上开始计数,只要 TI1 为低电平就持续计数,一旦 TI1 变为高电平便停止计数。SR 寄存器中的 TIF 标志在计数器启动或停止时都会被置位。
TI1 上升沿与计数器实际停止之间的延迟是由于 TI1 输入的重同步电路引起的。
图 46. 门控模式下的控制电路
从模式:触发模式
计数器可以响应所选输入上的事件而启动。
在以下示例中,向上计数器响应 TI2 输入上的上升沿而启动:
- 配置通道 1 以检测 TI2 上的上升沿。配置输入滤波器持续时间(在本例中不需要滤波器,因此保持 IC2F=0000)。捕获预分频器在触发中不起作用,因此无需配置。CC2S 位用于选择输入捕获源,仅需配置 CC2S=01(在 CCMR1 寄存器中)。在 CCER 寄存器中写入 CC2P=1,以确认极性(并仅检测低电平)。
- 通过在 SMCR 寄存器中写入 SMS=110,将定时器配置为触发模式。通过在 SMCR 寄存器中写入 TS=110,选择 TI2 作为输入源。
当 TI2 上出现上升沿时,计数器在内部时钟上开始计数,并置位 TIF 标志。
TI2 上升沿与计数器实际开始之间的延迟是由于 TI2 输入的重同步电路引起的。
图 47. 触发模式下的控制电路
从模式:外部时钟模式 2 + 触发模式
外部时钟模式 2 可与另一种从模式共同使用(除外部时钟模式 1 和编码器模式外)。在这种情况下,ETR 信号被用作外部时钟输入,另一个输入可以选择为触发输入(在复位模式、门控模式或触发模式中)。建议不要通过 SMCR 寄存器的 TS 位选择 ETR 作为 TRGI。
在以下示例中,只要 TI1 出现上升沿,ETR 信号的每个上升沿就会使向上计数器递增一次:
-
通过如下配置 SMCR 寄存器,配置外部触发输入电路:
- ETF = 0000:无滤波器
- ETPS = 00:预分频器禁用
- ETP = 0:检测 ETR 上的上升沿,且 ECE=1 以使能外部时钟模式 2。
-
将通道 0 配置如下,以检测 TI1 上的上升沿:
- IC1F = 0000:无滤波器。
- 捕获预分频器不用于触发,因此无需配置。
- 在 CCMR1 寄存器中设置 CC1S = 01,仅选择输入捕获源。
- 在 CCER 寄存器中设置 CC1P = 0 以确认极性(并仅检测上升沿)。
-
在 SMCR 寄存器中写入 SMS = 110,将定时器配置为触发模式。通过在 SMCR 寄存器中写入 TS = 101,选择 TI1 作为输入源。
TI1 上的上升沿会使计数器使能,并置位 TIF 标志。之后,计数器在 ETR 的上升沿上计数。
ETR 信号的上升沿与计数器实际复位之间的延迟是由于 ETRP 输入上的重同步电路造成的。
图 48. 外部时钟模式 2 + 触发模式下的控制电路
8.3.20 定时器同步¶
TIM 定时器在内部连接在一起,用于定时器同步或级联。
注意:必须在从定时器接收主定时器事件之前使能从定时器的时钟,并且在主定时器触发期间不得动态更改该时钟。
8.3.21 调试模式¶
当微控制器进入调试模式时,计数器要么继续正常工作,要么停止,具体取决于系统控制模块中的 APB_CLK STOP 配置位。
8.4 寄存器¶
外设寄存器可以通过半字(16 位)或字(32 位)访问。
8.4.1 控制寄存器 1(CR1)¶
地址偏移:0x00
复位值:0x0000
- 位 15:10 保留,必须保持为复位值。
-
位 9:8 CKD[1:0]:时钟分频
此位字段表示定时器时钟(CK_INT)频率与死区时间和采样时钟(tDTS)之间的分频比,该时钟用于死区时间发生器和数字滤波器(ETR、TIx)。
00
:tDTS = tCK_INT01
:tDTS = 2 × tCK_INT10
:tDTS = 4 × tCK_INT11
:tDTS = 8 × tCK_INT
-
位 7 ARPE:自动重载缓冲使能
0
:ARR 寄存器不带缓冲1
:ARR 寄存器带缓冲
-
位 6:5 CMS[1:0]:中心对齐模式选择
00
:边沿对齐模式。计数器根据方向位(DIR)向上或向下计数01
:中心对齐模式 1。计数器交替向上和向下计数。配置为输出模式的通道(CCxS=00)仅在计数器向下计数时设置输出比较中断标志10
:中心对齐模式 2。配置为输出模式的通道仅在计数器向上计数时设置输出比较中断标志11
:中心对齐模式 3。配置为输出模式的通道在计数器向上和向下计数时均设置输出比较中断标志
注意:当计数器已启用(CEN=1)时,不允许从边沿对齐模式切换为中心对齐模式
-
位 4 DIR:方向
0
:计数器作为向上计数器使用1
:计数器作为向下计数器使用
注意:仅当定时器配置为中心对齐模式或编码器模式时,此位才可读
-
位 3 OPM:单脉冲模式
0
:计数器不会在更新事件时停止1
:计数器将在下一个更新事件时停止(清除 CEN 位)
-
位 2 URS:更新请求来源
此位由软件设置和清除,以选择 UEV 事件的来源。
-
0
:以下任一事件可在启用的情况下生成更新中断或 DMA 请求:- 计数器上溢/下溢
- 设置 UG 位
- 通过从模式控制器生成的更新事件
-
1
:仅计数器上溢/下溢事件可生成更新中断或 DMA 请求(若启用)
-
-
位 1 UDIS:更新禁止
此位由软件设置和清除,以启用/禁用更新事件(UEV)的生成。
-
0
:UEV 使能。以下任一事件可生成更新事件:- 计数器上溢/下溢
- 设置 UG 位
- 通过从模式控制器生成的更新事件,此时缓冲寄存器将被预加载值更新
-
1
:UEV 禁止。不会生成更新事件,影子寄存器(ARR、PSC、CCRx)保持原值
然而,如果设置了 UG 位,或从从模式控制器收到硬件复位,计数器和预分频器仍将重新初始化
-
-
位 0 CEN:计数器使能
0
:计数器禁用1
:计数器使能
注意:外部时钟、门控模式和编码器模式仅在软件先设置 CEN 位后才可工作;而触发模式可由硬件自动设置 CEN 位
8.4.2 控制寄存器 2(CR2)¶
地址偏移:0x04
复位值:0x0000
- 位 15:保留,必须保持为复位值。
-
位 14 OIS3:输出空闲状态 4(OC3 输出)
参见 OIS1 位。
-
位 13 OIS2N:输出空闲状态 3(OC2N 输出)
参见 OIS1N 位。
-
位 12 OIS2:输出空闲状态 3(OC2 输出)
参见 OIS1 位。
-
位 11 OIS1N:输出空闲状态 2(OC1N 输出)
参见 OIS1N 位。
-
位 10 OIS1:输出空闲状态 2(OC1 输出)
参见 OIS1 位。
-
位 9 OIS0N:输出空闲状态 1(OC0N 输出)
0
:当 MOE=0 时,在死区时间之后 OC0N=01
:当 MOE=0 时,在死区时间之后 OC0N=1
注意: 若已配置了 LOCK 级别 1、2 或 3(BDTR 寄存器中的 LOCK 位),则该位不可修改。
-
位 8 OIS0:输出空闲状态 1(OC0 输出)
0
:当 MOE=0 且(若实现了 OC1N)在死区时间之后 OC0=01
:当 MOE=0 且(若实现了 OC1N)在死区时间之后 OC0=1
注意: 若已配置了 LOCK 级别 1、2 或 3(BDTR 寄存器中的 LOCK 位),则该位不可修改。
-
位 7 TI1S:TI1 选择
0
:CH1 引脚连接到 TI1 输入1
:CH1、CH2 和 CH3 引脚连接至 TI1 输入(XOR 组合)
-
位 6:4 MMS[2:0]:主模式选择(Master Mode Selection)
用于选择在主模式下发送给从定时器的同步信息(TRGO)的来源,组合如下:
000
:复位。使用来自 EGR 寄存器的 UG 位作为触发输出(TRGO)。若复位是由触发输入产生(从模式控制器配置为复位模式),则 TRGO 信号会相对实际复位延迟。001
:使能。使用计数器使能信号 CNT_EN 作为 TRGO 输出。适用于同时启动多个定时器,或用于控制从定时器使能的时间窗口。CNT_EN 信号由 CEN 控制位与触发输入(在门控模式下配置)逻辑 OR 产生。当 CNT_EN 被触发输入控制时,TRGO 存在延迟,除非启用了主/从模式(见 SMCR 寄存器中的 MSM 位说明)。010
:更新。将更新事件作为 TRGO 输出。例如,主定时器可以作为从定时器的预分频器。011
:比较脉冲。当 CC1IF 标志将被设置(即便它已为高电平)时,TRGO 发送一个正脉冲,发生在捕获或比较匹配事件发生时。100
:比较 - 使用 OC0REF 信号作为 TRGO 输出101
:比较 - 使用 OC1REF 信号作为 TRGO 输出110
:比较 - 使用 OC2REF 信号作为 TRGO 输出111
:比较 - 使用 OC3REF 信号作为 TRGO 输出
注意:从定时器和 ADC 的时钟必须在接收主定时器事件前开启,并且在接收触发信号期间不能动态改变。
-
位 3 CCDS:捕获/比较 DMA 选择
0
:当 CCx 事件发生时发送 CCx DMA 请求1
:当更新事件发生时发送 CCx DMA 请求
-
位 2 CCUS:捕获/比较控制更新选择
0
:当捕获/比较控制位已预装(CCPC=1)时,仅在设置 COMG 位时才更新1
:当捕获/比较控制位已预装(CCPC=1)时,设置 COMG 位或 TRGI 上升沿均可触发更新
注意: 此位仅影响具有互补输出的通道。
-
位 1:保留,必须保持为复位值。
-
位 0 CCPC:捕获/比较预加载控制
0
:CCxE、CCxNE 和 OCxM 位不进行预加载1
:CCxE、CCxNE 和 OCxM 位在写入后进行预加载,只有在发生换相事件(COM)时才会更新(通过设置 COMG 位或 TRGI 上升沿,具体取决于 CCUS 位)
8.4.3 从模式控制寄存器(SMCR)¶
地址偏移:0x08
复位值:0x0000
-
位 15 ETP:外部触发极性
此位用于选择是否对外部触发输入(ETR)信号进行反相:
0
:ETR 非反相,处于高电平或上升沿时为有效触发1
:ETR 反相,处于低电平或下降沿时为有效触发
-
位 14 ECE:外部时钟使能
启用外部时钟模式 2。
0
:禁用外部时钟模式 21
:启用外部时钟模式 2,计数器由 ETRF 信号的任意有效边沿驱动计数
注意:
1. 设置 ECE 位的效果等同于选择外部时钟模式 1,并将 TRGI 连接到 ETRF(即SMS=111
且TS=111
)
2. 外部时钟模式 2 可以与以下从模式同时使用:复位模式、门控模式、触发模式。但此时 TRGI 不能连接到 ETRF(即TS
不能为111
)
3. 若同时启用外部时钟模式 1 与模式 2,则实际使用的外部时钟输入为 ETRF -
位 13:12 ETPS[1:0]:外部触发预分频器
外部触发信号 ETRP 的频率必须不高于主时钟的 1/4。启用预分频器可以降低 ETRP 的频率,用于快速外部时钟输入场景。
00
:不分频01
:ETRP 频率除以 210
:ETRP 频率除以 411
:ETRP 频率除以 8
-
位 11:8 ETF[3:0]:外部触发滤波器
定义对 ETRP 信号采样的频率以及所应用的数字滤波器长度。数字滤波器基于事件计数器,只有 N 个连续事件才能使输出发生变化。
0000
:无滤波,采样频率为 fDTS0001
:fSAMPLING = fCK_INT,N = 20010
:fSAMPLING = fCK_INT,N = 40011
:fSAMPLING = fCK_INT,N = 80100
:fSAMPLING = fDTS/2,N = 60101
:fSAMPLING = fDTS/2,N = 80110
:fSAMPLING = fDTS/4,N = 60111
:fSAMPLING = fDTS/4,N = 81000
:fSAMPLING = fDTS/8,N = 61001
:fSAMPLING = fDTS/8,N = 81010
:fSAMPLING = fDTS/16,N = 51011
:fSAMPLING = fDTS/16,N = 61100
:fSAMPLING = fDTS/16,N = 81101
:fSAMPLING = fDTS/32,N = 51110
:fSAMPLING = fDTS/32,N = 61111
:fSAMPLING = fDTS/32,N = 8
-
位 7 MSM:主/从模式
0
:无动作1
:触发输入(TRGI)上的事件作用会延迟,以实现当前定时器与其从属定时器之间的同步(通过 TRGO)。适用于多个定时器对同一个外部事件进行同步的情况。
-
位 6:4 TS[2:0]:触发源选择
选择用于同步计数器的触发输入源:
000
:内部触发 0(ITR0)001
:内部触发 1(ITR1)010
:内部触发 2(ITR2)011
:内部触发 3(ITR3)100
:TI1 边沿检测器(TI1F_ED)101
:过滤后的定时器输入 1(TI1FP1)110
:过滤后的定时器输入 2(TI2FP2)111
:外部触发输入(ETRF)
注意: 只有在未使用触发功能时(例如
SMS=000
)才能更改这些位,以避免错误的边沿检测。 -
位 3:保留,必须保持为复位值。
-
位 2:0 SMS[2:0]:从模式选择
当选择外部信号时,触发信号(TRGI)的有效边沿由外部输入的极性决定(详见输入控制寄存器和控制寄存器说明):
000
:从模式禁用。若 CEN=1,则预分频器由内部时钟直接驱动。001
:编码器模式 1 - 计数器在 TI2FP1 的边沿上加/减计数,依据 TI1FP2 的电平。010
:编码器模式 2 - 计数器在 TI1FP2 的边沿上加/减计数,依据 TI2FP1 的电平。011
:编码器模式 3 - 计数器在 TI1FP1 和 TI2FP2 的边沿上均加/减计数,依据另一个输入的电平。100
:复位模式 - 所选触发输入(TRGI)上的上升沿重置计数器并更新寄存器。101
:门控模式 - 当触发输入(TRGI)为高电平时启用计数器时钟;当 TRGI 为低时停止计数器(不重置)。110
:触发模式 - 计数器在 TRGI 的上升沿开始运行(但不重置)。仅控制启动。111
:外部时钟模式 1 - 所选触发输入(TRGI)的上升沿驱动计数器。
注意: 若选择 TI1F_ED(
TS=100
)作为触发输入,不应使用门控模式,因为 TI1F_ED 为每次边沿生成一个脉冲,而门控模式依据的是触发信号的电平。说明: 从定时器的时钟在接收来自主定时器的事件前必须已启用,且在接收触发信号期间不得动态更改。
表格:内部触发连接(TS 配置值对照)
从定时器 | ITR0 (TS=000) | ITR1 (TS=001) | ITR2 (TS=010) | ITR3 (TS=011) |
---|---|---|---|---|
GPTIMER0 | GPTIMER1_TRGO | GPTIMER2_TRGO | GPTIMER3_TRGO | GPTIMER4_TRGO |
GPTIMER1 | GPTIMER2_TRGO | GPTIMER3_TRGO | GPTIMER4_TRGO | GPTIMER0_TRGO |
GPTIMER2 | GPTIMER3_TRGO | GPTIMER4_TRGO | GPTIMER0_TRGO | GPTIMER1_TRGO |
GPTIMER3 | GPTIMER4_TRGO | GPTIMER0_TRGO | GPTIMER1_TRGO | GPTIMER2_TRGO |
GPTIMER4 | GPTIMER0_TRGO | GPTIMER1_TRGO | GPTIMER2_TRGO | GPTIMER3_TRGO |
8.4.4 DMA/中断使能寄存器(DIER)¶
地址偏移:0x0C
重置值:0x0000
位定义:
- 位 15 保留,必须保持为重置值。
-
位 14 TDE:触发 DMA 请求使能
- 0: 触发 DMA 请求禁用
- 1: 触发 DMA 请求使能
-
位 13 COMDE:COM DMA 请求使能
- 0: COM DMA 请求禁用
- 1: COM DMA 请求使能
-
位 12 CC3DE:捕获/比较 3 DMA 请求使能
- 0: CC3 DMA 请求禁用
- 1: CC3 DMA 请求使能
-
位 11 CC2DE:捕获/比较 2 DMA 请求使能
- 0: CC2 DMA 请求禁用
- 1: CC2 DMA 请求使能
-
位 10 CC1DE:捕获/比较 1 DMA 请求使能
- 0: CC1 DMA 请求禁用
- 1: CC1 DMA 请求使能
-
位 9 CC0DE:捕获/比较 0 DMA 请求使能
- 0: CC0 DMA 请求禁用
- 1: CC0 DMA 请求使能
-
位 8 UDE:更新 DMA 请求使能
- 0: 更新 DMA 请求禁用
- 1: 更新 DMA 请求使能
-
位 7 BIE:断路器中断使能
- 0: 断路器中断禁用
- 1: 断路器中断使能
-
位 6 TIE:触发中断使能
- 0: 触发中断禁用
- 1: 触发中断使能
-
位 5 COMIE:COM 中断使能
- 0: COM 中断禁用
- 1: COM 中断使能
-
位 4 CC4IE:捕获/比较 4 中断使能
- 0: CC4 中断禁用
- 1: CC4 中断使能
-
位 3 CC3IE:捕获/比较 3 中断使能
- 0: CC3 中断禁用
- 1: CC3 中断使能
-
位 2 CC2IE:捕获/比较 2 中断使能
- 0: CC2 中断禁用
- 1: CC2 中断使能
-
位 1 CC1IE:捕获/比较 1 中断使能
- 0: CC1 中断禁用
- 1: CC1 中断使能
-
位 0 UIE:更新中断使能
- 0: 更新中断禁用
- 1: 更新中断使能
8.4.5 状态寄存器(SR)¶
地址偏移:0x10
重置值:0x0000
位定义:
- 位 15:13 保留,必须保持为重置值。
-
位 12 CC3OF:捕获/比较 3 溢出标志
参见 CC0OF 描述。
-
位 11 CC2OF:捕获/比较 2 溢出标志
参见 CC0OF 描述。
-
位 10 CC1OF:捕获/比较 1 溢出标志
参见 CC0OF 描述。
-
位 9 CC0OF:捕获/比较 0 溢出标志
- 此标志仅在相应通道配置为输入捕获模式时由硬件设置。通过软件将其清除,写入 ‘0’。
- 0: 没有检测到溢出。
- 1: 当 CC0IF 标志已设置时,计数器值已被捕获到 CCR0 寄存器中。
-
位 8 保留,必须保持为重置值。
-
位 7 BIF:断路器中断标志
- 此标志在断路器输入激活时由硬件设置。如果断路器输入未激活,则可以通过软件清除此标志。
- 0: 没有断路器事件发生。
- 1: 检测到断路器输入的有效电平。
-
位 6 TIF:触发中断标志
- 此标志在触发事件发生时由硬件设置(当 TRGI 输入上的上升沿被检测到时,且从模式控制器已启用,在所有模式中,除门控模式外,门控模式中则是两边沿)。可以通过软件清除此标志。
- 0: 没有触发事件发生。
- 1: 触发中断待处理。
-
位 5 COMIF:COM 中断标志
- 此标志在 COM 事件发生时由硬件设置(当捕获/比较控制位 - CCxE, CCxNE, OCxM - 被更新时)。可以通过软件清除此标志。
- 0: 没有 COM 事件发生。
- 1: COM 中断待处理。
-
位 4 CC3IF:捕获/比较 3 中断标志
参见 CC0IF 描述。
-
位 3 CC2IF:捕获/比较 2 中断标志
参见 CC0IF 描述。
-
位 2 CC1IF:捕获/比较 1 中断标志
参见 CC0IF 描述。
-
位 1 CC0IF:捕获/比较 0 中断标志
-
如果通道 CC0 配置为输出:
- 当计数器匹配比较值时,此标志由硬件设置,但在中心对齐模式下有一些例外(参见 CR0 寄存器中的 CMS 位描述)。可以通过软件清除此标志。
- 0: 没有匹配。
- 1: 计数器 CNT 的内容与 CCR0 寄存器的内容匹配。当 CCR0 的内容大于 ARR 的内容时,CC0IF 位在计数器溢出(在向上计数和向上/向下计数模式中)或下溢(在向下计数模式中)时变为高电平。
-
如果通道 CC0 配置为输入:
- 此位由硬件在捕获时设置。可以通过软件或通过读取 CCR0 寄存器来清除此位。
- 0: 没有输入捕获发生。
- 1: 计数器值已被捕获到 CCR0 寄存器(在 IC0 上检测到一个边缘,且该边缘与所选极性匹配)。
-
-
位 0 UIF:更新中断标志
- 此标志在更新事件发生时由硬件设置。可以通过软件清除此标志。
- 0: 没有更新发生。
-
1: 更新中断待处理。当寄存器被更新时,此位由硬件设置:
- 当溢出或下溢与重复计数器值相关时(如果重复计数器 = 0 时进行更新),并且 CR1 寄存器中的 UDIS=0。
- 当通过软件使用 EGR 寄存器中的 UG 位重新初始化 CNT 时,如果 CR0 寄存器中的 URS=0 和 UDIS=0。
- 当通过触发事件重新初始化 CNT 时(参见:从模式控制寄存器 SMCR),如果 CR1 寄存器中的 URS=0 和 UDIS=0。
8.4.6 事件生成寄存器 (EGR)¶
地址偏移:0x14
重置值:0x0000
- 位 15:8 保留,必须保持在重置值。
-
位 7 BG:断点生成
- 此位由软件设置以生成一个事件,硬件会自动清除此位。
- 0: 无动作
- 1: 生成断点事件。MOE 位被清除,BIF 标志被设置。如果启用,可能会发生相关中断或 DMA 传输。
-
位 6 TG:触发生成
- 此位由软件设置以生成一个事件,硬件会自动清除此位。
- 0: 无动作
- 1: 在 SR 寄存器中设置 TIF 标志。如果启用,可能会发生相关中断或 DMA 传输。
-
位 5 COMG:捕获/比较控制更新生成
- 此位由软件设置,硬件会自动清除此位。
- 0: 无动作
- 1: 当 CCPC 位被设置时,允许更新 CCxE、CCxNE 和 OCxM 位。
- 注意:此位仅作用于具有互补输出的通道。
-
位 3 CC3G:捕获/比较 3 生成,参考 CC1G 描述。
- 位 2 CC2G:捕获/比较 2 生成,参考 CC1G 描述。
- 位 1 CC1G:捕获/比较 1 生成,参考 CC1G 描述。
-
位 0 CC0G:捕获/比较 0 生成
- 此位由软件设置以生成一个事件,硬件会自动清除此位。
- 0: 无动作
-
1: 在通道 0 上生成捕获/比较事件:
- 如果 CC0 通道被配置为输出:设置 CC1IF 标志,如果启用,发送相应的中断或 DMA 请求。
- 如果 CC0 通道被配置为输入:当前计数器的值被捕获到 CCR0 寄存器中。设置 CC0IF 标志,如果启用,发送相应的中断或 DMA 请求。如果 CC0IF 标志已经被置高,则设置 CC0OF 标志。
-
位 0 UG:更新生成
- 此位由软件设置,硬件会自动清除此位。
- 0: 无动作
- 1: 重新初始化计数器并生成寄存器更新。注意,预分频器计数器也会被清除(但预分频比率不受影响)。如果选择中心对齐模式或 DIR=0(向上计数),则计数器会被清除;如果 DIR=1(向下计数),则计数器取自动重载值(ARR)。
8.4.7 捕获/比较模式寄存器 1 (CCMR1)¶
地址偏移: 0x18
复位值: 0x0000
通道可以用于输入(捕获模式)或输出(比较模式)。通道的方向通过配置相应的 CCxS 位来定义。该寄存器的所有其他位在输入和输出模式下具有不同的功能。对于给定的位,OCxx 描述的是通道配置为输出时的功能,ICxx 描述的是通道配置为输入时的功能。因此,用户需要注意,同一位在输入阶段和输出阶段可能具有不同的含义。
输出比较模式¶
- 位 15 OC1CE: 输出比较 2 清除使能
- 位 14:12 OC1M[2:0]: 输出比较 2 模式
- 位 11 OC1PE: 输出比较 2 预加载使能
- 位 10 OC1FE: 输出比较 2 快速使能
-
位 9:8 CC1S[1:0]: 捕获/比较 2 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC1 通道配置为输出
- 01:CC1 通道配置为输入,IC1 映射到 TI1
- 10:CC1 通道配置为输入,IC1 映射到 TI0
- 11:CC1 通道配置为输入,IC1 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC1S 位仅在通道关闭时可写(CC1E = ‘0’ 在 CCER 寄存器中)。
-
位 7 OC0CE: 输出比较 1 清除使能
-
OC0CE: 输出比较 1 清除使能
- 0:ETRF 输入不影响 OC0Ref
- 1:当检测到 ETRF 输入的高电平时,OC0Ref 会被清除
-
-
位 6:4 OC0M: 输出比较 1 模式
- 这些位定义了从 OC0 生成的输出参考信号 OC0REF 的行为,OC0 和 OC0N 的激活电平取决于 CC0P 和 CC0NP 位。
- 000:冻结 - 输出比较寄存器 CCR0 和计数器 CNT 之间的比较对输出没有影响。(此模式用于生成时基)
- 001:当计数器 CNT 与捕获/比较寄存器 1(CCR0)匹配时,OC0REF 信号强制为高电平。
- 010:当计数器 CNT 与捕获/比较寄存器 1(CCR0)匹配时,OC1REF 信号强制为低电平。
- 011:切换 - 当 CNT = CCR0 时,OC0REF 切换。
- 100:强制为低电平 - OC0REF 强制为低电平。
- 101:强制为高电平 - OC0REF 强制为高电平。
- 110:PWM 模式 1 - 在递增计数中,当 CNT < CCR0 时,通道 0 激活,否则为不活跃。在递减计数中,当 CNT > CCR0 时,通道 0 不活跃(OC0REF=‘0’),否则为活跃(OC0REF=‘1’)。
- 111:PWM 模式 2 - 在递增计数中,当 CNT < CCR0 时,通道 0 不活跃,否则为活跃。在递减计数中,当 CNT > CCR0 时,通道 0 激活,否则不活跃。
注意: 1. 这些位不能在 LOCK 级别 3 被编程(BDTR 寄存器中的 LOCK 位)且 CC0S = ‘00’(通道配置为输出)时修改。 2. 在 PWM 模式 1 或 2 中,OCREF 电平仅在比较结果发生变化时或当输出比较模式从“冻结”模式切换到“PWM”模式时变化。
-
位 3 OC0PE: 输出比较 1 预加载使能
- 0:禁用 CCR0 上的预加载寄存器。CCR0 可以随时写入,新值立即生效。
- 1:启用 CCR0 上的预加载寄存器。读/写操作访问预加载寄存器。每次更新事件时,CCR0 预加载值将加载到活动寄存器中。
注意: 1. 这些位不能在 LOCK 级别 3 被编程(BDTR 寄存器中的 LOCK 位)且 CC0S = ‘00’(通道配置为输出)时修改。 2. 仅在单脉冲模式下(CR0 寄存器中的 OPM 位设置)可以在不验证预加载寄存器的情况下使用 PWM 模式,否则行为无法保证。
-
位 2 OC0FE: 输出比较 1 快速使能
- 该位用于加速事件在输入触发上的效果,影响 CC 输出。
- 0:即使触发输入为 ON,CC0 也根据计数器和 CCR0 的值正常工作。触发输入边缘发生时,激活 CC0 输出的最小延迟为 5 个时钟周期。
- 1:触发输入上的活动边缘像比较匹配一样作用于 CC0 输出。然后,无论比较结果如何,OC 被设置为比较电平。采样触发输入并激活 CC0 输出的延迟缩短为 3 个时钟周期。OCFE 仅在通道配置为 PWM1 或 PWM2 模式时生效。
-
位 1:0 CC0S: 捕获/比较 1 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC0 通道配置为输出
- 01:CC0 通道配置为输入,IC0 映射到 TI1
- 10:CC0 通道配置为输入,IC0 映射到 TI2
- 11:CC0 通道配置为输入,IC0 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC0S 位仅在通道关闭时可写(CC0E = ‘0’ 在 CCER 寄存器中)。
输入捕获模式¶
- 位 15:12 IC1F: 输入捕获 2 滤波器
- 位 11:10 IC1PSC[1:0]: 输入捕获 2 预分频器
-
位 9:8 CC1S: 捕获/比较 2 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC1 通道配置为输出
- 01:CC1 通道配置为输入,IC1 映射到 TI2
- 10:CC1 通道配置为输入,IC1 映射到 TI1
- 11:CC1 通道配置为输入,IC1 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC1S 位仅在通道关闭时可写(CC1E = ‘0’ 在 CCER 寄存器中)。
-
位 7:4 IC0F[3:0]: 输入捕获 1 滤波器
- 该位域定义了用于采样 TI1 输入的频率,以及应用于 TI1 的数字滤波器的长度。数字滤波器由事件计数器组成,需要连续 N 个事件才能验证输出的转换:
- 0000:无滤波器,采样频率为 fDTS
- 0001:fSAMPLING=fCK_INT,N=2
- 0010:fSAMPLING=fCK_INT,N=4
- 0011:fSAMPLING=fCK_INT,N=8
- 0100:fSAMPLING=fDTS/2,N=6
- 0101:fSAMPLING=fDTS/2,N=8
- 0110:fSAMPLING=fDTS/4,N=6
- 0111:fSAMPLING=fDTS/4,N=8
- 1000:fSAMPLING=fDTS/8,N=6
- 1001:fSAMPLING=fDTS/8,N=8
- 1010:fSAMPLING=fDTS/16,N=5
- 1011:fSAMPLING=fDTS/16,N=6
- 1100:fSAMPLING=fDTS/16,N=8
- 1101:fSAMPLING=fDTS/32,N=5
- 1110:fSAMPLING=fDTS/32,N=6
- 1111:fSAMPLING=fDTS/32,N=8
- 该位域定义了用于采样 TI1 输入的频率,以及应用于 TI1 的数字滤波器的长度。数字滤波器由事件计数器组成,需要连续 N 个事件才能验证输出的转换:
-
位 3:2 IC0PSC: 输入捕获 1 预分频器
- 该位域定义了作用于 CC0 输入(IC0)的预分频器的比例。
-
预分频器在 CC0E = ‘0’(CCER 寄存器中)时重置。
- 00:无预分频器,每次检测到捕获输入的边缘时进行捕获
- 01:每 2 个事件进行一次捕获
- 10:每 4 个事件进行一次捕获
- 11:每 8 个事件进行一次捕获
-
位 1:0 CC0S: 捕获/比较 1 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC0 通道配置为输出
- 01:CC0 通道配置为输入,IC0 映射到 TI1
- 10:CC0 通道配置为输入,IC0 映射到 TI2
- 11:CC0 通道配置为输入,IC0 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC0S 位仅在通道关闭时可写(CC0E = ‘0’ 在 CCER 寄存器中)。
8.4.8 捕获/比较模式寄存器 2 (CCMR2)¶
地址偏移: 0x1C
复位值: 0x0000
参考上面的 CCMR1 寄存器描述。
输出比较模式¶
- 位 15 OC3CE: 输出比较 4 清除使能
- 位 14:12 OC3M: 输出比较 4 模式
- 位 11 OC3PE: 输出比较 4 预加载使能
- 位 10 OC3FE: 输出比较 4 快速使能
-
位 9:8 CC3S: 捕获/比较 4 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC3 通道配置为输出
- 01:CC3 通道配置为输入,IC3 映射到 TI3
- 10:CC3 通道配置为输入,IC3 映射到 TI2
- 11:CC3 通道配置为输入,IC3 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC3S 位仅在通道关闭时可写(CC3E = ‘0’ 在 CCER 寄存器中)。
-
位 7 OC2CE: 输出比较 3 清除使能
- 位 6:4 OC2M: 输出比较 3 模式
- 位 3 OC2PE: 输出比较 3 预加载使能
- 位 2 OC2FE: 输出比较 3 快速使能
-
位 1:0 CC2S: 捕获/比较 3 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC2 通道配置为输出
- 01:CC2 通道配置为输入,IC2 映射到 TI2
- 10:CC2 通道配置为输入,IC3 映射到 TI3
- 11:CC2 通道配置为输入,IC2 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC2S 位仅在通道关闭时可写(CC2E = ‘0’ 在 CCER 寄存器中)。
输入捕获模式¶
- 位 15:12 IC3F: 输入捕获 4 滤波器
- 位 11:10 IC3PSC: 输入捕获 4 预分频器
-
位 9:8 CC3S: 捕获/比较 4 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC3 通道配置为输出
- 01:CC3 通道配置为输入,IC3 映射到 TI3
- 10:CC3 通道配置为输入,IC3 映射到 T2
- 11:CC3 通道配置为输入,IC3 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC3S 位仅在通道关闭时可写(CC3E = ‘0’ 在 CCER 寄存器中)。
-
位 7:4 IC2F: 输入捕获 3 滤波器
- 位 3:2 IC2PSC: 输入捕获 3 预分频器
-
位 1:0 CC2S: 捕获/比较 3 选择
- 该位域定义了通道的方向(输入/输出)以及所使用的输入。
- 00:CC2 通道配置为输出
- 01:CC2 通道配置为输入,IC2 映射到 TI2
- 10:CC2 通道配置为输入,IC2 映射到 TI3
- 11:CC2 通道配置为输入,IC2 映射到 TRC。此模式仅在通过 TS 位(SMCR 寄存器)选择了内部触发输入时有效。
注意: CC2S 位仅在通道关闭时可写(CC2E = ‘0’ 在 CCER 寄存器中)。
8.4.9 捕获/比较使能寄存器 (CCER)¶
地址偏移: 0x20
复位值: 0x0000
-
位 15 CC3NP: 捕获/比较 4 互补输出极性
参考 CC1NP 描述。
-
位 14 CC3NE: 捕获/比较 3 互补输出使能
参考 CC0NE 描述。
-
位 13 CC3P: 捕获/比较 4 输出极性
参考 CC0P 描述。
-
位 12 CC3E: 捕获/比较 4 输出使能
参考 CC0E 描述。
-
位 11 CC2NP: 捕获/比较 3 互补输出极性
参考 CC0NP 描述。
-
位 10 CC2NE: 捕获/比较 3 互补输出使能
参考 CC0NE 描述。
-
位 9 CC2P: 捕获/比较 3 输出极性
参考 CC0P 描述。
-
位 8 CC2E: 捕获/比较 3 输出使能
参考 CC0E 描述。
-
位 7 CC1NP: 捕获/比较 2 互补输出极性
参考 CC0NP 描述。
-
位 6 CC1NE: 捕获/比较 2 互补输出使能
参考 CC0NE 描述。
-
位 5 CC1P: 捕获/比较 2 输出极性
参考 CC0P 描述。
-
位 4 CC1E: 捕获/比较 2 输出使能
参考 CC0E 描述。
-
位 3 CC0NP: 捕获/比较 1 互补输出极性
- 0:OC0N 活跃高电平
- 1:OC0N 活跃低电平
注意: 一旦 LOCK 级别 2 或 3 被编程(BDTR 寄存器中的 LOCK 位)且 CC0S = "00"(通道配置为输出),此位不可写。
-
位 2 CC0NE: 捕获/比较 1 互补输出使能
- 0:关闭 - OC0N 不活跃。OC0N 的电平由 MOE、OSSI、OSSR、OIS0、OIS0N 和 CC0E 位决定。
- 1:开启 - OC0N 信号根据 MOE、OSSI、OSSR、OIS0、OIS0N 和 CC0E 位输出到相应的输出引脚。
-
位 1 CC0P: 捕获/比较 1 输出极性
-
CC0 通道配置为输出:
- 0:OC0 活跃高电平
- 1:OC0 活跃低电平
-
CC0 通道配置为输入:
- 此位选择是否使用 IC0 或 IC0 进行触发或捕获操作。
- 0:未反转:捕获发生在 IC0 的上升沿。当用作外部触发时,IC0 未反转。
- 1:反转:捕获发生在 IC0 的下降沿。当用作外部触发时,IC0 反转。
注意: 一旦 LOCK 级别 2 或 3 被编程(BDTR 寄存器中的 LOCK 位),此位不可写。
-
-
位 0 CC0E: 捕获/比较 1 输出使能
-
CC0 通道配置为输出:
- 0:关闭 - OC0 不活跃。OC0 的电平由 MOE、OSSI、OSSR、OIS0、OIS0N 和 CC0NE 位决定。
- 1:开启 - OC0 信号根据 MOE、OSSI、OSSR、OIS0、OIS0N 和 CC0NE 位输出到相应的输出引脚。
-
CC0 通道配置为输入:
- 此位决定是否可以将计数器值捕获到输入捕获/比较寄存器 1(CCR0)中。
- 0:捕获禁用。
- 1:捕获使能。
表 3. 具有断路功能的互补 OCx 和 OCxN 通道的输出控制位
-
8.4.10 计数器(CNT)¶
地址偏移: 0x24
复位值: 0x0000
8.4.11 分频器(PSC)¶
地址偏移: 0x28
复位值: 0x0000
分频器时钟频率(CK_CNT)等于 fCK_PSC / (PSC[15:0] + 1)。
PSC 包含在每次更新事件时(包括通过 EGR 寄存器中的 UG 位或在配置为“复位模式”时通过触发控制器时)要加载到活动分频器寄存器的值。
8.4.12 自动重载寄存器(ARR)¶
地址偏移: 0x2C
复位值: 0xFFFF
ARR 是要加载到实际自动重载寄存器中的值。
当自动重载值为空时,计数器会被阻塞。
8.4.13 重复计数器寄存器(RCR)¶
地址偏移: 0x30
复位值: 0x0000
位 15:8 保留,必须保持为复位值。
位 7:0 REP[7:0]:重复计数器值
这些位允许用户设置比较寄存器的更新速率(即当预加载寄存器启用时,从预加载寄存器到活动寄存器的周期性传输),以及更新中断的生成速率(如果该中断被启用)。
每次与 REP_CNT 相关的递减计数器达到零时,会生成一次更新事件,并从 REP 值重新开始计数。由于 REP_CNT 只在重复更新事件 U_RC 时加载 REP 值,因此任何对 RCR 寄存器的写操作在下一个重复更新事件之前不会生效。
这意味着在 PWM 模式下,(REP+1)对应于:
- 边缘对齐模式下的 PWM 周期数
- 中心对齐模式下的半 PWM 周期数
8.4.14 捕获/比较寄存器 1 (CCR0)¶
地址偏移: 0x34
复位值: 0x0000
位 31:0 CCR0[31:0]:捕获/比较 1 值
如果通道 CC0 配置为输出:
CCR0 是要加载到实际捕获/比较 1 寄存器中的值(预加载值)。如果在 CCMR0 寄存器中没有选择预加载功能(OC0PE 位),它会永久加载该值。否则,当发生更新事件时,预加载值会被复制到活动的捕获/比较 1 寄存器中。
活动的捕获/比较寄存器包含要与计数器 CNT 比较的值,并通过 OC0 输出信号。
如果通道 CC0 配置为输入:
CCR0 是通过上次输入捕获 1 事件(IC0)传输的计数器值。CCR0 寄存器是只读的,不能进行编程。
8.4.15 捕获/比较寄存器 2 (CCR1)¶
地址偏移: 0x38
复位值: 0x0000
位 31:0 CCR1[31:0]:捕获/比较 2 值
如果通道 CC1 配置为输出:
CCR1 是要加载到实际捕获/比较 2 寄存器中的值(预加载值)。如果在 CCMR1 寄存器中没有选择预加载功能(OC1PE 位),它会永久加载该值。否则,当发生更新事件时,预加载值会被复制到活动的捕获/比较 2 寄存器中。
活动的捕获/比较寄存器包含要与计数器 CNT 比较的值,并通过 OC1 输出信号。
如果通道 CC1 配置为输入:
CCR1 是通过上次输入捕获 2 事件(IC1)传输的计数器值。CCR1 寄存器是只读的,不能进行编程。
8.4.16 捕获/比较寄存器 3 (CCR2)¶
地址偏移: 0x3C
复位值: 0x0000
位 31:0 CCR2[31:0]:捕获/比较值
如果通道 CC2 配置为输出:
CCR2 是要加载到实际捕获/比较 3 寄存器中的值(预加载值)。如果在 CCMR2 寄存器中没有选择预加载功能(OC2PE 位),它会永久加载该值。否则,当发生更新事件时,预加载值会被复制到活动的捕获/比较 3 寄存器中。
活动的捕获/比较寄存器包含要与计数器 CNT 比较的值,并通过 OC2 输出信号。
如果通道 CC2 配置为输入:
CCR2 是通过上次输入捕获 3 事件(IC2)传输的计数器值。CCR2 寄存器是只读的,不能进行编程。
8.4.17 捕获/比较寄存器 4 (CCR3)¶
地址偏移: 0x40
复位值: 0x0000
位 31:0 CCR3[31:0]:捕获/比较值
如果通道 CC3 配置为输出:
CCR3 是要加载到实际捕获/比较 4 寄存器中的值(预加载值)。如果在 CCMR3 寄存器中没有选择预加载功能(OC3PE 位),它会永久加载该值。否则,当发生更新事件时,预加载值会被复制到活动的捕获/比较 4 寄存器中。
活动的捕获/比较寄存器包含要与计数器 CNT 比较的值,并通过 OC3 输出信号。
如果通道 CC3 配置为输入:
CCR3 是通过上次输入捕获 4 事件(IC3)传输的计数器值。CCR3 寄存器是只读的,不能进行编程。
8.4.18 断路和死区时间寄存器(BDTR)¶
地址偏移: 0x44
复位值: 0x0000
注:由于 AOE、BKP、BKE、OSSI、OSSR 和 DTG[7:0] 位可以根据 LOCK 配置进行写保护,因此在第一次写入 BDTR 寄存器时,可能需要配置所有这些位。
-
位 15 MOE:主输出使能
当断路输入激活时,硬件会异步清除该位。软件或根据 AOE 位自动设置该位。仅对配置为输出的通道起作用。
0:OC 和 OCN 输出被禁用或强制为空闲状态。
1:如果相应的使能位(CCxE, CCxNE 在 CCER 寄存器中)已设置,则启用 OC 和 OCN 输出。
参见 OC/OCN 启用描述(章节:捕获/比较使能寄存器(CCER))。 -
位 14 AOE:自动输出使能
0:MOE 只能由软件设置。
1:MOE 可以由软件设置,或在下一个更新事件时自动设置(如果断路输入未激活)。注:如果 LOCK 级别 1 已配置(BDTR 寄存器中的 LOCK 位),则无法修改此位。
-
位 13 BKP:断路极性
0:断路输入 BRK 为低电平有效。
1:断路输入 BRK 为高电平有效。注:如果 LOCK 级别 1 已配置(BDTR 寄存器中的 LOCK 位),则无法修改此位。
注:对此位的任何写操作需要 1 个 APB 时钟周期的延迟才能生效。 -
位 12 BKE:断路使能
0:断路输入(BRK 和 CSS 时钟失败事件)禁用。
1:断路输入(BRK 和 CSS 时钟失败事件)启用。注:如果 LOCK 级别 1 已配置(BDTR 寄存器中的 LOCK 位),则无法修改此位。
注:对此位的任何写操作需要 1 个 APB 时钟周期的延迟才能生效。 -
位 11 OSSR:运行模式的非活动状态选择
当 MOE=1 且通道配置为输出时,使用此位。
如果计时器未实现互补输出,则不实现 OSSR。
0:当处于非活动状态时,OC/OCN 输出被禁用(OC/OCN 输出使能信号=0)。
1:当处于非活动状态时,OC/OCN 输出被启用,并以其非活动电平输出,当 CCxE=1 或 CCxNE=1 时,OC/OCN 输出使能信号=1。注:如果 LOCK 级别 2 已配置(BDTR 寄存器中的 LOCK 位),则无法修改此位。
-
位 10 OSSI:空闲模式的非活动状态选择
当 MOE=0 且通道配置为输出时,使用此位。
0:当处于非活动状态时,OC/OCN 输出被禁用(OC/OCN 输出使能信号=0)。
1:当处于非活动状态时,OC/OCN 输出被强制为其空闲电平,当 CCxE=1 或 CCxNE=1 时,OC/OCN 输出使能信号=1。注:如果 LOCK 级别 2 已配置(BDTR 寄存器中的 LOCK 位),则无法修改此位。
-
位 9:8 LOCK[1:0]:锁定配置
这些位提供对软件错误的写保护。
00:LOCK 关闭 - 无位被写保护。
01:LOCK 级别 1 = BDTR 寄存器中的 DTG 位、CR2 寄存器中的 OISx 和 OISxN 位以及 BDTR 寄存器中的 BKE/BKP/AOE 位不能再被写入。
10:LOCK 级别 2 = LOCK 级别 1 + CC 极性位(CCxP/CCxNP 位在 CCER 寄存器中,只要相关通道通过 CCxS 位配置为输出),以及 OSSR 和 OSSI 位不能再被写入。
11:LOCK 级别 3 = LOCK 级别 2 + CC 控制位(OCxM 和 OCxPE 位在 CCMRx 寄存器中,只要相关通道通过 CCxS 位配置为输出)不能再被写入。注:LOCK 位只能在复位后写入一次。一旦写入 BDTR 寄存器,它们的内容将在下一个复位之前被冻结。
-
位 7:0 DTG[7:0]:死区时间生成器设置
这个位域定义了插入到互补输出之间的死区时间的持续时间。DT 表示此持续时间。
DTG[7:5]=0xx => DT=DTG[7:0]x tdtg,其中 tdtg=tDTS。
DTG[7:5]=10x => DT=(64+DTG[5:0])xtdtg,其中 Tdtg=2xtDTS。
DTG[7:5]=110 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=8xtDTS。
DTG[7:5]=111 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=16xtDTS。例如,如果 TDTS=125ns(8MHz),死区时间的可能值为:
- 从 0 到 15875 ns,步长为 125 ns
- 从 16 us 到 31750 ns,步长为 250 ns
- 从 32 us 到 63 us,步长为 1 us
- 从 64 us 到 126 us,步长为 2 us
注:如果 LOCK 级别 1、2 或 3 已配置(BDTR 寄存器中的 LOCK 位),则此位域不能被修改。
8.4.19 寄存器映射¶
寄存器被映射为 16 位可寻址寄存器,如下表所示:
表 4. 寄存器映射及复位值
9 看门狗¶
9.1 概述¶
AG32 设备提供了一个独立的看门狗,它连接到高级外设总线(APB)。
独立看门狗基于 12 位的递减计数器和 8 位的分频器。它从一个独立的 32 kHz 内部 RC 时钟供时,因为它独立于主时钟工作,因此可以在停止模式和待机模式下工作。它可以用作看门狗,在发生问题时复位设备,或者作为一个自由运行的定时器,用于应用程序超时管理。它可以通过选项字节进行硬件或软件配置。
看门狗模块是一个 AMBA 从设备模块,连接到高级外设总线(APB)。
看门狗模块由一个 32 位的递减计数器组成,具有可编程的超时间隔,可以在超时时生成中断和复位信号。它旨在在软件失败时对系统进行复位。
9.2 独立看门狗(IWDG)¶
9.2.1 IWDG 主要特性¶
- 自由运行的递减计数器
- 在停止模式和正常模式下由 LSI 振荡器提供时钟,在待机模式下由 LSE 提供时钟
- 当递减计数器值达到 0x000 时(如果看门狗已激活),生成复位信号
9.2.2 IWDG 功能描述¶
下图显示了独立看门狗模块的功能块。
当独立看门狗启动时,计数器从复位值 0xFFF 开始递减计数。当计数器达到计数结束值(0x000)时,生成复位信号(IWDG 复位)。
每当 1010 的键值写入 IWDG_KR 寄存器时,递减计数器会被初始化,并且看门狗复位被防止。
9.2.3 看门狗时钟¶
如果独立看门狗(IWDG)由硬件选项或软件访问启动:
-
在运行模式或停止模式下
通过在备份域控制寄存器(RCC_BDCR)中设置 IWDG_STOP_CLKSEL 位来选择 LSE 或 LSI 时钟源。 -
在待机模式下
硬件会选择 LSE 作为 IWDG 的时钟源。
9.2.4 调试模式¶
当 MCU 进入调试模式时,IWDG 计数器将根据 DBG 模块中的 DBG_IWDG_STOP 配置位,继续正常工作或停止。
IWDG 超时周期(以 40 kHz(LSI)时钟为基准,单位:毫秒)
预分频器除法器 PR[2:0] 位 | 超时(毫秒) |
---|---|
/2 | 204.8 |
/4 | 409.6 |
/8 | 819.2 |
/16 | 1638.4 |
/32 | 3276.8 |
/64 | 6553.6 |
/128 | 13107.2 |
/256 | 26214.4 |
9.2.5 IWDG 寄存器¶
-
位 15:12 IWDG_KR[3:0]:密钥值(仅写入,读取为 0xA)
软件必须以固定间隔写入密钥值
0xA
(即二进制 1010),否则当计数器减至 0 时,看门狗将触发复位。 -
位 8 IWDG_EN:看门狗使能控制位
- 0:禁用 IWDG
- 1:启用 IWDG
-
位 6 IWDG_STOP_CKSEL:STOP 模式下 IWDG 时钟源选择
- 0:选择 LSI(低速内部时钟)
- 1:选择 LSE(低速外部时钟)
注:在 STANDBY 模式下,强制选择 LSI。
-
位 5 IWDG_STDBY_FRZ:STANDBY 模式下是否冻结计数器
- 0:继续正常工作
- 1:停止计数器
-
位 4 IWDG_STOP_FRZ:STOP 模式下是否冻结计数器
- 0:继续正常工作
- 1:停止计数器
-
位 2:0 IWDG_PR[2:0]:预分频器设置
软件可写,用于选择馈入计数器时钟的分频系数:
- 000:除以 2
- 001:除以 4
- 010:除以 8
- 011:除以 16
- 100:除以 32
- 101:除以 64
- 110:除以 128
- 111:除以 256
9.3 功能概述¶
9.3.1 特性¶
看门狗模块的特性如下:
- 32 位递减计数器,具有可编程超时间隔。
- 独立的看门狗时钟,具备时钟使能功能,提供对超时间隔的灵活控制。
- 超时发生时生成中断输出。
- 如果上一次超时的中断未被软件服务,则超时时生成复位信号。
- 锁定寄存器,用于保护寄存器不被失控的软件修改。
- 唯一标识看门狗模块的标识寄存器。软件可使用这些寄存器进行自动配置。
下图显示了看门狗模块的简化框图。
可编程参数
以下是看门狗模块的可编程参数:
- 启用/禁用中断生成
- 中断屏蔽
- 启用/禁用复位信号生成
- 中断间隔
9.3.2 看门狗模块概述¶
看门狗模块基于一个 32 位递减计数器,该计数器由重载寄存器 WdogLoad 初始化。
当 WDOGCLK 时钟使能(WDOGCLKEN)为高时,计数器在每个正向时钟沿上递减 1。
当计数器达到零时,生成一个中断。下一次启用的 WDOGCLK 时钟沿到来时,计数器会从 WdogLoad 寄存器重新加载,计数过程继续进行。
如果中断在计数器下次达到零之前未被清除,则看门狗模块会触发复位信号(WDOGRES),并停止计数器。
WDOGCLK 可以等于或是 PCLK 时钟频率的整数倍。但是,WDOGCLK 和 PCLK 的正向时钟沿必须是同步且平衡的。
看门狗模块的中断和复位生成可以通过控制寄存器 WdogControl 根据需要启用或禁用。
当中断生成被禁用时,计数器将停止。重新启用中断时,计数器将从 WdogLoad 寄存器中编程的值开始,而不是从上一个计数值开始。
可以通过使用看门狗模块锁定寄存器 WdogLock 来禁用对看门狗模块寄存器的写访问。
向该寄存器写入值 0x1ACCE551 会启用对所有其他寄存器的写访问。写入任何其他值则会禁用对所有寄存器的写访问,除了锁定寄存器。这项功能可以防止看门狗模块寄存器被失控的软件错误修改,从而避免意外禁用看门狗模块的操作。
9.3.3 功能描述¶
下图显示了看门狗模块的功能框图。
AMBA APB 接口¶
AMBA APB 从接口用于生成对看门狗模块所有寄存器访问的读写解码。
锁定寄存器 WdogLock 用于控制对其他所有寄存器的写访问权限,以确保软件不会无意中禁用看门狗模块的操作。
自由运行计数器块¶
自由运行计数器块包含 32 位递减计数器功能,并生成中断和复位信号输出。
计数器和中断/复位逻辑由 WDOGCLK 时钟独立于 PCLK 时钟驱动,并配合时钟使能 WDOGCLKEN 使用,尽管 PCLK 和 WDOGCLK 之间有约束条件。有关这些约束的详细信息,请参见时钟信号部分。
接口复位¶
看门狗模块由以下信号复位:
- 全局复位信号:PRESETn
- 模块特定复位信号:WDOGRESn
PRESETn 可以异步地被激活,但必须同步至 PCLK 上升沿后去激活。PRESETn 用于复位看门狗模块寄存器的状态。看门狗模块需要 PRESETn 保持低电平至少一个 PCLK 周期。复位后的寄存器值在第 3 章《程序员模型》中定义。
WDOGRESn 可以异步地被激活,但必须同步至 WDOGCLK 上升沿后去去激活。WDOGRESn 用于复位 WDOGCLK 域内寄存器的状态。看门狗模块需要 WDOGRESn 保持低电平至少一个 WDOGCLK 周期。
时钟信号¶
看门狗模块使用两个输入时钟:
-
PCLK
用于定时所有对看门狗模块寄存器的 APB 访问。
-
WDOGCLK
此时钟与时钟使能信号 WDOGCLKEN 一起,用于驱动看门狗模块计数器及其相关的中断和复位生成逻辑。看门狗计数器仅在 WDOGCLK 上升沿且 WDOGCLKEN 为高时递减。
WDOGCLK 和 PCLK 之间的关系必须满足以下约束:
- WDOGCLK 的上升沿必须与 PCLK 的上升沿同步且平衡
- WDOGCLK 的频率不能大于 PCLK 的频率
9.3.4 操作¶
在初始化并释放 PRESETn 和 WDOGRESn 之后,控制寄存器被复位,且中断和复位生成被禁用。锁定寄存器 WdogLock 被初始化为未锁定状态,从而使得对所有看门狗模块寄存器的写访问被启用。看门狗计数器保持其初始值(0xFFFFFFFF),直到通过设置 WdogControl 寄存器中的 INTEN 位启用中断生成。
在启用看门狗模块之前,必须将 WdogLoad 寄存器编程为所需的超时间隔。设置 INTEN 位后,计数器将在下一个由 WDOGCLK 使能的 WDOGCLK 上升沿时从 WdogLoad 寄存器中的值加载。之后,每次启用的 WDOGCLK 上升沿到来时,计数器递减 1。当计数器达到零时,生成一个中断,并且看门狗中断信号 WDOGINT 被激活。然后,计数器从 WdogLoad 寄存器中的值重新加载,开始新的倒计时序列。
通过向 WdogIntClr 寄存器写入任何数据值可以清除中断。这将导致计数器从 WdogLoad 寄存器中保持的值重新加载,并启动另一个倒计时序列。如果在计数器下次达到零之前没有清除中断,则如果 WdogControl 寄存器中的复位使能位 RESEN 被设置,看门狗复位信号 WDOGRES 将被激活。激活 WDOGRES 信号后,计数器停止。
在系统芯片(SoC)中,WDOGRES 信号用于复位进入不可预测状态的系统。因此,看门狗模块期望通过 PRESETn 和 WDOGRESn 被复位,并重新开始初始化过程。
为了防止看门狗模块寄存器被意外修改,修改寄存器后必须使用锁定寄存器 WdogLock 禁用对看门狗模块寄存器的写访问。为了启用对所有寄存器的写访问,向锁定寄存器 WdogLock 写入值 0x1ACCE551。在写入所需的看门狗寄存器后,通过向锁定寄存器写入除了 0x1ACCE551 之外的任何值来禁用对所有寄存器的写访问,除了锁定寄存器。读取锁定寄存器返回的是锁定状态,而不是写入的 32 位值。因此,当写访问被禁用时,读取锁定寄存器返回 0x00000001(已锁定),否则返回值为 0x00000000(未锁定)。
如果在看门狗计数器递减过程中向 WdogLoad 寄存器写入新值,则计数器会立即用新加载值重新加载,并从新值继续递减。写入 WdogLoad 不会清除已激活的中断。必须通过向中断清除寄存器 WdogIntClr 写入来专门清除中断。
如果通过清除控制寄存器 WdogControl 中的 INTEN 位禁用中断生成,则计数器在其当前值处停止。当重新启用中断生成时,计数器将从 WdogLoad 寄存器重新加载,并开始递减。
中断行为¶
当看门狗通过激活 WDOGINT 触发中断时,该信号的时序是由 WDOGCLK 上升沿生成的,且 WDOGCLK 必须通过 WDOGCLKEN 使能。当通过向中断清除寄存器 WdogIntClr 写入数据来清除中断时,WDOGINT 信号会立即在 PCLK 域中去激活,而不是等待下一个启用的 WDOGCLK 上升沿。
下图显示了中断被触发和清除的时序示例。
编程超时间隔¶
当 WDOGCLKEN 为高时,看门狗模块计数器由 WDOGCLK 上升沿驱动。
如果 WDOGCLKEN 永久为高,则计数速率等于 WDOGCLK 的频率。
当 WDOGCLKEN 以每个 WDOGCLK 上升沿的脉冲周期性地为高时,则计数速率等于 WDOGCLKEN 脉冲的频率。启用的时钟边缘的频率被称为有效的看门狗时钟频率,周期被称为有效的看门狗时钟周期。
每当以下事件发生时,计数器会从 WdogLoad 寄存器重新加载:
- 计数器达到零
- 通过设置控制寄存器 WdogControl 中的 INTEN 位启用中断生成,当中断之前已被禁用时
- 通过向中断清除寄存器 WdogIntClr 写入清除中断
- 向加载寄存器 WdogLoad 写入新值
计数器加载发生到计数器达到零并生成中断之间的时间间隔由以下公式给出:
中断间隔 = (WdogLoad + 1) × 有效看门狗时钟周期
WdogLoad 的初始复位值为 0xFFFFFFFF,对于示例的有效看门狗频率 1MHz(1 毫秒周期),中断间隔为 4295 秒。
WdogLoad 的最小有效值为 0x00000001。如果 WdogLoad 设置为 0x00000000,则始终立即生成中断。
下表显示了在有效看门狗时钟频率为 1MHz 时所需的不同中断间隔的 WdogLoad 值示例。
9.3.5 寄存器概述¶
看门狗模块寄存器概述:
9.3.6 寄存器描述¶
加载寄存器,WdogLoad¶
这是一个 32 位的读/写寄存器,包含计数器递减的起始值。当写入该寄存器时,计数会立即从新值重新开始。WdogLoad 的最小有效值为 1。如果 WdogLoad 设置为 0,则会立即生成一个中断。
值寄存器,WdogValue¶
这是一个只读的 32 位寄存器,给出递减计数器的当前值。
控制寄存器,WdogControl¶
这是一个读/写寄存器,允许软件控制看门狗模块。下表显示了 WdogControl 寄存器的位分配。
中断清除寄存器,WdogIntClr¶
向此寄存器写入任何值会清除看门狗模块的中断,并从 WdogLoad 寄存器中的值重新加载计数器。
原始中断状态寄存器,WdogRIS¶
此寄存器指示来自计数器的原始中断状态。原始中断状态寄存器指示当看门狗计数器达到零时已引发中断。下表显示了 WdogRIS 寄存器的位分配。
屏蔽中断状态寄存器,WdogMIS¶
此寄存器指示来自计数器的屏蔽中断状态。该值是原始中断状态与控制寄存器中的 INTEN 位进行逻辑与运算的结果,并且是传递到中断输出引脚 WDOGINT 的相同值。下表显示了 WdogMIS 寄存器的位分配。
锁定寄存器,WdogLock¶
此寄存器允许禁用对所有其他寄存器的写访问。这是为了防止失控的软件禁用看门狗模块操作。写入值 0x1ACCE551 启用对所有其他寄存器的写访问。写入任何其他值则禁用写访问。对该寄存器的读取返回锁定状态,而不是写入的值:
- 0 表示写访问已启用(未锁定)
- 1 表示写访问已禁用(已锁定)
下表显示了 WdogLock 寄存器的位分配。
附录 A 信号描述¶
A.1 AMBA APB 信号¶
看门狗模块作为总线从设备连接到 AMBA APB。下表 A-1 描述了 APB 接口信号。
A.2 非 AMBA 信号¶
下表 A-2 描述了看门狗模块的非 AMBA 信号。
10 实时时钟(RTC)¶
实时时钟是一个独立的定时器。RTC 提供一组持续运行的计数器,可通过合适的软件实现时钟-日历功能。可以通过写入计数器值来设置系统的当前时间和日期。
RTC 核心和时钟配置位于备用域(Backup domain),这意味着在重置或从待机模式唤醒后,RTC 的设置和时间仍会保留。在重置后,访问备用寄存器和 RTC 被禁用,备用域(BKP)受到保护,防止意外的写入访问。
启用对备用寄存器和 RTC 的访问,请按以下步骤操作:
- 通过设置
RCC_APB1ENR
寄存器中的PWREN
和BKPEN
位,启用电源和备用接口时钟; - 在电源控制寄存器
PWR_CR
中设置DBP
位,启用对备用寄存器和 RTC 的访问。
10.1 RTC 主要特性:¶
- 可编程预分频器:分频因子最大可达 2²⁰
- 32 位可编程计数器,用于长期计时
-
RTC 时钟源可以为以下任一信号:
- 来自互连逻辑的
CLKLOCAL
- LSE(低速外部)振荡器时钟
- LSI(低速内部)振荡器时钟
- 来自互连逻辑的
-
两种独立的复位类型:
- APB 接口由系统复位控制;
- RTC 核心(预分频器、闹钟、计数器和分频器)仅由备用域复位控制。
-
三条专用中断线:
- 闹钟中断:用于生成软件可编程的闹钟中断;
- 秒钟中断:用于生成周期性中断信号,周期长度可编程(最长至 1 秒);
- 溢出中断:用于检测内部可编程计数器回绕至零的情况。
10.2 RTC 功能描述¶
RTC(实时时钟)由两个主要单元组成:
-
APB1 接口单元
该单元用于与 APB1 总线进行通信。它包含一组 16 位寄存器,可通过 APB1 总线以读或写方式访问。此接口单元由 APB1 总线时钟提供时钟信号,以实现与 APB1 总线的同步交互。
-
RTC 核心单元
RTC 核心由一系列可编程计数器构成,主要包括两个功能模块:
-
RTC 预分频器模块
此模块用于生成 RTC 时间基准
TR_CLK
,其周期最长可编程为 1 秒。它包括一个 20 位可编程分频器(RTC 预分频器)。每个TR_CLK
周期到来时,若已在RTC_CR
控制寄存器中启用,将触发一次“秒钟中断(Second Interrupt)”。 -
32 位可编程计数器
该计数器可初始化为当前系统时间。系统时间以
TR_CLK
的频率递增,并与可编程日期(保存在RTC_ALR
寄存器中)进行比较。如果已在RTC_CR
控制寄存器中启用,则当匹配发生时,会触发一次“闹钟中断(Alarm Interrupt)”。
-
RTC 简化框图
重置 RTC 寄存器¶
所有系统寄存器都会被系统复位或上电复位异步清零,但以下寄存器除外:
RTC_PRL
(预分频器)RTC_ALR
(闹钟)RTC_CNT
(计数器)RTC_DIV
(分频器)
这些寄存器仅在备用域(Backup Domain)复位时被清除。
读取 RTC 寄存器¶
RTC 核心与 RTC 的 APB1 接口是完全独立的。
软件通过 APB1 接口访问 RTC 的预分频器、计数器和闹钟寄存器。但这些寄存器的可读值是通过 RTC 时钟上升沿进行内部更新,并由 APB1 时钟重新同步的。RTC 状态标志(Flags)也是如此。
因此,如果之前禁用了 APB1 接口,并在接口刚启用后立即读取 RTC 寄存器,则第一次读取结果可能会出错(通常为 0)。这种情况可能在以下情形中发生:
- 系统复位或上电复位;
- MCU 从待机模式(Standby)唤醒;
- MCU 从停止模式(Stop)唤醒。
在上述情况下,虽然 RTC 核心仍在运行,但 APB1 接口处于禁用状态(复位、无时钟或未供电)。
正确读取步骤:
在禁用过 RTC APB1 接口后读取 RTC 寄存器时,软件必须先等待 RTC_CRL
寄存器中的 RSF
(寄存器同步标志位)被硬件置位,表示寄存器已更新完毕。
注意:RTC 的 APB1 接口不受 WFI 和 WFE 低功耗模式的影响。
配置 RTC 寄存器¶
要写入以下寄存器:RTC_PRL
, RTC_CNT
, RTC_ALR
,外设必须进入 配置模式(Configuration Mode)。
进入配置模式的方法:
设置 RTC_CRL
寄存器中的 CNF
位。
此外,写入操作只能在上一次写入完成后进行。为了让软件检测写入是否完成,RTC_CR
寄存器中提供了 RTOFF
状态位,表示寄存器是否正在更新。
只有当 RTOFF = 1
时,才允许写入新的值。
配置流程:
- 轮询
RTOFF
位,等待其为1
- 设置
CNF
位,进入配置模式 - 写入一个或多个 RTC 寄存器
- 清除
CNF
位,退出配置模式 - 再次轮询
RTOFF
位,等待其为1
,表示写入操作完成
注意:写入操作仅在
CNF
位被清除时开始,至少需要 3 个RTCCLK
时钟周期完成。
RTC 标志位断言说明¶
- 秒钟标志(SECF):在每个 RTC 核心时钟周期 更新 RTC 计数器之前 被置位。
- 溢出标志(OWF):在 RTC 计数器回绕到
0x0000
之前的最后一个 RTC 核心周期被置位。 - 闹钟标志(ALRF) 和 RTC_Alarm 信号:在 RTC 计数器等于
(RTC_ALR + 1)
前一个周期被置位。
RTC 闹钟与秒钟写入同步方法¶
RTC 闹钟和秒钟相关标志的写入必须使用以下任一同步方法:
- 使用 RTC 闹钟中断:在中断处理函数中更新 RTC 闹钟或计数器寄存器;
- 轮询 SECF 位:等待
RTC_CR
控制寄存器中的 SECF 置位后,再更新 RTC 闹钟或计数器寄存器。
使用
PR = 0003
,ALARM = 00004
的 RTC 秒钟和闹钟波形示例
使用
PR = 0003
的 RTC 溢出波形示例
11 DMA¶
11.1 概述¶
灵活的通用 DMA 控制器提供了一种硬件方式,在外设和/或内存之间传输数据,无需 CPU 干预,从而释放带宽供其他系统功能使用。支持三种访问方式:外设到内存、内存到外设、内存到内存。
每个通道都与固定的硬件 DMA 请求相连接。DMA 通道请求的优先级由软件配置和硬件通道号决定。源地址和目的地址的传输大小是独立配置的。
DMAC 特性¶
DMAC 提供以下特性:
- 八个 DMA 通道。每个通道可以支持单向传输。
- 16 条 DMA 请求。DMAC 提供 16 条外设 DMA 请求线。
- 单次 DMA 和突发 DMA 请求信号。每个连接到 DMAC 的外设可以发出突发 DMA 请求或单次 DMA 请求。通过编程 DMAC,您可以设置 DMA 的突发大小。
- 支持内存到内存、内存到外设、外设到内存和外设到外设的传输。
- 通过使用链表支持散布/聚集 DMA。
- 硬件 DMA 通道优先级。每个 DMA 通道有特定的硬件优先级。通道 0 的优先级最高,通道 7 的优先级最低。如果两个通道的请求同时变为激活状态,优先服务优先级更高的通道。
- AHB 从设备 DMA 编程接口。通过 AHB 从接口编程 DMAC,写入 DMA 控制寄存器。
- 两个 AHB 总线主设备用于数据传输。当 DMA 请求激活时,使用这些接口传输数据。
- 32 位 AHB 主总线宽度。
- 源地址和目的地址的递增或非递增寻址方式。
- 可编程的 DMA 突发大小。您可以编程 DMA 突发大小以更有效地传输数据。突发大小通常设置为外设 FIFO 大小的一半。
- 每个通道有一个内部四字的 FIFO。
- 支持 8 位、16 位和 32 位宽的事务。
- 支持大端和小端模式。DMAC 在复位时默认处于小端模式。
- 原始中断状态。可以在屏蔽之前读取 DMA 错误和 DMA 计数的原始中断状态。
- 用于块级和集成系统测试的测试寄存器。
- 唯一标识 DMAC 的标识寄存器。操作系统可以使用这些寄存器自动进行配置。
11.2 功能概述¶
11.2.1 功能描述¶
DMAC 支持以下传输类型:
- 内存到内存
- 内存到外设
- 外设到内存
- 外设到外设
每个 DMA 流(stream)提供单向的串行 DMA 传输,用于一个源地址和一个目标地址。例如,一个双向端口需要一个流用于发送,另一个流用于接收。源地址和目标地址区域可以是内存区域或外设,您可以通过同一个 AHB 主接口访问它们,或者分别通过两个 AHB 主接口访问。
图 2-1 展示了 DMAC 的框图。
11.2.1.1 AHB 从设备接口¶
DMAC 的 AHB 从设备编程总线上的所有事务为 32 位。这消除了在编程 DMAC 时的字节序问题。
11.2.1.2 控制逻辑和寄存器库¶
寄存器块存储通过 AMBA AHB 接口写入或读取的数据。使用 AMBA AHB 从设备接口通过该块来编程 DMAC。
11.2.1.3 DMA 请求和响应接口¶
DMA 请求映射:
外设请求 | 流 0 | 流 1 | 流 2 | 流 3 |
---|---|---|---|---|
通道 0 | FLASH_DMA_REQ | GPTIMER0_TRIGGER_DMA_REQ | GPTIMER3_CC_DMA0_REQ | UART1_RX_DMA_REQ |
通道 1 | EXT_DMA0_REQ | GPTIMER1_UPDATE_DMA_REQ | GPTIMER3_CC_DMA1_REQ | UART2_TX_DMA_REQ |
通道 2 | EXT_DMA1_REQ | GPTIMER1_CC_DMA0_REQ | GPTIMER3_CC_DMA2_REQ | UART2_RX_DMA_REQ |
通道 3 | EXT_DMA2_REQ | GPTIMER1_CC_DMA1_REQ | GPTIMER3_CC_DMA3_REQ | UART3_TX_DMA_REQ |
通道 4 | EXT_DMA3_REQ | GPTIMER1_CC_DMA2_REQ | GPTIMER3_COM_DMA_REQ | UART3_RX_DMA_REQ |
通道 5 | FCB0_DMA_REQ | GPTIMER1_CC_DMA3_REQ | GPTIMER3_TRIGGER_DMA_REQ | UART4_TX_DMA_REQ |
通道 6 | GPTIMER1_COM_DMA_REQ | GPTIMER4_UPDATE_DMA_REQ | SPI0_TX_DMA_REQ | UART4_RX_DMA_REQ |
通道 7 | GPTIMER1_TRIGGER_DMA_REQ | GPTIMER4_CC_DMA0_REQ | SPI0_RX_DMA_REQ | |
通道 8 | GPTIMER2_UPDATE_DMA_REQ | GPTIMER4_CC_DMA1_REQ | SPI1_TX_DMA_REQ | |
通道 9 | GPTIMER2_CC_DMA0_REQ | GPTIMER4_CC_DMA2_REQ | SPI1_RX_DMA_REQ | |
通道 10 | GPTIMER0_UPDATE_DMA_REQ | GPTIMER2_CC_DMA1_REQ | GPTIMER4_CC_DMA3_REQ | |
通道 11 | GPTIMER0_CC_DMA0_REQ | GPTIMER2_CC_DMA2_REQ | GPTIMER4_COM_DMA_REQ | |
通道 12 | GPTIMER0_CC_DMA1_REQ | GPTIMER2_CC_DMA3_REQ | GPTIMER4_TRIGGER_DMA_REQ | |
通道 13 | GPTIMER0_CC_DMA2_REQ | GPTIMER2_COM_DMA_REQ | UART0_TX_DMA_REQ | |
通道 14 | GPTIMER0_CC_DMA3_REQ | GPTIMER2_TRIGGER_DMA_REQ | UART0_RX_DMA_REQ | |
通道 15 | GPTIMER0_COM_DMA_REQ | GPTIMER3_UPDATE_DMA_REQ | UART1_TX_DMA_REQ |
11.2.1.4 通道逻辑和通道寄存器库¶
通道逻辑和通道寄存器库包含每个 DMA 通道所需的寄存器和逻辑。
11.2.1.5 中断请求¶
中断请求生成中断信号至核心处理器。
11.2.1.6 AHB 主设备接口¶
DMAC 包含两个完整的 AHB 主设备。下图显示了这两个主设备如何连接到系统中。例如,这使得 DMAC 能够直接将数据从连接到 AHB 端口 1 的内存传输到连接到 AHB 端口 2 的任何 AHB 外设。同时,它还使 DMAC 与任何 APB 外设之间的事务可以独立于 AHB 总线 1 上的事务进行。
这两个 AHB 主设备能够处理所有类型的 AHB 事务,包括:
- 从从设备返回的拆分(split)、重试(retry)和错误(error)响应。如果外设执行拆分或重试,DMAC 会暂停并等待事务完成。
- 每个流的源和目的地的锁定传输。
- 为每个流的传输设置保护位。
所有 AHB 信号都按照 AHB 规范定义连接。两个 AHB 主设备必须是同步的。它们必须使用相同的 HCLK。DMAC 并不支持异步 AHB 总线,如果需要,必须通过包装器来实现。
总线和传输宽度¶
这两个 AHB 主设备连接到相同宽度的总线,默认宽度为 32 位。源和目的地的传输可以具有不同的宽度,可以与物理总线宽度相同或更窄。DMAC 会根据需要打包或解包数据。DMAC 使用 HSIZE1 或 HSIZE2 来指示传输的宽度,如果此宽度与外设期望的宽度不匹配,则外设可以在 HRESP1 或 HRESP2 上触发错误。
字节序行为¶
DMAC 可以处理小端和大端寻址。您可以单独设置每个 AHB 主设备的字节序。
在内部,DMAC 将所有数据视为字节流,而不是 16 位或 32 位的数据量。这意味着在进行混合字节序操作时,源和目的地的字节序不同,数据会在 32 位数据总线上进行字节交换。
注意:
如果不需要字节交换,避免源地址和目的地地址之间使用不同的字节序。
错误条件¶
DMA 传输过程中出现错误时,外设会通过在传输期间在 AHB 总线上触发错误响应来直接标记该错误。当前传输完成后,DMAC 会自动禁用 DMA 流,并可选择向 CPU 生成错误中断。您可以屏蔽此错误中断。
11.2.1.7 通道硬件¶
每个流都由一个专用的硬件通道支持,包括源和目的地控制器以及 FIFO。这比只有一个硬件通道在多个 DMA 流之间共享的 DMAC 具有更好的延迟性能,同时也简化了控制逻辑。
11.2.1.8 测试寄存器¶
提供测试寄存器用于集成测试。正常使用时,您不应读取或写入测试寄存器。集成测试验证 DMAC 是否正确连接到系统,使您能够读写每个输入和输出。
11.2.1.9 DMA 请求优先级¶
DMA 通道的优先级是固定的。DMA 通道 0 具有最高优先级,DMA 通道 7 具有最低优先级。
如果 DMAC 正在为一个较低优先级的通道传输数据,然后更高优先级的通道激活,它会在切换到传输更高优先级通道的数据之前,完成为低优先级通道委派的传输次数。在最坏的情况下,这个数量可能是一个四字。
DMAC 中两个最低优先级的通道(6 和 7)被设计为无法使 AHB 总线饱和。如果这些较低优先级的通道之一激活,DMAC 会在每四次传输周期中释放总线一次,而不管传输的大小。例如,如果程序设置的传输宽度是 8 位,则每四次 8 位的传输后,DMAC 会释放一次总线。这使得其他 AHB 主设备能够访问总线。
建议内存到内存的传输使用这两个低优先级通道中的一个,否则在DMAC进行内存到内存传输期间,其他低优先级的AHB总线主设备将无法访问总线。
11.2.2 系统设计考虑¶
减少总线上发生的事务数量可以减少总线延迟,改善系统性能,并降低功耗。因此,建议采取以下设计考虑:
- 所有内存事务在标准配置中都是 32 位宽,以提高总线效率。
- 自然字长小于 32 位的外设必须包含字节或半字打包硬件,以便所有事务可以设置为 32 位宽。
- 通常使用等待状态的慢速外设必须包含 FIFO,以便您可以使用突发传输以全速传输数据。
11.2.3 系统连接¶
下图显示了 DMAC 如何连接到系统。
11.2.3.1 AHB 接口¶
所有 AHB 从设备和主设备接口都在同一个时钟 HCLK 下执行。每个主设备是完全独立的,它们之间没有共享逻辑。
11.2.3.2 AHB 从设备接口¶
AHB 从设备接口用于编程 DMAC。图 2-3(第 2-13 页)显示了 AHB 从设备接口模块的端口级连接。
11.2.3.3 AHB 主设备接口¶
除非另有说明,否则必须按照 AMBA 规范描述连接此接口。您可以在执行 DMA 传输时设置 AHB 信号。
保护控制¶
软件为每个 DMA 通道编程 HPROT[3:0] 位。这些位的设置如下:
- HPROT[0] 操作码或数据。此位硬编码为 Data-1。
-
HPROT[1] 用户模式或特权模式:
- 用户 = 0
- 特权 = 1
由软件编程。请参见通道控制寄存器。在 LLI 加载期间,HPROT[1] 设为 1,表示特权。
-
HPROT[2] 可缓冲或不可缓冲:
- 不可缓冲 = 0
- 可缓冲 = 1
由软件编程。请参见通道控制寄存器。在 LLI 加载期间,HPROT[2] 设为 0。
-
HPROT[3] 可缓存或不可缓存:
- 不可缓存 = 0
- 可缓存 = 1
由软件编程。请参见通道控制寄存器。在 LLI 加载期间,HPROT[3] 设为 1。
外设可以根据需要解释 HPROT 信息,以帮助执行高效的事务。例如:
- 您可以使用 HPROT[1] 用户或特权位来保护某些外设或内存区域,防止用户模式事务访问。
- 您可以使用 HPROT[2] 可缓冲或不可缓冲位,指示 AMBA 桥接器该写操作可以在源总线上以零等待状态完成,而不需要等待目标总线的仲裁和从设备接受数据。
- AMBA 桥接器可以使用 HPROT[3] 可缓存或不可缓存位,以便在读取一个八字节的突发传输时,能够在目标总线上一次性传输整个八字节,而不是逐个传输事务。
锁定控制¶
通过编程 DMACCxConfiguration 寄存器中的第 16 位来设置锁定位。请参见通道配置寄存器。
当发生突发时,AHB 仲裁器在突发期间不得释放主设备,直到锁定解除。您可以将 DMAC 锁定为一个单独的突发,例如长源获取突发或长目的地传输突发。通常,DMAC 不会连续断言锁定,以进行源获取突发后跟目的地传输突发。
在某些情况下,当 DMAC 进行源传输后跟目的地传输时,它会断言锁定。这在 DMAC 内部条件允许它执行源获取后紧接目的地传输时是可能的,并且必须满足以下条件:
- 源宽度 = 目的地宽度,且
- 源突发大小至少为 4。
总线宽度¶
源宽度(SWidth)或目的地宽度(DWidth)值在 DMACCxControl 寄存器中编程 HSIZE[1:0] 位。
11.2.3.4 中断生成逻辑¶
DMAC 生成单独的可屏蔽的高电平活动中断。还生成一个组合中断输出,它是各个中断请求的 OR 逻辑运算结果。
您可以使用单一的组合中断与系统中断控制器配合,该控制器提供按外设逐个屏蔽的功能。这使得您可以使用模块化的设备驱动程序,始终知道从哪里找到中断源控制寄存器位。
您还可以使用单独的中断请求与系统中断控制器配合,该控制器为每个外设的输出提供屏蔽功能。通过这种方式,全局中断服务例程可以从系统中断控制器中的一个宽寄存器中读取所有源。这在外设寄存器读取时间相对于 CPU 时钟速度较长的实时系统中非常有用。
该外设支持这两种方法。
11.2.3.5 中断控制器连接¶
您可以通过两种方式将 DMAC 的中断请求信号连接到中断控制器。
- 对于高性能系统,必须将 DMACINTERR 和 DMACINTTC 中断请求信号连接到中断控制器。下图显示了连接到高性能系统的方式。
- 对于低性能系统,其中断控制器的中断请求输入线较少,您可以使用 DMACINTR 中断请求信号。下图显示了连接到低性能系统的方式。
11.2.3.6 DMA 请求和响应连接¶
下图显示了如何将 DMA 请求和响应信号连接到外设。然而,一些外设并不使用所有这些信号。对于不需要的输出信号,您可以将其保持未连接;对于不需要的输入信号,您可以将其连接至低电平(LOW)。有关 DMA 请求和响应接口的更多信息,请参见附录 B DMA 接口。
下图展示了一个使用所有 DMA 请求和授权信号的外设示例。
下图展示了一个简单的连接示例。
11.2.4 软件考虑事项¶
在编程 DMAC 时,您必须考虑以下软件事项:
- 在通道使能为高电平之后,不应对活动通道的通道寄存器进行写操作。如果需要重新编程任何 DMAC 通道参数,必须在禁用 DMAC 通道后重新编程。
- 如果源宽度小于目的地宽度,则源宽度乘以 TransferSize 值必须是目的地宽度的整数倍。
- 当源外设是流控制器且源宽度小于目的地宽度时,源外设在断言 DMACLSREQ 或 DMACLBREQ 之前执行的传输次数,必须使得传输次数乘以源宽度是目的地宽度的整数倍。如果违反此条件,数据可能会卡住并丢失在 FIFO 中,导致不可预测的结果。您可以通过禁用相关的 DMAC 通道来中止传输。
- 您不得在 DMACCxConfig 寄存器中的 SrcPeripheral 和 DestPeripheral 位字段中编程大于 15 的值。
- DMACCxControl 寄存器中的 SWidth 和 DWidth 位字段不得指示大于 32 位宽的外设。
- 在软件通过清除 DMACCxConfig 寄存器中的 ChannelEnable 位禁用通道后,必须等到对应的 DMACEnbldChns 寄存器位显示为 0 后,再重新使能该位。因为实际禁用操作不会在清除 ChannelEnable 位后立即发生,您必须适应正在进行的 AHB 突发传输的延迟。
- DMACCxLLIReg 寄存器中的 LLI 字段不得指示大于 0xFFFFFFF0 的地址,否则四字 LLI 突发将在 0x00000000 处发生回绕,LLI 数据结构将不再是连续的内存位置。请参见通道链表项寄存器。
- 当在 DMAC 中编程的传输大小大于源或目的外设 FIFO 的深度时,您必须仅为 DMAC 编程非递增地址生成。
- 外设在接收到 DMACCLR 信号时,预期会取消断言任何 DMACSREQ、DMACBREQ、DMACLSREQ 或 DMACLBREQ 信号,而不管 DMACCLR 信号是响应哪个请求断言的。这是因为 DMACCLR 不特定于单个请求信号(DMACSREQ)或突发请求信号(DMACSBEQ),它通过对所有 DMA 请求进行逻辑 OR 操作来实现 DMACCLR 的握手。
- 如果您在 DMACCxControl 寄存器中编程 TransferSize 字段为零,并且 DMAC 是流控制器,则在其他流控制模式下,TransferSize 字段没有意义,通道不会发起任何传输。您有责任通过写入 DMACCxConfig 寄存器中的通道使能位来禁用通道,并重新编程该通道。
- 您不得对 DMACCxControl 寄存器执行常规的读写测试,因为 TransferSize 字段不是典型的写入和读回寄存器字段。在写入时,TransferSize 字段像控制寄存器一样工作,因为它决定 DMAC 执行多少次传输。然而,在读回时,TransferSize 像状态寄存器一样工作,因为它返回剩余的传输次数,并以源宽度为单位。读回时,TransferSize 返回的是目的地传输完成的次数,存储在名为 TrfSizeDst 的单独计数器中,并乘以一个因子。相同的物理寄存器没有被写入和读取,常规的写入和读回测试不适用。
- 在目的地流控制模式下,外设到外设传输时,如果通道 FIFO 中有足够的数据来服务目的地外设发出的 DMACLSREQ 或 DMACLBREQ 请求,而无需从源外设获取数据,则向源外设发出 DMACTC。
- 对于目的地流控制的情况,外设到外设传输,且 DWidth < SWidth 时,目的地外设请求的数据字节数必须是源宽度(SWidth)所表示的字节数的整数倍。如果未确保这一点,DMAC 可能会从源外设获取比所需更多的数据,从而导致数据丢失。
- 在低优先级通道对应的访问结束时,在 AHB 总线上插入一个 IDLE 周期,以使其他主设备能够访问总线。这确保低优先级通道不会独占总线。然而,这也意味着总线在最坏情况下可能会被低优先级事务占用最多 16 个周期。这适用于所有传输配置,包括内存到内存传输。
11.3 程序员模型¶
11.3.1 关于程序员模型¶
DMAC 支持以下类型的传输:
- 内存到内存
- 内存到外设
- 外设到内存
- 外设到外设
每个 DMA 流配置为提供单向 DMA 传输,适用于单一的源和目的地。
例如,一个双向串行端口需要一个流用于发送,一个流用于接收。源和目的地区域可以是内存区域或外设,您可以通过同一个 AHB 主设备访问它们,或者通过每个主设备分别访问每个区域。
DMAC 的基地址不是固定的,可以根据具体系统实现有所不同。然而,任何特定寄存器的偏移量是固定的。
11.3.2 编程 DMAC¶
11.3.2.1 启用 DMAC¶
通过在 DMACConfiguration 寄存器中设置 DMA 启用(E)位来启用 DMAC。请参见配置寄存器。
11.3.2.2 禁用 DMAC¶
要禁用 DMAC,请按照以下步骤操作:
- 读取 DMACEnbldChns 寄存器,确保所有 DMA 通道都已禁用。如果有任何通道处于活动状态,请参见禁用 DMA 通道部分。
- 通过向 DMACConfiguration 寄存器中的 DMA 启用位写入 0 来禁用 DMAC。请参见配置寄存器。
11.3.2.3 启用 DMA 通道¶
通过在相关的 DMA 通道配置寄存器中设置通道启用位来启用 DMA 通道。请参见通道配置寄存器。
注意:
在启用通道之前,必须完全初始化该通道。此外,必须在启用任何通道之前,先设置 DMAC 的启用位。
11.3.2.4 禁用 DMA 通道¶
您可以通过以下方式禁用 DMA 通道:
- 直接写入通道使能位
- 将活动位和暂停位与通道使能位结合使用
- 等待传输完成。然后通道会自动禁用
禁用 DMA 通道并丢失 FIFO 中的数据¶
清除相关通道配置寄存器中的通道使能位。当前的 AHB 传输(如果有进行中的传输)会完成,通道会被禁用。
禁用 DMA 通道而不丢失 FIFO 中的数据¶
要禁用 DMA 通道而不丢失 FIFO 中的数据,请执行以下步骤:
- 在相关的通道配置寄存器中设置暂停位。这会导致任何后续的 DMA 请求被忽略。
- 轮询相关通道配置寄存器中的活动位,直到该位变为 0。此位指示是否有数据需要传输。
- 清除相关通道配置寄存器中的通道使能位。
11.3.2.5 设置新的 DMA 传输¶
要设置新的 DMA 传输,请按照以下步骤操作:
- 如果通道未专用于 DMA 事务: a. 读取 DMACEnbldChns 寄存器,确定哪些通道处于非活动状态。请参见已启用通道寄存器。 b. 选择一个非活动通道并具有所需的优先级。
- 编程 DMAC。
11.3.2.6 停止 DMA 通道¶
在相关的 DMA 通道配置寄存器中设置暂停位。当前的源请求会被服务,任何后续的源 DMA 请求会被忽略,直到暂停位被清除。
11.3.2.7 编程 DMA 通道¶
要编程 DMA 通道,请按照以下步骤操作:
- 选择一个空闲的 DMA 通道,并具有所需的优先级。DMA 通道 0 优先级最高,DMA 通道 7 优先级最低。
- 通过向 DMACIntTCClear 和 DMACIntErrClr 寄存器写入数据,清除通道上的任何挂起中断。请参见中断终端计数清除寄存器和中断错误清除寄存器。之前的通道操作可能已将中断保持活动状态。
- 将源地址写入 DMACCxSrcAddr 寄存器。请参见通道源地址寄存器。
- 将目标地址写入 DMACCxDestAddr 寄存器。请参见通道目标地址寄存器。
- 将下一个 LLI 的地址写入 DMACCxLLI 寄存器。请参见通道链表项寄存器。如果传输只包含一包数据,则必须将 0 写入此寄存器。
- 将控制信息写入 DMACCxControl 寄存器。请参见通道控制寄存器。
- 将通道配置写入 DMACCxConfiguration 寄存器。请参见通道配置寄存器。如果启用位已设置,则 DMA 通道会自动启用。
11.3.3 寄存器摘要¶
名称 | 地址 (基地址 +) | 类型 | 重置值 | 描述 |
---|---|---|---|---|
DMACIntStatus | 0x000 | RO | 00 | 见中断状态寄存器 |
DMACIntTCStatus | 0x004 | RO | 00 | 见中断终端计数状态寄存器 |
DMACIntTCClear | 0x008 | WO | - | 见中断终端计数清除寄存器 |
DMACIntErrorStatus | 0x00C | RO | 00 | 见中断错误状态寄存器 |
DMACIntErrClr | 0x010 | WO | - | 见中断错误清除寄存器 |
DMACRawIntTCStatus | 0x014 | RO | - | 见原始中断终端计数状态寄存器 |
DMACRawIntErrorStatus | 0x018 | RO | - | 见原始错误中断状态寄存器 |
DMACEnbldChns | 0x01C | RO | 00 | 见已启用通道寄存器 |
DMACSoftBReq | 0x020 | R/W | 0x0000 | 见软件突发请求寄存器 |
DMACSoftSReq | 0x024 | R/W | 0x0000 | 见软件单次请求寄存器 |
DMACSoftLBReq | 0x028 | R/W | 0x0000 | 见软件最后突发请求寄存器 |
DMACSoftLSReq | 0x02C | R/W | 0x0000 | 见软件最后单次请求寄存器 |
DMACConfiguration | 0x100 | R/W | 0x0000 | 见配置寄存器 |
DMACSync | 0x104 | R/W | 0x0000 | 见同步寄存器 |
DMACC0SrcAddr | 0x030 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC0DestAddr | 0x034 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC0LLI | 0x038 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC0Control | 0x03C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC0Configuration | 0x040 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC1SrcAddr | 0x100 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC1DestAddr | 0x104 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC1LLI | 0x108 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC1Control | 0x10C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC1Configuration | 0x110 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC2SrcAddr | 0x120 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC2DestAddr | 0x124 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC2LLI | 0x128 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC2Control | 0x12C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC2Configuration | 0x130 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC3SrcAddr | 0x140 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC3DestAddr | 0x144 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC3LLI | 0x148 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC3Control | 0x14C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC3Configuration | 0x150 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC4SrcAddr | 0x160 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC4DestAddr | 0x164 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC4LLI | 0x168 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC4Control | 0x16C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC4Configuration | 0x170 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC5SrcAddr | 0x180 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC5DestAddr | 0x184 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC5LLI | 0x188 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC5Control | 0x18C | R/W | 0x000000 | 见通道控制寄存器 |
DMACC5Configuration | 0x190 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC6SrcAddr | 0x1A0 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC6DestAddr | 0x1A4 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC6LLI | 0x1A8 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC6Control | 0x1AC | R/W | 0x000000 | 见通道控制寄存器 |
DMACC6Configuration | 0x1B0 | R/W | 0x000000 | 见通道配置寄存器 |
DMACC7SrcAddr | 0x1C0 | R/W | 0x000000 | 见通道源地址寄存器 |
DMACC7DestAddr | 0x1C4 | R/W | 0x000000 | 见通道目标地址寄存器 |
DMACC7LLI | 0x1C8 | R/W | 0x000000 | 见通道链表项寄存器 |
DMACC7Control | 0x1CC | R/W | 0x000000 | 见通道控制寄存器 |
DMACC7Configuration | 0x1D0 | R/W | 0x000000 | 见通道配置寄存器 |
DMACPeriphID0 | 0x1F0 | RO | 0x80 | 见 DMACPeriphID0 寄存器 |
DMACPeriphID1 | 0x1F4 | RO | 0x10 | 见 DMACPeriphID1 寄存器 |
DMACPeriphID2 | 0x1F8 | RO | 0x04 | 见 DMACPeriphID2 寄存器 |
DMACPeriphID3 | 0x1FC | RO | 0x0A | 见 DMACPeriphID3 寄存器 |
DMACPCellID0 | 0xFE0 | RO | 0x0D | 见 DMACPCellID0 寄存器 |
DMACPCellID1 | 0xFE4 | RO | 0xF0 | 见 DMACPCellID1 寄存器 |
DMACPCellID2 | 0xFE8 | RO | 0x05 | 见 DMACPCellID2 寄存器 |
DMACPCellID3 | 0xFEC | RO | 0xB1 | 见 DMACPCellID3 寄存器 |
DMACITCR | 0x500 | R/W | 0x0000 | 见测试控制寄存器 |
DMACITOP1 | 0x504 | R/W | 0x0000 | 见集成测试输出寄存器 1 |
DMACITOP2 | 0x508 | R/W | 0x0000 | 见集成测试输出寄存器 2 |
DMACITOP3 | 0x50C | R/W | 0x0000 | 见集成测试输出寄存器 3 |
11.3.4 寄存器描述¶
11.3.4.1 中断状态寄存器(Interrupt Status Register)¶
只读的 DMACIntStatus
寄存器(地址偏移量为 0x000)用于显示屏蔽后的中断状态。某一位为高电平(HIGH)表示对应的 DMA 通道中断请求处于激活状态。该中断请求可以由错误中断或终止计数中断触发。下图展示了该寄存器的位分配情况。
11.3.4.2 中断终止计数状态寄存器(Interrupt Terminal Count Status Register)¶
只读的 DMACIntTCStatus
寄存器(地址偏移量为 0x004)用于显示屏蔽后的终止计数状态。如果你使用组合中断请求 DMACINTR
来请求中断,则必须将该寄存器与 DMACIntStatus
寄存器结合使用。若你使用 DMACINTTC
中断请求,则只需读取 DMACIntTCStatus
寄存器即可确定中断请求的来源。下图展示了该寄存器的位分配情况。
11.3.4.3 中断终点计数清除寄存器¶
仅写的 DMACIntTCClear 寄存器,偏移地址为 0x008,用于清除终点计数中断请求。 当向该寄存器写入时,每个被置为高电平(HIGH)的数据位将清除状态寄存器中对应的位。被置为低电平(LOW)的数据位对寄存器中的相应位无影响。下图展示了该寄存器的位分配。
11.3.4.4 中断错误状态寄存器¶
只读的 DMACIntErrorStatus 寄存器,偏移地址为 0x00C,用于指示经过屏蔽处理后的错误请求状态。 如果你使用的是合并中断请求 DMACINTR 来请求中断,则必须将此寄存器与 DMACIntStatus 寄存器结合使用。 如果你使用的是 DMACINTERR 中断请求,则仅需读取 DMACIntErrorStatus 寄存器。下图展示了该寄存器的位分配。
11.3.4.5 中断错误清除寄存器¶
仅写的 DMACIntErrClr 寄存器,偏移地址为 0x010,用于清除错误中断请求。 当向该寄存器写入时,每个为高电平(HIGH)的数据位会清除状态寄存器中对应的位。为低电平(LOW)的数据位不会影响寄存器中对应的位。下图展示了该寄存器的位分配。
11.3.4.6 原始中断终点计数状态寄存器¶
只读的 DMACRawIntTCStatus 寄存器,偏移地址为 0x014,用于指示在屏蔽之前,请求传输完成(终点计数)中断的 DMA 通道。 一个为高电平(HIGH)的位表示该通道在屏蔽前已激活终点计数中断请求。下图展示了该寄存器的位分配。
11.3.4.7 原始错误中断状态寄存器(Raw Error Interrupt Status Register)¶
只读的 DMACRawIntErrorStatus
寄存器(地址偏移量为 0x018
)用于指示在屏蔽之前请求错误中断的 DMA 通道。某一位为高电平(HIGH)表示该错误中断请求在屏蔽前处于激活状态。下图显示了该寄存器的位分配。
11.3.4.8 启用通道寄存器(Enabled Channel Register)¶
只读的 DMACEnbldChns
寄存器(地址偏移量为 0x01C
)用于指示哪些 DMA 通道已启用,这由 DMACCxConfiguration
寄存器中的 Enable 位决定。某一位为高电平(HIGH)表示对应的 DMA 通道已启用。当 DMA 传输完成时,该位将被清除。图 3-8 显示了该寄存器的位分配。
11.3.4.9 软件突发请求寄存器(Software Burst Request Register)¶
可读写的 DMACSoftBReq
寄存器(地址偏移量为 0x020
)允许软件生成 DMA 突发请求。通过将 1
写入对应的寄存器位,可为每个源生成 DMA 请求。当事务完成时,该位将被清除。将 0
写入该寄存器无任何效果。读取该寄存器可查看当前哪些源正在请求 DMA 突发传输。你可以通过外设或此软件请求寄存器发起请求。下图显示了该寄存器的位分配。
11.3.4.10 软件单次请求寄存器(Software Single Request Register)¶
可读写的 DMACSoftSReq 寄存器(地址偏移量为 0x024
)允许通过软件生成 DMA 单次请求。通过将 1
写入对应的寄存器位,可以为每个源生成一个 DMA 请求。当事务完成时,该寄存器位将被清除。将 0
写入该寄存器无任何作用。读取该寄存器可以指示哪些源正在请求单次 DMA 传输。你可以通过外设或软件请求寄存器生成请求。下图显示了该寄存器的位分配。
11.3.4.11 软件最后突发请求寄存器(Software Last Burst Request Register)¶
可读写的 DMACSoftLBReq 寄存器(地址偏移量为 0x028
)允许软件生成 DMA 最后突发请求。通过将 1
写入对应的寄存器位,可以为每个源生成一个 DMA 请求。当事务完成时,该寄存器位将被清除。将 0
写入该寄存器无任何作用。读取该寄存器可以指示哪些源正在请求最后突发 DMA 传输。你可以通过外设或软件请求寄存器生成请求。下图显示了该寄存器的位分配。
11.3.4.12 软件最后单次请求寄存器(Software Last Single Request Register)¶
可读写的 DMACSoftLSReq 寄存器(地址偏移量为 0x02C
)允许软件生成 DMA 最后单次请求。通过将 1
写入对应的寄存器位,可以为每个源生成一个 DMA 请求。当事务完成时,该寄存器位将被清除。将 0
写入该寄存器无任何作用。读取该寄存器可以指示哪些源正在请求最后单次 DMA 传输。你可以通过外设或软件请求寄存器生成请求。下图显示了该寄存器的位分配。
11.3.4.13 配置寄存器(Configuration Register)¶
可读写的 DMACConfiguration 寄存器(地址偏移量为 0x030
)用于配置 DMAC 的操作。通过写入该寄存器的 M1 和 M2 位,你可以更改各个 AHB 主接口的字节顺序。M1 位使你能够更改 AHB 主接口 1 的字节顺序。M2 位使你能够更改 AHB 主接口 2 的字节顺序。复位时,AHB 主接口的字节顺序默认为小端模式。
11.3.4.14 同步寄存器(Synchronization Register)¶
可读写的 DMACSync 寄存器(地址偏移量为 0x034
)用于启用或禁用 DMA 请求信号的同步逻辑。
DMA 请求信号包括:
- DMACBREQ[15:0]
- DMACSREQ[15:0]
- DMACLBREQ[15:0]
- DMACLSREQ[15:0]
将某一位设置为 0
会启用特定组 DMA 请求的同步逻辑。将某一位设置为 1
会禁用特定组 DMA 请求的同步逻辑。该寄存器在复位时会被设置为 0
,并启用同步逻辑。
注意:
- 当 DMACCLR 为高电平时,外设不允许发送新的 DMACSREQ 或 DMACBREQ 信号。
- 当生成 DMA 请求的外设与 DMAC 的时钟不同步时,必须使用同步逻辑。对于与 DMAC 使用相同时钟的外设,禁用同步逻辑可以提高 DMA 请求的响应时间。如果需要,可以在外设中同步 DMA 响应信号 DMACCLR 和 DMACTC。
11.3.4.15 通道寄存器(Channel registers)¶
通道寄存器用于编程 DMA 通道。这些寄存器包括:
- 八个 DMACCxSrcAddr 寄存器
- 八个 DMACCxDestAddr 寄存器
- 八个 DMACCxLLI 寄存器
- 八个 DMACCxControl 寄存器
- 八个 DMACCxConfiguration 寄存器
在执行 scatter/gather DMA 时,前四个寄存器会自动更新。
注意: 如果在传输过程中更新通道寄存器,可能会导致不可预测的行为。如果需要更改通道配置,必须先禁用通道,然后重新配置相关寄存器。
通道源地址寄存器(Channel Source Address Registers)¶
八个可读写的 DMACCxSrcAddr 寄存器(地址偏移量分别为 0x100
、0x120
、0x140
、0x160
、0x180
、0x1A0
、0x1C0
和 0x1E0
)包含当前待传输数据的源地址,数据按字节对齐。软件在适当的通道启用之前直接编程每个寄存器。
当 DMA 通道被启用时,该寄存器会被更新:
- 当源地址递增时
- 当完成一个数据包传输后,按照链表方式更新。
当通道处于活动状态时,读取该寄存器不会提供有用的信息。因为在软件处理读取的值时,通道可能已经进展到下一个状态。该寄存器应在通道停止时为只读,此时它显示最后一个读取项的源地址。
通道目标地址寄存器(Channel Destination Address Registers)¶
八个可读写的 DMACCxDestAddr 寄存器(地址偏移量分别为 0x104
、0x124
、0x144
、0x164
、0x184
、0x1A4
、0x1C4
和 0x1E4
)包含当前待传输数据的目标地址,数据按字节对齐。
软件在启用通道之前直接编程每个寄存器。当 DMA 通道被启用时,该寄存器会在目标地址递增时更新,并在完成一个数据包传输后,按照链表方式更新。
当通道处于活动状态时,读取该寄存器不会提供有用的信息。因为在软件处理读取的值时,通道可能已经进展到下一个状态。该寄存器应在通道停止时为只读,此时它显示最后一个读取项的目标地址。
通道链表项寄存器(Channel Linked List Item Registers)¶
八个可读写的 DMACCxLLI 寄存器(地址偏移量分别为 0x108
、0x128
、0x148
、0x168
、0x188
、0x1A8
、0x1C8
和 0x1E8
)包含下一个 LLI 的按字对齐的地址。如果 LLI 为 0,则当前 LLI 为链表中的最后一个项,并且在与其相关的所有 DMA 传输完成后,DMA 通道将被禁用。
注意: 当 DMA 通道启用时编程此寄存器会产生不可预测的结果。
通道控制寄存器(Channel Control Registers)¶
八个可读写的 DMACCxControl 寄存器(地址偏移量分别为 0x010C
、0x12C
、0x14C
、0x16C
、0x18C
、0x1AC
、0x1CC
和 0x1EC
)包含 DMA 通道控制信息,如传输大小、突发大小和传输宽度。软件在启用 DMA 通道之前直接编程每个寄存器。
当通道启用时,该寄存器会在完成一个数据包传输后,按照链表方式更新。
当通道处于活动状态时,读取该寄存器不会提供有用的信息。因为在软件处理读取的值时,通道可能已经进展到下一个状态。该寄存器应在通道停止时为只读。
下表列出了 DBSize 或 SBSsize 位的值及其对应的突发大小。
下表列出了 SWidth 或 DWidth 位的值及其对应的宽度。
保护和访问信息¶
当发生传输时,AHB 访问信息会提供给源外设和目标外设。传输信息通过编程 DMA 通道、DMACCxControl 寄存器的 Prot 位 和 DMACCxConfiguration 寄存器的 Lock 位 来提供。软件程序这些位,外设在必要时可以使用这些信息。提供了三个位的信息。下表列出了这三个位的保护作用。
通道配置寄存器(Channel Configuration Registers)¶
八个 DMACCxConfiguration 寄存器(地址偏移量分别为 0x110
、0x130
、0x150
、0x170
、0x190
、0x1B0
、0x1D0
和 0x1F0
)是可读写的,用于配置 DMA 通道。请求新的 LLI 时,这些寄存器不会被更新。
下图显示了这些寄存器的位分配。
下表列出了这些寄存器的位分配。
下表列出了三个流控制和传输类型位的位值。
11.3.4.16 外设标识寄存器 0-3(Peripheral Identification Registers 0-3)¶
DMACPeriphID0-3 寄存器是四个 8 位寄存器,地址范围为 0xFE0
到 0xFEC
。可以将这些寄存器概念性地视为一个 32 位寄存器。这些只读寄存器提供以下外设选项:
-
PartNumber[11:0]
该字段用于标识外设。使用三位数字产品代码
0x080
。 -
Designer ID[19:12]
该字段表示设计者的标识符(ASCII 为 A)。
-
Revision[23:20]
该字段表示外设的修订号。修订号从 0 开始。
-
Configuration[31:24]
该字段表示外设的配置选项。
下图显示了这些寄存器的位分配。
DMACPeriphID0 寄存器¶
只读的 DMACPeriphID0 寄存器(地址偏移量为 0xFE0
)是硬编码的,寄存器中的字段决定了复位值。图 3-19 显示了该寄存器的位分配。
DMACPeriphID1 寄存器¶
只读的 DMACPeriphID1 寄存器(地址偏移量为 0xFE4
)是硬编码的,寄存器中的字段决定了复位值。图 3-20 显示了该寄存器的位分配。
DMACPeriphID2 寄存器¶
只读的 DMACPeriphID2 寄存器(地址偏移量为 0xFE8
)是硬编码的,寄存器中的字段决定了复位值。图 3-21 显示了该寄存器的位分配。
DMACPeriphID3 寄存器¶
只读的 DMACPeriphID3 寄存器(地址偏移量为 0xFEC
)是硬编码的,寄存器中的字段决定了复位值。图 3-22 显示了该寄存器的位分配。
11.3.4.17 PrimeCell 标识寄存器 0-3(PrimeCell Identification Registers 0-3)¶
DMACPCellID0-3 寄存器是四个 8 位宽的只读寄存器,地址范围为 0xFF0
到 0xFFC
。可以将这些寄存器概念性地视为一个 32 位寄存器。该寄存器是一个标准的跨外设识别系统。DMACPCellID 寄存器的值被设置为 0xB105F00D
。
下图显示了这些寄存器的位分配。
DMACPCellID0 寄存器¶
只读的 DMACPCellID0 寄存器(地址偏移量为 0xFF0
)是硬编码的,其字段决定了复位值。下图显示了寄存器的位分配。
DMACPCellID1 寄存器¶
只读的 DMACPCellID1 寄存器(地址偏移量为 0xFF4
)是硬编码的,其字段决定了复位值。下图显示了寄存器的位分配。
DMACPCellID2 寄存器¶
只读的 DMACPCellID2 寄存器(地址偏移量为 0xFF8
)是硬编码的,其字段决定了复位值。下图显示了寄存器的位分配。
DMACPCellID3 寄存器¶
只读的 DMACPCellID3 寄存器(地址偏移量为 0xFFC
)是硬编码的,其字段决定了复位值。下图显示了寄存器的位分配。
11.3.5 测试寄存器(Test Registers)¶
11.3.5.1 测试控制寄存器(Test Control Register)¶
DMACITCR 寄存器为可读写的 16 位寄存器,地址偏移为 0x500
,用于选择各种测试模式,在复位时会被清零。
该寄存器允许你使用 TIC 模块级测试 和 内建自测试(BIST)集成及系统级测试 来测试 DMAC。
下图显示了该寄存器的位分配。
11.3.5.2 集成测试输出寄存器 1(Integration Test Output Register 1)¶
DMACITOP1 寄存器为可读写的 16 位寄存器,地址偏移为 0x504
,用于在测试模式下控制和读取 DMACCLR[15:0]
输出信号。
图 4-2 显示了该寄存器的位分配。
11.3.5.3 集成测试输出寄存器 2(Integration Test Output Register 2)¶
DMACITOP2 寄存器为可读写的 16 位寄存器,地址偏移为 0x508
,用于在测试模式下控制和读取 DMACTC[15:0]
输出信号。
图 4-3 显示了该寄存器的位分配。
11.3.5.4 集成测试输出寄存器 3(Integration Test Output Register 3)¶
可读写的 DMACITOP3 寄存器,地址偏移量为 0x50C
,是一个 16 位寄存器,在测试模式下控制并读取中断请求(interrupt request)输出线。图 4-4 显示了该寄存器的位分配。
12 模数转换器(ADC)¶
12.1 概述¶
芯片内嵌 3 个 12 位、1.0 MSPS(百万次采样/秒)的 ADC(模数转换器),每个 ADC 支持最多 17 个复用通道,可测量来自 16 个外部模拟信号和 1 个内部信号。在三重交错模式(Triple Interleaved Mode)下,总采样率可达到 3 MSPS。
ADC 支持以下多种转换模式:
- 单次模式(Single)
- 连续模式(Continuous)
- 扫描模式(Scan)
- 非连续模式(Discontinuous)
ADC 还具有模拟看门狗(Analog Watchdog)功能,允许用户检测输入电压是否超出用户定义的高/低阈值范围。
ADC 的输入时钟来源于互连逻辑时钟(inter-connection logic clock)。
ADC 特性¶
- ADC 采样率:12 位分辨率下为 1 MSPS
- 可编程采样时间
- 16 个外部模拟输入通道 和 1 个内部温度传感器通道
- 支持单通道转换或通道序列扫描
- 单次模式:每次触发转换所选通道一次
- 连续模式:持续不断地转换所选通道
- 非连续模式
- 模拟看门狗功能
- ADC 电源要求:3.135V 至 3.465V,典型供电电压为 3.3V
- ADC 输入电压范围:VSSA ≤ VIN ≤ VREFP
12.2 引脚与内部信号(Pins and Internal Signals)¶
ADC 内部信号¶
内部信号名称 | 信号类型 | 描述 |
---|---|---|
Vtemp-sense (ADC1) | 输入 | 内部温度传感器的输出电压 |
ADC 引脚定义¶
名称 | 信号类型 | 描述 |
---|---|---|
VDDA | 模拟电源 | 模拟电源电压,等于 VDD33,满足范围为 3.135 V ≤ VDDA ≤ 3.465 V |
VSSA | 模拟电源地 | 模拟电源地,等于 VSS33 |
VREFP | 模拟参考正极 | ADC 的正参考电压,满足范围为 3.135 V ≤ VREFP ≤ VDDA |
IN[15:0] | 模拟输入 | 最多支持 16 个外部模拟输入通道 |
12.3 温度传感器(Temperature Sensor)¶
内部温度传感器可用于测量器件的环境温度。其输出电压可以通过 ADC 转换为数字值。
- 推荐的采样时间:为了获得准确的温度读数,推荐将温度传感器的采样时间设置为 不少于 10μs。
- 线性关系:传感器输出电压与温度之间呈线性关系。
- 注意事项:由于制造工艺差异导致的偏移量不同,温度传感器更适合用于检测温度变化趋势而非精确的绝对温度。
12.4 ADC 模块引脚(ADC Block Pins)¶
ADC 模块框图(ADC Block Diagram)
ADC 模块引脚说明(ADC Block Pins Descriptions)
ADC 模块引脚 描述 in0~in16 模拟输入通道 insel1[4:0] 输入通道选择 00001:in0 00010:in1 00011:in2 00100:in3 00101:in4 00110:in5 00111:in6 01000:in7 01001:in8 01010:in9 01011:in10 01100:in11 01101:in12 01110:in13 01111:in14 10000:in15 10001:in16(内部源) 对于 ADC1,内部源为 Vtemp-sense enb 用于使能 ADC 0:ADC 使能 1:ADC 禁用 stop 停止模式使能 0:禁用 1:启用,当启用停止模式时,关闭 ADC 模块电源 db[11:0] ADC 12 位输出数据 eoc ADC 转换结束标志 上升沿时,ADC 输出数据将准备就绪
12.5 ADC 输入信号与封装引脚对应关系¶
(12.5 ADC Input Signals vs Package Pins)
LQFP64¶
ADC IP 输入引脚 | 封装引脚号 | 引脚功能描述 |
---|---|---|
IN0 | PIN14 | WKUP_ADC_IN0_CMP_PA0 |
IN1 | PIN15 | ADC_IN1_CMP_PA1 |
IN2 | PIN16 | ADC_IN2_CMP_PA2 |
IN3 | PIN17 | ADC_IN3_CMP_PA3 |
IN4 | PIN20 | ADC_IN4_CMP_PA4_DAC0 |
IN5 | PIN21 | ADC_IN5_CMP_PA5_DAC1 |
IN6 | PIN22 | ADC_IN6 |
IN7 | PIN23 | ADC_IN7 |
IN8 | PIN26 | ADC_IN8 |
IN9 | PIN27 | ADC_IN9 |
IN10 | PIN8 | ADC_IN10 |
IN11 | PIN9 | ADC_IN11 |
IN12 | PIN10 | ADC_IN12 |
IN13 | PIN11 | ADC_IN13 |
IN14 | PIN24 | ADC_IN14 |
IN15 | PIN25 | ADC_IN15 |
LQFP100¶
ADC IP 输入引脚 | 封装引脚号 | 引脚功能描述 |
---|---|---|
IN0 | PIN23 | WKUP_ADC_IN0_CMP_PA0 |
IN1 | PIN24 | ADC_IN1_CMP_PA1 |
IN2 | PIN25 | ADC_IN2_CMP_PA2 |
IN3 | PIN26 | ADC_IN3_CMP_PA3 |
IN4 | PIN29 | ADC_IN4_CMP_PA4_DAC0 |
IN5 | PIN30 | ADC_IN5_CMP_PA5_DAC1 |
IN6 | PIN31 | ADC_IN6 |
IN7 | PIN32 | ADC_IN7 |
IN8 | PIN35 | ADC_IN8 |
IN9 | PIN36 | ADC_IN9 |
IN10 | PIN15 | ADC_IN10 |
IN11 | PIN16 | ADC_IN11 |
IN12 | PIN17 | ADC_IN12 |
IN13 | PIN18 | ADC_IN13 |
IN14 | PIN33 | ADC_IN14 |
IN15 | PIN34 | ADC_IN15 |
12.6 ADC 特性(ADC Characteristics)¶
符号 | 参数 | 最小值 (MIN) | 典型值 (TYP) | 最大值 (MAX) | 单位 |
---|---|---|---|---|---|
VDDA | 工作电压 | 3.135 | 3.3 | 3.465 | V |
VIN | ADC 输入电压范围 | 0 | — | VREFP | V |
fADC | ADC 时钟频率 | 0.5 | — | 14 | MHz |
fs | 采样率 | — | — | 1 | MHz |
tconv | ADC 转换时间 | 1 | — | 20 | μs |
RADC | 输入采样开关电阻 | — | — | 2 | kΩ |
CADC | 输入采样电容 | — | 10 | — | pF |
tsu | 启动时间 | — | — | 10 | μs |
12.7 ADC 时序图(ADC Timing Diagram)¶
在 ADC 转换开始后,经过 13 个时钟周期,EOC 标志被置位,12 位数据准备就绪。
参数说明
参数 限制 单位 描述 sclk 14 MHz 系统时钟频率 tcon 13 周期 数据转换时间 tACQ 1 周期 信号采样时间 t1 10 ns ENB 到 SCLK 的建立时间
13 数字-模拟转换器 (DAC)¶
13.1 概述 (Overview)¶
数字-模拟转换器将 10 位数字数据转换为外部引脚上的电压。输出电压可以选择性地进行缓冲,以提高驱动能力。两个 DAC 可以独立或同时工作。
DAC 主要特点 (DAC Main Features)
- 两个 DAC 转换器:每个输出一个通道
- 外部触发转换:转换通过外部触发器启动
- 双 DAC 通道独立或同时转换:支持独立或同时进行两个 DAC 通道的转换
- 可配置的内部缓冲器:输出信号可以通过内部缓冲器进行配置
- 外部触发器进行转换:支持外部触发转换
- 输入电压参考 VREFP:提供参考电压输入
13.2 DAC 模块引脚 (DAC Block Pins)¶
信号名 | 描述 |
---|---|
enb |
用于使能 DAC |
0:DAC 使能 | |
1:DAC 禁用 | |
bufenb |
用于使能输出缓冲器 |
0:缓冲器使能 | |
1:缓冲器禁用 | |
stop |
停止模式使能 |
0:禁用 | |
1:启用,当启用时关闭 DAC 模块电源 | |
din[9:0] |
10 位 DAC 输入数据 |
dout |
模拟 DAC 输出信号到 IO 引脚 |
13.3 DAC 引脚 (DAC Pins)¶
引脚名 | 信号类型 | 备注 |
---|---|---|
VDDA |
模拟电源供应 | 模拟电源,等同于 VDD,且 3.135 V ≤ VDDA ≤ 3.465 V |
VSSA |
模拟地 | 模拟电源接地,等同于 VSS33 |
VREFP |
模拟参考正极 | ADC 的正参考电压,3.135 V ≤ VREFP ≤ VDDA |
DOUT |
DAC 输出信号 | 模拟输出信号 |
13.4 DAC 输出信号与封装引脚对应 (DAC Output Signals vs Package Pins)¶
QFP100¶
引脚名 | 封装引脚号 | 引脚功能描述 |
---|---|---|
dout_dac0 |
PIN_29 | ADC_IN4_CMP_PA4_DAC0 |
dout_dac1 |
PIN_30 | ADC_IN5_CMP_PA5_DAC1 |
QFP64¶
引脚名 | 封装引脚号 | 引脚功能描述 |
---|---|---|
dout_dac0 |
PIN_20 | ADC_IN4_CMP_PA4_DAC0 |
dout_dac1 |
PIN_21 | ADC_IN5_CMP_PA5_DAC1 |
13.5 DAC 特性 (DAC Characteristics)¶
符号 | 参数 | 条件 | 最小值 (Min) | 典型值 (Typ) | 最大值 (Max) | 单位 |
---|---|---|---|---|---|---|
VDDA | 工作电压 | 3.135 | 3.3 | 3.465 | V | |
VREFP | 参考电压 | VREFP 应始终小于 VDDA | 3.135 | 3.3 | 3.3 | V |
RLOAD | 负载电阻 | 与 VSSA 之间的电阻负载,缓冲器开启 | 5 | kΩ | ||
CLOAD | 负载电容 | 不包括引脚/焊盘电容 | 50 | pF | ||
DAC_OUTmin | DAC 输出最低电压 | 缓冲器开启时 | ||||
DAC_OUTmax | DAC 输出最高电压 | 缓冲器开启时 | VDDA - 0.2 | V | ||
更新率 | 最大频率 | 从代码 i 转换到 i±1 LSB 时 |
CLOAD ≤ 50pF, RLOAD ≥ 5kΩ | 2 | MS/s |
13.6 DAC 输出电压 (DAC Output Voltage)¶
DAC 引脚上的模拟输出电压由以下公式确定:
DACoutput = VREFP * DAC_Dout / 1024
数字输入被线性转换为模拟输出电压,输出电压范围为 0 到 VREFP。
14 比较器 (CMP)¶
14.1 概述 (Overview)¶
通用比较器 CMP0 和 CMP1 可以独立工作,也可以与定时器配合使用。它们可以用于通过模拟信号唤醒 MCU 从低功耗模式,提供当模拟信号处于某一条件时的触发源,或者通过与定时器的 PWM 输出和 DAC 一起工作,实现某些电流控制。
14.2 特性 (Characteristics)¶
- 轨到轨比较器:支持完整的轨到轨比较功能
- 可配置的滞回:支持滞回配置
- 可配置的速度和功耗:可根据需求调整比较器的速度与功耗
- 每个比较器都有可配置的模拟输入源:支持多种模拟输入源配置
- 内部参考电压的整体或子倍值:可用于窗口比较器模式
- 输出到 I/O 引脚:可以将结果输出至 I/O 引脚
- 输出到定时器用于触发:比较器的输出可用作定时器触发源
14.3 CMP 模块引脚 (CMP Block Pins)¶
引脚名 | 描述 |
---|---|
INP1_1 |
CMP1 非反相输入信号 |
INP1_2 |
CMP1 非反相输入信号 |
ipsel1[1:0] |
CMP1 输入选择 |
01: INP1_1 |
|
10: INP1_2 |
|
INM1_1 |
CMP1 反相输入信号 |
INM1_2 |
CMP1 反相输入信号 |
INM1_3 |
CMP1 反相输入信号 |
imsel1[2:0] |
CMP1 反相输入选择 |
001: INM1_1 |
|
010: INM1_2 |
|
011: INM1_3 |
|
100: ¼ VREF | |
101: ½ VREF | |
110: ¾ VREF | |
111: VREF | |
mode1 |
控制 CMP1 的工作模式,调节速度/功耗 |
0: 高速/全功率 | |
1: 低速/低功耗 | |
hyst1 |
用于设置 CMP1 的滞回 |
0: 无滞回 | |
1: 有滞回 | |
enb1 |
用于使能 CMP1 |
0: CMP1 使能 | |
1: CMP1 禁用 | |
out1 |
CMP1 输出信号 |
INP2_1 |
CMP2 非反相输入信号 |
INP2_2 |
CMP2 非反相输入信号 |
ipsel2[1:0] |
CMP2 输入选择 |
01: INP2_1 |
|
10: INP2_2 |
|
INM2_1 |
CMP2 反相输入信号 |
INM2_2 |
CMP2 反相输入信号 |
INM2_3 |
CMP2 反相输入信号 |
imsel2[2:0] |
CMP2 反相输入选择 |
001: INM2_1 |
|
010: INM2_2 |
|
011: INM2_3 |
|
100: ¼ VREF | |
101: ½ VREF | |
110: ¾ VREF | |
111: VREF | |
mode2 |
控制 CMP2 的工作模式,调节速度/功耗 |
0: 高速/全功率 | |
1: 低速/低功耗 | |
hyst2 |
用于设置 CMP2 的滞回 |
0: 无滞回 | |
1: 有滞回 | |
enb2 |
用于使能 CMP2 |
0: CMP2 使能 | |
1: CMP2 禁用 | |
out2 |
CMP2 输出信号 |
stop |
停止模式使能 |
0: 禁用 | |
1: 启用,当启用时关闭 CMP 模块电源 |
14.4 CMP 输入信号与封装引脚对应 (CMP Input Signals vs Package Pins)¶
LQFP64¶
引脚名 | 封装引脚号 | 引脚功能描述 |
---|---|---|
INP1_1 |
PIN_15 | ADC_IN1_CMP_PA1 |
INP1_2 |
PIN_20 | ADC_IN4_CMP_PA4_DAC0 |
INM1_1 |
PIN_20 | ADC_IN4_CMP_PA4_DAC0 |
INM1_2 |
PIN_14 | WKUP_ADC_IN0_CMP_PA0 |
INM1_3 |
PIN_21 | ADC_IN5_CMP_PA5_DAC1 |
INP2_1 |
PIN_15 | ADC_IN1_CMP_PA1 |
INP2_2 |
PIN_17 | ADC_IN3_CMP_PA3 |
INM2_1 |
PIN_20 | ADC_IN4_CMP_PA4_DAC0 |
INM2_2 |
PIN_16 | ADC_IN2_CMP_PA2 |
INM2_3 |
PIN_21 | ADC_IN5_CMP_PA5_DAC1 |
LQFP100¶
引脚名 | 封装引脚号 | 引脚功能描述 |
---|---|---|
INP1_1 |
PIN_24 | ADC_IN1_CMP_PA1 |
INP1_2 |
PIN_29 | ADC_IN4_CMP_PA4_DAC0 |
INM1_1 |
PIN_29 | ADC_IN4_CMP_PA4_DAC0 |
INM1_2 |
PIN_23 | WKUP_ADC_IN0_CMP_PA0 |
INM1_3 |
PIN_30 | ADC_IN5_CMP_PA5_DAC1 |
INP2_1 |
PIN_24 | ADC_IN1_CMP_PA1 |
INP2_2 |
PIN_26 | ADC_IN3_CMP_PA3 |
INM2_1 |
PIN_29 | ADC_IN4_CMP_PA4_DAC0 |
INM2_2 |
PIN_25 | ADC_IN2_CMP_PA2 |
INM2_3 |
PIN_30 | ADC_IN5_CMP_PA5_DAC1 |
14.5 比较器特性 (Comparator Characteristics)¶
符号 | 参数 | 条件 | 最小值 (Min) | 典型值 (Typ) | 最大值 (Max) | 单位 |
---|---|---|---|---|---|---|
VDDA | 模拟电源电压 | 3.135 | 3.3 | 3.3 | V | |
VIN | 比较器输入电压范围 | 0 | VDDA | VDDA | V | |
tstart | 比较器启动时间 | VDDA ≥ 3.135 V | 10 | μs | ||
tD | 完全范围步进的传播延迟 | 100 mV 过驱动,VDDA ≥ 3.135 V | 50 | ns | ||
VOFFSET | 比较器偏移误差 | VDDA ≥ 3.135 V | ±30 | mV |
15 后备寄存器 (BKP)¶
后备寄存器简介 (BKP Introduction)¶
后备寄存器是 16 个 16 位寄存器,用于存储 32 字节的用户应用数据。它们实现于后备域,当 VDD33 电源关闭时,通过 VBAT 仍然保持供电。它们在设备从待机模式唤醒时,或者通过系统复位或电源复位时不会被重置。
此外,BKP 控制寄存器用于管理 RTC 校准。
在复位后,访问后备寄存器和 RTC 被禁用,后备域(BKP)受到保护,防止可能的寄生写入访问。
要启用访问后备寄存器和 RTC,按如下步骤操作:
- 通过设置 RCC_APB1ENR 寄存器中的 PWREN 和 BKPEN 位来启用电源和后备接口时钟。
- 设置电源控制寄存器(PWR_CR)中的 DBP 位,启用对后备寄存器和 RTC 的访问。
BKP 主要特点 (BKP Main Features)¶
- 32 字节数据寄存器:提供存储用户数据的空间
- RTC 校准寄存器:用于存储 RTC 校准值
- RTC 校准时钟输出功能:可以输出 RTC 校准时钟、RTC 闹钟脉冲或秒脉冲
RTC 校准 (RTC Calibration)¶
为了进行测量,RTC 时钟可以通过 64 分频输出到引脚。通过配置 CAL[6:0] 位,可以将时钟的频率降低最多 121 ppm。
BKP 寄存器 (BKP Registers)¶
后备数据寄存器 x (BKP_DRx) (x = 1 .. 17)¶
- 地址偏移:
- 重置值:0x0000 0000
位 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | D[15:0] | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
-
位 15:0:D[15:0]:备份数据
- 这些位可以写入用户数据。
- 注意:BKP_DRx 寄存器不会被系统复位、电源复位或设备从待机模式唤醒时重置。它们只会在备份域重置时重置。
RTC 时钟校准寄存器 (BKP_RTCCR)¶
- 地址偏移:
- 重置值:0x0000 0000
位 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
字段 | ASOS | ASOE | COO | CAL[6:0] | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
-
位 9: ASOS:闹钟或秒脉冲输出选择
-
当 ASOE 位被设置时,ASOS 位可以选择在 IO_RTC 上输出 RTC 秒脉冲信号或闹钟脉冲信号:
- 0: 选择 RTC 闹钟脉冲输出
- 1: 选择 RTC 秒脉冲输出
-
注意:此位仅在备份域重置时被重置。
-
-
位 8: ASOE:闹钟或秒脉冲输出使能
-
设置此位后,可以根据 ASOS 位的设置,在 IO_RTC 上输出 RTC 闹钟脉冲信号或秒脉冲信号:
- 0: 输出禁用
- 1: 输出使能
-
输出脉冲的持续时间为一个 RTC 时钟周期。设置 ASOE 位时,IO_RTC 必须禁用。
- 注意:此位仅在备份域重置时被重置。
-
-
位 7: COO:校准时钟输出
- 0: 无效
- 1: 设置此位会将 RTC 时钟输出为经过 64 分频的信号,输出到 IO_RTC。
- 注意:此位在 VDD 电源关闭时被重置。
-
位 6:0: CAL[6:0]:校准值
- 此值表示每 2^20 个时钟脉冲中将忽略的脉冲数。
- 该设置允许 RTC 时钟的校准,以 1000000/2^20 PPM 的步长减慢时钟。
- RTC 时钟的速度可以从 0 到 121 PPM 进行减速。
16 CRC(循环冗余校验计算单元)¶
16.1 概述 (Introduction)¶
CRC(循环冗余校验)计算单元用于根据 8 位、16 位或 32 位数据字和生成多项式计算 CRC 码。
CRC 基于的技术广泛应用于数据传输或存储完整性验证。根据功能安全标准,它们提供了一种验证 Flash 存储器完整性的方法。CRC 计算单元有助于在运行时计算软件签名,并将其与在链接时生成并存储在指定内存位置的参考签名进行比较。
16.2 CRC 主要特点 (CRC Main Features)¶
- 完全可编程的多项式,支持可编程大小(7 位、8 位、16 位、32 位)
- 支持 8 位、16 位、32 位数据大小
- 可编程 CRC 初始值
- 单输入/输出 32 位数据寄存器
- 输入缓冲区,避免在计算期间发生总线停滞
- 对于 32 位数据大小,CRC 计算在 4 个 AHB 时钟周期(HCLK)内完成
- 通用 8 位寄存器(可用于临时存储)
- I/O 数据的可逆选项
16.3 CRC 功能描述¶
16.3.1 CRC 模块框图¶
图 7. CRC 计算单元框图
16.3.2 CRC 内部信号¶
表 15. CRC 内部输入/输出信号
信号名称 信号类型 描述 crc_hclk 数字输入 AHB 时钟
16.3.3 CRC 操作¶
CRC 计算单元包含一个 32 位的读/写数据寄存器(CRC_DR
)。该寄存器用于输入新的数据(写操作)或读取上一次 CRC 计算的结果(读操作)。
每次向数据寄存器写入操作时,都会将新数据与上一次的 CRC 值(保存在 CRC_DR
中)结合进行计算。CRC 的计算可以基于整个 32 位数据字,或按字节进行,这取决于写入数据的格式。
CRC_DR
寄存器支持按字、右对齐半字、右对齐字节进行访问。其他寄存器仅支持 32 位访问。
计算时间根据数据宽度而不同:
- 32 位数据:4 个 AHB 时钟周期
- 16 位数据:2 个 AHB 时钟周期
- 8 位数据:1 个 AHB 时钟周期
一个输入缓冲器允许在不等待前一个 CRC 计算完成的情况下立即写入第二个数据,无需等待状态。
可以动态调整数据大小,以减少为固定字节数所需的写入次数。例如,对于 5 字节的 CRC 计算,可以通过一个字(word)写入加一个字节(byte)写入来完成。
输入数据可以进行反转,以支持不同的字节序方案。反转操作可以针对 8 位、16 位或 32 位进行,具体取决于 CRC_CR
寄存器中的 REV_IN[1:0]
位。
例如:输入数据 0x1A2B3C4D
在不同反转模式下的 CRC 计算值为:
- 按字节反转:
0x58D43CB2
- 按半字反转:
0xD458B23C
- 按完整字反转:
0xB23CD458
输出数据也可以通过设置 CRC_CR
寄存器中的 REV_OUT
位进行反转。
此操作在位级别进行。例如,输出数据 0x11223344
被转换为 0x22CC4488
。
可以通过设置 CRC_CR
寄存器中的 RESET
控制位来将 CRC 计算器初始化为可编程值(默认值为 0xFFFFFFFF
)。
初始 CRC 值可以通过 CRC_INIT
寄存器进行编程。当访问 CRC_INIT
寄存器进行写操作时,CRC_DR
寄存器将自动初始化。
CRC_IDR
寄存器可用于保存与 CRC 计算相关的临时值。该寄存器不会受到 CRC_CR
寄存器中 RESET
位的影响。
多项式可编程性
多项式系数可以通过 CRC_POL
寄存器完全编程。多项式的大小可通过设置 CRC_CR
寄存器中的 POLYSIZE[1:0]
位配置为 7、8、16 或 32 位。不支持偶数阶多项式。
如果 CRC 数据小于 32 位,其值可以从 CRC_DR
寄存器的最低有效位读取。
为了确保 CRC 计算的可靠性,在进行 CRC 计算期间,禁止动态更改多项式的值或大小。因此,如果 CRC 计算正在进行,应用程序必须先重置或读取一次 CRC_DR
,然后才能修改多项式。
默认的多项式值为 CRC-32(以太网)多项式:0x4C11DB7
16.4 CRC 寄存器¶
16.4.1 数据寄存器(CRC_DR)¶
- 地址偏移:
0x00
- 复位值:
0xFFFF FFFF
位 31:0 DR[31:0]:数据寄存器位
该寄存器用于向 CRC 计算器写入新数据。 在读取时,寄存器中保存的是上一次 CRC 计算的结果。 如果数据小于 32 位,则使用最低有效位来读写正确的值。
16.4.2 独立数据寄存器(CRC_IDR)¶
- 地址偏移:
0x04
- 复位值:
0x0000 0000
位 31:8 保留,必须保持清零 位 7:0 IDR[7:0]:通用 8 位数据寄存器位
这些位可用作一个字节的临时存储位置。
该寄存器不会受到 CRC_CR
寄存器中 RESET
位触发的 CRC 复位的影响。
16.4.3 控制寄存器(CRC_CR)¶
- 地址偏移:
0x08
- 复位值:
0x0000 0000
位 31:8 保留,必须保持清零
位 7 REV_OUT:输出数据反转
该位用于控制输出数据的位顺序是否反转:
- 0:不影响位顺序
- 1:按位反转输出格式
位 6:5 REV_IN[1:0]:输入数据反转
该位控制输入数据的位反转方式:
- 00:不反转
- 01:按字节反转
- 10:按半字反转
- 11:按字反转
位 4:3 POLYSIZE[1:0]:多项式大小
该位控制 CRC 多项式的大小:
- 00:32 位多项式
- 01:16 位多项式
- 10:8 位多项式
- 11:7 位多项式
位 2:1 保留,必须保持清零
位 0 RESET:重置位
该位由软件设置,用于重置 CRC 计算单元,并将数据寄存器设置为 CRC_INIT
寄存器中的初始值。
该位只能被设置,硬件会自动清除该位。
16.4.4 初始 CRC 值(CRC_INIT)¶
- 地址偏移:
0x10
- 复位值:
0xFFFF FFFF
位 31:0 CRC_INIT:可编程的初始 CRC 值
该寄存器用于写入 CRC 的初始值。
16.4.5 CRC 多项式(CRC_POL)¶
- 地址偏移:
0x14
- 复位值:
0x04C11DB7
位 31:0 POL[31:0]:可编程多项式
该寄存器用于写入用于 CRC 计算的多项式系数。 如果多项式小于 32 位,则应使用最低有效位写入正确的值。
16.4.6 CRC 寄存器映射¶
表 16. CRC 寄存器映射与复位值
17 通用输入/输出(GPIO)¶
17.1 概述¶
AG32 器件最多提供 78 个用户 I/O 端口(GPIO)。 每个 GPIO 引脚都可以通过软件配置为输出(推挽或开漏,带或不带上拉/下拉),输入(浮空,带或不带上拉/下拉),或配置为外设复用功能。 大多数 GPIO 引脚与数字或模拟复用功能共享。所有 GPIO 都支持高电流,并具备速度选择功能,以更好地管理内部噪声、电源消耗和电磁辐射。
如有需要,可通过特定的操作顺序锁定 I/O 配置,以防止对 I/O 寄存器的误写。
17.2 功能描述¶
用户 I/O 的基本结构¶
用户 I/O 为每个 I/O 引脚提供了一系列可编程功能。这些功能增强了 I/O 的使用灵活性,并可减少外部分立元件(如上拉电阻)的使用。
可编程电流驱动能力¶
每个 I/O 引脚的输出缓冲器都支持针对特定 I/O 标准的可编程电流强度控制。 对于 LVTTL、LVCMOS 标准,可控制多个级别的输出电流。
上升/下降沿速率控制¶
每个 I/O 引脚的输出缓冲器提供可选的可编程输出沿速率控制。然而,这些快速的电平跳变可能会在系统中引入噪声瞬变。 较慢的沿速率可以降低系统噪声,但会给上升沿和下降沿引入名义延迟。 由于每个 I/O 引脚都具有独立的沿速率控制功能,因此可按引脚逐个设置。沿速率控制会同时影响上升沿和下降沿。
开漏输出¶
每个 I/O 引脚都支持可选的开漏(等效于开集)输出。开漏输出允许该器件提供系统级控制信号(例如中断信号和写使能信号),以便系统中多个器件共同驱动这些信号。
总线保持功能(Bus Hold)¶
每个用户 I/O 引脚都支持可选的总线保持功能。总线保持电路可在 I/O 引脚上维持其上一次驱动状态。 由于该功能可保持引脚的最后驱动电平,直到下一个输入信号出现,因此在总线处于三态时,无需外部上拉或下拉电阻来维持电平。
可编程上拉电阻¶
在用户模式下,每个 I/O 引脚提供可选的可编程上拉电阻功能。启用此功能后,该引脚将被上拉至 VDD 电平。
在复位期间及其刚结束时,用户 I/O 会配置为输入浮空模式。 JTAG 引脚在复位后配置如下:
- JTDI:上拉(PU)
- JTCK:下拉(PD)
- JTMS:上拉(PU)
- NJTRST:上拉(PU)
17.3 寄存器描述¶
17.3.1 数据寄存器,GPIODATA¶
GPIODATA 寄存器是数据寄存器。在软件控制模式下,写入 GPIODATA 寄存器的值会被传送到 GPOUT 引脚,如果相应的引脚已经通过 GPIODIR 寄存器配置为输出引脚的话。
为了写入 GPIODATA,相应的地址总线 PADDR[9:2] 中的掩码位必须为高电平。否则,写入操作不会改变位值。
同样地,从该寄存器读取的值是根据每个位的掩码位来确定的,掩码位由访问数据寄存器时使用的地址 PADDR[9:2] 得到。地址掩码中为 1 的位会导致 GPIODATA 寄存器中的相应位被读取,而地址掩码中为 0 的位会导致 GPIODATA 寄存器中的相应位被读取为 0,无论它们的实际值如何。
从 GPIODATA 寄存器读取时,如果相应的引脚被配置为输出,则返回最后一次写入的位值;如果相应的引脚被配置为输入,则返回对应的输入 GPIN 位的值。所有位在复位时都会被清除。
下表显示了 GPIODATA 寄存器的位分配。
17.3.2 数据方向寄存器,GPIODIR¶
GPIODIR 寄存器是数据方向寄存器。在 GPIODIR 中设置为高电平的位会将相应的引脚配置为输出。清除某个位会将引脚配置为输入。所有位在复位时都会被清除。因此,GPIO 引脚默认为输入。
下表显示了 GPIODIR 寄存器的位分配。
17.3.3 中断触发方式寄存器,GPIOIS¶
GPIOIS 寄存器是中断触发方式寄存器。在 GPIOIS 中设置为高电平的位会将相应的引脚配置为检测电平变化。清除某个位会将引脚配置为检测边沿变化。所有位在复位时都会被清除。
下表显示了 GPIOIS 寄存器的位分配。
17.3.4 中断双边沿寄存器,GPIOIBE¶
GPIOIBE 寄存器是中断双边沿寄存器。当 GPIOIS 中的相应位被设置为检测边沿时,在 GPIOIBE 中设置为高电平的位会使相应的引脚检测上升沿和下降沿,而不管 GPIOIEV(中断事件寄存器)中的相应位的设置。清除某个位会使引脚由 GPIOIEV 寄存器控制。所有位在复位时都会被清除。
下表显示了 GPIOIBE 寄存器的位分配。
17.3.5 中断事件寄存器,GPIOIEV¶
GPIOIEV 寄存器是中断事件寄存器。在 GPIOIEV 中设置为高电平的位,会将相应的引脚配置为检测上升沿或高电平,这取决于 GPIOIS 中相应位的值。清除某个位会将引脚配置为检测下降沿或低电平,也取决于 GPIOIS 中相应位的值。所有位在复位时都会被清除。
下表显示了 GPIOIEV 寄存器的位分配。
17.3.6 中断屏蔽寄存器,GPIOIE¶
GPIOIE 寄存器是中断屏蔽寄存器。在 GPIOIE 中设置为高电平的位,会使相应的引脚能够触发各自的中断以及联合的 GPIOINTR 线。清除某个位会禁用该引脚上的中断触发。所有位在复位时都会被清除。
下表显示了 GPIOIE 寄存器的位分配。
17.3.7 原始中断状态寄存器,GPIORIS¶
GPIORIS 寄存器是原始中断状态寄存器。在 GPIORIS 中读取为高电平的位表示检测到了中断触发条件(原始状态,未经过屏蔽),说明已满足所有中断触发条件,等待 GPIOIE 的允许来真正触发中断。读取为 0 的位表示相应的输入引脚尚未引发中断。该寄存器为只读,并且所有位在复位时被清除。
下表显示了 GPIORIS 寄存器的位分配。
17.3.8 屏蔽中断状态寄存器,GPIOMIS¶
GPIOMIS 寄存器是屏蔽中断状态寄存器。在 GPIOMIS 中读取为高电平的位表示相应的输入引脚已触发中断。读取为低电平的位表示未产生中断,或中断被屏蔽。GPIOMIS 表示的是中断经过屏蔽后的状态。该寄存器为只读,所有位在复位时被清除。
该寄存器的内容也可通过片内的 GPIOMIS[7:0] 信号对外提供。
下表显示了 GPIOMIS 寄存器的位分配。
17.3.9 中断清除寄存器,GPIOIC¶
GPIOIC 寄存器是中断清除寄存器。向该寄存器的某个位写入 1 会清除相应的中断边沿检测逻辑。写入 0 则无任何影响。该寄存器为只写寄存器,所有位在复位时被清除。
下表显示了 GPIOIC 寄存器的位分配。
17.3.10 模式控制选择寄存器,GPIOAFSEL¶
GPIOAFSEL 寄存器是模式控制选择寄存器。向该寄存器的某个位写入 1 会为相应的 PrimeCell GPIO 引脚选择硬件控制模式。所有位在复位时被清除,因此默认情况下所有 PrimeCell GPIO 引脚都未设置为硬件控制模式。
下表显示了 GPIOAFSEL 寄存器的位分配。
18 通用异步收发传输器(UART)¶
18.1 UART 简介¶
UART 是一个 AMBA 从模块,连接到高级外设总线(APB)。UART(UART0 - UART4)用于在并行和串行接口之间传输数据,提供灵活的全双工异步数据交换。它也常用于 RS-232 标准通信。
UART 包含一个可编程波特率发生器,能够对系统时钟进行分频,以为 UART 发射器和接收器生成专用时钟。除了 UART4 外,UART 还支持 DMA 功能,以实现高速数据通信。
可编程参数: 以下关键参数均可编程:
- 通信波特率(整数和小数部分)
- 数据位数
- 停止位数
- 奇偶校验模式
- FIFO 启用(16 字深)或禁用(1 字深)
- FIFO 触发电平可选择为 1/8、1/4、1/2、3/4 和 7/8
- 内部标准时钟频率为 1.8432MHz(1.42–2.12MHz),用于在低功耗模式下生成更短的位持续时间
- 硬件流控
此外,还实现了额外的测试寄存器和模式,用于集成测试。
18.2 UART 功能描述¶
UART 执行以下操作:
- 将来自外设设备的串行数据转换为并行数据(串转并)
- 将发送到外设设备的并行数据转换为串行数据(并转串)
CPU 通过 AMBA APB 接口读取和写入数据及控制/状态信息。收发路径使用内部 FIFO 缓存,分别支持最多 16 字节的独立收发。
UART 的特性包括:
- 包含一个可编程的波特率发生器,从 UART 的内部参考时钟输入(UARTCLK)生成共用的收发内部时钟
- 提供与行业标准 16C550 UART 设备类似的功能
- 支持最高 460.8Kbit/s 的波特率(取决于 UARTCLK 参考时钟频率)
UART 的操作和波特率设置由线路控制寄存器(UARTLCR_H)和波特率除数寄存器(UARTIBRD 和 UARTFBRD)控制。
UART 可生成以下中断:
- 来自接收(包括超时)、发送、调制解调器状态以及错误条件的独立可屏蔽中断
- 一个组合中断:当任一未被屏蔽的独立中断被触发时,该输出中断信号被激活
- 用于与直接内存访问控制器(DMA)接口的 DMA 请求信号
当接收过程中出现帧错误、奇偶校验错误或断开错误时,相应的错误位会被置位,并存储在 FIFO 中。如果发生溢出情况,溢出寄存器位会立即被置位,同时 FIFO 数据将不会被覆盖。
您可以将 FIFO 配置为 1 字节深度,从而提供传统的双缓冲 UART 接口。
UART 支持以下调制解调器状态输入信号:
- 清除发送(CTS)
- 载波检测(DCD)
- 数据设置就绪(DSR)
- 振铃指示(RI)
UART 还支持输出调制解调器控制线:
- 请求发送(RTS)
- 数据终端就绪(DTR)
UART 具备可编程的硬件流控功能,通过 nUARTCTS 输入和 nUARTRTS 输出自动控制串行数据流。
下图显示了 UART 的框图。
18.3 操作¶
18.3.1 接口复位¶
UART 通过全局复位信号 PRESETn
和模块专用复位信号 nUARTRST
进行复位。外部复位控制器必须使用 PRESETn
异步地置位 nUARTRST
,并以 UARTCLK 为基准同步取消该复位。
PRESETn
必须拉低足够长的时间,以确保片上系统中最慢模块能被复位,然后再拉高。UART 要求 PRESETn
至少拉低一个 PCLK
周期。
复位后的寄存器值将在下一章节中详细说明。
18.3.2 时钟信号¶
选择的 UARTCLK 频率必须满足目标波特率范围的要求:
-
最小时钟频率:
FUARTCLK (min) >= 16 × 最大波特率
-
最大时钟频率:
FUARTCLK (max) <= 16 × 65535 × 最小波特率
例如,对于波特率范围 110 到 460800,UARTCLK 的频率应在 7.3728MHz 到 115MHz 之间。
UARTCLK 的频率还必须满足所有目标波特率的误差限制。
另外,对 PCLK
与 UARTCLK
的频率比也有限制:
FUARTCLK <= (5/3) × FPCLK
这样可以保证接收到的数据有足够时间写入接收 FIFO。
18.3.3 UART 操作¶
控制数据写入 UART 线路控制寄存器 UARTLCR_H
。该寄存器内部宽度为 29 位,通过 AMBA APB 总线进行 3 次写操作访问:
UARTLCR_H
:定义传输参数(字长、缓冲模式、停止位数量、奇偶校验、Break 生成)UARTIBRD
和UARTFBRD
:定义波特率除数
分数波特率除数器¶
波特率除数是一个 22 位数,由 16 位整数部分(通过 UARTIBRD
设置)和 6 位小数部分(通过 UARTFBRD
设置)组成。其关系如下:
Baud Rate Divisor = UARTCLK / (16 × Baud Rate) = BRDI + BRDF
其中BRDI
是整数部分,BRDF
是小数部分。
要计算 6 位小数(m):
m = integer(BRDF × 2⁶ + 0.5)
内部会生成一个名为 Baud16
的时钟使能信号,其平均频率为目标波特率的 16 倍,然后再除以 16 得到发送时钟。除数越小,位周期越短;除数越大,位周期越长。
数据收发¶
UART 具有两个各 16 字节的 FIFO,接收 FIFO 每个字符还多出 4 位状态信息。
发送:
数据写入发送 FIFO。当 UART 使能时,会根据 UARTLCR_H
设置开始传输帧数据。
只要 FIFO 中有数据,UART 将持续传输。BUSY
信号在 FIFO 非空时拉高,并保持拉高直到所有数据传输完成(包括停止位)。即使 UART 被禁用,BUSY
仍可能拉高。
接收:
每个数据样本会取三次采样,取多数值。
在接收空闲(UARTRXD 持续为 1)状态下,若检测到低电平(即起始位),将启动一个基于 Baud16
的计数器。
- 正常 UART 模式:第 8 个
Baud16
周期采样起始位 - SIR 模式:第 4 个周期采样起始位(为更短的逻辑 0 脉冲做准备)
若第 8 个周期仍为 LOW,则认为起始位有效,否则为假起始位并被忽略。
数据位将在之后每 16 个 Baud16
周期采样一次,按设置的数据长度进行接收。若启用了奇偶校验,则校验位随后被检查。
最后一个停止位应为 HIGH,否则说明发生了帧错误。接收到完整字符后,数据连同错误信息一同写入接收 FIFO。
错误位¶
- 位
[10:8]
:与每个字符相关联的错误位(帧错、奇偶错、断开) - 位
11
:溢出错误(Overrun)
溢出位说明:
该位不与接收 FIFO 中具体字符关联。当 FIFO 已满而移位寄存器中接收到下一个字符时,数据被覆盖但不写入 FIFO,此时溢出位被置位。 当 FIFO 有空位且接收到新数据时,溢出状态会写入 FIFO 并随后清除。
禁用 FIFO¶
可以选择禁用 FIFO,此时 UART 的收发仅保留一个 1 字节的保持寄存器(FIFO 最底部)。 如果接收数据未被读取而又收到新数据,则设置溢出位。实际中 FIFO 未被物理禁用,而是通过标志位模拟为 1 字节寄存器。 当禁用 FIFO 时,若发送移位寄存器空闲,则写入数据会绕过保持寄存器。
系统和诊断环回测试¶
可以通过将控制寄存器 UARTCR
的第 7 位 LBE(Loop Back Enable) 设为 1 来进行 UART 环回测试。
这时,发送的 UARTTXD
信号将直接返回到 UARTRXD
输入端。
18.3.4 UART 字符帧¶
18.4 UART 调制解调器操作¶
您可以使用 UART 支持数据终端设备(DTE)模式和数据通信设备(DCE)模式的操作。第 2-3 页的图示显示了 DTE 模式下的调制解调器信号。对于 DCE 模式,表 2-2 显示了信号的含义。
18.5 UART 硬件流控¶
硬件流控功能是完全可选的,并且可以通过使用 nUARTRTS 输出和 nUARTCTS 输入信号来控制串行数据流。下图展示了两个设备如何使用硬件流控进行通信。
当启用 RTS 流控时,nUARTRTS 信号在接收 FIFO 被填充至预设水位线之前一直保持有效。当启用 CTS 流控时,发送器仅在 nUARTCTS 信号为有效时才能传输数据。
硬件流控可通过 UART 控制寄存器(UARTCR)中的第 14 位(RTSEn)和第 15 位(CTSEn)进行选择。下表显示了如何设置这些位,以同时或分别启用 RTS 和 CTS 流控。
RTS 流控¶
RTS 流控逻辑与可编程的接收 FIFO 水位线相关联。当启用 RTS 流控时,nUARTRTS 信号在接收 FIFO 被填充至水位线之前一直保持有效。当接收 FIFO 达到水位线时,nUARTRTS 信号被去使能,表示没有更多空间来接收更多数据。数据传输应在当前字符传输完成后停止。
当接收 FIFO 中的数据被读取并使其低于水位线时,nUARTRTS 信号重新使能。如果 RTS 流控被禁用且 UART 仍处于启用状态,则数据将一直接收直到接收 FIFO 满,或者不再有数据传输到该 FIFO。
CTS 流控¶
如果启用了 CTS 流控,发送器在传输下一个字节之前会检查 nUARTCTS 信号。如果 nUARTCTS 信号为有效,则发送该字节;否则,不进行发送。
当 nUARTCTS 为有效且发送 FIFO 非空时,数据将持续传输。如果发送 FIFO 为空,且 nUARTCTS 为有效,则不传输任何数据。
如果 nUARTCTS 信号被去使能,且启用了 CTS 流控,则当前字符的传输将在完成后停止。如果 CTS 流控被禁用且 UART 被启用,则数据将持续传输,直到发送 FIFO 为空为止。
18.6 UART DMA 接口¶
UART 提供一个用于连接到 DMA 控制器的接口。UART 的 DMA 操作通过 UART DMA 控制寄存器(UARTDMACR)进行控制。DMA 接口包括以下信号:
接收方向¶
-
UARTRXDMASREQ
单字符 DMA 传输请求,由 UART 置位。对于接收,一个字符最多为 12 位。当接收 FIFO 中至少包含一个字符时,该信号被置位。
-
UARTRXDMABREQ
突发 DMA 传输请求,由 UART 置位。当接收 FIFO 中的数据量超过已编程的水位线时,该信号被置位。可以通过 UARTIFLS 寄存器为每个 FIFO 编程水位线。
-
UARTRXDMACLR
DMA 请求清除信号,由 DMA 控制器置位以清除接收请求信号。如果请求了 DMA 突发传输,则在突发传输的最后一个数据传输期间该清除信号被置位。
发送方向¶
-
UARTTXDMASREQ
单字符 DMA 传输请求,由 UART 置位。对于发送,一个字符最多为 8 位。当发送 FIFO 中至少有一个空位置时,该信号被置位。
-
UARTTXDMABREQ
突发 DMA 传输请求,由 UART 置位。当发送 FIFO 中的数据量少于水位线时,该信号被置位。可以通过 UARTIFLS 寄存器为每个 FIFO 编程水位线。
-
UARTTXDMACLR
DMA 请求清除信号,由 DMA 控制器置位以清除发送请求信号。如果请求了 DMA 突发传输,则在突发传输的最后一个数据传输期间该清除信号被置位。
突发传输请求和单传输请求信号不是互斥的,它们可以同时被置位。例如,当接收 FIFO 中的数据多于水位线时,会同时置位突发请求和单请求信号。当接收 FIFO 中剩余数据少于水位线时,仅置位单请求信号。这对于流中剩余字符少于突发传输长度的情况非常有用。
例如,若需要接收 19 个字符,且水位线设置为 4,则 DMA 控制器会传输 4 个 4 字符的突发传输和 3 个单字符传输来完成整个流。
每个请求信号在对应的 DMACLR 信号被置位之前保持有效。清除信号去使能后,请求信号可以根据上述条件再次有效。如果 UART 被禁用或 DMA 使能信号被清除,所有请求信号都会被去使能。
当 UART 处于 FIFO 禁用模式时,仅能使用 DMA 单字符传输模式,因为每次只能向 FIFO 中传输一个字符。此时,只有 UARTRXDMASREQ 和 UARTTXDMASREQ 请求信号可以被置位。
当 UART 处于 FIFO 启用模式时,数据传输可以根据编程水位线和 FIFO 中的数据量,通过单字符或突发传输完成。下表展示了根据水位线设定,发送和接收 FIFO 的 DMABREQ 触发点。
此外,DMA 控制寄存器中的 DMAONERR 位支持使用接收错误中断(UARTEINTR)。该位允许在 UART 错误中断 UARTEINTR 被置位时屏蔽接收 DMA 请求输出(UARTRXDMASREQ 或 UARTRXDMABREQ)。在 UARTEINTR 清除之前,DMA 接收请求输出保持无效状态。DMA 发送请求输出不受影响。
下图显示了单传输请求和突发传输请求与相应 DMA 清除信号的时序图。所有信号均同步于 PCLK。为清晰起见,假设 DMA 控制器中请求信号没有同步处理。
18.7 程序员模型¶
18.7.1 寄存器汇总¶
偏移地址 | 类型 | 位宽 | 复位值 | 名称 | 描述 |
---|---|---|---|---|---|
0x000 | RW | 12/8 | 0x--- | UARTDR | 数据寄存器 |
0x004 | RW | 4/0 | 0x0 | UARTRSR/UARTECR | 接收状态寄存器 / 错误清除寄存器 |
0x008–0x014 | - | - | - | 保留 | - |
0x018 | RO | 9 | 0b-10010--- | UARTFR | 标志寄存器 |
0x01C–0x020 | - | - | - | 保留 | - |
0x024 | RW | 16 | 0x0000 | UARTIBRD | 整数波特率寄存器 |
0x028 | RW | 6 | 0x00 | UARTFBRD | 小数波特率寄存器 |
0x02C | RW | 8 | 0x00 | UARTLCR_H | 线路控制寄存器 |
0x030 | RW | 16 | 0x0300 | UARTCR | 控制寄存器 |
0x034 | RW | 6 | 0x12 | UARTIFLS | 中断FIFO电平选择寄存器 |
0x038 | RW | 11 | 0x000 | UARTIMSC | 中断屏蔽设置/清除寄存器 |
0x03C | RO | 11 | 0x00- | UARTRIS | 原始中断状态寄存器 |
0x040 | RO | 11 | 0x00- | UARTMIS | 屏蔽中断状态寄存器 |
0x044 | WO | 11 | - | UARTICR | 中断清除寄存器 |
0x048 | RW | 3 | 0x00 | UARTDMACR | DMA控制寄存器 |
18.7.2 寄存器描述¶
18.7.2.1 数据寄存器 UARTDR¶
UARTDR 寄存器是数据寄存器。
用于发送数据时:
- 如果启用了 FIFO,写入该位置的数据将被压入发送 FIFO;
- 如果未启用 FIFO,数据将存储在发送保持寄存器中(即发送 FIFO 的最低位字)。
写操作将启动 UART 的传输。数据会加上起始位,添加适当的奇偶校验位(如果启用了奇偶校验),以及停止位。最终形成的字会被发送出去。
用于接收数据时:
- 如果启用了 FIFO,数据字节以及 4 位状态(中断、帧错误、奇偶校验错误和溢出)将被压入 12 位宽的接收 FIFO;
- 如果未启用 FIFO,数据字节及其状态将被存储在接收保持寄存器中(即接收 FIFO 的最低位字)。
通过读取 UARTDR 寄存器可读取接收的数据字节以及对应的状态信息。状态信息也可以通过读取 UARTRSR/UARTECR 寄存器获得(参见下一页表格)。
注意:
在重新编程任一控制寄存器之前,必须先禁用 UART。如果在传输或接收过程中禁用 UART,UART 会完成当前字符的传输后才会停止。
18.7.2.2 接收状态寄存器 / 错误清除寄存器 UARTRSR / UARTECR¶
UARTRSR/UARTECR 寄存器是接收状态寄存器 / 错误清除寄存器。
接收状态也可以通过读取 UARTRSR 来获取。如果从该寄存器读取状态,那么关于中断、帧错误和奇偶校验错误的信息对应的是在读取 UARTRSR 之前从 UARTDR 读取的数据字符。一旦发生溢出错误,相关状态立即被置位。
写入 UARTECR 将清除帧错误、奇偶校验错误、中断错误和溢出错误。复位时所有位都被清零。下面的表格显示了 UARTRSR/UARTECR 寄存器的位分配。
注意:
必须先从 UARTDR 读取接收到的数据字符,然后才能读取与该数据字符相关的错误状态(从 UARTRSR 读取)。这个读取顺序不能颠倒,因为状态寄存器 UARTRSR 只有在从 UARTDR 读取时才会更新状态。
不过,状态信息也可以直接从 UARTDR 寄存器中读取。
18.7.2.3 标志寄存器 UARTFR¶
UARTFR 寄存器是标志寄存器。
在复位之后:
- TXFF(发送 FIFO 满)、RXFF(接收 FIFO 满)和 BUSY(忙碌状态)为
0
; - TXFE(发送 FIFO 空)和 RXFE(接收 FIFO 空)为
1
。
下面的表格显示了 UARTFR 寄存器的位分配。
18.7.2.4 整数波特率寄存器 UARTIBRD¶
UARTIBRD 寄存器是波特率除数值的整数部分。复位时所有位清零。下面的表格显示了 UARTIBRD 寄存器的位分配。
18.7.2.5 小数波特率寄存器 UARTFBRD¶
UARTFBRD 寄存器是波特率除数值的小数部分。复位时所有位清零。下面的表格显示了 UARTFBRD 寄存器的位分配。
波特率除数的计算公式如下:
波特率除数 BAUDDIV = (FUARTCLK / {16 * 波特率})
其中 FUARTCLK 是 UART 参考时钟频率。
BAUDDIV 由整数值(BAUDDIVINT)和小数值(BAUDDIVFRAC)组成。
注意:
只有在当前字符的传输或接收完成后,UARTIBRD 和 UARTFBRD 寄存器的内容才会被更新。
最小的除法比率为 1,最大为 65535(即 2^16 - 1)。也就是说,UARTIBRD = 0 是无效的,且在这种情况下,UARTFBRD 被忽略。
类似地,当 UARTIBRD = 65535(即 0xFFFF)时,UARTFBRD 不能大于零。如果超出了此范围,则会导致传输或接收中止。
以下是如何计算除数值的示例:
假设所需的波特率是 230400,且 UARTCLK = 4MHz:
波特率除数 = (4 * 10^6) / (16 * 230400) = 1.085
因此,BRDI = 1,BRDF = 0.085,
因此,小数部分,m = 整数((0.085 * 64) + 0.5) = 5
生成的波特率除数 = 1 + 5/64 = 1.078
生成的波特率 = (4 * 10^6) / (16 * 1.078) = 231911
误差 = (231911 - 230400) / 230400 * 100 = 0.656%
使用 6 位 UARTFBRD 寄存器时的最大误差 = 1/64 * 100 = 1.56%。当 m = 1 时发生此情况,且误差在 64 个时钟周期内累积。
下面的表格显示了在 7.3728MHz 的 UART 时钟频率下,一些典型波特率及其对应的除数值。这些值不使用小数除数,因此 UARTFBRD 寄存器中的值为零。
下表显示了一些所需的波特率及其对应的整数和小数除数值,以及在 4MHz 时钟频率下生成的波特率。
18.7.2.6 线路控制寄存器 UARTLCR_H¶
UARTLCR_H 寄存器是线路控制寄存器。该寄存器访问 UART 波特率和线路控制寄存器 UARTLCR 的第 29 位到第 22 位。
复位时所有位清零。下表显示了 UARTLCR_H 寄存器的位分配。
UARTLCR_H、UARTIBRD 和 UARTFBRD 组成一个单一的 30 位宽寄存器(UARTLCR),该寄存器会在 UARTLCR_H 写操作时通过单次写脉冲更新。因此,为了内部更新 UARTIBRD 或 UARTFBRD 的内容,必须始终在最后执行 UARTLCR_H 写操作。
注意:
更新这三个寄存器有两种可能的顺序:
- UARTIBRD 写操作、UARTFBRD 写操作和 UARTLCR_H 写操作
- UARTFBRD 写操作、UARTIBRD 写操作和 UARTLCR_H 写操作
要仅更新 UARTIBRD 或 UARTFBRD: - UARTIBRD 写操作(或 UARTFBRD 写操作)和 UARTLCR_H 写操作。
下面是 UARTLCR_H 寄存器中 Stick Parity Select (SPS)、Even Parity Select (EPS) 和 Parity Enable (PEN) 位的真值表。
注意:
不能在以下情况下修改波特率和线路控制寄存器:
- 当 UART 被启用时;
- 在传输或接收完成后,如果已经编程使其禁用时。
在以下条件下,FIFO 的完整性无法得到保证: - 在 BRK 位被触发之后; - 如果软件在 FIFO 中有数据的情况下禁用 UART 进行传输,并且之后重新启用 UART。
18.7.2.7 控制寄存器 UARTCR¶
UARTCR 寄存器是控制寄存器。复位时,除了第 9 位和第 8 位被置为 1 外,所有位都被清零。下表显示了 UARTCR 寄存器的位分配。
注意:
要启用传输,必须同时设置 TXE(第 8 位)和 UARTEN(第 0 位)。同样,要启用接收,必须同时设置 RXE(第 9 位)和 UARTEN(第 0 位)。注意:
按以下步骤编程控制寄存器:
- 禁用 UART。
- 等待当前字符的传输或接收完成。
- 通过在线路控制寄存器(UARTLCR_H)中禁用第 4 位(FEN)来清空发送 FIFO。
- 重新编程控制寄存器。
- 启用 UART。
18.7.2.8 中断 FIFO 电平选择寄存器 UARTIFLS¶
UARTIFLS 寄存器是中断 FIFO 电平选择寄存器。您可以使用 UARTIFLS 寄存器来定义触发 UARTTXINTR 和 UARTRXINTR 的 FIFO 电平。
中断的产生是基于穿越某一电平的过渡,而不是基于该电平本身。也就是说,设计是这样的:当 FIFO 的填充电平通过触发电平时,才会生成中断。
这些位的重置值使得触发电平为 FIFO 填充到中间位置时。下面的表格显示了 UARTIFLS 寄存器的位分配。
18.7.2.9 中断屏蔽设置/清除寄存器 UARTIMSC¶
UARTIMSC 寄存器是中断屏蔽设置/清除寄存器。
它是一个可读/可写寄存器。读取时,此寄存器提供相关中断的当前屏蔽值。写入 1 到特定位时,将设置该中断的相应屏蔽。写入 0 将清除相应的屏蔽。
复位时,所有位都被清零。下面的表格显示了 UARTIMSC 寄存器的位分配。
18.7.2.10 原始中断状态寄存器 UARTRIS¶
UARTRIS 寄存器是原始中断状态寄存器。它是一个只读寄存器。读取时,该寄存器提供对应中断的当前原始状态值。写入操作无效。
注意:
除了调制解调器状态中断位(第 3 到第 0 位)外,所有位在复位时都会清零。调制解调器状态中断位在复位后是未定义的。
下面的表格显示了 UARTRIS 寄存器的位分配。
18.7.2.11 屏蔽中断状态寄存器 UARTMIS¶
UARTMIS 寄存器是屏蔽中断状态寄存器。它是一个只读寄存器。读取时,该寄存器提供对应中断的当前屏蔽状态值。写入操作无效。
复位时,除了调制解调器状态中断位(第 3 到第 0 位)外,所有位都会被清零。调制解调器状态中断位在复位后是未定义的。
下面的表格显示了 UARTMIS 寄存器的位分配(未提供原表格,建议参考原手册)。
18.7.2.12 中断清除寄存器 UARTICR¶
UARTICR 寄存器是中断清除寄存器,且为写入专用寄存器。写入 1 时,清除相应的中断。写入 0 无效。
下面的表格显示了 UARTICR 寄存器的位分配。
18.7.2.13 DMA 控制寄存器 UARTDMACR¶
UARTDMACR 寄存器是 DMA 控制寄存器。它是一个可读/可写寄存器。复位时,所有位都被清零。
下面的表格显示了 UARTDMACR 寄存器的位分配。
19. I2C 总线接口¶
19.1 I2C 介绍¶
I2C 接口是一个内部电路,用于与外部 I2C 接口进行通信,I2C 是一种行业标准的两线串行接口,用于连接外部硬件。
这两条串行线分别称为串行数据线(SDA)和串行时钟线(SCL)。I2C 模块提供了几种数据传输速率,标准模式下最高可达 100 kHz,快速模式下可达 400 kHz,以及快速模式加速(Fast Mode Plus)下最高可达 1 MHz。
I2C 模块还具有仲裁检测功能,防止多个主设备同时尝试向 I2C 总线发送数据的情况。此外,I2C 接口还提供了一个 CRC-8 校验器,用于对 I2C 数据进行数据包错误检查。
AG32 设备提供:
- 最多支持两个 I2C 总线接口,能够在主模式下支持最高 1 MHz 的频率(Fast Mode Plus)
- 提供仲裁功能,可选择生成和检查 PEC(数据包错误检查)
- 支持 7 位和 10 位寻址模式以及通用呼叫寻址模式
19.2 架构¶
I2C 核心是由四个主要模块构建的:时钟生成器、字节命令控制器、位命令控制器和数据 I/O 移位寄存器。所有其他模块用于接口或存储临时值。
时钟生成器¶
时钟生成器生成一个内部 4 * Fscl 时钟使能信号,用于触发位命令控制器中的所有同步元件。它还处理一些从设备所需的时钟延迟(Clock Stretching)。
字节命令控制器¶
字节命令控制器处理 I2C 传输中的字节级操作。它从命令寄存器获取数据,并根据单字节的传输定义序列。例如,通过设置命令寄存器中的 START、STOP 和 READ 位,字节命令控制器生成一个序列,产生 START 信号,从从设备读取一个字节,并生成 STOP 信号。它通过将每个字节操作分解为独立的位操作,然后将这些操作发送到位命令控制器。
位命令控制器¶
位命令控制器处理实际的数据传输,并通过控制 SCL 和 SDA 线生成 START、重复 START 和 STOP 信号的特定电平。字节命令控制器告知位命令控制器需要执行的操作。对于单字节读取,位命令控制器接收 8 个单独的读取命令。每个位操作被分为 5 个部分(空闲和 A、B、C、D),STOP 操作则分为 4 个部分(空闲和 A、B、C)。
数据 I/O 移位寄存器¶
数据 I/O 移位寄存器包含当前传输的相关数据。在读取操作期间,数据从 SDA 线移入。在读取一个字节后,内容会被复制到接收寄存器中。在写入操作期间,传输寄存器的内容被复制到数据 I/O 移位寄存器中,并随后传输到 SDA 线。
19.3 操作¶
19.3.1 系统配置¶
I2C 系统使用串行数据线(SDA)和串行时钟线(SCL)进行数据传输。所有连接到这两条信号线的设备必须具有开漏(Open Drain)或开集电极(Open Collector)输出。这两条线上的逻辑与运算是通过外部上拉电阻实现的。
数据在主设备(Master)和从设备(Slave)之间以字节为单位,按照与 SCL 同步的方式传输。每个数据字节为 8 位长。每传输一个数据位都会有一个 SCL 时钟脉冲,最高有效位(MSB)先被传输。每个传输的字节后跟随一个确认位(ACK)。每个位在 SCL 的高电平期间进行采样;因此,SDA 线只能在 SCL 的低电平期间发生变化,并且在 SCL 的高电平期间必须保持稳定。SDA 线在 SCL 高电平期间的过渡被解释为命令(如 START 和 STOP 信号)。
19.3.2 I2C 协议¶
通常,标准通信包括四个部分:
- START 信号生成
- 从设备地址传输
- 数据传输
- STOP 信号生成
START 信号¶
当总线空闲/处于空闲状态时,意味着没有主设备正在占用总线(SCL 和 SDA 线均为高电平),此时主设备可以通过发送 START 信号来启动传输。START 信号,通常称为 S-bit,定义为 SDA 从高电平到低电平的过渡,而 SCL 保持为高电平。START 信号表示新数据传输的开始。重复 START 信号是没有先生成 STOP 信号的 START 信号。主设备使用这种方法与另一个从设备或相同从设备在不同的传输方向(例如从写入设备到读取设备)进行通信,而无需释放总线。当命令寄存器中的 STA 位被设置,并且 RD 或 WR 位被设置时,核心会生成 START 信号。根据 SCL 线的当前状态,会生成 START 或重复 START 信号。
从设备地址传输¶
主设备在发送 START 信号后立即传输的第一个字节是从设备地址。这是一个七位的调用地址,后跟一个 RW 位。RW 位向从设备指示数据传输的方向。系统中的两个从设备不能具有相同的地址。只有地址与主设备发送的地址匹配的从设备,才会通过在第 9 个 SCL 时钟周期将 SDA 拉低来返回确认位。
注意:
核心支持通过生成两个地址传输来实现 10 位从设备地址。更多详细信息请参见 Philips I2C 规范。
核心将从设备地址传输视为任何其他写操作。将从设备的地址存储到传输寄存器中,并设置 WR 位。然后,核心将在总线上传输从设备地址。
数据传输¶
一旦成功完成从设备寻址,数据传输就可以按照主设备发送的 RW 位指定的方向以字节为单位进行传输。每个传输的字节后面会跟随第 9 个 SCL 时钟周期的确认位。如果从设备信号为无确认(No Acknowledge),主设备可以生成 STOP 信号来中止数据传输,或者生成重复 START 信号并开始新的传输周期。
如果主设备作为接收设备没有确认从设备,从设备会释放 SDA 线,供主设备生成 STOP 或重复 START 信号。
要写入数据到从设备,将要传输的数据存储到传输寄存器,并设置 WR 位。要从从设备读取数据,设置 RD 位。在传输期间,核心会设置 TIP 标志,表示传输正在进行。当传输完成时,TIP 标志被重置,IF 标志被设置,并且在启用时生成中断。当 IF 标志被设置后,接收寄存器中包含有效数据。用户可以在 TIP 标志重置后发出新的写入或读取命令。
STOP 信号¶
主设备可以通过生成 STOP 信号来终止通信。STOP 信号,通常称为 P-bit,定义为 SDA 从低电平到高电平的过渡,而 SCL 处于逻辑“1”状态。
19.3.3 仲裁过程¶
时钟同步¶
I2C 总线是一个真正的多主机总线,允许多个主设备连接到总线上。如果两个或更多主设备同时尝试控制总线,时钟同步过程将决定总线时钟。由于 I2C 信号的连线与操作(wired-AND)特性,SCL 线的高电平到低电平的过渡会影响连接到总线的所有设备。因此,SCL 线上的高到低过渡会使所有相关设备开始计数它们的低电平周期。一旦设备的时钟进入低电平,它将保持 SCL 线处于低电平状态,直到时钟高电平到达。由于连线与操作的特性,SCL 线将由具有最长低电平周期的设备保持在低电平,由具有最短高电平周期的设备保持在高电平。
时钟拉伸¶
从设备可以利用时钟同步机制来降低传输比特率。在主设备将 SCL 拉低后,从设备可以将 SCL 拉低所需的时间,然后释放它。如果从设备的 SCL 低电平周期大于主设备的 SCL 低电平周期,则结果 SCL 总线信号的低电平周期会被拉伸,从而插入等待状态。
19.4 寄存器¶
19.4.1 寄存器列表¶
19.4.2 寄存器描述¶
预分频寄存器¶
此寄存器用于预分频 SCL 时钟线。由于 I2C 接口的结构,核心内部使用的是 5SCL 时钟。预分频寄存器必须编程为 5SCL 频率(减去 1)。仅在‘EN’位被清除时才可更改预分频寄存器的值。
控制寄存器¶
核心仅在‘EN’位被设置时响应新的命令。挂起的命令会被完成。只有在没有传输正在进行时(即,在 STOP 命令后,或者当命令寄存器的 STO 位被设置时),才能清除‘EN’位。当在传输过程中暂停时,核心可能会挂起 I2C 总线。
传输寄存器¶
接收寄存器¶
命令寄存器¶
STA、STO、RD、WR 和 IACK 位会被自动清除。这些位始终被读取为零。
状态寄存器¶
请注意,所有保留位读取为零。为了确保向前兼容性,这些位应该写为零。
20 控制器局域网络 (CAN)¶
20.1 概述¶
AG32 设备提供:
- 一个 CAN2.0B 接口,通信频率最高可达 1 Mbit/s
- 内部主 PLL 用于 CAN CLK 符合性
控制器局域网络(CAN)是一种用于现场总线的串行通信方法。CAN 协议已广泛应用于工业自动化和汽车应用中。它可以接收和传输具有 11 位标识符的标准帧,以及具有 29 位标识符的扩展帧。CAN 具有三个用于传输的邮箱和两个深度为三条消息的 FIFO 用于接收。它还提供 14 个可扩展/可配置的标识符过滤器组,用于选择所需的传入消息并丢弃其他消息。
AG32 支持 Inventra™ MCAN2 标准。
MCAN2 有两种主要的操作模式:操作模式和复位模式。在操作模式下,数据可以传输和接收;在复位模式下,可以设置总线时序参数和消息接收过滤器。复位模式还允许更改接收和传输错误计数器以及错误警告限制。
复位模式可以通过执行硬件复位或通过在模式寄存器(MOD.0)中将复位模式位设置为“1”来选择。通过清除 MOD.0 位,MCAN2 会返回操作模式。
MCAN2 还支持监听模式和自测试模式,可以通过模式寄存器在操作模式或复位模式下进行选择。
在监听模式下,MCAN2 只能接收数据,无法进行传输。MCAN2 甚至不会传输任何已成功接收数据的确认信号。它也被强制设置为“错误被动”状态。
在自测试模式下,MCAN2 使用 MCAN2 的自接收功能发送和接收消息,而不需要任何远程节点的确认。
该设备还提供时钟输出模式,仅在复位模式下可选择,在此模式下,TX1 用于输出传输时钟,而不是传输数据的第二个副本。
20.2 操作¶
20.2.1 配置¶
MCAN2 的操作配置在其复位模式下设置。它会在硬件复位(NRST 拉低)后立即进入复位模式,也可以通过在模式寄存器(MOD.0)中将复位模式位设置为 1(软件复位)来进入复位模式。
这两种事件后的寄存器设置详细信息会在本文档末尾的附录中给出。
在复位模式下,您可能希望设置 MCAN2 操作的以下方面:
- 应用的总线时序参数(这些选择 CAN 总线上使用的波特率)
- 应应用于接收消息的接收过滤器
- 所需的中断
- 所需的错误警告限制
- 所需的输出模式 - 在 TX1 上是传输比特流的副本,还是传输时钟
- CLKOUT 信号与输入时钟的关系
20.2.2 总线时序参数¶
总线时序参数配置 MCAN2 以适应 CAN 总线上使用的比特率,并设置在每个比特周期内接收的比特流将被采样的点。它们还指定了 MCAN2 可以在多大程度上通过重新同步到比特流来补偿其他节点生成的比特率变化。
为了应对其他节点生成的比特率变化以及总线和 CAN 节点内部的物理延迟时间,比特周期被视为由同步段、传播段和两个相位缓冲区组成。同步段表示比特周期中期望比特边缘到达的部分。传播段表示允许补偿物理延迟时间的比特时间部分。两个相位缓冲区围绕采样点,并在必要时缩短或延长,以便在比特边缘到达同步段外部时重新同步到传入的比特流。
每个这些段的长度定义为“时间量化”(TQ)的数量。同步段始终为 1 TQ,传播段可以是 1 – 8 TQ,两个相位缓冲区可以是 1 – 8 TQ。相位缓冲区可以被延长或缩短的最大量也被定义为同步跳跃宽度。同步跳跃宽度的限制为 1 – 4 TQ,并且不能比两个相位缓冲区中的任何一个更长。
MCAN2 使用的时序参数通过两个总线时序寄存器进行选择:BTR0 和 BTR1。
BTR0 定义了使用的时间量化,以 XTAL1 输入时钟周期为单位,以及同步跳跃宽度(以时间量化为单位)。支持的时间量化范围为 XTAL1 时钟周期的 2 倍到 XTAL1 时钟周期的 128 倍。
BTR1 定义了两个时间段 TSEG1 和 TSEG2 的时间量化长度,以及每个比特周期的采样次数(1 或 3)(对于高速(C 类)总线建议使用 1,对于低/中速(A 或 B 类)总线建议使用 3)。TSEG1 表示同步段与采样点之间的时间(即传播段加第一个相位缓冲区)。TSEG2 表示采样点与比特周期结束之间的时间(即第二个相位缓冲区)。
比特周期的一般结构¶
TSEG1 可以长达 1 到 16 TQ,而 TSEG2 可以长达 1 到 8 TQ。理论上,比特周期的长度可以在 3 到 25 TQ 之间定义。然而,在实际应用中,它们需要在 8 到 25 TQ 范围内,这一范围由博世标准选定。
20.2.3 接受过滤器¶
在 CAN 网络中,所有节点都会接收到总线上传输的所有消息。 为了让节点忽略与其无关的消息,MCAN2 提供了一个 4 字节的接受过滤器,可用于仅选择具有适当标识符的消息。 任何未通过此过滤器的消息都可以被丢弃,因为它不适用于接收的 CAN 节点。
通常,消息过滤是基于整个标识符的,标识符可以是 11 位或 29 位,具体取决于接收的消息是标准帧格式还是扩展帧格式。然而,在 MCAN2 中,使用可选的掩码寄存器允许接收一组标识符并将其放入接收 FIFO,通过将特定的标识符位设置为“无关”来实现。
过滤器可以作为一个单一的 4 字节过滤器或两个较短的过滤器应用。通过模式寄存器(Mode register,bit 3)的 AFM 位进行选择。如果 AFM = ‘1’,则应用一个过滤器;如果 AFM = ‘0’,则应用两个过滤器。使用两个过滤器时,如果传入的消息标识符匹配任一过滤器,则接受该消息。
应用的过滤器由一组接受代码寄存器(ACR0 – 3)定义,并与相应的接受掩码寄存器(AMR0 – 3)配合使用(参见第 10.1 和 10.2 节)。与消息标识符匹配的比特模式记录在 ACR 寄存器中,并由 AMR 寄存器中记录的值进行掩码处理。AMR0 – 3 中的‘0’标识必须与消息标识符中相应位置的 ACR0 – 3 位匹配的比特,‘1’标识相应的位为“无关”。这两组寄存器在硬件复位后会被设置为零(即仅接受标识符为零的消息),但在软件复位时保持不变。
ACR0 – 3 定义的比特模式如何应用,还取决于传入的消息是标准帧格式(SFF)还是扩展帧格式(EFF)。
20.2.4 中断¶
MCAN2 支持为以下任一条件生成中断:
- 在 MCAN2 处于睡眠模式时的总线活动(唤醒中断)
- 接收到消息(接收中断)
- 当前传输完成(传输中断)
- 由于 FIFO 满导致接收数据丢失(数据溢出中断)
- 在 CAN 总线上失去仲裁*(仲裁丧失中断)
- CAN 总线上的错误*(总线错误中断)
- MCAN2 从“错误被动”状态恢复(错误被动中断)
- 错误数量超过错误警告限制或导致设备进入总线关闭状态(错误警告中断)
在硬件复位后,这些中断被禁用。因此,用户需要在中断使能寄存器中启用所需的中断。已启用的中断选择不受软件复位的影响。
20.2.5 错误警告限制¶
错误警告限制(EWL)表示在接收或传输中发生错误的次数,超过此值时应生成警告。当传输错误计数器或接收错误计数器超过此值时,状态寄存器(SR.6)中的错误状态位会被设置,并生成错误警告中断(如果已启用)。
EWL 的值记录在错误警告限制寄存器中(见第 10.9 节)。硬件复位后选择的值为 96,当达到该值时,表示总线严重失效。
当前设置在软件复位时保持不变。
20.2.6 输出模式¶
MCAN2 支持两种可能的输出驱动配置:“常规输出”和“时钟输出”。
注意:
SJA1000 通过此寄存器提供的附加驱动配置不被 MCAN2 支持。
在常规输出模式下,比特序列(TXD)发送到 TX0,并且其反向副本发送到 TX1。在时钟输出模式下,比特序列如同常规输出模式一样输出到 TX0,但发送到 TX1 的数据流被传输时钟(TXCLK)的副本替代,TXCLK 的上升沿标志着比特周期的开始。
硬件复位后,常规输出模式会被自动选择。如果需要时钟输出模式,可以通过输出控制寄存器进行选择。
所选择的模式在软件复位时保持不变。
20.2.7 CLKOUT 信号¶
CLKOUT 信号来自 XTAL1 输入时钟。 CLKOUT 信号与 XTAL1 时钟之间的关系由时钟分频寄存器(Clock Divider Register)定义。此寄存器的最低三位指定 XTAL1 时钟的分频因子,范围为 2 到 14,而寄存器的第 3 位根据需要启用或禁用 CLKOUT 信号。
在硬件复位后,时钟分频寄存器被设置为启用 CLKOUT 信号,并将其设置为 XTAL1 时钟除以 2。当前设置在软件复位时保持不变。
20.2.8 示例配置步骤¶
20.3 中断处理¶
当 CPU 被中断(NINT 变为低电平)时,需要读取中断寄存器以确定哪个事件导致了中断。
可能的中断类型(按中断寄存器中的顺序)如下:
- 接收中断(IR.0 设置)
- 传输中断(IR.1 设置)
- 错误警告中断(IR.2 设置)
- 数据溢出中断(IR.3 设置)
- 唤醒中断(IR.4 设置)
- 错误被动中断(IR.5 设置)
- 仲裁丧失中断(IR.6 设置)
- 总线错误中断(IR.7 设置)
以下各节描述了针对每种类型的中断应采取的操作。
20.3.1 接收中断¶
接收中断的生成表示接收 FIFO 中有消息可以读取。
该消息通过一个 13 字节的窗口读取到接收 FIFO,这个窗口称为接收缓冲区(Receive Buffer),它位于 CAN 地址 10h – 1Ch 之间。
一旦当前可以通过接收缓冲区访问的消息被读取,CPU 需要通过发出释放接收缓冲区命令(CMR.2 = ‘1’)来释放它当前在 FIFO 上的窗口。然后,RX FIFO 读取指针(以及接收缓冲区起始地址)会移动到接收 FIFO 中下一个消息开始的位置。
如果在该位置有未读消息,它会立即通过接收缓冲区可供读取。如果没有消息可用,接收中断(IR.0)和接收缓冲区状态(SR.0)位将被清除。
20.3.2 传输中断¶
传输中断的生成表示传输缓冲区已准备好接收另一个待传输的消息。对此中断的响应仅取决于是否还有数据需要发送。如果有数据需要发送,则需要重复第 4 节中概述的传输过程。如果没有数据,则可以忽略该中断。
20.3.3 错误警告中断¶
错误警告中断的生成表示传输错误计数或接收错误计数已超过记录在错误警告限制寄存器中的 EWL 值,或者 MCAN2 已进入总线关闭(Bus Off)状态,因为传输错误次数已超过 255。
接收错误计数记录在 RXERR 寄存器中,传输错误计数记录在 TXERR 寄存器中。
如果 MCAN2 已进入总线关闭状态,总线状态位(SR.7)将被设置为“1”(Bus Off)。此外,复位模式位(MOD.0)将被设置,触发软件复位并将 MCAN2 置于复位模式,直到主机 CPU 清除模式寄存器(MOD.0)中的复位模式位,MCAN2 才会退出复位模式。
此外,在恢复到操作模式时,MCAN2 将等待 128 次总线空闲序列的 11 个连续的 recessive 位(这是 CAN 协议定义的最小时间),然后才能再次变为“Bus On”。
注意:
在此期间,可以通过读取 TXERR 寄存器监控向 Bus On 过渡的进度。离开复位模式时,它最初设置为 127。然后,它会倒计时经过所需数量的总线空闲序列,直到达到零,此时设备可以再次变为 Bus On。
如果中断是由于超过 EWL 值而生成的,那么在生成此中断后,程序员可以根据需要决定采取的操作。
20.3.4 数据溢出中断¶
仅当接收消息所需的存储空间大于接收 FIFO 中的空闲字节数时,才会生成数据溢出中断。数据溢出状态位(SR.1)也将被设置。
所需的存储空间由接收消息的 RTR、FF 和 DLC 位确定,这些位分别定义了消息是否为远程传输请求(Remote Transmission Request),是否为标准帧格式或扩展帧格式消息,以及消息中包含的字节数。
在接收到消息后,系统会评估所需的空间。如果没有足够的空间存储消息,消息将被丢失。
当消息丢失时的恢复操作将取决于系统设计。然而,经历大量数据溢出事件通常表明数据流量的量估计不足,系统可能会从增加接收消息的内存缓冲区中受益。
20.3.5 唤醒中断¶
当 MCAN2 从睡眠模式(Sleep Mode)唤醒时,会生成唤醒中断。
以下任何事件都会导致 MCAN2 从睡眠模式唤醒:
- 清除睡眠模式位(MOD.4)
- NINT_IN 变为低电平
- CAN 总线输入(RX0)有活动
CPU 需要识别设备唤醒的原因,例如,首先读取模式寄存器,然后测试 NINT_IN 的电平。
20.3.6 错误被动中断¶
接收错误(RXERR)和传输错误(TXERR)计数器分别在每次发生接收错误或传输错误时自动递增 1,并在每次成功接收或传输时递减 1。
如果接收或传输错误的累积总数超过 127,MCAN2 将进入一种状态,在这种状态下,错误继续计数,但不再生成单独的中断。这种状态被描述为“错误被动”(Error Passive),并生成错误被动中断(如果启用),以指示进入错误被动状态。
只要接收或传输错误计数超过 127,MCAN2 将保持在错误被动状态。传输错误计数会继续递增和递减,只要它保持在 127 以上。接收错误计数,然而,在每次成功接收消息时,会自动减少到 119 到 127 之间的某个值,这可能会将 MCAN2 从错误被动状态中带出。
20.3.7 仲裁丧失中断¶
仲裁丧失中断的生成表示 MCAN2 在传输消息的过程中丧失了对 CAN 总线的控制。
通常,不需要采取任何特殊的操作,因为 MCAN2 会自动尝试重新传输当前的消息。然而,如果选择了单次传输(One-Shot Transmission)选项,则丧失仲裁可能会显得尤为重要。
仲裁丧失的位位置将记录在仲裁丧失捕获寄存器(Arbitration Lost Capture,ALC)中。有关如何记录此位位置的详细信息,请参见相关文档。
20.3.8 总线错误中断¶
总线错误中断的生成表示 CAN 总线上发生了传输错误。
通常,不需要采取任何特殊的操作,因为 MCAN2 会自动丢弃任何发生总线错误的接收消息,并且会自动尝试重新发送发生总线错误的传输消息。然而,如果需要有关总线错误的附加信息,可以在错误代码捕获寄存器(Error Code Capture Register,见第 10.8 节)中捕获每个错误的类型(比特错误/格式错误/填充错误/其他错误)及其发生位置,这些信息会保留直到该寄存器被读取。
然而,如果遇到大量此类错误,可能表明需要采取纠正措施,因此 MCAN2 维护了两个错误计数器 —— 一个用于接收错误(RXERR),一个用于传输错误(TXERR)。每当发生错误时,这两个计数器会自动递增。如果任一计数器超过错误警告限制寄存器中记录的值,则会生成错误警告中断(如果启用)。如果任一计数器超过 127,则会生成错误被动中断(如果启用)。如果传输错误计数超过 255,导致 MCAN2 进入总线关闭状态(Bus Off),也会生成错误警告中断。
20.4 睡眠模式(Sleep Mode)¶
当总线处于空闲状态且没有挂起的中断时,可以通过将 MCAN2 置于睡眠模式以关闭 XTAL1_IN,从而节省功耗。该模式可通过将模式寄存器(Mode Register)中的睡眠模式位(MOD.4)设置为 ‘1’ 来启用。
以下任一事件将导致 MCAN2 从睡眠模式“唤醒”:
- 将睡眠模式位设置为 ‘0’
- CAN 总线输入(RX0)上出现活动
- NINT_IN 变为低电平
唤醒后,MCAN2 会生成一个唤醒中断(Wake-Up Interrupt)。
注意:
如果 MCAN2 是因总线活动而唤醒的,在它检测到总线上 11 个连续 recessive 位的“总线空闲序列”(Bus-Free Sequence)之前,不能接收任何消息。
还需注意,在 MCAN2 处于复位模式时,无法选择睡眠模式。
20.5 寄存器描述¶
MCAN2 使用的寄存器如下所示,关于各个寄存器的详细信息将在后续章节中给出(参考表格中的引用)。
注意:
根据 MCAN2 是否处于操作模式(Operating Mode)或复位模式(Reset Mode),不同的读/写权限适用。
20.5.1 接受代码寄存器(ACR0 – ACR3):地址 10h – 13h¶
这些 8 位寄存器记录了接受过滤器在配合 AMR0 – AMR3 提供的掩码时使用的比特模式,用于过滤接收到的数据。
这些比特模式的应用方式取决于是否使用单个过滤器或双重过滤器,以及数据是标准帧格式(SFF)还是扩展帧格式(EFF)。
这些寄存器只能在复位模式下访问。
20.5.2 接受掩码寄存器(AMR0 – AMR3):地址 14h – 17h¶
这些 8 位寄存器记录了接受过滤器在过滤接收数据时应用的掩码模式。
寄存器中的‘0’表示输入数据字节中需要与相应接受代码寄存器中的比特值匹配的比特。‘1’表示将相应的比特标记为“无关”(don’t care)。
这些掩码所选择的输入数据位,取决于是否使用单个过滤器或双重过滤器,以及数据是标准帧格式(SFF)还是扩展帧格式(EFF)。
这些寄存器只能在复位模式下访问。
20.5.3 仲裁丧失捕获寄存器(ALC):地址 0Bh¶
这是一个只读寄存器,用于记录仲裁丧失发生时的比特位置。
当总线仲裁丧失时,会生成仲裁丧失中断(如果启用),并且当前比特处理器的位置会被捕获到该仲裁丧失捕获寄存器中。该寄存器的内容会一直保持,直到该寄存器被用户的软件读取。然后,捕获机制将重新激活。
20.5.4 总线时序寄存器 0(BTR0):地址 06h¶
总线时序寄存器 0 定义了同步跳跃宽度(SJW)和波特率预分频器(BRP)的值。
同步跳跃宽度(SJW):BTR0[7:6]
同步跳跃宽度定义了一个比特周期可以缩短或延长的最大时间量子数,用于尝试在当前传输的相关信号边缘(从 recessive 到 dominant)重新同步。
波特率预分频器(BRP):BTR0[5:0]
波特率预分频器定义了 CAN 时钟的“时间量子”TQ,作为 XTAL1 输入时钟周期的倍数。CAN 时钟的时间量子由以下公式给出:
TQ = 2 x tclk x (32 x BRP.5 + 16 x BRP.4 + 8 x BRP.3 + 4 x BRP.2 + 2 x BRP.1 + BRP.0 + 1)
其中 tclk = XTAL1 频率的时间周期 = 1 / fxtal1
20.5.5 总线时序寄存器 1(BTR1):地址 07h¶
总线时序寄存器 1 定义了比特周期的长度、采样点的位置以及每个采样点要采集的样本数量。
采样(SAM):BTR1.7
TSEG1 和 TSEG2:BTR1[3:0],BTR1[6:4]
TSEG1 和 TSEG2 通过给出采样点之前和之后的时间量子数,定义了比特周期的长度。在 TSEG1 和 TSEG2 的定义中,图示中的参数 tsyncseg、ttseg1 和 ttseg2 如下:
- tsyncseg = 1 x TQ
- ttseg1 = TQ x (8 x TSEG1.3 + 4 x TSEG1.2 + 2 x TSEG1.1 + TSEG1.0 + 1)
- ttseg2 = TQ x (4 x TSEG2.2 + 2 x TSEG2.1 + TSEG2.0 + 1)
20.5.6 时钟分频寄存器(CDR):地址 1Fh¶
时钟分频寄存器控制 CLKOUT 信号。硬件复位后的寄存器默认状态为 11000000(分频为 2,并启用 CLKOUT 信号)。软件复位不会更改此寄存器的值。
CDR[2:0]
CD.2 到 CD.0 位定义了外部 CLKOUT 引脚的频率,如下表所示(fosc 是外部振荡器(XTAL1)的频率)。这些位可以从复位模式或操作模式下访问。
CLOCKOFF(CDR.3)
设置此位可禁用外部 CLKOUT 信号。
20.5.7 命令寄存器(CMR):地址 01h¶
在命令寄存器中设置一个或多个位会启动 CAN 控制器传输层中的某个操作。
注意:
此寄存器为只写寄存器。当读取时,所有位返回‘0’。您还需要注意,在连续的命令之间必须至少有一个外部时钟周期。
20.5.8 错误代码捕获寄存器(ECC):地址 0Ch¶
这是一个只读寄存器,可用于获取有关总线错误类型和位置的详细信息。
当发生总线错误时,会生成总线错误中断(如果启用),并且当前比特处理器的位置会被捕获到此错误代码捕获寄存器中。该寄存器的内容会一直保持,直到用户的软件读取该寄存器。然后,捕获机制会重新激活。
20.5.9 错误警告限制寄存器(EWLR):地址 0Dh¶
此寄存器定义了在发生多少次错误后应生成错误警告中断(如果启用)。
该寄存器在操作模式下为只读,但在复位模式下可以写入。您需要注意,复位模式下所做的更改只有在返回操作模式后才会生效。
该寄存器的默认值(硬件复位后)为 0110000(即 96)。该错误计数值表明总线可能受到严重干扰,应调查其原因。
20.5.10 中断寄存器(IR):地址 03h¶
中断寄存器用于识别中断的来源。当此寄存器中的一个或多个位被设置时,MCAN2 会向 CPU 发送中断。如何处理不同的中断取决于具体的实现。
注意:
中断寄存器为只读寄存器。在 CPU 读取寄存器后,除接收中断位外,所有位将被重置。
20.5.11 中断使能寄存器(IER):地址 04h¶
这是一个读/写寄存器,用于选择通过生成中断通知 CPU 的事件。
20.5.12 模式寄存器(MOD):地址 00h¶
这是一个读/写寄存器,用于设置 CAN 控制器的行为。
20.5.13 输出控制寄存器(OCR):地址 08h¶
输出控制寄存器允许选择两种可能的输出驱动配置:‘常规输出’和‘时钟输出’。
在常规输出模式下,比特序列(TXD)发送到 TX0,反向副本发送到 TX1。
在时钟输出模式下,比特序列如同常规输出模式一样输出到 TX0,但 TX1 上的数据流被传输时钟(TXCLK)的副本替代,TXCLK 的上升沿标志着比特周期的开始。该时钟的脉冲宽度为一个时间量子(TQ)。
注意:
SJA1000 通过此寄存器提供的附加驱动配置不被 MCAN2 支持。
OCMODE 位的解释
注意:
输出控制寄存器仅在复位模式下可写。在操作模式下,此寄存器为只读。读取时,保留位返回‘0’。
20.5.14 接收缓冲区(10h – 1Ch)¶
接收缓冲区提供了一个窗口,CPU 通过这个窗口访问接收 FIFO。与传输缓冲区类似,接收缓冲区的长度为 13 字节(足以容纳一个最多包含八个数据字节的接收消息)。
在操作模式下,使用 CAN 地址 10h – 1Ch 提供对接收缓冲区的只读访问。
接收缓冲区的布局类似于前面章节中描述的传输缓冲区。实际上,所使用的配置是专门选择的,以便与传输缓冲区的布局兼容。同样,区分标准帧格式(SFF)消息和扩展帧格式(EFF)消息是非常重要的。
接收缓冲区布局
接收缓冲区被细分为描述符字段和数据字段。描述符字段的第一个字节包含帧信息。它描述了帧格式(SFF 或 EFF),指定是远程帧还是数据帧,并给出数据长度。接下来是 SFF 消息的两个标识符字节或 EFF 消息的四个字节。数据字段包含最多八个数据字节。
20.5.15 接收缓冲区起始地址(RBSA):地址 1Eh¶
接收缓冲区起始地址寄存器记录了当前 RX FIFO 读取指针在 64 字节接收 FIFO 中的位置,范围为 0 到 63。位置 0 映射到 CAN 地址 20h;位置 63 映射到 CAN 地址 5Fh。
此寄存器在硬件复位时会重置为 00h,但在软件复位时不会更改(软件复位也不会更改 FIFO 内容)。然而,软件复位会将 RX FIFO 写入指针设置为 RX FIFO 读取指针的值,结果是软件复位后接收缓冲区当前访问的数据将被接收 FIFO 中的下一个消息覆盖。
注意:
只有在复位模式下才能写入此寄存器。
20.5.16 接收错误计数器寄存器(RXERR):地址 0Eh¶
接收错误计数器寄存器记录了接收错误计数器的当前值。该计数器在接收到的比特流发生错误时递增,在无错误接收消息时递减,遵循 CAN 2.0 规范中的规则。
与相关的传输错误计数器(见第 10.20 节)一起,它提供了 CAN 总线上传输质量的指示。
下表概述了计数器递增和递减的规则。有关详细信息,请参考 CAN 2.0 规范。
计数器的两个级别会触发特定事件:
- 当计数器达到错误警告限制寄存器中设置的级别(见第 10.9 节)时,会生成错误警告中断(如果启用),除非此事件已由传输错误计数器触发。
- 当计数器超过 127 时,根据 CAN 2.0 规范,设备会进入错误被动状态(除非已由传输错误计数器触发),并且会发送一个活动错误。还会生成错误被动中断(如果启用)。
在硬件复位或发生总线关闭事件时(见传输错误计数器——见第 10.20 节),计数器会自动设置为‘0’。
该寄存器在操作模式下为只读,但在复位模式下可以写入。您需要注意的是,当 MCAN2 处于总线关闭状态时,写入此寄存器不会产生任何效果,而且在复位模式下所做的任何更改无论如何只有在返回操作模式后才会生效。
20.5.17 接收消息计数器(RMC):地址 1Dh¶
接收消息计数器寄存器记录当前在接收 FIFO 中可用的消息数量。每发生一次接收事件,计数器自动递增;每执行一次释放接收缓冲区命令时,计数器会递减。在操作模式和复位模式下,都可以对该寄存器进行只读访问。
该寄存器在硬件复位或软件复位时会重置为 00h。
20.5.18 状态寄存器(SR):地址 02h¶
这是一个只读寄存器,用于反映 MCAN2 控制器的状态。
20.5.19 传输缓冲区(写:10h – 1Ch;读:60h – 6Ch)¶
传输缓冲区的长度为 13 字节。它容纳一个最多包含八个数据字节的传输消息。
在操作模式下,对传输缓冲区的访问是只写的,使用 CAN 地址 10h – 1Ch 提供。
传输缓冲区的整体布局如下所示。区分标准帧格式(SFF)消息和扩展帧格式(EFF)消息非常重要。
注意:
可以使用 CAN 地址 60h – 6Ch 对传输缓冲区进行读取访问。
传输缓冲区布局
传输缓冲区被细分为描述符字段和数据字段。描述符字段的第一个字节包含帧信息。它描述了帧格式(SFF 或 EFF),指定远程帧或数据帧,并给出数据长度。接下来是 SFF 消息的两个标识符字节或 EFF 消息的四个字节。数据字段包含最多八个数据字节。
20.5.20 传输错误计数器寄存器(TXERR):地址 0Fh¶
传输错误计数器寄存器记录传输错误计数器的当前值。当发生传输错误时,计数器会递增;当消息在没有错误的情况下传输时,计数器会递减,遵循 CAN 2.0 规范中的规则。
与相关的接收错误计数器(见第 10.16 节)一起,它提供了 CAN 总线上传输质量的指示。
计数器递增和递减的规则在第 10.16 节的表格中概述。有关详细信息,请参考 CAN 2.0 规范。
计数器的三个级别会触发特定事件:
- 当计数器达到错误警告限制寄存器中设置的级别(见第 10.9 节)时,会生成错误警告中断(如果启用),除非此事件已由接收错误计数器触发。
- 当计数器超过 127 时,设备会进入错误被动状态,符合 CAN 2.0 规范(除非已由接收错误计数器触发),并发送一个活动错误。还会生成错误被动中断(如果启用)。
- 当计数器超过 255 时,设备会根据 CAN 2.0 规范进入总线关闭(Bus Off)状态,并自动进入复位模式(除非在启动期间只有一个节点在 CAN 总线上)。还会生成错误警告中断(如果启用)。
在硬件复位后,传输错误计数器会自动设置为‘0’。
在发生‘总线关闭’事件后,寄存器会初始化为 127,以便在 MCAN2 可以继续在 CAN 总线上进行传输之前计数最小的协议定义时间(128 次‘总线空闲’序列,其中包含 11 个连续的 recessive 位)。在此期间读取传输错误计数器将提供总线关闭恢复的状态。
注意:
如果在总线关闭恢复完成之前重新进入复位模式(TXERR > 0),总线关闭状态将保持活动状态,并且 TXERR 将被冻结,直到 MCAN2 被带回操作模式。
可以写入此寄存器,但仅在复位模式下可写。在操作模式下,该寄存器对 CPU 仅作为只读内存。
在总线关闭状态下,将值从 0 到 254 写入 TXERR 会清除总线关闭标志。然后,MCAN2 将在复位模式被清除后等待一个总线空闲序列。
在复位模式下写入 255 到 TXERR 会启动一个由 CPU 驱动的总线关闭事件。直到 MCAN2 被带回操作模式时,不会发生任何错误或总线状态变化,此时将执行一个总线关闭事件,正如它是由总线错误强制触发的一样。这意味着将再次进入复位模式,传输错误计数器将初始化为 127,接收计数器会被清除,并且相关的状态和中断寄存器位将被设置。现在清除复位模式将执行协议定义的总线关闭恢复序列(等待 128 次总线空闲信号)。
21 Flash-SPI 控制¶
21.1 概述¶
21.1.1 本 SPI 控制器的特点¶
FlashSpi 模块是一个 SPI 主控器,可通过 AHB 总线进行配置。它适用于基于 AHB 总线架构的 WiFi 芯片(如 S902),用于读写外部 Flash 芯片,如 Spansion 的 S25FL116K、Winbond 的 W25Q20CL 或其他类似支持 SPI 从接口的外部 Flash 芯片。该模块具备以下特点:
- 提供一组 AHB 从接口、一组 DMA 单次请求接口和一个片上中断请求,同时向片外提供 SPI 主控接口。
- 可提供最高为系统时钟频率一半的 SPI 时钟。
- 一次通信在寄存器配置完成后自动开始,通信完成后会通过寄存器标志位显示状态,并可触发完成中断。
- 一次通信最多可以包含 8 个独立可配置的相位,足以灵活应对 Flash 芯片 SPI 通信中涉及的各种情况。
- 整个模块采用同步时钟设计,所有信号均属于 CLK 时钟域。
21.1.2 PHASE 的概念¶
下图是一个通过 SPI 读取 FLASH 数据的典型时序图。
从 CSn 下降沿到 CSn 上升沿的过程被称为一次 SPI 通信。 在上述 SPI 通信中,需要依次发送 Instruction、A、M 和 Dummy,然后接收数据。 其中 Instruction 仅使用一根线传输,而后续过程均使用四根线。
针对这种时序,本模块提出了 PHASE 的概念。一次通信最多可以包含 8 个 PHASE,每个 PHASE 都可以独立设置参数,例如读写操作方式、1/2/4 线模式、通信数据量等。
在第一次 SPI 通信开始后,本模块将按照 PHASE0 → PHASE7 的顺序依次完成每个 PHASE 所设定的任务,之后结束该次 SPI 通信。
例如,对于上图中的时序,可以将其划分为 4 个 PHASE。
21.1.3 模块框图¶
下图是该 SPI 控制器的模块框图:
- FlashSpiAhbIf:一个 AHB 从接口控制器,负责将 AHB 总线信号转换为模块内部的读写信号,并与寄存器模块 FlashSpiReg 交互以完成读写操作。
- FlashSpiReg:SPI 控制器的寄存器模块,所有寄存器都位于此模块。同时,DMA 接口信号的生成和处理以及中断的生成也在此模块内完成。
- FlashSpiCtrl:SPI 控制器的核心控制模块。当检测到 FlashSpiReg 中 SPI_START 位被写为 1 时,分析寄存器中设置的 Phase,并生成控制信号和数据供 FlashSpiDataPump 使用。
- FlashSpiPsc:SPI SCK 时钟控制器,用于控制 SCK 时钟的频率。
- FlashSpiMaster:SPI 主接口控制器,根据 FlashSpiCtrl 发送的控制信号,控制 SPI 总线进行发送和接收。
21.1.4 顶层端口¶
以下是该模块的顶层端口及其功能列表:
信号名称 | 方向 | 位宽 | 连接对象 | 说明 |
---|---|---|---|---|
CLK | I | 1 | ClockGen | 模块时钟 |
RST_n | I | 1 | ResetGen | 模块复位 |
HSEL | I | 1 | BusMatrix | AHB 从总线信号 |
HWRITE | I | 1 | BusMatrix | AHB 从总线信号 |
HADDR | I | 32 | BusMatrix | AHB 从总线信号 |
HTRANS | I | 2 | BusMatrix | AHB 从总线信号 |
HSIZE | I | 3 | BusMatrix | AHB 从总线信号 |
HWDATA | I | 32 | BusMatrix | AHB 从总线信号 |
HREADYIN | I | 1 | BusMatrix | AHB 从总线信号 |
DMA_TX_SREQ_CLR | I | 1 | Dma | 清除 TX_DMA 请求信号 |
DMA_RX_SREQ_CLR | I | 1 | Dma | 清除 RX_DMA 请求信号 |
IO0_I | I | 1 | Pad | 总线的 Spiio0 输入 |
SO_IO1_I | I | 1 | Pad | 总线的 Spiso_io1 输入 |
IO2_I | I | 1 | Pad | 总线的 Spiio2 输入 |
IO3_I | I | 1 | Pad | 总线的 Spiio3 输入 |
HREADYOUT | O | 1 | BusMatrix | AHB 从总线信号 |
HRDATA | O | 32 | BusMatrix | AHB 从总线信号 |
HRESP | O | 2 | BusMatrix | AHB 从总线信号 |
DMA_TX_SREQ | O | 1 | Dma | TX_DMA 请求信号 |
DMA_RX_SREQ | O | 1 | Dma | RX_DMA 请求信号 |
SPI_DONE_INT | O | 1 | Cpu | SPI 完成中断 |
SCK | O | 1 | Pad | 总线的 Spisck 信号 |
CSn | O | 1 | Pad | 总线的 Spicsn 信号 |
SI_IO0_O | O | 1 | Pad | SPI 总线 SI_IO0 输出数据 |
SI_IO0_OE | O | 1 | Pad | SPI 总线 SI_IO0 输出使能 |
IO1_O | O | 1 | Pad | 总线的 Spiio1 输出数据 |
SO_IO1_OE | O | 1 | Pad | 总线的 Spiio1 输出使能 |
WPn_IO2_O | O | 1 | Pad | 总线的 Spiwpn_io2 输出数据 |
WPn_IO2_OE | O | 1 | Pad | 总线的 Spiwpn_io2 输出使能 |
HOLDn_IO3_O | O | 1 | Pad | 总线的 Spiholdn_io3 输出数据 |
HOLDn_IO3_OE | O | 1 | Pad | 总线的 Spiholdn_io3 输出使能 |
21.2 模块使用说明¶
21.2.1 系统集成方式¶
AHB 总线、DMA 接口和中断接口的集成相对简单,此处不作描述。 SPI 总线的集成应等效于以下逻辑:
此外,为防止输入悬空,最好在 Wifi 芯片和 Flash 芯片之间添加上拉电阻。
21.2.2 寄存器说明¶
SPCR 寄存器(地址:BASE_ADDR + 8'h00)¶
SPCR 是 SPI 通信的全局控制寄存器,其位配置如下:
各位功能定义如下表所示:
bit 位名 初始值 读写属性 描述 31 RESET 1'b0 W/R SPI 控制器的软件复位。置 1 时,除本位外的所有寄存器及所有内部电路被复位。 30-21 保留 10'h000 R 保留。 20 INT_EN 1'b0 W/R 中断使能。置 1 时,如果 SPI_DONE 为 1,将向 CPU 发送中断。 19-12 SCK_DIV_VAL 8'h08 W/R SPI 通信频率设置。SPI 通信速率为系统时钟按此值进行分频。必须填写偶数。填写 8'h00 表示 256 分频。 11 保留 1'b0 R 保留。 10 LE 1'b0 W/R 小端起始。因数据寄存器为 32 位,而 SPI 每次发送 1 字节,当 LE 为 1 时,SPI 先发送接收寄存器的 [7:0] 位,再为 [15:8],直到 [31:24];当 LE 为 0 时,顺序相反。 9 WP 1'b1 W/R 写保护。 8 USE_DMA 1'b0 W/R 最后一个 phase 的数据使用 DMA 传输。 注意:如果一次 SPI 通信仅包含一个 phase,禁止将 USE_DMA 设为 1。 7 保留 1'b0 W/R R 当 SPI 通信为单线或双线模式时,WP 为 1(即 0)时 WPn 有效;WP 为 0 时,WPn 为 1。 6-4 PHASE_CNT 3'h0 - 一次 SPI 通信中包含的 PHASE 数量。 0:包含 1 个 phase 1:包含 2 个 phase …… 7:包含 8 个 phase 3 保留 1'b0 R 保留。 2 SPI_ERROR 1'b0 W0/R 一次通信结束时,如果任一 phase 错误,则该位置 1。 清除条件:软件写 0,或软件写 SPI_START 为 1(即下一次通信开始时自动清除)。 1 SPI_DONE 1'b0 W0/R SPI 传输与 DMA 传输的首次通信已全部结束。 清除条件:软件写 0,或软件写 SPI_START 为 1(即下一次通信开始时自动清除)。 0 SPI_START 1'b0 W/R 通信开始。在配置完一次通信的所有 phase 后,请设置为 1。 清除条件:SPI 通信结束后自动清除。请勿在软件中写 0。
phase_ctrl0 ~ phase_ctrl7 寄存器(地址:BASE_ADDR + 8'h10 ~ 8'h2C)¶
PHASE_CTRL 寄存器用于分别配置 SPI 通信中的每个 phase。共有八个 PHASE_CTRL 寄存器,即 phase_ctrl0 ~ phase_ctrl7,分别控制每一个 phase。
PHASE_CTRL 寄存器的位配置如下:
各位功能定义如下表所示:
bit 位名 初始值 读写属性 描述 31-22 保留 10'h000 R 保留。 21-20 SPI_MODE 2'h0 W/R 当前 PHASE 的 SPI 总线模式: 2'h0:单线模式 2'h1:双线模式 2'h2:四线模式 2'h3:禁止设置 19-8 BYTE_CNT 12'h000 W/R 当前 PHASE 通信中数据字节数量。 当 PHASE_ACTION 为 POLL 时该值无效。 7-6 保留 1'b0 R 保留。 5-4 PHASE_ACTION 2'h0 W/R 当前 PHASE 的 SPI 操作类型: 2'h0:发送(TX) 2'h1:空发送(DUMMY TX) 2'h2:接收(RX) 2'h3:轮询(POLL) 详见第 2.3 节。 3 保留 1'b0 R 保留。 2 PHASE_ERROR 1'b0 R 当 PHASE_ACTION 为 POLL 且超出未读尝试次数时,该位被置 1。 清除条件:SPCR 写入 SPI_START 为 1(即在下一次通信开始时自动清除)。 1 PHASE_DONE 1'b0 R 当前 PHASE 已完成。 清除条件:SPCR 写入 SPI_START 为 1(即在下一次通信开始时自动清除)。 0 PHASE_START 1'b0 R 当前 PHASE 正在进行中。根据运行情况由硬件自动设置与清除。
phase_data0 ~ phase_data7 寄存器(地址:BASE_ADDR + 8'h30 ~ 8'h4C)¶
每个 PHASE 的数据寄存器。PHASE_DATA 寄存器的位定义取决于当前 phase 设置的 PHASE_ACTION。 具体如下:
当 PHASE_ACTION 为 POLL 时,用于保存与 POLL 相关的配置:
当 (POLL_READ & POLL_MASK) == POLL_EXPECT
且尝试次数小于 POLL_LIMIT 时,POLL 成功;
否则,POLL 失败,并将 PHASE_ERROR 位置为 1。
当 PHASE_ACTION 不为 POLL 时,PHASE_DATA 寄存器用于存储发送/接收数据,最多可达 4 字节。
- 若
SPCR.LE = 0
,功能如下:
- 若
SPCR.LE = 1
,功能如下:
即:
- 发送数据时,SPI 会先发送 data byte 0,再依次为 byte 1 到 byte 3;
- 接收数据时,会先写入 data byte 0,再依次写入至 byte 3。
21.2.3 PHASE_ACTION 描述¶
当 SPCR.SPI_START = 1
时,硬件将自动按照 PHASE0 → PHASE1 → ... → PHASE7 的顺序执行每个 phase 中的事务,直到完成 SPCR.PHASE_CNT
指定的数量。
根据常见 Flash 芯片的功能,本模块中 SPI 需要执行的操作共分为四种:TX、DUMMY TX、RX 和 POLL。下面是对每种操作的详细定义说明:
TX¶
当 PHASE_ACTION
为 TX 时,SPI 将按照 SPI_MODE
配置的总线模式,循环发送 PHASE_DATA
中的数据,发送顺序为 data byte0 ~ data byte3,直到发送完指定的 PHASE_BYTE_CNT
字节数。
因此,当 PHASE_BYTE_CNT
小于 5 时,软件可以直接将数据填入 PHASE_DATA
;否则建议配置 DMA,使 SPI 在每次循环结束后自动调用 DMA 将新数据写入 PHASE_DATA
。
DUMMY TX¶
DUMMY TX 类似于 TX,不同之处在于 SPI 不再发送 PHASE_DATA
中的数据,而是发送固定的 8'hFF
。因此,即使 PHASE_BYTE_CNT
大于 4,也无需配置 DMA。
RX¶
当 PHASE_ACTION
为 RX 时,SPI 将根据 SPI_MODE
配置的总线模式接收数据,并按 data byte0 ~ data byte3 的顺序循环写入 PHASE_DATA
。
因此,当 PHASE_BYTE_CNT
小于 5 时,SPI 通信完成后软件可直接读取 PHASE_DATA
中的数据;否则建议配置 DMA,使 SPI 在每次循环结束后自动调用 DMA 发送走 PHASE_DATA
中的数据,以避免新数据覆盖旧数据。
POLL¶
当 PHASE_ACTION
为 POLL 时,SPI 将根据 SPI_MODE
配置的总线模式持续接收数据,并进行 (POLL_READ & POLL_MASK) == POLL_EXPECT
的比较操作:
- 如果在
POLL_LIMIT
指定的次数内比较成功,则 POLL 操作完成; - 否则,当达到
POLL_LIMIT
指定的次数后,POLL 操作被强制完成,并将PHASE_ERROR
位置为 1。
注意:如果
POLL_LIMIT
被设置为8'h00
,则会进入无限 POLL 模式。SPI 将无限次执行 POLL 操作,直到比较成功,否则将无法停止。此时,唯一的停止方法是使用SOFT_RESET
。
注意事项¶
- RX 和 POLL 必须是一次 SPI 通信的最后一个 PHASE,不能是第一个 PHASE。
- 如果某个 PHASE 设置为使用 DMA,则其
PHASE_ACTION
不能为 POLL。 - 如果某个 PHASE 设置为使用 DMA,且其
PHASE_ACTION
为 RX,有可能出现 SPI 通信已完成,但 DMA 仍未完成的情况。此时SPCR.SPI_START
会被清除,但SPCR.SPI_DONE
不会被置位;直到 DMA 传输完成后,SPCR.SPI_DONE
才会被置位。
21.2.1 软件配置顺序¶
在每次 SPI 通信中,软件可按以下顺序配置寄存器:
软件配置示例¶
本节将结合常见 FLASH 芯片的操作,介绍如何配置该模块。
示例一:发送 Write Enable(06h)指令¶
该指令的格式如下:
推荐配置如下:
顺序 寄存器名称 配置值 1 PHASE_CTRL0 SPI_MODE=2'h0
BYTE_CNT=12'h001
PHASE_ACTION=2'h02 PHASE_DATA0 32'h06000000(SPCR.LE=0)
32'h00000006(SPCR.LE=1)3 SPCR USE_DMA=1'b0
PHASE_CNT=3'h0
WP=1'b0
SPI_START=1'b1
配置完成后,SPI 将开始通信,软件可以等待中断或轮询 SPCR.SPI_START = 0
。
示例二:发送 Read Status Register-1(05h)命令¶
该命令的序列如下:
在 CSn 变为 1 之前,将反复读取 Status Register-1 的值。
示例:读取 Status Register-1 的值 4 次
推荐配置如下:
顺序 寄存器名称 配置值 1 PHASE_CTRL0 SPI_MODE=2'h0
BYTE_CNT=12'h001
PHASE_ACTION=2'h02 PHASE_DATA0 32'h05000000(SPCR.LE=0)
32'h00000005(SPCR.LE=1)3 PHASE_CTRL1 SPI_MODE=2'h0
BYTE_CNT=12'h004
PHASE_ACTION=2'h24 SPCR USE_DMA=1'b0
PHASE_CNT=3'h1
WP=1'b1
SPI_START=1'b1
SPI 首先运行 PHASE0,发送 05h,然后运行 PHASE1,读取 4 字节,并将读取结果写入 PHASE_DATA1。软件可在 SPI_START = 0
后读取该寄存器。
示例:等待 Status Register-1 的第 0 位为 0,最多尝试读取 100 次
推荐配置如下:
顺序 寄存器名称 配置值 1 PHASE_CTRL0 SPI_MODE=2'h0
BYTE_CNT=12'h001
PHASE_ACTION=2'h02 PHASE_DATA0 32'h05000000(SPCR.LE=0)
32'h00000005(SPCR.LE=1)3 PHASE_CTRL1 SPI_MODE=2'h0
PHASE_ACTION=2'h3(POLL)4 PHASE_DATA1 32'h64010000 (POLL_LIMIT=0x64, POLL_MASK=0x01, POLL_EXPECT=0x00) 5 SPCR USE_DMA=1'b0
PHASE_CNT=3'h1
WP=1'b1
SPI_START=1'b1
配置完成后,SPI 首先执行 PHASE0,发送 05h,然后执行 PHASE1,不断读取数据并比较:
(POLL_READ & POLL_MASK) == POLL_EXPECT
若在最大次数(0x64)内比较成功,则 POLL 成功;否则设置 PHASE_ERROR = 1
。等待 SPI_START = 0
后,软件需检查 SPI_ERROR
是否为 1 来判断 POLL 是否失败。
示例三:使用 Fast Read Quad IO(EBh)指令读取数据¶
该命令的时序图如下:
假设地址 A = 24'h123456,模式字节 M = 0x78,读取 100 字节数据。
推荐配置如下:
顺序 寄存器名称 配置值 1 DMA 源地址 PHASE_DATA3 2 PHASE_CTRL0 SPI_MODE=2'h0
BYTE_CNT=12'h001
PHASE_ACTION=2'h03 PHASE_DATA0 32'hEB000000(SPCR.LE=0)
32'h000000EB(SPCR.LE=1)4 PHASE_CTRL1 SPI_MODE=2'h2
BYTE_CNT=12'h004
PHASE_ACTION=2'h05 PHASE_DATA1 32'h12345678(SPCR.LE=0)
32'h78563412(SPCR.LE=1)6 PHASE_CTRL2 SPI_MODE=2'h2
BYTE_CNT=12'h002
PHASE_ACTION=2'h1(DUMMY TX)7 PHASE_CTRL3 SPI_MODE=2'h2
BYTE_CNT=12'h064
PHASE_ACTION=2'h2(RX)8 SPCR USE_DMA=1'b1
PHASE_CNT=3'h3
WP=1'b1
SPI_START=1'b1
通信开始后:
- PHASE0 发送命令 0xEB;
- PHASE1 发送地址 A 与模式字节 M(拼成 4 字节);
- PHASE2 发送两个 dummy 字节;
- PHASE3 接收 100 字节数据。
由于 SPCR.USE_DMA=1
,PHASE_DATA3 写入数据时将触发 DMA 请求,自动搬运数据。
22 其他接口¶
22.1 全速 USB 设备接口(USBD)¶
- 一个全速 USB 接口,速率高达 12 Mbit/s
- 内部 60 MHz 振荡器支持无晶振操作
- 内部主 PLL 生成符合标准的 USB 时钟
通用串行总线(USB)是一种 4 线制总线,具有 4 个双向端点。设备控制器通过集成的收发器支持 12 Mbit/s 的数据交换。事务格式化由硬件完成,包括 CRC 的生成与校验。支持设备模式。
事务格式化由硬件完成,包括 CRC 的生成与校验。USB 传输完成或发生错误时,其状态通过状态寄存器指示,如启用中断也会触发中断信号。所需的精确 48 MHz 时钟可通过内部主 PLL 生成(其时钟源需使用 HXTAL 晶体振荡器),或通过内部 48 MHz 振荡器的自动校准模式生成,实现无晶振操作。
AG32 项目中已集成 tinyUSB,可独立使用。USB 所用的引脚为固定引脚,在 VE 中不可更改。
在示例代码中,USB 被同时枚举为 CDC 和 MSC(也支持 HID 与 MIDI 模式)。
在示例中,USB 描述符、回调函数及配置(CDC、HID、MSC、MIDI)均通过 src
路径下的 in.c.h
接口打开。用户可根据自身需求自定义或修改。有关配置部分和 USB 接口使用的详细说明,请参考 sdk
下 tinyUSB 路径中的文件说明,或参考 tinyUSB 官方文档。
22.2 以太网 MAC 接口¶
该外设仅适用于 AG32 设备。
AG32 提供一个符合 IEEE-802.3-2002 标准的以太网局域网通信用媒体访问控制器(MAC),通过行业标准的媒体独立接口(MII)或简化媒体独立接口(RMII)实现。
AG32 需要外接物理层接口设备(PHY)以连接实际物理 LAN 总线(如双绞线、光纤等)。PHY 通过 17 根 MII 信号线或 9 根 RMII 信号线与 AG32 的 MII 接口连接,并可使用 AG32 输出的 25 MHz(MII 模式)进行时钟同步。
AG32 支持 MAC 模块,支持 RMII/MII 接口。当前 SDK 已集成 LwIP 2.1.0 版本。在示例中使用的是服务器端功能。
22.3 调试模式¶
- 串行线 JTAG 调试端口(SWJ-DP)
SWJ-DP 接口是嵌入式接口,它结合了 JTAG 与串行线调试端口(Serial Wire Debug Port),允许连接串行线调试器或 JTAG 探针至目标设备。
23 电气特性¶
绝对最大额定值(Absolute Maximum Ratings)¶
最大额定值是设备在不造成永久损坏的情况下可以承受的极限条件。请注意,设备在最大额定值下不保证能正常工作。若在绝对最大额定条件下长时间运行,可能影响器件的可靠性。
符号 | 参数 | 最小值 | 最大值 | 单位 |
---|---|---|---|---|
VDD | 外部供电电压范围 | VSS - 0.3 | VSS + 3.465 | V |
VDDA | 外部模拟电源电压 | VSSA - 0.3 | VSSA + 3.465 | V |
VBAT | 外部电池供电电压 | VSS - 0.3 | VSS + 3.465 | V |
VIN | I/O 引脚输入电压 | VSS - 0.3 | VSS + 3.465 | V |
Iio | GPIO 引脚最大电流 | — | 25 | mA |
Iinj | I/O 引脚注入电流 | — | ±5 | mA |
TA | 工作温度范围 | -40 | +85 | °C |
TSTG | 存储温度范围 | -55 | +150 | °C |
TJ | 最大结温 | — | 125 | °C |
推荐直流电特性(Recommended DC Characteristics)¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VDD | 数字电源电压 | — | 3.135 | 3.3 | 3.465 | V |
VDDA | 模拟电源电压 | — | 3.135 | 3.3 | 3.465 | V |
VBAT | 电池供电电压 | — | 2.2 | — | 3.465 | V |
静电放电(ESD)与闩锁(Latch-up)特性¶
参数 | 描述 | 条件 | 最大值 | 单位 |
---|---|---|---|---|
VESD(HBM) | 最大 ESD 电压(人体模型) | — | 2000 | V |
VESD(CDM) | 最大 ESD 电压(充电设备模型) | — | 500 | V |
LU | 闩锁电流 | — | 100 | mA |
功耗(Power Consumption)¶
下列功耗测量均基于从片上 Flash 中执行代码,测试条件如下:
- VDD = VBAT = 3.3V
- 外部高速晶振 HSE = 8MHz
- 系统时钟为 108 MHz 或 72 MHz
- 所有外设启用或禁用状态下的电流消耗
电源模式 | 测试条件 | 电流单位 |
---|---|---|
运行模式(Run) | 所有外设启用(108MHz) | mA |
所有外设禁用(108MHz) | mA | |
所有外设启用(72MHz) | mA | |
所有外设禁用(72MHz) | mA | |
睡眠模式(Sleep) | CPU 时钟关闭,所有外设启用 | mA |
CPU 时钟关闭,所有外设禁用 | mA | |
深度睡眠模式 | 所有时钟关闭,仅 LSI、RTC 启用,所有 IO 配置为模拟模式 | mA |
待机模式(Standby) | LDO 关闭,LSE 关闭,LSI 启用,RTC 启用 | μA |
电池待机模式(VBAT) | VDD 不可用,VBAT=3.3V,LDO 关闭,LSE 启用,LSI 关闭,RTC 启用 | μA |
VDD 不可用,VBAT=3.3V,LDO 关闭,LSE 关闭,LSI 启用,RTC 启用 | μA |
⚠️ 备注:表中数值未填写完整,请参考实际产品手册中详细功耗测试数据表。
上电/掉电特性(Power-Up/Down)¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
Vpor | 上电复位门限电压 | — | 2.0 | 2.2 | 2.4 | V |
Vpdr | 掉电复位门限电压 | — | 1.8 | 2.0 | 2.2 | V |
Vhyst | 掉电复位迟滞电压 | — | — | 0.2 | — | V |
Trsttemp | 复位延迟时间 | — | — | 4 | — | ms |
外部时钟特性¶
高速外部时钟¶
由晶体/陶瓷谐振器产生的高速外部时钟。高速外部(HSE)时钟可以通过一个 4 到 16 MHz 的晶体/陶瓷谐振器振荡器提供。本段中提供的所有信息基于使用表中指定的典型外部元件所获得的特性数据。在应用中,谐振器及负载电容必须尽可能靠近振荡器引脚放置,以最小化输出失真和启动稳定时间。关于谐振器特性(频率、封装、精度等)的更多信息,请参考晶体谐振器制造商资料。
HSE 4–26 MHz 振荡器特性
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
f_OSC_IN | 振荡器频率 | VDD = 3.3V | 4 | 8 | 26 | MHz |
RF | 反馈电阻 | — | — | 1 | — | MΩ |
C | 推荐 OSC_IN 和 OSC_OUT 负载电容 | — | — | 20 | 30 | pF |
gm | 振荡器跨导 | — | 25 | — | — | mA/V |
Dosc_out | 振荡器输出占空比 | — | 45 | 50 | 55 | % |
T_su_hse | 启动时间(VDD 稳定后) | — | 2 | — | — | 毫秒 |
对于 CL1 和 CL2,推荐使用 5pF 到 25pF 范围(典型值)内的高品质外部陶瓷电容,这些电容器专为高频应用设计,并根据晶体或谐振器的要求选定(见图 24)。CL1 和 CL2 通常大小相同。晶体制造商通常规定的负载电容是 CL1 和 CL2 的串联组合。选定 CL1 和 CL2 时还必须计入 PCB 和 MCU 引脚电容(一般可粗略估算为 10pF)。
典型应用: 使用 8 MHz 晶体
REXT 值依赖于晶体特性。
低速外部时钟¶
由晶体/陶瓷谐振器产生的低速外部时钟。低速外部(LSE)时钟可通过 32.768 kHz 的晶体/陶瓷谐振器振荡器提供。本段中提供的所有信息基于使用表中指定的典型外部元件所获得的特性数据。在应用中,谐振器及负载电容必须尽可能靠近振荡器引脚放置,以最小化输出失真和启动稳定时间。关于谐振器特性(频率、封装、精度等)的更多信息,请参考晶体谐振器制造商资料。
LSE 振荡器特性
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
f_LSE | 振荡器频率 | VDD = VBAT = 3.3V | 32.768 | — | 1000 | kHz |
RF | 反馈电阻 | — | — | 10 | — | MΩ |
C | 推荐 OSC32_IN 和 OSC32_OUT 负载电容 | — | — | — | 15 | pF |
gm | 振荡器跨导 | — | 10 | — | — | μA/V |
Dosc_out | 振荡器输出占空比 | — | 45 | 50 | 55 | % |
T_su_lse | 启动时间(VDD 稳定后) | — | 3 | — | — | 秒 |
典型应用: 使用 32.768 kHz 晶体
内部时钟源特性¶
高速内部 (HSI) RC 振荡器¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
f_HSI | 振荡器频率 | VDD=3.3V | 10 | 20 | 40 | MHz |
Duty_HSI | 占空比 | — | 45 | 50 | 55 | % |
T_su_HSI | 启动时间 | — | 1 | — | 2 | μs |
PLL 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
fPLL_IN | PLL 输入时钟频率 | — | 4 | 20 | 50 | MHz |
占空比 | PLL 输入时钟占空比 | — | 40 | 50 | 60 | % |
fPLL_OUT | PLL 输出时钟频率 | — | — | — | 300 | MHz |
tLOCK | PLL 锁定时间 | — | — | — | 400 | μs |
Jitter | 周期抖动 | — | — | — | 400 | ps |
存储器特性¶
Flash 闪存特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
PECYC | 保证的编程/擦除周期数(耐久性) | TA = -40°C 到 +85°C | 100 | — | — | 千次 |
tRET | 数据保存时间 | TA = 125°C | 20 | — | — | 年 |
tPROG | 字编程时间 | — | — | 2 | 3 | 毫秒 |
tERASE | 页面擦除时间 | — | — | 8 | 20 | 毫秒 |
tMERASE | 整体擦除时间 | — | — | 8 | 20 | 毫秒 |
IO 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VIL | 标准 IO 低电平输入电压 | VDD ≥ 3.135V | -0.3 | — | 0.8 | V |
VIH | 标准 IO 高电平输入电压 | VDD ≥ 3.135V | 1.5 | — | 3.46 | V |
VOL | 低电平输出电压 | VDD ≥ 3.135V | — | — | 0.2 | V |
VOH | 高电平输出电压 | VDD ≥ 3.135V | 2.8 | — | — | V |
RPU | 内部上拉电阻 | VIN = VSS | 30 | 40 | 50 | kΩ |
RPD | 内部下拉电阻 | VIN = VDD | 30 | 40 | 50 | kΩ |
ADC 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VDDA | 工作电压 | — | 3.135 | 3.3 | 3.465 | V |
VIN | ADC 输入电压范围 | — | 0 | — | VREFP | V |
fADC | ADC 时钟频率 | — | 0.5 | — | 13 | MHz |
fs | 采样率 | — | — | — | 1 | MHz |
tconv | ADC 转换时间 | — | 1 | — | 20 | μs |
RADC | 输入采样开关电阻 | — | — | — | 0.5 | kΩ |
CADC | 输入采样电容 | — | — | 8 | — | pF |
tsu | 启动时间 | — | — | — | 2 | μs |
DAC 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VDDA | 工作电压 | — | 3.135 | 3.3 | 3.465 | V |
VREFP | 参考电压(需小于 VDDA) | — | 3.135 | 3.3 | 3.465 | V |
RLOAD | 负载电阻(带缓冲) | 相对 VSSA | 5 | — | — | kΩ |
CLOAD | 负载电容 | 无引脚/封装寄生电容 | — | — | 50 | pF |
比较器特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VDDA | 模拟供电电压 | — | 3.135 | 3.3 | 3.465 | V |
VIN | 比较器输入电压范围 | — | 0 | — | VDDA | V |
tstart | 启动时间 | VDDA ≥ 3.135V | — | — | 10 | μs |
tD | 传播延迟(100 mV 过驱) | VDDA ≥ 3.135V | — | — | 40 | ns |
VOFFSET | 偏移误差 | VDDA ≥ 3.135V | — | — | ±25 | mV |
I²C 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
fSCL | SCL 时钟频率 | — | 0 | — | 100 | kHz |
tSCL(H) | SCL 时钟高电平时间 | — | 4.0 | — | 0.6 | ns |
tSCL(L) | SCL 时钟低电平时间 | — | 4.7 | — | 1.3 | ns |
SPI 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
fSCK | SCK 时钟频率 | — | — | — | 40/100 | MHz |
tSCK(H) | SCK 时钟高电平时间 | — | 5 | — | — | ns |
tSCK(L) | SCK 时钟低电平时间 | — | 5 | — | — | ns |
SPI 主模式下:
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tV(MO) | 数据输出有效时间 | — | — | — | 5 | ns |
tH(MO) | 数据输出保持时间 | — | 2 | — | — | ns |
tSU(MI) | 数据输入建立时间 | — | 5 | — | — | ns |
tH(MI) | 数据输入保持时间 | — | 5 | — | — | ns |
NRST 引脚特性¶
NRST 引脚输入驱动器采用 CMOS 技术,并连接一个永久的上拉电阻 RPU。
NRST 引脚电气特性
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VIL(NRST) | NRST 输入低电平电压 | — | — | — | 0.2VDD | V |
VIH(NRST) | NRST 输入高电平电压 | — | 0.5VDD | — | — | V |
Vhys(NRST) | NRST 施密特触发器迟滞电压 | — | — | 200 | — | mV |
RPU | 弱上拉等效电阻 | VIN = VSS | 30 | 40 | 50 | kΩ |
VF(NRST) | NRST 可滤除脉冲 | — | — | — | 100 | ns |
VNF(NRST) | NRST 不可滤除脉冲 | — | 500 | — | — | ns |
推荐的 NRST 引脚保护特性(针对数据传输模式)
时钟特性(数据传输模式)
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
fPP | 数据传输模式下的时钟频率 | — | 0 | — | 48 | MHz |
tW(CKL) | 时钟低电平时间 | fPP = 48 MHz | 10.5 | 11 | — | ns |
tW(CKH) | 时钟高电平时间 | fPP = 48 MHz | 9.5 | 10 | — | ns |
CMD、D 输入(以 CK 为参考)在 MMC 和 SD 高速模式下
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tISU | 输入建立时间(高速模式) | fPP = 48 MHz | 4 | — | — | ns |
tIH | 输入保持时间(高速模式) | fPP = 48 MHz | 3 | — | — | ns |
CMD、D 输出(以 CK 为参考)在 MMC 和 SD 高速模式下
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tOV | 输出有效时间(高速模式) | fPP = 48 MHz | — | — | 13.8 | ns |
tOH | 输出保持时间(高速模式) | fPP = 48 MHz | 12 | — | — | ns |
CMD、D 输入(以 CK 为参考)在 SD 默认模式下
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tISUD | 输入建立时间(SD 默认模式) | fPP = 24 MHz | 3 | — | — | ns |
tIHD | 输入保持时间(SD 默认模式) | fPP = 24 MHz | 3 | — | — | ns |
CMD、D 输出(以 CK 为参考)在 SD 默认模式下
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tOVD | 输出有效时间(SD 默认模式) | fPP = 24 MHz | — | 2.4 | 2.8 | ns |
tOHD | 输出保持时间(SD 默认模式) | fPP = 24 MHz | 0.8 | — | — | ns |
UART 特性¶
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
fSCK | SCK 时钟频率 | fPCLK = 120 MHz | — | — | 60 | MHz |
tSCK(H) | SCK 时钟高电平时间 | fPCLK = 120 MHz | 7.5 | — | — | ns |
tSCK(L) | SCK 时钟低电平时间 | fPCLK = 120 MHz | 7.5 | — | — | ns |
USB 特性¶
USB 直流电气特性(USB DC Electrical Characteristics)
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
VDD | USB 工作电压 | — | 3 | — | 3.3 | V |
VDI | 差分输入灵敏度 | I(USBDP, USBDM) | 0.2 | — | — | V |
VCM | 差分共模范围(包含差分灵敏度) | 包括 VDI 范围 | 0.8 | — | 2.5 | V |
VSE | 单端接收器阈值 | — | 1.3 | — | 2.0 | V |
VOL | 静态输出低电平 | RL = 1.5 kΩ 到 3.465 V | — | — | 0.3 | V |
VOH | 静态输出高电平 | RL = 15 kΩ 到 VSS | 2.8 | 3.3 | 3.465 | V |
tSTARTUP | USBFS 启动时间 | — | — | — | 1 | μs |
USB 全速电气特性(USB Full Speed Electrical Characteristics)
符号 | 参数 | 条件 | 最小值 | 典型值 | 最大值 | 单位 |
---|---|---|---|---|---|---|
tR | 上升时间 | CL = 50 pF | 4 | — | 20 | ns |
tF | 下降时间 | CL = 50 pF | 4 | — | 20 | ns |
tRFM | 上升/下降时间匹配(tR/tF) | — | 90 | — | 110 | % |
vCRS | 输出信号交叉电压 | — | 1.3 | — | 2.0 | V |
USB 时序参数定义了数据信号的上升和下降时间。
TIMER 特性参数¶
TIMER 特性参数
符号 | 参数说明 | 条件 | 最小值 | 最大值 | 单位 |
---|---|---|---|---|---|
— | 1 | — | — | — | — |
t_res |
计时器分辨率时间 | tTIMERxCLK fTIMERxCLK = 240MHz |
4.2 | — | ns |
f_EXT |
外部时钟频率 | — | 0 | fTIMERxCLK / 2 |
MHz |
fTIMERxCLK = 240MHz |
0 | 120 | MHz | ||
RES |
定时器分辨率 | — | — | 32 | bit |
t_COUNTER |
选用内部时钟时的 16 位计数器周期 | — | 1 × tTIMERxCLK |
65536 × tTIMERxCLK |
— |
fTIMERxCLK = 240MHz |
0.0084 | 546 | μs | ||
— | — | — | — | 65536 × 65536 × tTIMERxCLK |
— |
t_MAX_COUNT |
最大可能计数时间 | fTIMERxCLK = 240MHz |
— | 35.7 | s |
24 封装与工作温度¶
支持以下封装形式:
- LQFP100(适用于 AG32VF303Vx、AG32VF407Vx)
- LQFP64(适用于 AG32VF407Rx、AG32VH407Rx)
- LQFP48(适用于 AG32VF303Cx)
- QFN32(适用于 AG32VF303KCU6)
工作温度范围:-40°C 至 +85°C
封装图示¶
- LQFP100 封装图
- LQFP64 封装图
- LQFP48 封装图
- QFN32 封装图
25 订购信息¶
订购型号 | Flash 容量 (KB) | 封装类型 | 封装形式 | 工作温度范围 |
---|---|---|---|---|
AG32VF303KCU6 | 256 | QFN32 | 无铅环保 | -40°C 至 +85°C (工业级) |
AG32VF303CCT6 | 256 | LQFP48 | 无铅环保 | -40°C 至 +85°C (工业级) |
AG32VF303VCT6 | 256 | LQFP100 | 无铅环保 | -40°C 至 +85°C (工业级) |
AG32VH407RCT6 | 256 | LQFP64 | 无铅环保 | -40°C 至 +85°C (工业级) |
AG32VF407RGT6 | 1024 | LQFP64 | 无铅环保 | -40°C 至 +85°C (工业级) |
AG32VF407VGT6 | 1024 | LQFP100 | 无铅环保 | -40°C 至 +85°C (工业级) |
26 修订历史¶
修订版本 | 描述 | 日期 |
---|---|---|
1.0 | 初始版本发布 | 2022 年 4 月 20 日 |
1.1 | 第二版发布 | 2023 年 5 月 10 日 |
1.2 | 版本更新 | 2024 年 11 月 20 日 |