diff --git a/doc/CH32FV2x_V3xRM.PDF b/doc/CH32FV2x_V3xRM.PDF new file mode 100644 index 0000000..b7228cf Binary files /dev/null and b/doc/CH32FV2x_V3xRM.PDF differ diff --git a/doc/CH32FV2x_V3xRM.md b/doc/CH32FV2x_V3xRM.md new file mode 100644 index 0000000..d1d5d67 --- /dev/null +++ b/doc/CH32FV2x_V3xRM.md @@ -0,0 +1,25589 @@ +# Page 1 + +CH32F/V20x_V30x_V31x 系列应用手册 +V2.4 +说明 +CH32F20x系列产品是基于ARM○RCortexTM-M3内核设计的通用微控制器,与大部分ARM工具和软件 +兼容。提供了丰富的通讯接口和控制单元,适用于大部分控制、连接、综合等嵌入式领域。 +CH32V20x、CH32V30x和CH32V31x系列是基于32位RISC-V指令集及架构设计的工业级通用微控 +制器。依据产品性能和资源差异搭配了不同的内核型号。CH32V203采用青稞V4B内核,支持硬件中断 +堆栈,提升中断响应效率;CH32V208采用青稞V4C内核,进一步加快硬件除法运算速度,并增加了内 +存保护功能;CH32V303/305/307/317采用青稞V4F内核,进一步支持了硬件浮点运算。该系列产品挂 +载了丰富的外设接口和功能模块。其内部组织架构满足低成本低功耗嵌入式应用场景。 +本手册针对用户的应用开发,提供了CH32F20x系列、CH32V20x系列、CH32V30x系列和CH32V31x +系列产品的详细使用信息,适用于系列中不同存储器容量、功能资源、封装的产品,若有差异将在对 +应的功能章节做特殊说明。 +注:(1)CH32F20x包括:CH32F203、CH32F205、CH32F207、CH32F208; +(2)CH32V20x包括:CH32V203、CH32V208; +(3)CH32V30x包括:CH32V303、CH32V305、CH32V307; +(4)CH32V31x包括:CH32V317。 +有关此系列产品的器件特性请参考以下数据手册。 +CH32F20x_D6:《CH32F203DS0》 +CH32F20x_D8、CH32F20x_D8C:《CH32F207DS0》。 +CH32F20x_D8W:《CH32F208DS0》。 +CH32V20x_D6、CH32V20x_D8:《CH32V203DS0》。 +CH32V20x_D8W:《CH32V208DS0》。 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C:《CH32V307DS0》。 +有关ARM○RCortexTM-M3内核的相关信息,请参考《ARM® Cortex®-M3 Processor Technical Reference +Manual Revision r2p1》,可在ARM公司网站下载。 +有关RISC-V内核的相关信息,可参考QingKeV4微处理手册:《QingKeV4_Processor_Manual》。 +CH32F20x系列产品概览 +连接型 互联型 无线型 +中小容量通用型(F203) 大容量通用型(F203) +(F205) (F207) (F208) +32K闪存 64K闪存 128K闪存 256K闪存 128K闪存 256K闪存 128K闪存 +10K SRAM 20K SRAM 32K SRAM 64K SRAM 32K SRAM 64K SRAM 64K SRAM +2*ADC(TKey) 2*ADC(TKey) 2*ADC(TKey) 2*ADC(TKey) 2*ADC(TKey) 2*ADC(TKey) ADC(TKey) +ADTM ADTM 2*DAC 2*DAC 2*DAC 2*DAC ADTM +2*GPTM 3*GPTM ADTM 4*ADTM 4*ADTM 4*ADTM 3*GPTM +2*USART 4*U(S)ART 3*GPTM 4*GPTM 4*GPTM 4*GPTM GPTM(32) +SPI 2*SPI 3*USART 2*BCTM 2*BCTM 2*BCTM 4*U(S)ART +I2C 2*I2C 2*SPI 8*U(S)ART 5*U(S)ART 8*U(S)ART 2*SPI +V2.4 1 + +# Page 2 + +USBD USBD 2*I2C 3*SPI(2*I2S) 3*SPI(2*I2S) 3*SPI(2*I2S) 2*I2C +USBFS USBFS USBD 2*I2C 2*I2C 2*I2C USBD +CAN CAN CAN USBD OTG_FS OTG_FS USBFS +RTC RTC RTC CAN USBHS(+PHY) USBHS(+PHY) CAN +2*WDG 2*WDG 2*WDG RTC 2*CAN 2*CAN RTC +2*OPA 2*OPA 4*OPA 2*WDG RTC RTC 2*WDG +4*OPA 2*WDG 2*WDG 2*OPA +RNG 4*OPA 4*OPA ETH- +SDIO RNG RNG 10M(+PHY) +FSMC SDIO SDIO BLE5.3 +FSMC +DVP +ETH-1000MAC +10M PHY +注:同一类产品的某些外设数量或功能可能受封装限制,选择时请确认产品封装。 +CH32V20x、CH32V30x和 CH32V31x系列产品概览 +连接型 互联型 互联型 无线型 +中小容量通用型(V203) 大容量通用型(V303) +(V305) (V307) (V317) (V208) +青稞V4B内核 青稞V4F内核 青稞V4C内核 +32K闪存 64K闪存 128K闪存 256K闪存 128K闪存 256K闪存 256K闪存 128K闪存 +10K SRAM 20K SRAM 32K SRAM 64K SRAM 32K SRAM 64K SRAM 64K SRAM 64K SRAM +2*ADC(TKey) +2*DAC 2*ADC(TKey) +2*ADC(TKey) 4*ADTM 2*DAC +2*ADC(TKey) ADC(TKey) +2*DAC 4*GPTM 4*ADTM +2*DAC ADTM +4*ADTM 2*BCTM 4*GPTM +2*ADC(TKey) 2*ADC(TKey) 2*ADC(TKey) 4*ADTM 3*GPTM +4*GPTM 8*U(S)ART 2*BCTM +ADTM ADTM 2*DAC 4*GPTM GPTM(32) +2*BCTM 3*SPI(2*I2S) 8*U(S)ART +3*GPTM 3*GPTM ADTM 2*BCTM 4*U(S)ART +8*U(S)ART 2*I2C 3*SPI(2*I2S) +2*USART 4*U(S)ART 3*GPTM 5*U(S)ART 2*SPI +3*SPI(2*I2S) OTG_FS 2*I2C +SPI 2*SPI 3*USART 3*SPI(2*I2S) 2*I2C +2*I2C USBHS(+PHY) OTG_FS +I2C 2*I2C 2*SPI 2*I2C USBD +USBFS 2*CAN USBHS(+PHY) +USBD USBD 2*I2C OTG_FS USBFS +CAN RTC 2*CAN +USBFS USBFS USBFS USBHS(+PHY) CAN +RTC 2*WDG RTC +CAN CAN CAN 2*CAN RTC +2*WDG 4*OPA 2*WDG +RTC RTC RTC RTC 2*WDG +4*OPA RNG 4*OPA +2*WDG 2*WDG 2*WDG 2*WDG 2*OPA +RNG SDIO RNG +2*OPA 2*OPA 4*OPA 4*OPA ETH- +SDIO FSMC SDIO +RNG 10M(+PHY) +FSMC DVP DVP +SDIO BLE5.3 +ETH-1000M ETH-10M/100M +MAC PHY +ETH-10M PHY +注:同一类产品的某些外设数量或功能可能受封装限制,选择时请确认产品封装。 +V2.4 2 + +# Page 3 + +RISC-V内核版本对比概览 +特点 硬件 中断 快速 整数 +扩展 内存 +内核 指令集 堆栈 嵌套 中断 除法 向量表模式 +指令 保护 +版本 级数 级数 通道数 周期 +青稞V4B IMAC 2 2 4 9 地址或指令 支持 无 +青稞V4C IMAC 2 2 4 5 地址或指令 支持 标准 +青稞V4F IMAFC 3 8 4 5 地址或指令 支持 标准 +寄存器中位属性缩写描述: +寄存器位属性 属性描述 +RF 只读属性,读出固定值。 +RO 只读属性,由硬件改变。 +RZ 只读属性,读操作后自动位清0 +WO 只写属性(不可读,读值不确定) +WA 只写属性,安全模式下可写入。 +WZ 只写属性,写操作后自动位清0 +RW 可读,可写。 +RWA 可读,安全模式下可写入。 +RW1 可读,写1有效,写0无效。 +RW0 可读,写0有效,写1无效。 +RW1T 可读,写0无效,写1翻转。 +RW1Z 可读,写1清除此位,写0无效。 +SC 自动清除。 +CH32系列 MCU分类描述: +分类缩写 FLASH大小 产品分类 +D6 32KB或64KB 中小容量通用型 +D8 128KB或256KB 大容量通用型 +D8C 128KB或256KB 连接型或互联型 +D8W 128KB或256KB 无线型 +注:D(Density)、6(2^6)、8(2^8) +具体分类缩写: +CH32F20x_D6包括:CH32F203K8、CH32F203C6、CH32F203C8; +CH32F20x_D8包括:CH32F203CB、CH32F203RC、CH32F203VC、CH32F203RB; +CH32F20x_D8C包括:CH32F205RB、CH32F207VC; +CH32F20x_D8W包括:CH32F208RB、CH32F208WB; +CH32V20x_D6包括:CH32V203F6、CH32V203G6、CH32V203F8、CH32V203G8、CH32V203K8、CH32V203C6、 +CH32V203C8; +CH32V20x_D8包括:CH32V203RB; +CH32V20x_D8W包括:CH32V208GB、CH32V208CB、CH32V208RB、CH32V208WB; +CH32V30x_D8包括:CH32V303CB、CH32V303RB、CH32V303RC、CH32V303VC; +CH32V30x_D8C包括:CH32V305FB、CH32V305RB、CH32V305GB、CH32V307RC、CH32V307WC、CH32V307VC; +CH32V31x_D8C包括:CH32V317SC、CH32V317WC、CH32V317VC。 +V2.4 3 + +# Page 4 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 1 章 存储器和总线架构 +1.1 总线架构 +CH32F20x 系列是基于 ARM○RCortexTM-M3 内核设计的微控制器,其构架中的内核、仲裁单元、DMA +模块和SRAM存储等部分通过多组总线实现交互。 +CH32V20x、CH32V30x 和 CH32V31x 系列产品是基于 RISC-V 指令集设计的通用微控制器,其架构 +中的内核、仲裁单元、DMA模块、SRAM存储等部分通过多组总线实现交互。 +图1-1 CH32F203(中小容量通用型)系统框图 +ARM Cortex-M3 FLASH +I-code Bus +CTRL +TPIU +NVIC SWD D-code Bus Flash +Memory +SRAM +HB to PB2 +Bridge +V2.4 1 +XUM +PB1: +Fmax += +144MHz +@VDD VDD: 2.4V~3.6V +VSS +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +@VDDA VDDA: VIO VSSA +RTC/BKP TAMPER-RTC +TIM2 4 channels, ETR +TIM3 4 channels, ETR +TIM4 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +USART4 RX, TX,CTS,RTE,CK +System +Bus +XUM +HB +Fmax += 144MHz +FS_DP USBFS +FS_DM +RCC +LSI-RC +RTC_CLK +O O P P A A x x _ _ C C H H N P OPA1-2 IWDG_CLK LSE O O S S C C 3 3 2 2 _ _ I O N UT +OPAx_OUT +(x=1,2) +HB to PB1 @VBAT +Bridge +EXTIT/WKUP +PA0 ~ PA15 GPIOA +PB0 ~ PB15 GPIOB +PC0 ~ PC15 GPIOC +PD0 ~ PD2 GPIOD +MOSI,MISO,SCK, NSS SPI1 +RX, TX, CTS, RTS, CK USART1 SPI2 MOSI, MISO, SCK , NSS +4 channels +3 complementary Channels TIM1 IWDG I2C1 SCL, SDA, SMBA +ETR, BIKN +WWDG I2C2 SCL, SDA, SMBA +Tkey +AIN0 ~ AIN9 +ADC1 bxCAN1 CAN1_TX,CAN1_RX +(VSSA)VREF - +ADC2 +(2.4V~VDDA)VREF+ +USBD USBDM,USBDP +Temp Sensor +PB2: +Fmax += 144MHz +TRACESWO +DMA 8Channels +SYSCLK +Reset & HBCLK +MUX & DIV PB1CLK +PB2CLK +HSI-RC +PLL +HSE OSC_IN +OSC_OUT + +# Page 5 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-2 CH32F20x(连接/互联/大容量通用型)系统框图 +ARM Cortex-M3 FLASH I-code Bus +CTRL +TPIU +NVIC SWD D-code Bus Flash +Memory +SRAM +HB to PB1 +Bridge +HB to PB2 +Bridge +EXTIT/WKUP +GPIOB +GPIOC +GPIOD +V2.4 2 +PB2: +Fmax += +144MHz +XUM +PB1: +Fmax += +144MHz +@VDD VDD: 2.4V~3.6V VSS +TRACESWO +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +DMA1 7 Channels @VDDA VDDA: VIO +DMA2 11 Channels VSSA +TXD[3:0],TXCLK,TXEN +MII RXD[3:0 C ] O ,R L X ,M ER D ,R C X ,M C P L D P K S I , O _ R , O X C D U R V T S FSMC A D CL D A K D T[ [ 1 2 5 3 : : 0 1 ] 6] +TXD[1:0],TXEN NOE +RMII RXD[1:0],REFCLK,CRSDV NWE +RGMII T R X X D D [ [ 3 3 : : 0 0 ] ] , M , G R T X D P X C P C C , S , R , M _ T X O X D C E U T IO N T L 10 E / T 1 H 0 0 M /1 A 0 C 00 M R U e X s e & t D & IV S H P Y B B S 1 C C C L L L K K K N N N N B W A E1 L D A [ / V 1 N IT :0 C ] E2 +MDC,MDIO PB2CLK +125IN +RXP, RXN HSI-RC +TXP, TXN 10M PHY +PLL +HSE OSC_IN +VSYN D C A , T H [ S 1 P Y 1 C N : L 0 C K ] DVP RCC OSC_OUT +VBUS OTG_FS LSI-RC ID TRNG RTC_CLK +DP, DM IWDG_CLK LSE OSC32_IN +USBHS OSC32_OUT +HS_DP +PHY +HS_DM @VBAT +RTC/BKP TAMPER-RTC +DAT[7:0] +CM C D K SDIO TIM2 4 channels, ETR +OPAx_CHP OPA1-4 TIM3 4 channels, ETR +OPAx_CHN +OPAx_OUT TIM4 4 channels, ETR +(x=1,2,3,4) +TIM5 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +PA0 ~ PA15 GPIOA UART4 RX, TX +PB0 ~ PB15 UART5 RX, TX +PC0 ~ PC15 UART6 RX, TX +PD0 ~ PD15 UART7 RX, TX +PE0 ~ PE15 GPIOE UART8 RX, TX +MOSI,MISO,SCK, NSS SPI1 SPI2/I2S2 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +RX, TX, CTS, RTS, CK USART1 IWDG SPI3/I2S3 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +4 channels +3 compl. E C T h R a , n B n IK el N s TIM1 WWDG I2C1 SCL, SDA, SMBA +3 compl 4 . C c h h a an n n n e el l s s TIM8 I2C2 SCL, SDA, SMBA +ETR, BIKN +3 compl 4 . C c h h a an n n n e el l s s TIM9 TIM6 bxCAN1 CAN1_TX,CAN1_RX +ETR, BIKN +3 compl 4 . C c h h a an n n n e el l s s TIM10 TIM7 SRAM 512B +ETR, BIKN bxCAN2 CAN2_TX,CAN2_RX +Tkey +AIN0 ~ AIN15 +ADC1 +(2.4V~V (V D S D S A A ) ) V V R R E E F F + - ADC2 DAC1 DAC_OUT1 +DAC2 DAC_OUT2 +Temp Sensor +System +Bus +XUM +HB +Fmax += +144MHz +PLL2 PLL3 +FS_DP USBFS FS_DM +USBD USBDM,USBDP + +# Page 6 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-3 CH32F208(无线型)系统框图 +ARM Cortex-M3 FLASH I-code Bus +CTRL +TPIU +NVIC SWD D-code Bus Flash +Memory +SRAM +HB to PB1 +Bridge +HB to PB2 +Bridge +EXTIT/WKUP +GPIOB +GPIOC +GPIOD +V2.4 3 +PB2: +Fmax += +144MHz +XUM +PB1: +Fmax += 144MHz +@VDD VDD: 2.4V~3.6V VSS +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +@VDDA VDDA: VIO +VSSA +RXP, RXN TXP, TXN +RCC +LSI-RC +RTC_CLK +IWDG_CLK LSE OSC32_IN +OSC32_OUT +@VBAT +RTC/BKP TAMPER-RTC +TIM2 4 channels, ETR +TIM3 4 channels, ETR +PA0 ~ PA15 GPIOA +PB0 ~ PB15 +PC0 ~ PC15 +PD2 SPI2 MOSI, MISO, SCK,NSS +IWDG +WWDG I2C1 SCL, SDA, SMBA +RX, TX, CTS, RTS, CK USART1 I2C2 SCL, SDA, SMBA +bxCAN1 CAN1_TX,CAN1_RX +4 channels +3 complementary Channels TIM1 +ETR, BIKN +AIN0 ~ AIN15 Tkey +(VSSA)VREF - ADC +(2.4V~VDDA)VREF+ +Temp Sensor +System +Bus +XUM +HB +Fmax += +144MHz +TRACESWO +DMA 8 Channels +SYSCLK +Reset & HBCLK +MUX & DIV PB1CLK +PB2CLK 10M PHY +HSI-RC +BLE 5.3 PLL +HSE OSC_IN +OSC_OUT +FS_DP USBFS +FS_DM +OPAx_CHP OPA1-2 +OPAx_CHN +OPAx_OUT +(x=1,2) +TIM4 4 channels, ETR +TIM5 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +UART4 RX, TX +MOSI,MISO,SCK, NSS SPI1 +USBD USBDM,USBDP + +# Page 7 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-4 CH32V203(中小容量通用型)系统框图 +RISC-V (V4B) FLASH +I-code Bus +CTRL +PFIC RV32 +SDI IMAC D-code Bus Flash +Memory +SRAM +HB to PB2 +Bridge +V2.4 4 +XUM +PB1: +Fmax += +144MHz +@VDD VDD: 2.4V~3.6V VSS +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +@VDDA VDDA: VIO VSSA +RTC/BKP TAMPER-RTC +TIM2 4 channels, ETR +TIM3 4 channels, ETR +TIM4 4 channels, ETR +TIM5 4 channels(CH32V203RBx) +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +UART4 RX, TX +System +Bus +XUM +HB +Fmax += 144MHz +FS_DP USBFS +FS_DM +RCC +LSI-RC +RTC_CLK +O O P P A A x x _ _ C C H H N P OPA1-2 IWDG_CLK LSE O O S S C C 3 3 2 2 _ _ I O N UT +OPAx_OUT +(x=1,2) +HB to PB1 @VBAT +Bridge +EXTIT/WKUP +PA0 ~ PA15 GPIOA +PB0 ~ PB15 GPIOB +PC0 ~ PC15 GPIOC +PD0 ~ PD2 GPIOD +MOSI,MISO,SCK, NSS SPI1 +RX, TX, CTS, RTS, CK USART1 SPI2 MOSI, MISO, SCK , NSS +4 channels +3 complementary Channels TIM1 IWDG I2C1 SCL, SDA, SMBA +ETR, BIKN +WWDG I2C2 SCL, SDA, SMBA +Tkey +AIN0 ~ AIN15 +ADC1 bxCAN1 CAN1_TX,CAN1_RX +(VSSA)VREF - +ADC2 +(2.4V~VDDA)VREF+ +USBD USBDM,USBDP +Temp Sensor +PB2: +Fmax += 144MHz +DMA 8Channels +SYSCLK +Reset & HBCLK +MUX & DIV PB1CLK +PB2CLK +HSI-RC +PLL +HSE OSC_IN +OSC_OUT + +# Page 8 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-5 CH32V208(无线型)系统框图 +RISC-V (V4C) FLASH I-code Bus +CTRL +PFIC RV32 +SDI IMAC D-code Bus Flash +Memory +SRAM +HB to PB1 +Bridge +HB to PB2 +Bridge +EXTIT/WKUP +GPIOB +GPIOC +GPIOD +V2.4 5 +PB2: +Fmax = +144MHz +XUM +PB1: +Fmax += 144MHz +@VDD VDD: 2.4V~3.6V VSS +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +@VDDA VDDA: VIO +VSSA +RXP, RXN TXP, TXN +RCC +LSI-RC +RTC_CLK +IWDG_CLK LSE OSC32_IN +OSC32_OUT +@VBAT +RTC/BKP TAMPER-RTC +TIM2 4 channels, ETR +TIM3 4 channels, ETR +PA0 ~ PA15 GPIOA +PB0 ~ PB15 +PC0 ~ PC15 +PD2 SPI2 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +IWDG +WWDG I2C1 SCL, SDA, SMBA +RX, TX, CTS, RTS, CK USART1 I2C2 SCL, SDA, SMBA +bxCAN1 CAN1_TX,CAN1_RX +4 channels +3 complementary Channels TIM1 +ETR, BIKN +AIN0 ~ AIN15 Tkey +(VSSA)VREF - ADC +(2.4V~VDDA)VREF+ +Temp Sensor +System +Bus +XUM +HB +Fmax += +144MHz +DMA 8 Channels +SYSCLK +Reset & HBCLK +MUX & DIV PB1CLK +PB2CLK 10M PHY +HSI-RC +BLE 5.3 PLL +HSE OSC_IN +OSC_OUT +FS_DP USBFS +FS_DM +OPAx_CHP OPA1-2 +OPAx_CHN +OPAx_OUT +(x=1,2) +TIM4 4 channels, ETR +TIM5 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +UART4 RX, TX +MOSI,MISO,SCK, NSS SPI1 +USBD USBDM,USBDP + +# Page 9 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-6 CH32V30x(连接/互联/大容量通用型)系统框图 +RISC-V (V4F) FLASH I-code Bus +CTRL +PFIC RV32 +SDI IMAFC D-code Bus Flash +Memory +SRAM +HB to PB1 +Bridge +HB to PB2 +Bridge +EXTIT/WKUP +GPIOB +GPIOC +GPIOD +V2.4 6 +PB2: +Fmax += +144MHz +XUM +PB1: +Fmax += +144MHz +@VDD VDD: 2.4V~3.6V VSS +SWCLK @VIO33 VIO: 2.4V~3.6V SWDIO VSS +DMA1 7 Channels @VDDA VDDA: VIO +DMA2 11 Channels VSSA +TXD[3:0],TXCLK,TXEN +MII RXD[3:0 C ] O ,R L X ,M ER D ,R C X ,M C P L D P K S I , O _ R , O X C D U R V T S FSMC A D CL D A K D T[ [ 1 2 5 3 : : 0 1 ] 6] +TXD[1:0],TXEN NOE +RMII RXD[1:0],REFCLK,CRSDV NWE +RGMII T R X X D D [ [ 3 3 : : 0 0 ] ] , M , G R T X D P X C P C C , S , R , M _ T X O X D C E U T IO N T L 10 E / T 1 H 0 0 M /1 A 0 C 00 M R U e X s e & t D & IV S H P Y B B S 1 C C C L L L K K K N N N N B W A E1 L D A [ / V 1 N IT :0 C ] E2 +125IN PB2CLK +RXP, RXN HSI-RC +TXP, TXN 10M PHY +PLL +HSE OSC_IN +OSC_OUT +DAT[1 P 1 C : L 0 K ] DVP RCC +VSYNC,HSYNC LSI-RC +USBHS TRNG RTC_CLK +HS_DP +PHY IWDG_CLK LSE OSC32_IN HS_DM OSC32_OUT +@VBAT +RTC/BKP TAMPER-RTC +DAT[7:0] +CM C D K SDIO TIM2 4 channels, ETR +OPAx_CHP OPA1-4 TIM3 4 channels, ETR +OPAx_CHN +OPAx_OUT TIM4 4 channels, ETR +(x=1,2,3,4) +TIM5 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +PA0 ~ PA15 GPIOA UART4 RX, TX +PB0 ~ PB15 UART5 RX, TX +PC0 ~ PC15 UART6 RX, TX +PD0 ~ PD15 UART7 RX, TX +PE0 ~ PE15 GPIOE UART8 RX, TX +MOSI,MISO,SCK, NSS SPI1 SPI2/I2S2 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +RX, TX, CTS, RTS, CK USART1 IWDG SPI3/I2S3 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +4 channels +3 complementary E C T h R a , n B n IK el N s TIM1 WWDG I2C1 SCL, SDA, SMBA +3 Complementary 4 C c h h a an n n n e el l s s TIM8 I2C2 SCL, SDA, SMBA +ETR, BIKN +3 complementary 4 C c h h a an n n n e el l s s TIM9 TIM6 bxCAN1 CAN1_TX,CAN1_RX +ETR, BIKN +3 Complementary 4 C c h h a an n n n e el l s s TIM10 TIM7 SRAM 512B +ETR, BIKN bxCAN2 CAN2_TX,CAN2_RX +Tkey +AIN0 ~ AIN15 +ADC1 +(2.4V~V (V D S D S A A ) ) V V R R E E F F + - ADC2 D D A A C C 2 1 D D A A C C _ _ O O U U T T 1 2 +Temp Sensor +System +Bus +XUM +HB +Fmax += +144MHz +PLL2 +PLL3 +FS_DP,FS_DM USBFS/ +VBUS,ID OTG_FS DP, DM + +# Page 10 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-7 CH32V317(互联型)系统框图 +RISC-V (V4F) FLASH +I-code Bus +CTRL PFIC RV32 +SDI IMAFC D-code Bus Flash +Memory +SRAM +HB to PB1 +Bridge +HB to PB2 +Bridge +EXTIT/WKUP +GPIOB +GPIOC +GPIOD +V2.4 7 +PB2: +Fmax += +144MHz +XUM +PB1: +Fmax += +144MHz +@VDD VDD: 2.4V~3.6V +VSS +@VIO33 VIO: 2.4V~3.6V +SWCLK +VSS +SWDIO @VDDA VDDA: VIO +VSSA +DMA1 7 Channels +DMA2 11 Channels +SYSCLK +ETH MAC Reset & HBCLK +10/100/1000 MUX & DIV PB1CLK +PB2CLK +HSI-RC +PLL +HSE OSC_IN +OSC_OUT +DAT[1 P 1 C : L 0 K ] DVP RCC +VSYNC,HSYNC LSI-RC +USBHS TRNG RTC_CLK +HS_DP +PHY IWDG_CLK LSE OSC32_IN HS_DM OSC32_OUT +@VBAT +RTC/BKP TAMPER-RTC +DAT[7:0] +CM C D K SDIO TIM2 4 channels, ETR +OPAx_CHP OPA1-4 TIM3 4 channels, ETR +OPAx_CHN +OPAx_OUT TIM4 4 channels, ETR +(x=1,2,3,4) +TIM5 4 channels +USART2 RX, TX, CTS, RTS, CK +USART3 RX, TX, CTS, RTS, CK +PA0 ~ PA15 GPIOA UART4 RX, TX +PB0 ~ PB15 UART5 RX, TX +PC0 ~ PC15 UART6 RX, TX +PD0 ~ PD15 UART7 RX, TX +PE0 ~ PE15 GPIOE UART8 RX, TX +MOSI,MISO,SCK, NSS SPI1 SPI2/I2S2 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +RX, TX, CTS, RTS, CK USART1 IWDG SPI3/I2S3 M SC O K S /C I/ K S , D M , M CK IS , O N , S S/WS +4 channels +3 complementary E C T h R a , n B n IK el N s TIM1 WWDG I2C1 SCL, SDA, SMBA +3 Complementary 4 C c h h a an n n n e el l s s TIM8 I2C2 SCL, SDA, SMBA +ETR, BIKN +3 complementary 4 C c h h a an n n n e el l s s TIM9 TIM6 bxCAN1 CAN1_TX,CAN1_RX +ETR, BIKN +3 Complementary 4 C c h h a an n n n e el l s s TIM10 TIM7 SRAM 512B +ETR, BIKN bxCAN2 CAN2_TX,CAN2_RX +Tkey +AIN0 ~ AIN15 +ADC1 +(2.4V~V (V D S D S A A ) ) V V R R E E F F + - ADC2 D D A A C C 2 1 D D A A C C _ _ O O U U T T 1 2 +Temp Sensor +System +Bus +XUM +HB +Fmax += +144MHz +@VDD_ETH VDD_ETH: 3.2V~3.45V VSS +MDITP,MDITN 10/100M +MDIRP, MDIRN PHY PLL2 +PLL3 +FS_DP,FS_DM USBFS/ +VBUS,ID OTG_FS DP, DM +系统中设有:通用DMA控制器用以减轻CPU负担、提高效率;时钟树分级管理用以降低了外设总 +的运行功耗,同时还兼有数据保护机制,时钟安全系统保护机制等措施来增加系统稳定性。 + 指令总线(I-Code)将内核和FLASH指令接口相连,预取指在此总线上完成。 + 数据总线(D-Code)将内核和FLASH数据接口相连,用于常量加载和调试。 + 系统总线将内核和总线矩阵相连,用于协调内核、DMA、SRAM和外设的访问。 + DMA总线负责DMA的HB主控接口与总线矩阵相连,该总线访问对象是FLASH数据、SRAM和外 +设。 + +# Page 11 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 总线矩阵负责的是系统总线、数据总线、DMA总线、SRAM和HB/PB桥之间的访问协调。 + HB/PB桥,为HB总线和两个PB总线提供同步连接。不同的外设挂在不同的PB总线下,可以按 +实际需求配置不同总线时钟,优化性能。 +1.2 存储器映像 +CH32F20x、CH32V20x、CH32V30x和CH32V31x系列产品都包含了程序存储器、数据存储器、内核 +寄存器和外设寄存器等等,它们都在一个4GB的线性空间寻址。 +系统存储以小端格式存放数据,即低字节存放在低地址,高字节存放在高地址。 +V2.4 8 + +# Page 12 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-8 CH32F203(中小容量通用型)存储映像 +0x5005 0400 Reserved +0x5005 0000 +Reserved +0x5004 0000 +USBFS +0x5000 0000 +Reserved +0x4002 8000 +0x4002 6000 +Reserved +0x4002 4000 +0x4002 3C00 +EXTEND +0x4002 3800 +Reserved +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +0x4002 0800 Reserved +0x4002 0400 +DMA +0x4002 0000 +0x4001 8400 +Reserved +0x4001 8000 +0x4001 5400 +0x4001 5000 +Reserved +0x4001 4C00 +0x4001 3C00 +USART1 +0x4001 3800 +Reserved +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +ADC2/TouchKey +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +0x4001 1C00 Reserved +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private +Peripherals 0x4000 7800 Reserved +0xE000 0000 +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +Reserved +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x4000 6000 +0x1FFF FFFF Reserved USBD +Reserved 0x4000 5C00 +I2C2 +0x1FFF F880 0x4000 5800 +Option Bytes 0xA000 0000 I2C1 +0x1FFF F800 0x4000 5400 +Vendor Bytes Reserved +0x1FFF F700 Reserved 0x4000 5000 USART4 +Reserved 0x4000 4C00 +0x1FFF F000 USART3 +0x4000 4800 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +(BOOT_28KB) 0x4000 4000 Reserved +Reserved +0x4000 3C00 +0x1FFF 8000 SPI2 +0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +Reserved Reserved 0x4000 3000 IWDG +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 +Code FLASH Reserved +224KB max +Includes 0 wait and non-0 0x2000 5000 Reserved +waiting areas SRAM (20KBmax) +0x2000 0000 +0x0800 0000 +Aliased to Flash or +system memory FLASH +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 9 + +# Page 13 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-9 CH32F20x(连接/互联/大容量通用型)存储映像 +Reserved +0x5005 0400 +DVP +0x5005 0000 +Reserved +0x5004 0000 +USBFS/OTG_FS +0x5000 0000 +Reserved +0x4002 A000 +Ethernet +0x4002 8000 +Reserved +0x4002 4000 +TRNG +0x4002 3C00 +EXTEND +0x4002 3800 +USBHS +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +Reserved +0x4002 0800 +DMA2 +0x4002 0400 +DMA1 +0x4002 0000 +Reserved +0x4001 8400 +SDIO +0x4001 8000 +Reserved +0x4001 5400 +TIM10 +0x4001 5000 +TIM9 +0x4001 4C00 +Reserved +0x4001 3C00 +USART1 +0x4001 3800 +TIM8 +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +ADC2/TouchKey +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +Reserved +0x4001 1C00 +Port E +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private Reserved +Peripherals 0x4000 7800 +0xE000 0000 DAC +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +bxCAN2 +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x1FFF FFFF Reserved 0x4000 6000 Reserved +Reserved 0x4000 5C00 +0x1FFF F880 Option Bytes 0 0 x x A A 0 0 0 0 0 0 0 1 0 0 0 0 0 0 FSMC register 0x4000 5800 I I 2 2 C C 1 2 +0x1FFF F800 0x4000 5400 +0x1FFF F700 Vendor Bytes Reserved 0x4000 5000 U U A A R R T T 4 5 +0x1FFF F000 Reserved 0x8000 0000 FSMC bank2 NAND(NAND1) 0 0 x x 4 4 0 0 0 0 0 0 4 4 C 8 0 0 0 0 USART3 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +Reserved +(BOOT_28KB) Reserved 0x4000 4000 +SPI3/I2S3 +0x4000 3C00 +0x1FFF 8000 0x6400 0000 SPI2/I2S2 +FSMC bank1 NOR/PSRAM 1 0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +Reserved Reserved 0x4000 3000 IWDG +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 Reserved +0x4000 2400 +Code FLASH Reserved 0x4000 2000 UART8 +480KB max UART7 +0x4000 1C00 +Includes 0 wait and non-0 0x2002 0000 UART6 +waiting areas SRAM (128KBmax) 0x4000 1800 +0x2000 0000 TIM7 +0x0800 0000 0x4000 1400 +TIM6 +Aliased to Flash or 0x4000 1000 +system memory FLASH TIM5 +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 10 + +# Page 14 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-10 CH32F208(无线型)存储映像 +0x5005 0400 Reserved +0x5005 0000 +Reserved +0x5004 0000 +USBFS +0x5000 0000 +Reserved +0x4002 A000 +Ethernet +0x4002 8000 +Reserved +0x4002 6000 +BLE 5.3 +0x4002 4000 +Reserved +0x4002 3C00 +EXTEND +0x4002 3800 +Reserved +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +Reserved +0x4002 0400 +DMA +0x4002 0000 +0x4001 8400 Reserved +0x4001 8000 +0x4001 5400 +Reserved +0x4001 5000 +0x4001 4C00 +Reserved +0x4001 3C00 +USART1 +0x4001 3800 +Reserved +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +Reserved +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +0x4001 1C00 Reserved +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private +Peripherals 0x4000 7800 Reserved +0xE000 0000 +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +Reserved +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x4000 6000 +0x1FFF FFFF Reserved Reserved 0x4000 5C00 USBD +I2C2 +0x1FFF F880 0x4000 5800 +Option Bytes 0xA000 0000 I2C1 +0x1FFF F800 0x4000 5400 +Vendor Bytes Reserved +0x1FFF F700 Reserved 0x4000 5000 UART4 +Reserved 0x4000 4C00 +0x1FFF F000 USART3 +0x4000 4800 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +(BOOT_28KB) Reserved +Reserved +0x4000 3C00 +0x1FFF 8000 SPI2 +0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +Reserved Reserved 0x4000 3000 IWDG +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 +Code FLASH Reserved Reserved +480KB max +Includes 0 wait and non-0 0x2001 0000 +waiting areas SRAM (64KBmax) 0x4000 1800 +0x2000 0000 +0x0800 0000 0x4000 1400 Reserved +Aliased to Flash or 0x4000 1000 +system memory FLASH TIM5 +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 11 + +# Page 15 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-11 CH32V203(中小容量通用型)存储映像 +0x5005 0400 Reserved +0x5005 0000 +Reserved +0x5004 0000 +USBFS +0x5000 0000 +Reserved +0x4002 A000 +Ethernet (CH203RBx) +0x4002 8000 +0x4002 6000 +Reserved +0x4002 4000 +0x4002 3C00 +EXTEND +0x4002 3800 +Reserved +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +0x4002 0800 Reserved +0x4002 0400 +DMA +0x4002 0000 +0x4001 8400 +Reserved +0x4001 8000 +0x4001 5400 +0x4001 5000 +Reserved +0x4001 4C00 +0x4001 3C00 +USART1 +0x4001 3800 +Reserved +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +ADC2/TouchKey +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +0x4001 1C00 Reserved +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private +Peripherals 0x4000 7800 Reserved +0xE000 0000 +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +Reserved +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x4000 6000 +0x1FFF FFFF Reserved USBD +Reserved 0x4000 5C00 +I2C2 +0x1FFF F880 0x4000 5800 +Option Bytes 0xA000 0000 I2C1 +0x1FFF F800 0x4000 5400 +Vendor Bytes Reserved +0x1FFF F700 Reserved 0x4000 5000 UART4 +Reserved 0x4000 4C00 +0x1FFF F000 USART3 +0x4000 4800 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +(BOOT_28KB) 0x4000 4000 Reserved +Reserved +0x4000 3C00 +0x1FFF 8000 SPI2 +0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +Reserved Reserved 0x4000 3000 IWDG +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 +Code FLASH Reserved +224KB max +Reserved +Includes 0 wait and non-0 0x2001 0000 +waiting areas SRAM (64KBmax) +0x2000 0000 +0x0800 0000 +Aliased to Flash or 0x4000 1000 +system memory FLASH TIM5 (CH203RBx) +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 12 + +# Page 16 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-12 CH32V208(无线型)存储映像 +0x5005 0400 +Reserved +0x5005 0000 +0x5004 0000 +USBFS +0x5000 0000 +Reserved +0x4002 A000 +Ethernet +0x4002 8000 +Reserved +0x4002 6000 +BLE 5.3 +0x4002 4000 +Reserved +0x4002 3C00 +EXTEND +0x4002 3800 +Reserved +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +Reserved +0x4002 0400 +DMA +0x4002 0000 +0x4001 8400 +0x4001 8000 +0x4001 5400 Reserved +0x4001 5000 +0x4001 4C00 +0x4001 3C00 +USART1 +0x4001 3800 +Reserved +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +Reserved +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +0x4001 1C00 Reserved +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private +Peripherals 0x4000 7800 Reserved +0xE000 0000 +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +Reserved +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x4000 6000 +0x1FFF FFFF Reserved USBD +Reserved 0x4000 5C00 +I2C2 +0x1FFF F880 0x4000 5800 +Option Bytes 0xA000 0000 I2C1 +0x1FFF F800 0x4000 5400 +Vendor Bytes Reserved +0x1FFF F700 0x4000 5000 +Reserved UART4 +Reserved 0x4000 4C00 +0x1FFF F000 USART3 +0x4000 4800 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +(BOOT_28KB) Reserved +Reserved +0x4000 3C00 +0x1FFF 8000 SPI2 +0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +IWDG +Reserved Reserved 0x4000 3000 +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 +Code FLASH Reserved Reserved +480KB max +Includes 0 wait and non-0 0x2001 0000 +waiting areas SRAM (64KBmax) 0x4000 1800 +0x2000 0000 +0x0800 0000 0x4000 1400 Reserved +Aliased to Flash or 0x4000 1000 +system memory FLASH TIM5 +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 13 + +# Page 17 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图1-13 CH32V30x(连接/互联/大容量通用型)和CH32V31x(互联型)存储映像 +Reserved +0x5005 0400 +DVP +0x5005 0000 +Reserved +0x5004 0000 +USBFS/OTG_FS +0x5000 0000 +Reserved +0x4002 A000 +Ethernet +0x4002 8000 +Reserved +0x4002 4000 +TRNG +0x4002 3C00 +EXTEND +0x4002 3800 +USBHS +0x4002 3400 +CRC +0x4002 3000 +Reserved +0x4002 2400 +Flash Interface +0x4002 2000 +Reserved +0x4002 1400 +RCC +0x4002 1000 +Reserved +0x4002 0800 +DMA2 +0x4002 0400 +DMA1 +0x4002 0000 +Reserved +0x4001 8400 +SDIO +0x4001 8000 +Reserved +0x4001 5400 +TIM10 +0x4001 5000 +TIM9 +0x4001 4C00 +Reserved +0x4001 3C00 +USART1 +0x4001 3800 +TIM8 +0x4001 3400 +SPI1 +0x4001 3000 +TIM1 +0x4001 2C00 +ADC2/TouchKey +0x4001 2800 +ADC1/TouchKey +0x4001 2400 +Reserved +0x4001 1C00 +Port E +0x4001 1800 +Port D +0x4001 1400 +Port C +0x4001 1000 +Port B +0x4001 0C00 +Port A +0xFFFF FFFFF 0x4001 0800 +Reserved 0x4001 0400 EXTI +AFIO +0xE010 0000 0x4001 0000 +Core Private Reserved +Peripherals 0x4000 7800 +0xE000 0000 DAC +0x4000 7400 +PWR +0x4000 7000 +Reserved BKP +0x4000 6C00 +bxCAN2 +0x4000 6800 +0xC000 0000 bxCAN1 +0x4000 6400 +share 512B SRAM +0x1FFF FFFF Reserved 0x4000 6000 Reserved +Reserved 0x4000 5C00 +0x1FFF F880 Option Bytes 0 0 x x A A 0 0 0 0 0 0 0 1 0 0 0 0 0 0 FSMC register 0x4000 5800 I I 2 2 C C 1 2 +0x1FFF F800 0x4000 5400 +0x1FFF F700 Vendor Bytes Reserved 0x4000 5000 U U A A R R T T 4 5 +0x1FFF F000 Reserved 0x70FF FFFF FSMC bank2 NAND(NAND1) 0 0 x x 4 4 0 0 0 0 0 0 4 4 C 8 0 0 0 0 USART3 +0x7000 0000 USART2 +System FLASH 0x4000 4400 +Reserved +(BOOT_28KB) Reserved 0x4000 4000 +SPI3/I2S3 +0x4000 3C00 +0x1FFF 8000 0x60FF FFFF SPI2/I2S2 +FSMC bank1 NOR/PSRAM 1 0x4000 3800 +0x6000 0000 Reserved +0x4000 3400 +Reserved Reserved 0x4000 3000 IWDG +WWDG +0x4000 2C00 +RTC +Peripherals 0x4000 2800 +0x4000 0000 Reserved +0x4000 2400 +Code FLASH Reserved 0x4000 2000 UART8 +480KB max UART7 +0x4000 1C00 +Includes 0 wait and non-0 0x2001 0000 UART6 +waiting areas SRAM (128KBmax) 0x4000 1800 +0x2000 0000 TIM7 +0x0800 0000 0x4000 1400 +TIM6 +Aliased to Flash or 0x4000 1000 +system memory FLASH TIM5 +depending on 0x4000 0C00 TIM4 +BOOT pins 0x4000 0800 +0x0000 0000 0x0000 0000 TIM3 +0x4000 0400 +4G线性地址空间 0x4000 0000 TIM2 +V2.4 14 + +# Page 18 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1.2.1 位段访问 +位操作就是单独读写一个比特位的操作。CH32F20x 产品中通过映射的处理方式提供了对外设寄 +存器和SRAM区内容的位操作读写。具体方法: +1)通过对映射地址区域32位的数据进行读操作,读出的值为0或非0,获取目标位域值是0或1; +2)通过对映射地址区域32位的数据进行写操作,写入0或1,修改目标位域值为0或1。 +地址映射: +目标位域:基地址(BEaddr) + 偏移地址(Ofaddr) + 位号(BitN) +映射地址:Mapaddr +Mapaddr = BEaddr + 0x2000000 + (Ofaddr*32) + (BitN*4) +举例1:对SRAM区的0x20000100地址字节中的bit3目标位域进行操作: +Mapaddr= 0x20000000+0x2000000+(0x100*32)+(3*4)= 0x2200200C +则读取 0x2200200C 地址的 4 字节数据内容可知 0x20000100 地址字节中的 bit3 是 0 还是 1;对 +0x2200200C地址执行写0或1操作,可以修改0x20000100地址字节中的bit3为0还是1。 +举例2:对外设区域的0x40021000地址中的bit24进行操作: +Mapaddr = 0x40000000+0x2000000+(0x21000*32)+(24*4)= 0x42420060 +则读取0x22420060地址的4字节数据内容可知0x40021000外设地址中的bit24是0还是1;对 +0x22420060地址执行写0或1操作,可以修改0x40021000外设地址中的bit24为0还是1。 +注:CH32V20x、CH32V30x和CH32V31x产品不支持位段映射访问方式。 +1.2.2 存储器分配 +内置最大128K字节的SRAM,起始地址0x20000000,支持字节、半字(2字节)、全字(4字节) +访问。 +内置最大480K字节的程序闪存存储区(CodeFlash),用于存储用户应用程序。 +内置28K字节的系统存储器(bootloader),用于存储系统引导程序(厂家固化自举加载程序)。 +内置128字节空间用于厂商配置字存储,出厂前固化,用户不可修改。 +内置128字节空间用于用户选择字存储。 +注:储存器分配各型号不同,具体参考芯片对应数据手册。 +1.3 启动配置 +系统可以通过BOOT0和BOOT1引脚来选择三种不同的启动模式。 +表1-1 启动模式 +BOOT0 BOOT1 启动模式 +0 X 从程序闪存存储器启动 +1 0 从系统存储器启动 +1 1 从内部SRAM启动 +用户通过设置 BOOT 引脚的状态值来选择复位后的启动模式。系统复位后或者电源复位都会导致 +BOOT引脚的值被重新锁存。 +启动模式不同,程序闪存存储器、系统存储器和内部SRAM有着不同的访问方式: + 从程序闪存存储器启动时,程序闪存存储器地址被映射到 0x00000000 地址区域,同时也能够在 +原地址区域0x08000000访问。 + 从系统存储器启动时,系统存储器地址被映射到 0x00000000 地址区域,同时也能够在原地址区 +域0x1FFF8000访问。 + 从内部 SRAM 启动,只能够从 0x20000000 地址区域访问。对于 CH32F20x系列产品,在此区域启 +动时,需要通过 NVIC 控制器设置向量表偏移寄存器,重映射向量表到 SRAM 中。对于 CH32V20x、 +CH32V30x和CH32V31x系列产品无需此动作。 +V2.4 15 + +# Page 19 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 2 章 电源控制(PWR) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +2.1 概述 +CH32F20x、CH32V20x、CH32V30x产品系统工作电压V 范围为2.4(1)~3.6V,CH32V31x产品系统 +DD +工作电压 V 范围为 2.4(1)~3.6V,内置电压调节器提供内核所需的工作电源。当主电源 V 掉电后, +DD DD +电池等后备电源可通过V 引脚为实时时钟(RTC)和后备寄存器提供电源,如果无需后备电源,建议 +BAT +将V 直接连接到V 引脚上。 +DD BAT +注:(1)对于FEATURE_SIGN寄存器VLEVEL位为1的芯片,系统工作电压V 支持最低供电电压为 +DD +2.4V;对于VLEVEL位为0的芯片,系统工作电压V 支持最低供电电压为1.8V。 +DD +对于CH32V31x产品还包括了以下参数(具体数据参考CH32V307DS0手册): +(1)V :为内置的以太网10/100M PHY供电。 +DD_ETH +(2)V :内部电源LDO退耦端,需外接退耦电容。 +DDK +V 和V 引脚专门为系统中模拟相关电路供电,包括ADC、DAC、温度传感器等。V 和V 作为 +DDA SSA REF+ REF- +一些模拟电路的参考点,在芯片内部等于V 及V 。 +DDA SSA +图2-1 电源结构框图 +VDDA power supply domain +V REF+ AD converter +V DA converter +REF- +Temperature +V sensor +DDA +Reset module +V +SSA PLL +OPA&CMP Core +Power +VDD power supply domain supply area +CPU cores +I/O circuit +memory +V +DD Standby circuit +(Wake-up logic, Built-in +V IWDG) digital +SS +periphera +Voltage regulator ls +Low voltage detector +Back-up power supply domain +LSE 32K crystal oscillator +V +BAT Back-up register +RCC BDCR register +RTC +在主电源 V 掉电后,模拟开关切换至 V ,后备区域由 V 引脚供电,此时 PC13~15 无法作为 +DD BAT BAT +GPIO,仅可使用如下功能: + PC13可以作为TAMPER引脚、RTC闹钟或秒输出。 + PC14和PC15只能用作LSE引脚。 +当主电源V 上电稳定后,系统自动切换后备区域由V 供电,PC13~15可以用作GPIO功能。 +DD DD +当PC13~15引脚作为GPIO输出时,速度必须限制在2MHz以下,最大负载电容为30pF,并且禁 +V2.4 16 + +# Page 20 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +止用在持续输出和吸入电流的场合,比如LED驱动。 +注:在主电源V 恢复供电过程中,内部V 电源仍然通过对应的V 引脚连在外部备用电源上,若V +DD BAT BAT DD +在小于复位滞后时间t 内就达到稳定,并且高于V 的值0.6V以上,则有可能存在较短瞬间,电 +RSTTEMPO BAT +流通过V 与V 之间的二极管灌入V ,进而通过V 引脚注入电池等后备电源,如果后备电源无法 +DD BAT BAT BAT +承受这样瞬时注入电流,建议在后备电源和V 引脚之间加一只正向导通低压降二极管。 +BAT +2.2 电源管理 +2.2.1 上电复位和掉电复位 +系统内部集成了上电复位POR和掉电复位PDR电路,当芯片供电电压V 和V 低于对应门限电压 +DD DDA +时,系统被相关电路复位,无需外置额外的复位电路。上电门限电压 V 和掉电门限电压 V 的参数 +POR PDR +请参考对应的数据手册。 +图2-2 POR和PDR的工作示意图 +V +DD(A) +V +POR +40-110mV Hysteresis +V +PDR +Reset lag time +t +RSTTEMPO +Reset signal 0 1 0 +2.2.2 可编程电压监测器 +可编程电压监测器 PVD,主要被用于监控系统主电源的变化,与电源控制寄存器 PWR_CTLR 的 +PLS[2:0]所设置的门槛电压相比较,配合外部中断寄存器(EXTI)设置,可产生相关中断,以便及时 +通知系统进行数据保存等掉电前操作。 +具体配置如下: +1) 设置PWR_CTLR寄存器的PLS[2:0]域,选择要监控电压阈值。 +2) 可选的中断处理。PVD功能内部连接EXTI模块的第16线的上升/下降边沿触发设置,开启此中断 +(配置EXTI),当V 下降到PVD阈值以下或上升到PVD阈值之上时就会产生PVD中断。 +DD +3) 设置PWR_CTLR寄存器的PVDE位来开启PVD功能。 +4) 读取 PWR_CSR 状态寄存器的 PVDO 位可获取当前系统主电源与 PLS[2:0]设置阈值关系,执行相应 +软处理。当 V 电压高于 PLS[2:0]设置阈值,PVDO 位置 0;当 V 电压低于 PLS[2:0]设置阈值, +DD DD +PVDO位置1。 +V2.4 17 + +# Page 21 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图2-3 PVD的工作示意图 +V +DD(A) +PVD Approx. +threshold 200mV +hysteresis +PVD +output +1 0 1 +2.3 低功耗模式 +在系统复位后,微控制器处于正常工作状态(运行模式),此时可以通过降低系统主频或者关闭 +不用外设时钟或者降低工作外设时钟来节省系统功耗。如果系统不需要工作,可设置系统进入低功耗 +模式,并通过特定事件让系统跳出此状态。 +微控制器目前提供了3种低功耗模式,从处理器、外设、电压调节器等的工作差异上分为: + 睡眠模式:内核停止运行,所有外设(包含内核私有外设)仍在运行。 + 停止模式:停止所有时钟,唤醒后系统继续运行。 + 待机模式:停止所有时钟,唤醒后微控制器复位(电源复位)。 +表2-1 低功耗模式一览 +模式 进入 唤醒源 对时钟的影响 电压调节器 +WFI 任意中断唤醒 内核时钟关闭, +睡眠 正常 +WFE 唤醒事件唤醒 其他时钟无影响 +SLEEPDEEP置1 +任一外部中断/事件(在外部 关闭HSE、HSI、 正常:LPDS=0或 +停止 PDDS清0 +中断寄存器中设置) PLL和外设时钟 低功耗:LPDS=1 +WFI或WFE +WKUP引脚上升沿、RTC闹钟事 +SLEEPDEEP置1 +件、NRST 引脚复位、IWDG 复 关闭HSE、HSI、 +待机 PDDS置1 关闭 +位。注:任意事件也可以唤醒 PLL和外设时钟 +WFI或WFE +系统,但唤醒后系统复位。 +注:SLEEPDEEP位属于内核私有外设控制位,CH32F20x产品参考Cortex-M3内核手册,CH32V20x、 +CH32V30x和CH32V31x产品参考PFIC_SCTLR寄存器。 +2.3.1 低功耗配置选项 + WFI和WFE方式 +WFI:微控制器被具有中断控制器响应的中断源唤醒,系统唤醒后,将最先执行中断服务函数 +(微控制器复位除外)。 +WFE:唤醒事件触发微控制器将退出低功耗模式。唤醒事件包括: +1) 配置一个外部或内部的EXTI线为事件模式,此时无需配置中断控制器; +2) 或者配置某个中断源,等效为WFI唤醒,系统优先执行中断服务函数; +3) 或者配置SEVONPEND位,开启外设中断使能,但不开启中断控制器中的中断使能,系统唤醒后需 +要清除中断挂起位。 + SLEEPONEXIT +启用:执行WFI或WFE指令后,微控制器确保所有待处理的中断服务退出后进入低功耗模式。 +不启用:执行WFI或WFE指令后,微控制器立即进入低功耗模式。 +V2.4 18 + +# Page 22 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + SEVONPEND +启用:所有中断或者唤醒事件都可以唤醒通过执行WFE进入的低功耗。 +不启用:只有在中断控制器中使能的中断或者唤醒事件可以唤醒通过执行WFE进入的低功耗。 +2.3.2 睡眠模式 +此模式下,所有的 IO 引脚都保持他们运行模式下的状态,所有的外设时钟都正常,所以进入睡 +眠模式前,尽量关闭无用的外设时钟,以减低功耗。该模式唤醒所需时间最短。 +进入:配置内核寄存器控制位 SLEEPDEEP=0,电源控制寄存器 PDDS=0,LPDS 决定内部调压器状 +态,执行WFI或WFE,可选SEVONPEND和SLEEPONEXIT。 +退出:任意中断或者唤醒事件。 +2.3.3 停止模式 +停止模式是在内核的深睡眠模式(SLEEPDEEP)基础上结合了外设的时钟控制机制,并让电压调 +节器的运行处于更低功耗的状态。此模式高频时钟(HSE/HSI/PLL)域被关闭,SRAM和寄存器内容保 +持,IO引脚状态保持。该模式唤醒后系统可以继续运行,HSI为默认系统时钟。 +如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式;如果正在进行对 PB 的访 +问,直到对PB访问完成,系统才进入停止模式。 +停止模式下可工作模块:独立看门狗(IWDG)、实时时钟(RTC)、低频时钟(LSI/LSE)。 +进入:配置内核寄存器控制位SLEEPDEEP=1,电源控制寄存器的PDDS=0,可选LPDS位,执行WFI +或WFE,可选SEVONPEND和SLEEPONEXIT。 +退出:任一外部中断/事件(在外部中断寄存器中设置)。 +在停止模式下,可选 LPDS 位,LPDS=0,电压调节器工作在正常模式;LPDS=1,电压调节器工作 +在低功耗模式。在低功耗模式下,可以通过配置PWR_CTLR寄存器的RAMLV=1,使能RAM低电压模式, +功耗达到最低。 +2.3.4 待机模式 +待机模式下,电压调节器关闭,除唤醒电路和后备域电路之外的电路将断电,实现最低功耗,在 +指定的唤醒条件下退出后,微控制器将被复位,并执行的是电源复位。 +待机模式下可工作模块:独立看门狗(IWDG)、实时时钟(RTC)、低频时钟(LSI/LSE)。 +进入:配置内核寄存器控制位SLEEPDEEP=1,电源控制寄存器的PDDS=1,执行WFI或WFE,可选 +SEVONPEND和SLEEPONEXIT。 +退出: +1) 任一事件(在外部中断寄存器中设置),此唤醒后微控制器执行电源复位。 +2) WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位,此唤醒后微 +控制器执行电源复位。 +在待机模式下,当正常供电时,通过配置PWR_CTLR寄存器的R2KSTY=1控制2K字节RAM不掉电, +R30KSTY=1控制30K字节RAM不掉电;当使用 VBAT供电时,通过配置 PWR_CTLR寄存器的 R2KVBAT=1 +控制2K字节RAM不掉电,R32K_VBATEN =1控制30K字节RAM不掉电。在该基础之上,可以通过配置 +PWR_CTLR寄存器的RAMLV=1,使能RAM低电压模式,功耗达到最低。 +注:调试模式下,使微处理器进入停止或待机模式,将失去调试连接。 +R2KSTY=1控制2K字节RAM的地址范围:0x20000000—0x20000000+2K +R30KSTY=1控制30K字节RAM的地址范围:0x20000000+2K—0x20000000+2K+30K +2.3.5 RTC 自动唤醒 +RTC可以实现无需外部中断的情况下自动唤醒。通过对时间基数进行编程,可周期性地从停止或 +待机模式下唤醒。 +V2.4 19 + +# Page 23 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +可选择精准的外部低频 32.768kHz 晶振 LSE 作为 RTC 时钟源,也可以选择内部 LSI 振荡器作为 +RTC时钟源,LSI的精度和功耗指标要差于LSE。 +RTC闹钟事件能够把MCU从停机模式下唤醒,为了实现此功能,需要配置外部中断线17,并且把 +RTC设置成可产生闹钟事件。而从待机模式下唤醒,仅需把RTC设置成可产生闹钟事件。 +2.4 寄存器描述 +表2-2 PWR相关寄存器列表 +名称 访问地址 描述 复位值 +R32_PWR_CTLR 0x40007000 电源控制寄存器 0x00000000 +R32_PWR_CSR 0x40007004 电源控制/状态寄存器 0x00000000 +2.4.1 电源控制寄存器(PWR_CTLR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RAM R30K R2K R30K R2K +Reserved +LV VBAT VBAT STY STY +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DBP PLS[2:0] PVDE CSBF CWUF PDDS LPDS +位 名称 访问 描述 复位值 +[31:21] Reserved RO 保留。 0 +RAM工作在低电压模式使能控制位(功耗相对更低): +20 RAMLV RW 0:关闭; 1:开启。 0 +注:在PWR_CTLR寄存器的LPDS位为1时有效。 +VBAT供电时,Standby模式下 30K RAM是否带电控制 +位: +0:不带电; 1:带电。 +19 R30KVBAT RW 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C 、 CH32V31x_D8C 、 CH32V20x_D8 、 +CH32V20x_D8W、CH32F20x_D8。 +VBAT 供电时,Standby 模式下 2K RAM 是否带电控制 +位: +0:不带电; 1:带电。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C 、 CH32V31x_D8C 、 CH32V20x_D8 、 +18 R2KVBAT RW CH32V20x_D8W、CH32F20x_D8。 0 +VBAT供电时,Standby模式下 20K RAM是否带电控制 +位: +0:不带电; 1:带电。 +注:适用于CH32F20x_D6、CH32V20x_D6。 +Standby模式下30K RAM是否带电控制位: +17 R30KSTY RW 0:不带电; 1:带电。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +V2.4 20 + +# Page 24 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CH32V30x_D8C 、 CH32V31x_D8C 、 CH32V20x_D8 、 +CH32V20x_D8W、CH32F20x_D8。 +Standby模式下2K RAM是否带电控制位: +0:不带电; 1:带电。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C 、 CH32V31x_D8C 、 CH32V20x_D8 、 +16 R2KSTY RW CH32V20x_D8W、CH32F20x_D8。 0 +Standby模式下20K RAM是否带电控制位: +0:不带电; 1:带电。 +注:适用于CH32F20x_D6、CH32V20x_D6。 +[15:9] Reserved RO 保留。 0 +后备区域的写使能。当 RTC 时钟为外部时钟的 128 分 +频时,该位必须设置为1。 +8 DBP RW 0 +0:禁止写RTC和后备寄存器; +1:允许写RTC和后备寄存器。 +PVD电压监测阈值设置。详细说明见数据手册中电气特 +性部分。 +适用于VLEVEL位为1(V 电压为2.4V)的产品: +DD +000:上升沿2.37V/下降沿2.29V; +001:上升沿2.55V/下降沿2.46V; +010:上升沿2.63V/下降沿2.55V; +011:上升沿2.76V/下降沿2.67V; +100:上升沿2.87V/下降沿2.78V; +101:上升沿3.03V/下降沿2.93V; +110:上升沿3.18V/下降沿3.06V; +[7:5] PLS[2:0] RW 111:上升沿3.29V/下降沿3.19V。 000b +适用于VLEVEL位为0(V 电压为1.8V)的产品: +DD +000:上升沿2.19V/下降沿2.13V; +001:上升沿2.33V/下降沿2.25V; +010:上升沿2.39V/下降沿2.32V; +011:上升沿2.48V/下降沿2.42V; +100:上升沿2.57V/下降沿2.51V; +101:上升沿2.69V/下降沿2.61V; +110:上升沿2.78V/下降沿2.69V; +111:上升沿2.88V/下降沿2.79V。 +电源电压监测功能使能标志位: +4 PVDE RW 0:禁止电源电压监测功能; 0 +1:开启电源电压监测功能。 +清除待机状态标志位,读出始终为0。 +3 CSBF RW1 0:清0无效; 0 +1:置1清除SBF待机状态标志位。 +清除唤醒状态标志位,读出始终为0。 +2 CWUF RW1 0:清0无效; 0 +1:置1后2个系统时钟周期后清除WUF标志位。 +V2.4 21 + +# Page 25 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +掉电深睡眠情景下,待机/停机模式选择位。 +1 PDDS RW 0:进入停机模式,电压调节器状态由LPDS控制; 0 +1:进入待机模式。 +停机模式下,电压调节器工作模式选择位。PDDS=0,该 +位有效。 +0 LPDS RW 0 +0:电压调节器工作在正常模式; +1:电压调节器工作在低功耗模式。 +注:此寄存器BIT16~BIT20只能由backup复位,其他BIT从待机模式唤醒时复位。 +2.4.2 电源控制/状态寄存器(PWR_CSR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved EWUP Reserved PVDO SBF WUF +位 名称 访问 描述 复位值 +[31:9] Reserved RO 保留。 0 +WKUP引脚使能位: +0:WKUP引脚可用于通用IO,无待机唤醒功能; +8 EWUP RW 0 +1:WKUP强制配置为输入下拉状态,用于把MCU从待机 +状态下唤醒。 +[7:3] Reserved RO 保留。 0 +PVD 输出状态标志位。当 PWR_CTLR 寄存器的 PVDE=1 +时,该位有效。 +2 PVDO RO 0 +0:V 和V 高于PLS[2:0]设定的PVD阈值; +DD DDA +1:V 和V 低于PLS[2:0]设定的PVD阈值。 +DD DDA +待机状态标志位,可通过CSBF位置1清除。 +1 SBF RO 0:MCU不在待机模式; 0 +1:MCU进入待机模式。 +唤醒事件状态标志位,可通过CWUF位置1清除。 +0 WUF RO 0:没有唤醒事件发生; 0 +1:在WKUP引脚检测到唤醒事件或RTC闹钟事件。 +注:此寄存器从待机模式唤醒后保持不变。 +V2.4 22 + +# Page 26 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 3 章 复位和时钟控制(RCC) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +控制器根据电源区域的划分以及应用中的外设功耗管理考虑,提供了不同的复位形式以及可配置 +的时钟树结构。此章节描述了系统中各个时钟的作用域。 +3.1 主要特性 + 多种复位形式 + 多路时钟源,总线时钟管理 + 内置外部晶体振荡监测和时钟安全系统 + 各外设时钟独立管理:复位、开启、关闭 + 支持内部时钟输出 +3.2 复位 +控制器提供了3种复位形式:电源复位、系统复位和后备区域复位。 +3.2.1 电源复位 +电源复位发生时,将复位除了后备区域外的所有寄存器(后备区域由V 供电)。 +BAT +其产生条件包括: + 上电/掉电复位(POR/PDR复位) + 从待机模式下唤醒 +3.2.2 系统复位 +系统复位发生时,将复位除了控制/状态寄存器 RCC_RSTSCKR 中的复位标志和后备区域外的所有 +寄存器。通过查看RCC_RSTSCKR寄存器中的复位状态标志位识别复位事件来源。 +其产生条件包括: + NRST引脚上的低电平信号(外部复位) + 窗口看门狗计数终止(WWDG复位) + 独立看门狗计数终止(IWDG复位) + 软件复位(SW复位) + 低功耗管理复位 +窗口/独立看门狗复位:由窗口/独立看门狗外设定时器计数周期溢出触发产生,详细描述看其相 +应章节。 +软件复位:CH32F20x产品通过内核寄存器AIRCR中的bit2置1复位系统,具体操作请参考Cortex- +M3 内核手册获得更详细信息。CH32V20x、CH32V30x和 CH32V31x 产品通过可编程中断控制器 PFIC中 +的中断配置寄存器 PFIC_CFGR 的 SYSRST 位置 1 复位系统或配置寄存器 PFIC_SCTLR 的 SYSRST 位置 1 +复位系统,具体参考对应章节。 +低功耗管理复位:通过将用户选择字节中的STANDY_RST位置0,将启用待机模式复位。这时执行 +了进入待机模式的过程后,将执行系统复位而不是进入待机模式。通过将用户选择字节中的STOP_RST +位置0,将启用停机模式复位。这时执行了进入停机模式的过程后,将执行系统复位而不是进入停机 +模式。 +V2.4 23 + +# Page 27 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图3-1系统复位结构 +V /V +DD DDA +R +PU +NRST +System +Reset +Power Reset +Software Reset +WWDG Reset +IWDG Reset +Low-power management reset +3.2.3 后备区域复位 +后备区域复位发生时,只会复位后备区域寄存器,包括后备寄存器、RCC_BDCTLR寄存器(RTC使 +能和LSE振荡器)。其产生条件包括: + 在V 和V 都掉电的前提下,由V 或V 上电引起 +DD BAT DD BAT + RCC_BDCTLR寄存器的BDRST位置1 +V2.4 24 + +# Page 28 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3.3 时钟 +3.3.1 系统时钟结构 +图3-2 CH32V305/307/317和CH32F205/207时钟树框图 +40kHz IWDGCLK +LSI RC to independent watchdog +OSC32_IN 32.768kHz RTCCLK +OSC32_OUT LSE OSC to RTC 60MHz ETH-PHY +/128 PLL3MUL to I2S2 interface +PLL3CLK +*2.5,*4,… +to I2S3 interface +*16,*20 +PLL3VCO +(2*PLL3CLK) to TRNG +PREDIV2 PLL2MUL +PREDIV1SRC +/1,/2,… *2.5,*4,… +PREDIV1 +/15,/16 *16,*20 +PLLSRC +XTI to MCO /1,/2,… +PLL2VCO /15,/16 PLLMUL SW +OSC_IN 3-25MHz (2*PLL2CLK) +*3,*4,… +OSC_OUT HSE OSC /2 *16,*18 PLLCLK +8MHz +HSI RC SYSCLK +HSI +PLLCLK USB /1 p ,/ re 2 s ,/ c 3 aler 48MHz USBCLK HSE +/1,/2,… USB +/7,/8 HSPLL CLKFLS48MHz OTGFSCLK CSS +HSPLLSRC USBHSPREDIV USB2.0 PHY OTGFSSRC +480MHz +MCO[3:0] +/1,/2 to Flash prog IF +HSE +HSI to HB bus/core/memory/DMA +HB prescaler +/1,/2…/512 FCLK core free running clock +PLLCLK/2 +MCO +PLL2CLK /8 to Core System timer +PLL3CLK/2 +PLL3CLK PB1 prescaler PCLK1 +XTI HCLK /1,/2…/16 to PB1 peripherals +144MHz max +peripheral clock enable +MII_TXC MACTXCLK MII/RMII interface i e f l ( s P e B 1 * 2 prescaler=1)*1 TIMxCLK to TIM2,3,4,5,6,7 +peripheral clock enable +MII_RMII_SEL in AFIO_MAPR +MII_RXC MACRXCLK PB2 prescaler +to Ethernet PCLK2 +MAC /1,/2…/16 to PB2 peripherals +GTXC +GTXC peripheral clock enable +RGMIION +ADC prescaler +GRXC GRXC /2,/4,/6,/8 ADCCLK to ADC1,2 +ETH1G_EN peripheral clock enable +EXT_125M +PLL2VCO ETH1G_125M if(PB2 prescaler=1)*1 TIMxCLK +PLL3VCO else *2 to TIM1,8,9,10 +ETH1G_SRC RGMII interface peripheral clock enable +注:本时钟树适用于CH32F20x_D8C和CH32V30x_D8C、CH32V31x_D8C。 +V2.4 25 + +# Page 29 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图3-3 CH32F203/V203/V303时钟树框图 +40kHz IWDGCLK +LSI RC to independent watchdog +OSC32_IN 32.768kHz RTCCLK +LSE OSC to RTC +OSC32_OUT +/128 +USB prescaler +48MHz +/1,/2,/3 USBCLK +OSC_IN 3-25MHz PLLXTPRE PLLSRC peripheral clock enable +PLLMUL +OSC_OUT HSE OSC SW +/2 *3,*4,… to I2S2 interface +PLLCLK +/2 *16,*18 +8MHz to I2S3 interface +HSI RC HSI SYSCLK +to TRNG +HSE +CSS +MCO[3:0] +HB prescaler +/1,/2…/512 /1,/2 to Flash prog IF +HSI +MCO +HSE to HB bus/core/memory/DMA +PLLCLK/2 +FCLK core free running clock +/8 to Core System timer +PB1 prescaler PCLK1 +HCLK /1,/2…/16 to PB1 peripherals +144MHz max +peripheral clock enable +if(PB1 prescaler=1)*1 TIMxCLK +else *2 to TIM2,3,4,5,6,7 +peripheral clock enable +PB2 prescaler +PCLK2 +/1,/2…/16 to PB2 peripherals +peripheral clock enable +ADC prescaler +/2,/4,/6,/8 ADCCLK to ADC1,2 +peripheral clock enable +if(PB2 prescaler=1)*1 TIMxCLK +else *2 to TIM1,8,9,10 +peripheral clock enable +注:本时钟树适用于CH32F20x_D6、CH32F20x_D8、CH32V20x_D6和CH32V30x_D8。当使用USB功能时, +CPU的频率必须是48MHz、96MHz或144MHz。使用USB高速功能时,USBHSPLL的时钟源只能为HSE。 +当系统从停止或待机模式唤醒时系统会自动切换为HSI做主频。 +V2.4 26 + +# Page 30 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图3-4 CH32V203RB时钟树结构 +32kHz IWDGCLK +LSI RC to independent watchdog +OSC32_IN 32.768kHz RTCCLK +LSE OSC to RTC +OSC32_OUT +/512 +USB prescaler +/1,/2,/3,/5 48MHz +PLLXTPRE USBCLK +USBPRE +/4 PLLSRC perpheral clock enable +OSC_IN 32MHz /8 +OSC_OUT HSE OSC /2 PLLMUL SW +*3,*4,… +PLLCLK +/2 *16,*18 +8MHz +HSI RC HSI SYSCLK +HSE +CSS +MCO[3:0] +HB prescaler /1,/2 to Flash prog IF +/1,/2…/512 +HSI to HB bus/core/memory/DMA +MCO +HSE +FCLK core free running clock +PLLCLK/2 +to Core System timer +/8 +/1,/2 60MHz +ETH-PHY +ETH clock enable +HCLK +144MHz max +PB1 prescaler PCLK1 +/1,/2…/16 to PB1 peripherals +perpheral clock enable +if(PB1 prescaler=1)*1 TIMxCLK +else *2 to TIM2,3,4,5 +perpheral clock enable +PB2 prescaler +PCLK2 +/1,/2…/16 to PB2 peripherals +perpheral clock enable +ADC prescaler +/2,/4,/6,/8 ADCCLK to ADC1 +perpheral clock enable +if(PB2 prescaler=1)*1 TIMxCLK +else *2 to TIM1 +perpheral clock enable +注:(1)CH32V203RB(CH32V20x_D8)产品外接晶体或时钟(HSE)为32M,使用外置晶体时无需负 +载电容已内置。 +(2)上图3-4中蓝色虚线框出来的部分仅适用于批号倒数第五位大于0的CH32V203RB芯片。 +V2.4 27 + +# Page 31 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图3-5 CH32FV208时钟树结构 +32kHz IWDGCLK +LSI RC to independent watchdog +OSC32_IN 32.768kHz RTCCLK +LSE OSC to RTC +OSC32_OUT +/512 +USB prescaler +48MHz +/1,/2,/3,/5 USBCLK +PLLXTPRE +USBPRE +/4 PLLSRC USB clock enable +/8 PLLMUL +OSC_IN 32MHz SW +OSC_OUT +HSE OSC /2 *3,*4,… +PLLCLK +/2 *16,*18 +8MHz +HSI RC HSI SYSCLK +HSE +RFCLK CSS +BLE control +MCO[3:0] /1,/2 to Flash prog IF +HB prescaler +to HB bus/core/memory/DMA +/1,/2…/512 +HSI FCLK core free running clock +MCO +HSE /8 to Core System timer +PLLCLK/2 +BLE +BLEC/S clock enable +HCLK /1,/2 60MHz +ETH-PHY +144MHz max +ETH clock enable +PB1 prescaler PCLK1 +/1,/2…/16 to PB1 peripherals +peripheral clock enable +if(PB1 prescaler=1)*1 TIMxCLK +else *2 to TIM2,3,4 +peripheral clock enable +PB2 prescaler +PCLK2 +/1,/2…/16 to PB2 peripherals +peripheral clock enable +ADC prescaler +/2,/4,/6,/8 ADCCLK to ADC1 +peripheral clock enable +if(PB2 prescaler=1)*1 TIMxCLK +else *2 to TIM1 +peripheral clock enable +注:本时钟树适用于CH32F20x_D8W和CH32V20x_D8W。若同时使用USB和ETH功能,需将USBPRE[1:0] +置为11b。产品外接晶体或时钟(HSE)为32M,使用外置晶体时无需负载电容已内置。 +3.3.2 高速时钟(HSI/HSE) +HSI是系统内部8MHz的RC振荡器产生的高速时钟信号。HSI RC振荡器能够在不需要任何外部器 +件的条件下提供系统时钟。它的启动时间很短但时钟频率精度较差。HSI 通过设置 RCC_CTLR 寄存器 +中的HSION位被启动和关闭,HSIRDY位指示HSI RC振荡器是否稳定。系统默认HSION和HSIRDY置1 +(建议不要关闭)。如果设置了RCC_INTR寄存器的HSIRDYIE位,将产生相应中断。 + 出厂校准:制造工艺的差异会导致每个芯片的 RC 振荡频率不同,所以在芯片出厂前,会为每颗 +芯片进行HSI校准。系统复位后,工厂校准值被装载到RCC_CTLR寄存器的HSICAL[7:0]中。 +V2.4 28 + +# Page 32 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 用户调整:基于不同的电压或环境温度,应用程序可以通过RCC_CTLR寄存器里的HSITRIM[4:0] +位来调整HSI频率。 +注:如果HSE晶体振荡器失效,HSI时钟会被作为备用时钟源(时钟安全系统)。 +HSE是外部的高速时钟信号,包括外部晶体/陶瓷谐振器产生或者外部高速时钟送入。 + 外部晶体/陶瓷谐振器(HSE晶体):外接3-25MHz外部振荡器为系统提供更为精确的时钟源。进 +一步信息可参考数据手册的电气特性部分。HSE晶体可以通过设置RCC_CTLR寄存器中的HSEON位 +被启动和关闭,HSERDY位指示HSE晶体振荡是否稳定,硬件在HSERDY位置1后才将时钟送入系 +统。如果设置了RCC_INTR寄存器的HSERDYIE位,将产生相应中断。 +图3-6 高速外部晶体电路 +OSC_IN +CL1 +L C o a a p d a citance 3~25MHz +OSC_OUT +CL2 +注:负载电容需要尽可能地靠近振荡器引脚,并根据晶体厂家参数选择容值。 + 外部高速时钟源(HSE旁路):此模式从外部直接送入时钟源到OSC_IN引脚,OSC_OUT引脚悬空。 +最高支持25MHz频率。应用程序需在HSEON位为0情况下,置位HSEBYP位,打开HSE旁路功能, +然后再置位HSEON位。 +图3-7 高速时钟源电路 +External clock +f +source HSE_ext OSC_IN +(Suspended) +3.3.3 低速时钟(LSI/LSE) +LSI是系统内部的RC振荡器产生的低速时钟信号。它可以在停机和待机模式下保持运行,为RTC +时钟、独立看门狗和唤醒单元提供时钟基准。进一步信息可参考数据手册的电气特性部分。LSI可以 +通过设置RCC_RSTSCKR寄存器中的LSION位被启动和关闭,然后通过查询LSIRDY位检测LSI RC振荡 +是否稳定,硬件在 LSIRDY位置 1后才将时钟送入。如果设置了 RCC_INTR寄存器的 LSIRDYIE位,将 +产生相应中断。 +LSE是外部的低速时钟信号,包括外部晶体/陶瓷谐振器产生或者外部低速时钟送入。它为RTC时 +钟或者其他定时功能提供一个低功耗且精确的时钟源。 + 外部晶体/陶瓷谐振器(LSE晶体):外接32.768kHz的外部低速振荡器。LSE通过设置RCC_BDCTLR +寄存器中的LSEON位被启动和关闭,LSERDY位指示LSE晶体振荡是否稳定,硬件在LSERDY位置1后 +才将时钟送入系统。如果设置了RCC_INTR寄存器的LSERDYIE位,将产生相应中断。 +V2.4 29 + +# Page 33 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图3-8 低速外部晶体电路 +OSC32_IN +CL1 +L C o a a p d a citance 32.768kHZ +OSC32_OUT +CL2 + 外部低速时钟源(LSE旁路):此模式从外部直接送入时钟源到OSC32_IN引脚,OSC32_OUT引脚 +悬空。应用程序需在 LSEON 位为 0 情况下,置位 LSEBYP 位,打开 LSE 旁路功能,然后再置位 LSEON +位。 +图3-9 低速时钟源电路 +External clock +f +source LSE_ext OSC32_IN +(Suspended) OSC32_OUT +3.3.4 PLL 时钟 +通过配置RCC_CFGR0寄存器和扩展寄存器EXTEN_CTR,内部PLL时钟可以选择3种时钟来源和倍 +频系数,这些设置必须在每个 PLL 被开启前完成,一旦 PLL 被启动,这些参数就不能被改动。设置 +RCC_CTLR寄存器中的PLLON位被启动和关闭,PLLRDY位指示PLL时钟是否稳定,硬件在PLLRDY位置 +1后才将时钟送入系统。设置RCC_CTLR寄存器中的PLLON2位被启动和关闭,PLLRDY2位指示PLL2时 +钟是否稳定,硬件在PLLRDY2位置1后才将时钟送入系统。设置RCC_CTLR寄存器中的PLLON3位被启 +动和关闭,PLLRDY3位指示PLL3时钟是否稳定,硬件在PLLRDY3位置1后才将时钟送入系统。如果设 +置了RCC_INTR寄存器的PLLRDYIE位、PLL2RDYIE位或PLL3RDYIE位,将产生相应中断。 +PLL时钟来源: + HSI时钟送入 + HSI经过2分频送入 + HSE时钟或通过一个可配置的分频器的PLL2时钟 + PLL2和PLL3由HSE通过一个可配置的分频器(PREDIV2)2提供时钟 +3.3.5 总线/外设时钟 +3.3.5.1 系统时钟(SYSCLK) +通过配置RCC_CFGR0寄存器SW[1:0]位配置系统时钟来源,SWS[1:0]指示当前的系统时钟源。 + HSI作为系统时钟 + HSE作为系统时钟 + PLL时钟作为系统时钟 +控制器复位后,默认HSI时钟被选为系统时钟源。时钟源之间的切换必须在目标时钟源准备就绪 +后才会发生。 +3.3.5.2 HB/PB1/PB2 总线外设时钟(HCLK/PCLK1/PCLK2) +通过配置RCC_CFGR0寄存器的HPRE[3:0]、PPRE1[2:0]、PPRE2[2:0]位,可以分别配置HB、PB1、 +PB2总线的时钟。这些总线时钟决定了挂载在其下面的外设接口访问时钟基准。应用程序可以调整不 +V2.4 30 + +# Page 34 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +同的数值,来降低部分外设工作时的功耗。 +通过 RCC_AHBRSTR、RCC_APB1PRSTR、RCC_APB2PRSTR 寄存器中各个位可以复位不同的外设模块, +将其恢复到初始状态。 +通过 RCC_AHBPCENR、RCC_APB1PCENR、RCC_APB2PCENR 寄存器中各个位可以单独开启或关闭不同 +外设模块通讯时钟接口。使用某个外设时,首先需要开启其时钟使能位,才能访问其寄存器。 +3.3.5.3 RTC 时钟(RTCCLK) +通过设置 RCC_BDCTLR 寄存器的 RTCSEL[1:0]位,RTCCLK 时钟源可以由 HSE 分频、LSE 或 LSI 时 +钟提供。修改此位前要保证电源控制寄存器(PWR_CTLR)中的DBP位置1,只有后备区域复位,才能 +复位此位。 + LSE作为RTC时钟:由于LSE处于后备域由 V 供电,只要V 维持供电,尽管 V 供电被切断, +BAT BAT DD +RTC仍继续工作。 + LSI作为RTC时钟:如果V 供电被切断,RTC自动唤醒不能保证。 +DD + HSE 经分频后作为 RTC 时钟:如果 V 供电被切断或内部电压调压器被关闭(1.8V 域的供电被切 +DD +断),则RTC状态不确定。相应型号芯片的HSE的分频系数参考RCC_BDCTLR寄存器RTCSEL[1:0] +位的描述。 +3.3.5.4 独立看门狗时钟 +如果独立看门狗已经由硬件配置设置或软件启动,LSI 振荡器将被强制打开,并且不能被关闭。 +在LSI振荡器稳定后,时钟供应给IWDG。 +3.3.5.5 时钟输出(MCO) +微控制器允许输出时钟信号到 MCO 引脚。在相应的 GPIO 端口寄存器配置复用推挽输出模式,通 +过配置RCC_CFGR0寄存器MCO[3:0]位,可以选择以下8个时钟信号作为MCO时钟输出: + 系统时钟(SYSCLK)输出 + HSI时钟输出 + HSE时钟输出 + PLL时钟经过2分频输出 + PLL2时钟输出 + PLL3时钟输出 + PLL3时钟经过2分频输出 + XT1外部3-25MHz振荡器(用于以太网) +3.3.5.6 USB 时钟 +USBD 48MHz 时钟源来自通过一个可配置的分频器的 PLL 时钟,此时 PLL 支持三种时钟配置,包 +括 48MHz、96MHz 和 144MHz,通过配置寄存器 RCC_CFGR0 的 USBPRE[1:0]位输出 48MHz 时钟到 USBD。 +USBFS/OTG_FS 48MHz时钟源来自通过一个可配置的分频器的PLL时钟或者USBHSPLL时钟,可通 +过配置寄存器 RCC_CFGR2的 USBFSSRC 位来选择。若时钟源选择通过一个可配置的分频器的 PLL时钟 +作为时钟源时,则配置步骤可参考USBD。若时钟源选择USBHSPLL时钟作为时钟源时,通过配置寄存 +器RCC_CFGR2的USBHSCLK[1:0]位,选择USBHSPLL参考时钟频率(参考时钟频率必须和USBHSPLL输 +入时钟保持一致)。 +USBHS时钟源来自USBHSPLL时钟,通过配置寄存器RCC_CFGR2的USBHSCLK[1:0]位,选择USBHSPLL +参考时钟频率(参考时钟频率必须和 USBHSPLL 输入时钟保持一致),通过配置寄存器 RCC_CFGR2 的 +USBHSPLL位,使能USB PHY内部PLL。 +3.3.5.7 ETH 时钟 +V2.4 31 + +# Page 35 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +ETH时钟配置参考27.1.4.5章节。 +3.3.5.8 I2S 和 RNG 时钟 +I2S和 RNG的时钟源来自 PLL3VCO或系统时钟(SYSCLK),I2S2、I2S3和 TRNG可分别通过配置 +寄存器RCC_CFGR2的I2S2SRC位、I2S3SRC位和RNGSRC位选择时钟源。 +3.3.6 时钟安全系统 +时钟安全系统是控制器的一种运行保护机制,它可以在HSE时钟发送故障的情况下,切换到HSI +时钟下,并产生中断通知,允许应用程序软件完成营救操作。 +通过设置RCC_CTLR寄存器的CSSON位置1,激活时钟安全系统。此时,时钟监测器将在HSE振荡 +器启动(HSERDY=1)延迟后被使能,并在HSE时钟关闭后关闭。一旦系统运行过程中HSE时钟发生故 +障,HSE振荡器将被关闭,时钟失效事件将被送到高级定时器(TIM1和TIM8)的刹车输入端,并产生 +时钟安全中断,CSSF位置1,并且应用程序进入NMI不可屏蔽中断,通过置位CSSC位,可以清除CSSF +位标志,可撤销NMI中断挂起位。 +如果当前HSE作为系统时钟,或者当前HSE作为PLL输入时钟,PLL作为系统时钟,时钟安全系 +统将在HSE故障时自动将系统时钟切换到HSI振荡器,并关闭HSE振荡器和PLL。 +3.4 寄存器描述 +表3-1 RCC相关寄存器列表 +名称 访问地址 描述 复位值 +R32_RCC_CTLR 0x40021000 时钟控制寄存器 0x0000xx83 +R32_RCC_CFGR0 0x40021004 时钟配置寄存器0 0x00000000 +R32_RCC_INTR 0x40021008 时钟中断寄存器 0x00000000 +R32_RCC_APB2PRSTR 0x4002100C PB2外设复位寄存器 0x00000000 +R32_RCC_APB1PRSTR 0x40021010 PB1外设复位寄存器 0x00000000 +R32_RCC_AHBPCENR 0x40021014 HB外设时钟使能寄存器 0x00000014 +R32_RCC_APB2PCENR 0x40021018 PB2外设时钟使能寄存器 0x00000000 +R32_RCC_APB1PCENR 0x4002101C PB1外设时钟使能寄存器 0x00000000 +R32_RCC_BDCTLR 0x40021020 后备域控制寄存器 0x00000000 +R32_RCC_RSTSCKR 0x40021024 控制/状态寄存器 0x0C000000 +R32_RCC_AHBRSTR 0x40021028 HB外设复位寄存器 0x00000000 +R32_RCC_CFGR2 0x4002102C 时钟配置寄存器2 0x00000000 +表3-2 OSC相关寄存器列表 +名称 访问地址 描述 复位值 +R32_HSE_CAL_CTRL 0x4002202C 外部晶振校准控制寄存器 0x09000000 +R16_LSI32K_TUNE 0x40022036 内部低速晶振校准调节寄存器 0x1011 +R8_LSI32K_CAL_CFG 0x40022049 内部低速晶振校准配置寄存器 0x01 +R16_LSI32K_CAL_STATR 0x4002204C 内部低速晶振校准状态寄存器 0x0000 +R8_LSI32K_CAL_OV_CNT 0x4002204E 内部低速晶振校准次数计数器 0x00 +R8_LSI32K_CAL_CTRL 0x4002204F 内部低速晶振校准控制寄存器 0x80 +注:适用于CH32V20x_D8W、CH32F20x_D8W。 +V2.4 32 + +# Page 36 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3.4.1 时钟控制寄存器(RCC_CTLR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +PLL3 PLL3 PLL2 PLL2 PLL PLL HSE HSE +Reserved Reserved CSSON HSEON +RDY ON RDY ON RDY ON BYP RDY +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser HSI +HSICAL[7:0] HSITRIM[4:0] HSION +ved RDY +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +PLL3时钟就绪锁定标志位(由硬件置位): +0:PLL3时钟未锁定; +29 PLL3RDY RO 1:PLL3时钟锁定。 0 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL3时钟使能控制位: +0:关闭PLL3时钟; +28 PLL3ON RW 1:使能PLL3时钟。 0 +注:进入停止或待机低功耗模式后,此位由硬件清0。 +适用于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C。 +PLL2时钟就绪锁定标志位(由硬件置位): +0:PLL时钟未锁定; +27 PLL2RDY RO 1:PLL时钟锁定。 0 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL2时钟使能控制位: +0:关闭PLL时钟; +26 PLL2ON RW 1:使能PLL时钟。 0 +注:进入停止或待机低功耗模式后,此位由硬件清0。 +适用于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C。 +PLL时钟就绪锁定标志位(由硬件置位): +25 PLLRDY RO 0:PLL时钟未锁定; 0 +1:PLL时钟锁定。 +PLL时钟使能控制位: +0:关闭PLL时钟; +24 PLLON RW 0 +1:使能PLL时钟。 +注:进入停止或待机低功耗模式后,此位由硬件清0。 +[23:20] Reserved RO 保留。 0 +时钟安全系统使能控制位: +0:关闭时钟安全系统; +1:使能时钟安全系统。当HSE准备好(HSERDY置1), +19 CSSON RW 0 +硬件开启对 HSE 的时钟监测功能,发现 HSE 异常触发 +CSSF标志及 NMI中断;当HSE没有准备好,硬件关闭 +对HSE的时钟监测功能。 +V2.4 33 + +# Page 37 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:此功能不适用于批号倒数第五位等于 0 的 +CH32V20x_D6芯片。 +外部高速晶体旁路控制位: +0:不旁路高速外部晶体/陶瓷谐振器; +18 HSEBYP RW 0 +1:旁路外部高速晶体/陶瓷谐振器(使用外部时钟源)。 +注:此位需在HSEON为0下写入。 +外部高速晶体振荡稳定就绪标志位(由硬件置位): +0:外部高速晶体振荡没有稳定; +17 HSERDY RO 0 +1:外部高速晶体振荡稳定。 +注:在HSEON位清0后,该位需要6个HSE周期清0。 +外部高速晶体振荡使能控制位: +0:关闭HSE振荡器; +16 HSEON RW 0 +1:使能HSE振荡器。 +注:进入停止或待机低功耗模式后,此位由硬件清0。 +[15:8] HSICAL[7:0] RO 内部高速时钟校准值,在系统启动时被自动初始化。 xxh +内部高速时钟调整值: +用户可以输入一个调整值叠加到HSICAL[7:0]数值上, +根据电压和温度的变化调整内部 HSI RC 振荡器的频 +[7:3] HSITRIM[4:0] RW 10000b +率。 +默认值为 16,可以把 HSI 调整到 8MHz±0.25%;每步 +HSICAL的变化调整约20kHz。 +2 Reserved RO 保留。 0 +内部高速时钟(8MHz)稳定就绪标志位(由硬件置位): +0:内部高速时钟(8MHz)没有稳定; +1 HSIRDY RO 1 +1:内部高速时钟(8MHz)稳定。 +注:在HSION位清0后,该位需要6个HSI周期清0。 +内部高速时钟(8MHz)使能控制位: +0:关闭HSI振荡器; +1:使能HSI振荡器。 +0 HSION RW 1 +注:当从待机和停止模式返回或用作系统时钟的外部 +振荡器HSE发生故障时,该位由硬件置1来启动内部 +8MHz的RC振荡器。 +3.4.2 时钟配置寄存器 0(RCC_CFGR0) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADC_ +Rese ETHP USBPRE PLL PLL +ADCDUTY DUTY MCO[3:0] PLLMUL[3:0] +rved RE [1:0] XTPRE SRC +_SEL +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADCPRE[1:0] PPRE2[2:0] PPRE1[2:0] HPRE[3:0] SWS[1:0] SW[1:0] +位 名称 访问 描述 复位值 +31 ADCDUTY RW ADC时钟占空比调整: 0 +V2.4 34 + +# Page 38 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:ADC时钟占空比为50%; +1:ADC时钟低电平时间更长。 +ADC时钟占空比选择: +0:ADC时钟占空比为50%; +1:ADC时钟占空比为75%。 +30 ADC_DUTY_SEL RW 0 +注:此位仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数 +第六位不为0的产品。 +29 Reserved RO 保留。 0 +以太网时钟来源预分频控制: +0:不分频; +28 ETHPRE RW 1:2分频; 0 +注 : 适 用 于 CH32V20x_D8W 、 CH32V20x_D8 、 +CH32F20x_D8W。 +微控制器MCO引脚时钟输出控制: +00xx:没有时钟输出; +0100:系统时钟(SYSCLK)输出; +0101:内部8MHz的RC振荡器时钟(HSI)输出; +0110:外部振荡器时钟(HSE)输出; +0111:PLL时钟2分频后输出; +[27:24] MCO[3:0] RW 1000:PLL2时钟输出; 0000b +1001:PLL3时钟2分频后输出; +1010:XT1外部震荡器时钟输出; +1011:PLL3时钟输出。 +注:在启动或切换MCO时钟时,可能有几个周期的时 +钟丢失。其中1000 —— 1011适用于CH32F20x_D8C、 +CH32V30x_D8C、CH32V31x_D8C。 +USBFS/USBOTG时钟分频配置: +00:1分频(适用于PLLCLK=48MHz); +01:2分频(适用于PLLCLK=96MHz); +10:3分频(适用于PLLCLK=144MHz); +11:5 分频,且 PLL 的源为 HSE 二分频(适用于 +PLLCLK=240MHz , 仅 适 用 于 CH32V20x_D8W/ +CH32F20x_D8W 以及 CH32V20x_D8 批号倒数第五位大于 +[23:22] USBPRE[1:0] RW 00b +0的)。 +注:CH32V20x_D8W、CH32F20x_D8W以及CH32V20x_D8 +批号倒数第五位大于0的支持11b选项,其余型号该 +选项保留。 +USBD/USBHS模块时钟需要48MHz。此位必须在USBD和 +USBHS 时钟使能前进行配置(RCC_AHBPCENR 和 +RCC_APB1PCENR中) +PLL时钟倍频系数(在PLL关闭才可写入): +对于CH32F20x_D6、CH32F20x_D8、CH32F20x_D8W、 +[21:18] PLLMUL[3:0] RW CH32V20x_D6、CH32V20x_D8、CH32V20x_D8W、 0000b +CH32V30x_D8: +0000:PLL 2倍频输出; 0001:PLL 3倍频输出; +V2.4 35 + +# Page 39 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0010:PLL 4倍频输出; 0011:PLL 5倍频输出; +0100:PLL 6倍频输出; 0101:PLL 7倍频输出; +0110:PLL 8倍频输出; 0111:PLL 9倍频输出; +1000:PLL 10倍频输出; 1001:PLL 11倍频输出; +1010:PLL 12倍频输出; 1011:PLL 13倍频输出; +1100:PLL 14倍频输出; 1101:PLL 15倍频输出; +1110:PLL 16倍频输出; 1111:PLL 18倍频输出。 +对于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C: +0000:PLL 18倍频输出; 0001:PLL 3倍频输出; +0010:PLL 4倍频输出; 0011:PLL 5倍频输出; +0100:PLL 6倍频输出; 0101:PLL 7倍频输出; +0110:PLL 8倍频输出; 0111:PLL 9倍频输出; +1000:PLL 10倍频输出; 1001:PLL 11倍频输出; +1010:PLL 12倍频输出; 1011:PLL 13倍频输出; +1100:PLL 14倍频输出; 1101:PLL 6.5倍频输出; +1110:PLL 15倍频输出; 1111:PLL 16倍频输出。 +HSE分频送入PLL控制(在PLL关闭才可写入): +对于 CH32F20x_D6、CH32F20x_D8、CH32V20x_D6、 +CH32V30x_D8: +0:HSE不分频送入PLL; +1:HSE 2分频送入PLL。 +对于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C: +由软件置1或清0来选择PREDIV1分频因子的最低位。 +17 PLLXTPRE RW PLLXTPRE位与RCC_CFGR2寄存器的位[0]是同一位,因 0 +此修改RCC_CFGR2寄存器的位[0]同时会改变这一位。 +如果RCC_CFGR2寄存器的位[3:1]为000b,则该位控制 +PREDIV1 对输入时钟进行 2 分频(PLLXPRE=1),或不对 +输入时钟分频(PLLXPRE=0)。 +对于CH32F20x_D8W、CH32V20x_D8W、CH32V20x_D8: +0:HSE 4分频送入PLL; +1:HSE 8分频送入PLL。 +PLL的输入时钟源(在PLL关闭才可写入): +对于 CH32F20x_D6、CH32F20x_D8、CH32V20x_D6、 +CH32V30x_D8: +0:HSI不分频或2分频送入PLL; +1:HSE不分频或2分频送入PLL。 +16 PLLSRC RW 对于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C: 0 +0:HSI不分频或2分频送入PLL; +1:PREDIV1输出送入PLL。 +对于CH32F20x_D8W、CH32V20x_D8W、CH32V20x_D8: +0:HSI不分频或2分频送入PLL; +1:HSE 2分频或4分频或8分频送入PLL。 +V2.4 36 + +# Page 40 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +ADC时钟来源预分频控制: +00:PCLK2 2分频后作为ADC时钟; +01:PCLK2 4分频后作为ADC时钟; +[15:14] ADCPRE[1:0] RW 00b +10:PCLK2 6分频后作为ADC时钟; +11:PCLK2 8分频后作为ADC时钟。 +注:ADC时钟最高不要超过14MHz。 +PB2时钟来源预分频控制: +0xx:HCLK不分频; +100:HCLK 2分频; +[13:11] PPRE2[2:0] RW 000b +101:HCLK 4分频; +110:HCLK 8分频; +111:HCLK 16分频 +PB1时钟来源预分频控制: +0xx:HCLK不分频; +100:HCLK 2分频; +[10:8] PPRE1[2:0] RW 000b +101:HCLK 4分频; +110:HCLK 8分频; +111:HCLK 16分频 +HB时钟来源预分频控制: +0xxx:SYSCLK不分频; +1000:SYSCLK 2分频; +1001:SYSCLK 4分频; +1010:SYSCLK 8分频; +[7:4] HPRE[3:0] RW 0000b +1011:SYSCLK 16分频; +1100:SYSCLK 64分频; +1101:SYSCLK 128分频; +1110:SYSCLK 256分频; +1111:SYSCLK 512分频。 +系统时钟(SYSCLK)状态(硬件置位): +00:系统时钟源是HSI; +[3:2] SWS[1:0] RO 01:系统时钟源是HSE; 00b +10:系统时钟源是PLL; +11:不可用。 +选择系统时钟来源: +00:HSI作为系统时钟; +01:HSE作为系统时钟; +10:PLL输出作为系统时钟; +[1:0] SW[1:0] RW 00b +11:不可用。 +注:在使能了时钟安全系统下(CSSON=1),当从待机 +和停止模式返回或用作系统时钟的外部振荡器HSE发 +生故障时,由硬件强制选择HSI作为系统时钟。 +3.4.3 时钟中断寄存器(RCC_INTR) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 37 + +# Page 41 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +PLL3 PLL2 PLL HSE HSI LSE LSI +Reserved CSSC +RDYC RDYC RDYC RDYC RDYC RDYC RDYC +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser PLL3 PLL2 PLL HSE HSI LSE LSI PLL3 PLL2 PLL HSE HSI LSE LSI +CSSF +ved RDYIE RDYIE RDYIE RDYIE RDYIE RDYIE RDYIE RDYF RDYF RDYF RDYF RDYF RDYF RDYF +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +清除时钟安全系统中断标志位(CSSF): +23 CSSC WO 0:无动作; 0 +1:清除CSSF中断标志。 +清除PLL3就绪中断标志位: +0:无动作; +22 PLL3RDYC WO 1:清除PLL3RDYF中断标志。 0 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +清除PLL2就绪中断标志位: +0:无动作; +21 PLL2RDYC WO 1:清除PLL2RDYF中断标志。 0 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +清除PLL就绪中断标志位: +20 PLLRDYC WO 0:无动作; 0 +1:清除PLLRDYF中断标志。 +清除HSE振荡器就绪中断标志位: +19 HSERDYC WO 0:无动作; 0 +1:清除HSERDYF中断标志。 +清除HSI振荡器就绪中断标志位: +18 HSIRDYC WO 0:无动作; 0 +1:清除HSIRDYF中断标志。 +清除LSE振荡器就绪中断标志位: +17 LSERDYC WO 0:无动作; 0 +1:清除LSERDYF中断标志。 +清除LSI振荡器就绪中断标志位: +16 LSIRDYC WO 0:无动作; 0 +1:清除LSIRDYF中断标志。 +15 Reserved RO 保留。 0 +PLL3就绪中断使能位: +0:关闭PLL3就绪中断; +14 PLL3RDYIE RW 1:使能PLL3就绪中断。 0 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL2就绪中断使能位: +13 PLL2RDYIE RW 0:关闭PLL2就绪中断; 0 +1:使能PLL2就绪中断。 +V2.4 38 + +# Page 42 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL就绪中断使能位: +12 PLLRDYIE RW 0:关闭PLL就绪中断; 0 +1:使能PLL就绪中断。 +HSE就绪中断使能位: +11 HSERDYIE RW 0:关闭HSE就绪中断; 0 +1:使能HSE就绪中断。 +HSI就绪中断使能位: +10 HSIRDYIE RW 0:关闭HSI就绪中断; 0 +1:使能HSI就绪中断。 +LSE就绪中断使能位: +9 LSERDYIE RW 0:关闭LSE就绪中断; 0 +1:使能LSE就绪中断。 +LSI就绪中断使能位: +8 LSIRDYIE RW 0:关闭LSI就绪中断; 0 +1:使能LSI就绪中断。 +时钟安全系统中断标志位: +0:无时钟安全系统中断; +7 CSSF RO 0 +1:HSE时钟失效,产生了时钟安全中断CSSI。 +硬件置位,软件写CSSC位1清除。 +PLL3时钟就绪锁定中断标志: +0:无PLL3时钟锁定中断; +1:PLL3时钟锁定产生中断。 +6 PLL3RDYF RO 0 +硬件置位,软件写PLL3RDYC位1清除。 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL2时钟就绪锁定中断标志: +0:无PLL2时钟锁定中断; +1:PLL2时钟锁定产生中断。 +5 PLL2RDYF RO 0 +硬件置位,软件写PLL2RDYC位1清除。 +注 : 适 用 于 CH32F20x_D8C 、 CH32V30x_D8C 、 +CH32V31x_D8C。 +PLL时钟就绪锁定中断标志: +0:无PLL时钟锁定中断; +4 PLLRDYF RO 0 +1:PLL时钟锁定产生中断。 +硬件置位,软件写PLLRDYC位1清除。 +HSE时钟就绪中断标志: +0:无HSE时钟就绪中断; +3 HSERDYF RO 0 +1:HSE时钟就绪产生中断。 +硬件置位,软件写HSERDYC位1清除。 +HSI时钟就绪中断标志: +0:无HSI时钟就绪中断; +2 HSIRDYF RO 0 +1:HSI时钟就绪产生中断。 +硬件置位,软件写HSIRDYC位1清除。 +1 LSERDYF RO LSE时钟就绪中断标志: 0 +V2.4 39 + +# Page 43 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:无LSE时钟就绪中断; +1:LSE时钟就绪产生中断。 +硬件置位,软件写LSERDYC位1清除。 +LSI时钟就绪中断标志: +0:无LSI时钟就绪中断; +0 LSIRDYF RO 0 +1:LSI时钟就绪产生中断。 +硬件置位,软件写LSIRDYC位1清除。 +3.4.4 PB2 外设复位寄存器(RCC_APB2PRSTR) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIM10 TIM9 +Reserved Reserved +RST RST +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Rese USART1 TIM8 SPI1 TIM1 ADC2 ADC1 IOPE IOPD IOPC IOPB IOPA Reser AFIO +Reserved +rved RST RST RST RST RST RST RST RST RST RST RST ved RST +位 名称 访问 描述 复位值 +[31:21] Reserved RO 保留。 0 +TIM10模块复位控制: +20 TIM10RST RW 0 +0:无作用; 1:复位模块。 +TIM9模块复位控制: +19 TIM9RST RW 0 +0:无作用; 1:复位模块。 +[18:15] Reserved RO 保留。 0 +USART1接口复位控制: +14 USART1RST RW 0 +0:无作用; 1:复位模块。 +TIM8模块复位控制: +13 TIM8RST RW 0 +0:无作用; 1:复位模块。 +SPI1接口复位控制: +12 SPI1RST RW 0 +0:无作用; 1:复位模块。 +TIM1模块复位控制: +11 TIM1RST RW 0 +0:无作用; 1:复位模块。 +ADC2模块复位控制: +10 ADC2RST RW 0 +0:无作用; 1:复位模块。 +ADC1模块复位控制: +9 ADC1RST RW 0 +0:无作用; 1:复位模块。 +[8:7] Reserved RO 保留。 0 +IO的PE端口模块复位控制: +6 IOPERST RW 0 +0:无作用; 1:复位模块。 +IO的PD端口模块复位控制: +5 IOPDRST RW 0 +0:无作用; 1:复位模块。 +IO的PC端口模块复位控制: +4 IOPCRST RW 0 +0:无作用; 1:复位模块。 +3 IOPBRST RW IO的PB端口模块复位控制: 0 +V2.4 40 + +# Page 44 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:无作用; 1:复位模块。 +IO的PA端口模块复位控制: +2 IOPARST RW 0 +0:无作用; 1:复位模块。 +1 Reserved RO 保留。 0 +IO辅助功能模块复位控制: +0 AFIORST RW 0 +0:无作用; 1:复位模块。 +3.4.5 PB1 外设复位寄存器(RCC_APB1PRSTR) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +USAR USAR +DAC PWR BKP CAN2 CAN1 Reser USBD I2C2 I2C1 USART3 USART2 Rese +Reserved T5 T4 +RST RST RST RST RST ved RST RST RST RST RST rved +RST RST +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +USAR USAR USAR +SPI3 SPI2 WWDG TIM7 TIM6 TIM5 TIM4 TIM3 TIM2 +Reserved Reserved T8RS T7RS T6RS +RST RST RST RST RST RST RST RST RST +T T T +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +DAC模块复位控制: +29 DACRST RW 0 +0:无作用; 1:复位模块。 +电源接口模块复位控制: +28 PWRRST RW 0 +0:无作用; 1:复位模块。 +后备单元复位控制: +27 BKPRST RW 0 +0:无作用; 1:复位模块。 +CAN2模块复位控制: +26 CAN2RST RW 0 +0:无作用; 1:复位模块。 +CAN1模块复位控制: +25 CAN1RST RW 0 +0:无作用; 1:复位模块。 +24 Reserved RO 保留。 0 +USBD模块复位控制: +23 USBDRST RW 0 +0:无作用; 1:复位模块。 +I2C 2接口复位控制: +22 I2C2RST RW 0 +0:无作用; 1:复位模块。 +I2C 1接口复位控制: +21 I2C1RST RW 0 +0:无作用; 1:复位模块。 +USART5接口复位控制: +20 USART5RST RW 0 +0:无作用; 1:复位模块。 +USART4接口复位控制: +19 USART4RST RW 0 +0:无作用; 1:复位模块。 +USART3接口复位控制: +18 USART3RST RW 0 +0:无作用; 1:复位模块。 +17 USART2RST RW USART2接口复位控制: 0 +V2.4 41 + +# Page 45 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:无作用; 1:复位模块。 +16 Reserved RO 保留。 0 +SPI3接口复位控制: +15 SPI3RST RW 0 +0:无作用; 1:复位模块。 +SPI2接口复位控制: +14 SPI2RST RW 0 +0:无作用; 1:复位模块。 +[13:12] Reserved RO 保留。 0 +窗口看门狗复位控制: +11 WWDGRST RW 0 +0:无作用; 1:复位模块。 +[10:9] Reserved RO 保留。 0 +USART8接口复位控制: +8 USART8RST RW 0 +0:无作用; 1:复位模块。 +USART7接口复位控制: +7 USART7RST RW 0 +0:无作用; 1:复位模块。 +USART6接口复位控制: +6 USART6RST RW 0 +0:无作用; 1:复位模块。 +定时器7模块复位控制: +5 TIM7RST RW 0 +0:无作用; 1:复位模块。 +定时器6模块复位控制: +4 TIM6RST RW 0 +0:无作用; 1:复位模块。 +定时器5模块复位控制: +3 TIM5RST RW 0 +0:无作用; 1:复位模块。 +定时器4模块复位控制: +2 TIM4RST RW 0 +0:无作用; 1:复位模块。 +定时器3模块复位控制: +1 TIM3RST RW 0 +0:无作用; 1:复位模块。 +定时器2模块复位控制: +0 TIM2RST RW 0 +0:无作用; 1:复位模块。 +V2.4 42 + +# Page 46 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3.4.6 HB 外设时钟使能寄存器(RCC_AHBPCENR) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ETHMA +Reserved BLES CRXEN +/BLEC +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ETHMAETHMA OTGFS USBHS SDIO FSMCE Reser CRC SRAM DMA2 DMA1 +DVPEN RNGEN Reserved +CTXEN CEN EN EN EN N ved EN EN EN EN +位 名称 访问 描述 复位值 +[31:18] Reserved RO 保留。 0 +BLES时钟使能: +0:BLES时钟关闭; +17 BLES RW 1 +1:BLES时钟开启。 +注:适用于CH32V20x_D8W、CH32F20x_D8W。 +BLEC时钟使能: +0:BLEC时钟关闭; +16 BLEC RW 1 +1:BLEC时钟开启。 +注:适用于CH32V20x_D8W、CH32F20x_D8W。 +以太网MAC接收时钟使能: +0:以太网MAC接收时钟关闭; +16 ETHMACRXEN RW 1:以太网MAC接收时钟开启。 0 +注 : 适 用 于 CH32V30x_D8C 、 CH32V31x_D8C 、 +CH32F20x_D8C百兆千兆外置PHY。 +以太网MAC发送时钟使能: +0:以太网MAC发送时钟关闭; +15 ETHMACTXEN RW 1:以太网MAC发送时钟开启。 0 +注 : 适 用 于 CH32V30x_D8C 、 CH32V31x_D8C 、 +CH32F20x_D8C百兆千兆外置PHY。 +以太网MAC时钟使能: +0:以太网MAC时钟关闭; +14 ETHMACEN RW 1:以太网MAC时钟开启。 0 +注 : 适 用 于 CH32V30x_D8C 、 CH32V31x_D8C 、 +CH32F20x_D8C百兆千兆外置PHY。 +DVP模块时钟使能位: +13 DVPEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USBOTG_FS模块时钟使能位: +12 OTGFSEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USBHS模块时钟使能位: +11 USBHSEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +SDIO模块时钟使能位: +10 SDIOEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +RNG模块时钟使能位: +9 RNGEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +V2.4 43 + +# Page 47 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +FSMCEN模块时钟使能位: +8 FSMCEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +7 Reserved RO 保留。 0 +CRC模块时钟使能位: +6 CRCEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +[5:3] Reserved RO 保留。 0 +SRAM接口模块时钟使能位: +2 SRAMEN RW 0:睡眠模式时,SRAM接口模块时钟关闭; 1 +1:睡眠模式时,SRAM接口模块时钟开启。 +DMA2模块时钟使能位: +1 DMA2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +DMA1模块时钟使能位: +0 DMA1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +3.4.7 PB2 外设时钟使能寄存器(RCC_APB2PCENR) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIM10 TIM9 +Reserved Reserved +EN EN +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser USART1 TIM8 SPI1 TIM1 ADC2 ADC1 IOPE IOPD IOPC IOPB IOPA Reser AFIO +Reserved +ved EN EN EN EN EN EN EN EN EN EN EN ved EN +位 名称 访问 描述 复位值 +[31:21] Reserved RO 保留。 0 +TIM10接口时钟使能位: +20 TIM10EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +TIM9接口时钟使能位: +19 TIM9EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +[18:15] Reserved RO 保留。 0 +USART1接口时钟使能位: +14 USART1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +TIM8模块时钟使能位: +13 TIM8EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +SPI1接口时钟使能位: +12 SPI1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +TIM1模块时钟使能位: +11 TIM1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +ADC2模块时钟使能位: +10 ADC2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +ADC1模块时钟使能位: +9 ADC1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +[8:7] Reserved RO 保留。 0 +6 IOPEEN RW IO的PE端口模块时钟使能位: 0 +V2.4 44 + +# Page 48 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:模块时钟关闭; 1:模块时钟开启。 +IO的PD端口模块时钟使能位: +5 IOPDEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +IO的PC端口模块时钟使能位: +4 IOPCEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +IO的PB端口模块时钟使能位: +3 IOPBEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +IO的PA端口模块时钟使能位: +2 IOPAEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +1 Reserved RO 保留。 0 +IO辅助功能模块时钟使能位: +0 AFIOEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +3.4.8 PB1 外设时钟使能寄存器(RCC_APB1PCENR) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DAC PWR BKP CAN2 CAN1 Reser USBD I2C2 I2C1 USART5 USART4 USART3 USART2 Reser +Reserved +EN EN EN EN EN ved EN EN EN EN EN EN EN ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SPI3 SPI2 WWDG USART USART USART TIM7 TIM6 TIM5 TIM4 TIM3 TIM2 +Reserved Reserved +EN EN EN 8EN 7EN 6EN EN EN EN EN EN EN +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +DAC模块时钟使能位: +29 DACEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +电源接口模块时钟使能位: +28 PWREN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +后备单元时钟使能位: +27 BKPEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +CAN2模块时钟使能位: +26 CAN2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +CAN1模块时钟使能位: +25 CAN1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +24 Reserved RO 保留。 0 +USBD模块时钟使能位: +23 USBDEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +I2C 2接口时钟使能位: +22 I2C2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +I2C 1接口时钟使能位: +21 I2C1EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USART5接口时钟使能位: +20 USART5EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +19 USART4EN RW USART4接口时钟使能位: 0 +V2.4 45 + +# Page 49 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:模块时钟关闭; 1:模块时钟开启。 +USART3接口时钟使能位: +18 USART3EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USART2接口时钟使能位: +17 USART2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +16 Reserved RO 保留。 0 +SPI3接口时钟使能位: +15 SPI3EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +SPI2接口时钟使能位: +14 SPI2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +[13:12] Reserved RO 保留。 0 +窗口看门狗时钟使能位: +11 WWDGEN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +[10:9] Reserved RO 保留。 0 +USART8使能位: +8 USART8EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USART7使能位: +7 USART7EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +USART6使能位: +6 USART6EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器7模块时钟使能位: +5 TIM7EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器6模块时钟使能位: +4 TIM6EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器5模块时钟使能位: +3 TIM5EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器4模块时钟使能位: +2 TIM4EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器3模块时钟使能位: +1 TIM3EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +定时器2模块时钟使能位: +0 TIM2EN RW 0 +0:模块时钟关闭; 1:模块时钟开启。 +3.4.9 后备域控制寄存器(RCC_BDCTLR) +偏移地址:0x20 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved BDRST +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +LSE LSE +RTCEN Reserved RTCSEL[1:0] Reserved LSEON +BYP RDY +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +16 BDRST RW 后备域软件复位控制: 0 +V2.4 46 + +# Page 50 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:撤销复位。 +1:复位整个后备域。 +RTC时钟使能控制: +0:关闭RTC时钟; +15 RTCEN RW 1:使能RTC时钟。 0 +注:RTCSEL!=0的条件下才可以使能RTC时钟,否则硬 +件强制为0。 +[14:10] Reserved RO 保留。 0 +RTC时钟源选择: +00:无时钟; +01:LSE振荡器作为RTC时钟; +10:LSI振荡器作为RTC时钟; +11:HSE 振荡器经过分频后作为 RTC 时钟。其中 +CH32F20x_D6、CH32V20x_D6系列芯片批号倒数第5位 +[9:8] RTCSEL[1:0] RW 小于1的为512分频,反之为128分频;CH32F20x_D8W、 0 +CH32V20x_D8、CH32V20x_D8W系列芯片均为512分频; +CH32F20x_D8 、 CH32F20x_D8C 、 CH32V30x_D8 、 +CH32V30x_D8C、CH32V31x_D8C系列芯片均为128分频。 +注:一旦RTC时钟源被选定(RTCEN=1),直到下次后 +备域被复位,它不能再被改变。可通过设置BDRST位 +来恢复默认。 +[7:3] Reserved RO 保留。 0 +外部低速晶体(LSE)旁路控制位: +0:不旁路低速外部晶体/陶瓷谐振器; +2 LSEBYP RW 0 +1:旁路外部低速晶体/陶瓷谐振器(使用外部时钟源)。 +注:此位需在LSEON为0下写入。 +外部低速晶体振荡稳定就绪标志位(由硬件置位): +0:外部低速晶体振荡没有稳定; +1 LSERDY RO 0 +1:外部低速晶体振荡稳定。 +注:在LSEON位清0后,该位需要6个LSE周期清0。 +外部低速晶体振荡使能控制位: +0 LSEON RW 0:关闭LSE振荡器; 0 +1:使能LSE振荡器。 +注:后备域控制寄存器中(RCC_BDCTLR)的LSEON、LSEBYP、RTCSEL和RTCEN位处于后备域。因此, +这些位在复位后处于写保护状态,只有在电源控制寄存器(PWR_CTLR)中的DBP位置1后,才能对这 +些位进行改动。这些位只能由后备域复位清除。任何内部或外部复位都不会影响这些位。 +3.4.10 控制/状态寄存器(RCC_RSTSCKR) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +LPWR WWDG IWDG SFT POR PIN Reser +RMVF Reserved +RSTF RSTF RSTF RSTF RSTF RSTF ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +LSI +Reserved LSION +RDY +V2.4 47 + +# Page 51 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +低功耗复位标志: +0:无低功耗复位发生; +31 LPWRRSTF RO 1:发生低功耗复位。 0 +发生低功耗管理复位时由硬件置 1;软件写 RMVF位清 +除。 +窗口看门狗复位标志: +0:无窗口看门狗复位发生; +30 WWDGRSTF RO 1:发生窗口看门狗复位。 0 +发生窗口看门狗复位时由硬件置 1;软件写 RMVF位清 +除。 +独立看门狗复位标志: +0:无独立看门狗复位发生; +29 IWDGRSTF RO 1:发生独立看门狗复位。 0 +发生独立看门狗复位时由硬件置 1;软件写 RMVF位清 +除。 +软件复位标志: +0:无软件复位发生; +28 SFTRSTF RO 0 +1:发生软件复位。 +发生软件复位时由硬件置1;软件写RMVF位清除。 +上电/掉电复位标志: +0:无上电/掉电复位发生; +27 PORRSTF RO 1:发生上电/掉电复位。 1 +发生上电/掉电复位时由硬件置 1;软件写 RMVF 位清 +除。 +外部手动复位(NRST引脚)标志: +0:无NRST引脚复位发生; +26 PINRSTF RO 1:发生NRST引脚复位。 0 +在NRST引脚复位发生时由硬件置1;软件写RMVF位清 +除。 +25 Reserved RO 保留。 0 +清除复位标志控制: +24 RMVF RW 0:无作用; 0 +1:清除复位标志。 +[23:2] Reserved RO 保留。 0 +内部低速时钟(LSI)稳定就绪标志位(由硬件置位): +0:内部低速时钟(40kHz)没有稳定; +1 LSIRDY RO 0 +1:内部低速时钟(40kHz)稳定。 +注:在LSION位清0后,该位需要3个LSI周期清0。 +内部低速时钟(LSI)使能控制位: +0 LSION RW 0:关闭LSI(40kHz)振荡器; 0 +1:使能LSI(40kHz)振荡器。 +注:除BIT1由上电复位清除,其他写清除复位标志可以清除。 +V2.4 48 + +# Page 52 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3.4.11 HB 外设复位寄存器(RCC_AHBRSTR) +偏移地址:0x28 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ReserETHMA DVP OTGFS +Reserved +ved CRST RST RST +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +以太网MAC复位控制: +14 ETHMACRST RW 0 +0:无作用; 1:复位模块。 +DVP复位控制: +13 DVPRST RW 0 +0:无作用; 1:复位模块。 +USBOTG_FS模块复位控制: +12 OTGFSRST RW 0 +0:无作用; 1:复位模块。 +[11:0] Reserved RO 保留。 0 +3.4.12 时钟配置寄存器 2(RCC_CFGR2) +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +USBHS +USBFSUSBHS USBHSCLK Reser ETH1G ETH1GSRC RNGSR I2S3S I2S2S PREDI +PLLSR USBHSDIV[2:0] +SRC PLL [1:0] ved EN [1:0] C RC RC V1SRC +C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PLL3MUL[3:0] PLL2MUL[3:0] PREDIV2[3:0] PREDIV1[3:0] +位 名称 访问 描述 复位值 +USBFS 48MHz时钟源选择: +31 USBFSSRC RW 0 +0:PLL CLK; 1:USB PHY。 +USBHS PHY 内部PLL控制位: +30 USBHSPLL RW 0:USB PHY内部PLL关闭; 0 +1:USB PHY内部PLL使能。 +USBHSPLL 参 考 时 钟 频 率 选 择 ( USBHSPLLSRC/ +USBHSDIV): +00:3MHz; +[29:28] USBHSCLK[1:0] RW 00b +01:4MHz; +10:8MHz; +11:5MHz; +USBHSPLL参考源选择: +27 USBHSPLLSRC RW 0 +0:HSE; 1:HSI。 +USBHSPLL参考源分频: +[26:24] USBHSDIV[2:0] RW 000b +000:1分频 001:2分频 +V2.4 49 + +# Page 53 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +010:3分频 011:4分频 +100:5分频 101:6分频 +110:7分频 111:8分频 +23 Reserved RO 保留。 0 +千兆以太网125M时钟控制位: +22 ETH1GEN RW 0 +0:关闭; 1:开启。 +千兆以太网125M时钟选择: +00:PLL2 VCO +[21:20] ETH1GSRC[1:0] RW 00b +01:PLL3 VCO +1x:外部PB1引脚输入 +RNG时钟源选择: +19 RNGSRC RW 0 +0:系统时钟; 1:PLL3 VCO。 +I2S3时钟源: +18 I2S3SRC RW 0:系统时钟(SYSCLK); 0 +1:PLL3 VCO。 +I2S2时钟源: +17 I2S2SRC RW 0:系统时钟(SYSCLK); 0 +1:PLL3 VCO。 +PREDIV1时钟源: +16 PREDIV1SRC RW 0:HSE; 0 +1:PLL2。 +PLL3倍频因子(在PLL3关闭才可写入)。 +0000:PLL3 2.5倍频输出 0001:PLL3 12.5倍频输出; +0010:PLL3 4倍频输出; 0011:PLL3 5倍频输出; +0100:PLL3 6倍频输出; 0101:PLL3 7倍频输出; +[15:12] PLL3MUL[3:0] RW 0110:PLL3 8倍频输出; 0111:PLL3 9倍频输出; 0000b +1000:PLL3 10倍频输出;1001:PLL3 11倍频输出; +1010:PLL3 12倍频输出;1011:PLL3 13倍频输出; +1100:PLL3 14倍频输出;1101:PLL3 15倍频输出; +1110:PLL3 16倍频输出;1111:PLL3 20倍频输出 +PLL2倍频因子(在PLL2关闭才可写入)。 +0000:PLL2 2.5倍频输出 0001:PLL2 12.5倍频输出; +0010:PLL2 4倍频输出; 0011:PLL2 5倍频输出; +0100:PLL2 6倍频输出; 0101:PLL2 7倍频输出; +[11:8] PLL2MUL[3:0] RW 0110:PLL2 8倍频输出; 0111:PLL2 9倍频输出; 0000b +1000:PLL2 10倍频输出;1001:PLL2 11倍频输出; +1010:PLL2 12倍频输出;1011:PLL2 13倍频输出; +1100:PLL2 14倍频输出;1101:PLL2 15倍频输出; +1110:PLL2 16倍频输出;1111:PLL2 20倍频输出 +PREDIV2分频因子(在PLL2和PLL3关闭才可写入) +0000:PREDIV2不对输入时钟分频; +0001:PREDIV2对输入时钟2分频; +[7:4] PREDIV2[3:0] RW 0010:PREDIV2对输入时钟3分频; 0000b +0011:PREDIV2对输入时钟4分频; +0100:PREDIV2对输入时钟5分频; +0101:PREDIV2对输入时钟6分频; +V2.4 50 + +# Page 54 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0110:PREDIV2对输入时钟7分频; +0111:PREDIV2对输入时钟8分频; +1000:PREDIV2对输入时钟9分频; +1001:PREDIV2对输入时钟10分频; +1010:PREDIV2对输入时钟11分频; +1011:PREDIV2对输入时钟12分频; +1100:PREDIV2对输入时钟13分频; +1101:PREDIV2对输入时钟14分频; +1110:PREDIV2对输入时钟15分频; +1111:PREDIV2对输入时钟16分频; +PREDIV1分频因子(在PLL关闭才可写入) +0000:PREDIV1不对输入时钟分频; +0001:PREDIV1对输入时钟2分频; +0010:PREDIV1对输入时钟3分频; +0011:PREDIV1对输入时钟4分频; +0100:PREDIV1对输入时钟5分频; +0101:PREDIV1对输入时钟6分频; +0110:PREDIV1对输入时钟7分频; +0111:PREDIV1对输入时钟8分频; +[3:0] PREDIV1[3:0] RW 1000:PREDIV1对输入时钟9分频; 0000b +1001:PREDIV1对输入时钟10分频; +1010:PREDIV1对输入时钟11分频; +1011:PREDIV1对输入时钟12分频; +1100:PREDIV1对输入时钟13分频; +1101:PREDIV1对输入时钟14分频; +1110:PREDIV1对输入时钟15分频; +1111:PREDIV1对输入时钟16分频; +注:bit0和RCC_CFGR0的bit17相同,修改RCC_CFGR0 +的bit17会同时改变该寄存器的bit0。 +注:适用于CH32F20x_D8C、CH32V30x_D8C、CH32V31x_D8C。 +3.4.13 外部晶振校准控制寄存器(HSE_CAL_CTRL) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reser HSE Reser HSEITRIM +HSEC[2:0] Reserved +ved FAULT ved [1:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved +位 名称 访问 描述 复位值 +31 Reserved RO 保留。 0 +HSE内置匹配电容调节位: +[30:28] HSEC[2:0] RW 000:8pF; 000b +001:10pF; +V2.4 51 + +# Page 55 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +010:12pF; +011:14pF; +100:16pF; +101:18pF; +110:20pF; +111:22pF。 +HSE失效检测禁用控制位: +27 HSEFAULT RW 0:使用模拟输入的HSE失效检测信号; 0 +1:忽略模拟输入的HSE失效检测信号。 +26 Reserved RO 保留。 0 +[25:24] HSEITRIM[1:0] RW HSE起振电流调节位。 01b +[23:0] Reserved RO 保留。 0 +3.4.14 内部低速晶振校准调节寄存器(LSI32K_TUNE) +偏移地址:0x0A +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved HTUNE[7:0] LTUNE[4:0] +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +[12:5] HTUNE[7:0] RW LSI32K细调配置位。 0x80 +[4:0] LTUNE[4:0] RW LSI32K粗调配置位。 0x11 +3.4.15 内部低速晶振校准配置寄存器(LSI32K_CAL_CFG) +偏移地址:0x1D +7 6 5 4 3 2 1 0 +Reserved LPEN WKUPEN HALTMD CNTVLU[3:0] +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +低功耗模式下校准使能位: +0:在低功耗模式下关闭校准功能; +6 LPEN RW 1:在低功耗模式下使能校准功能。 0 +注:此功能必须要配合EXTEN中的RB_HSE_KEEP_LP使 +用。 +LSI32K 唤醒中断使能: +5 WKUPEN RW 0:禁止唤醒中断; 0 +1:使能唤醒中断。 +LSI32K校准计数暂停时长配置位: +4 HALTMD RW 0:计数暂停维持1个CK32K周期; 0 +1:计数暂停维持3个CK32K周期。 +LSI32K校准采样时长配置位: +[3:0] CNTVLU[3:0] RW 0000:2个CK32K周期; 0001b +0001:4个CK32K周期; +V2.4 52 + +# Page 56 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0010:32个CK32K周期; +0011:64个CK32K周期; +0100:128个CK32K周期; +0101:256个CK32K周期; +0110:512个CK32K周期; +0111:1024个CK32K周期; +1000:1088个CK32K周期; +1001:1152个CK32K周期; +1010:1216个CK32K周期; +1011:1280个CK32K周期; +1100:2000个CK32K周期。 +注:其他的配置值对应2个CK32K周期。 +3.4.16 内部低速晶振校准状态寄存器(LSI32K_CAL_STATR) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +IFEND CNTOV CNT[13:0] +访 +位 名称 描述 复位值 +问 +LSI32K校准计数结束中断标志位: +15 IFEND RW1 0:采样计数中,无标志; 0 +1:采样计数结束,标志置位。 +LSI32K采样计数器溢出标志位: +14 CNTOV RW1 0:未发生溢出; 0 +1:发生溢出。 +对若干个CK32K周期基于系统主频的计数值。 +[13:0] CNT[13:0] RO 0 +注:具体的CK32K周期数可配置。 +3.4.17 内部低速晶振校准次数计数器(LSI32K_CAL_OV_CNT) +偏移地址:0x22 +7 6 5 4 3 2 1 0 +OVCNT[7:0] +位 名称 访问 描述 复位值 +LSI32K采样计数器溢出次数。 +[7:0] OVCNT[7:0] RO 0 +注:清除溢出标志操作会清除此计数器。 +3.4.18 内部低速晶振校准控制寄存器(LSI32K_CAL_CTRL) +偏移地址:0x23 +7 6 5 4 3 2 1 0 +HALT Reserved CALEN CALINTEN +位 名称 访问 描述 复位值 +V2.4 53 + +# Page 57 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +LSI32K 校准计数状态位: +7 HALT RO 0:计数中,计数值不可用; 1 +1:计数暂停,可获取计数值。 +[6:2] Reserved RO 保留。 0 +LSI32K校准使能: +1 CALEN RW 0:关闭LSI32K校准; 0 +1:使能LSI32K校准。 +LSI32K校准中断使能: +0 CALINTEN RW 0:关闭LSI32K校准中断; 0 +1:使能LSI32K校准中断。 +注:适用于CH32V20x_D8W、CH32F20x_D8W。 +V2.4 54 + +# Page 58 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 4 章 后备寄存器(BKP) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +后备寄存器(BKP)提供了最大42个16位的后备数据寄存器,最大可以用来存储84字节的用户 +数据。在主电源(V )掉电后,这些数据仍可以由V 供电而保持,不受待机状态、系统复位或电源 +DD BAT +复位的影响。此外BKP单元还提供了侵入检测管理、RTC时钟校准及脉冲输出功能。 +4.1 主要特征 + 侵入检测(TAMPER)功能 + RTC时钟校准功能 + 在PC13引脚上输出RTC时钟64分频,闹钟脉冲或者秒脉冲 +4.2 功能说明 +微控制器复位后对后备寄存器和 RTC 的访问被禁止,需通过以下操作开启对后备寄存器的访问: +1)置寄存器RCC_APB1PCENR的PWREN位和BKPEN位来打开电源和后备接口的操作时钟; +2)置电源控制寄存器PWR_CTLR的DBP位,使能对后备寄存器和RTC寄存器的访问。 +4.2.1 后备数据寄存器 +后备数据寄存器可以作为通用数据缓存使用,由于其在V 掉电下靠V 电源保存数据的特性,可 +DD BAT +以用来存一些重要的或敏感的数据。但这些数据在产生侵入事件后会被全部清除。 +4.2.2 侵入检测 +侵入检测就是当外界提供了一个信号(上升沿或下降沿)时,表示有“侵入事件”,硬件将自动 +清除当前系统中保留的重要信息。这种方式可以增加系统信息的安全性。 +当侵入检测引脚上出现跳变沿(取决于 TPAL 位)时会产生一个侵入事件,如果使能了侵入检测 +中断,还会同时产生一个侵入检测中断。只要出现了侵入事件,后备数据寄存器就会被全部清除。此 +外,硬件检测采用记忆方式,即使侵入检测功能未开启(TPE=0),系统也会采样是否有跳变沿,并在 +满足TPAL位选择情况下,提前锁定侵入事件,并在TPE位置1下,触发侵入事件。 +例如:当TPAL=0时,如果TPE=0未开启功能,但TAMPER引脚已经为高电平,一旦TPE=1后,则 +会产生一个额外的侵入事件(系统提前锁定了上升沿)。当 TPAL=1 时,如果 TPE=0 未开启功能,但 +TAMPER引脚已经为低电平,一旦TPE=1后,则会产生一个额外的侵入事件(系统提前锁定了下降沿)。 +所以为了防止发生不必要的侵入事件,导致清除了后备寄存器,建议:在希望硬件检测侵入引脚 +的开始时刻,通过写BKP_TPCSR寄存器CTE位置1,先清除硬件可能记忆过的侵入事件,并确保当前 +侵入检测引脚状态是无效的。 +注:当V 电源断开时,侵入检测功能仍然有效。为了避免不必要的复位数据后备寄存器,TAMPER引 +DD +脚应该在片外连接到正确的电平。 +4.2.3 RTC 校准 +此功能必须配置侵入检测引脚作为普通IO口使用。配置BKP_TPCTLR寄存器TPE位清0。 + 脉冲输出 +配置BKP_OCTLR寄存器的ASOE位,开启RTC脉冲输出,设置ASOS位,选择秒脉冲输出还是闹钟 +脉冲输出。 + RTC校准 +配置BKP_OCTLR寄存器的CCO位后,内部的RTC时钟将经过64分频后输出到侵入检测引脚(TAMPER) +V2.4 55 + +# Page 59 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +上。通过实际测试,软件配合修改CAL[6:0]位来调整时钟对RTC进行校准。 +4.2.4 BKP 接口复位 +BKP区域可以在V 主电源掉电下,由V 独立供电。应用代码控制BKP区域寄存器复位中,后备 +DD BAT +数据寄存器BKP_DATAR1-10、ASOS位、ASOE位在软件配置RCC_BDCTLR寄存器的BDRST位下复位,不 +受RCC外设接口控制BKPRST位影响。 +4.3 寄存器描述 +表4-1 BKP相关寄存器列表 +名称 访问地址 描述 复位值 +R16_BKP_DATAR1 0x40006C04 后备数据寄存器1 0x0000 +R16_BKP_DATAR2 0x40006C08 后备数据寄存器2 0x0000 +R16_BKP_DATAR3 0x40006C0C 后备数据寄存器3 0x0000 +R16_BKP_DATAR4 0x40006C10 后备数据寄存器4 0x0000 +R16_BKP_DATAR5 0x40006C14 后备数据寄存器5 0x0000 +R16_BKP_DATAR6 0x40006C18 后备数据寄存器6 0x0000 +R16_BKP_DATAR7 0x40006C1C 后备数据寄存器7 0x0000 +R16_BKP_DATAR8 0x40006C20 后备数据寄存器8 0x0000 +R16_BKP_DATAR9 0x40006C24 后备数据寄存器9 0x0000 +R16_BKP_DATAR10 0x40006C28 后备数据寄存器10 0x0000 +R16_BKP_OCTLR 0x40006C2C RTC校准寄存器 0x0000 +R16_BKP_TPCTLR 0x40006C30 侵入检测控制寄存器 0x0000 +R16_BKP_TPCSR 0x40006C34 侵入检测状态寄存器 0x0000 +R16_BKP_DATAR11 0x40006C40 后备数据寄存器11 0x0000 +R16_BKP_DATAR12 0x40006C44 后备数据寄存器12 0x0000 +R16_BKP_DATAR13 0x40006C48 后备数据寄存器13 0x0000 +R16_BKP_DATAR14 0x40006C4C 后备数据寄存器14 0x0000 +R16_BKP_DATAR15 0x40006C50 后备数据寄存器15 0x0000 +R16_BKP_DATAR16 0x40006C54 后备数据寄存器16 0x0000 +R16_BKP_DATAR17 0x40006C58 后备数据寄存器17 0x0000 +R16_BKP_DATAR18 0x40006C5C 后备数据寄存器18 0x0000 +R16_BKP_DATAR19 0x40006C60 后备数据寄存器19 0x0000 +R16_BKP_DATAR20 0x40006C64 后备数据寄存器20 0x0000 +R16_BKP_DATAR21 0x40006C68 后备数据寄存器21 0x0000 +R16_BKP_DATAR22 0x40006C6C 后备数据寄存器22 0x0000 +R16_BKP_DATAR23 0x40006C70 后备数据寄存器23 0x0000 +R16_BKP_DATAR24 0x40006C74 后备数据寄存器24 0x0000 +R16_BKP_DATAR25 0x40006C78 后备数据寄存器25 0x0000 +R16_BKP_DATAR26 0x40006C7C 后备数据寄存器26 0x0000 +R16_BKP_DATAR27 0x40006C80 后备数据寄存器27 0x0000 +R16_BKP_DATAR28 0x40006C84 后备数据寄存器28 0x0000 +R16_BKP_DATAR29 0x40006C88 后备数据寄存器29 0x0000 +R16_BKP_DATAR30 0x40006C8C 后备数据寄存器30 0x0000 +R16_BKP_DATAR31 0x40006C90 后备数据寄存器31 0x0000 +V2.4 56 + +# Page 60 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_BKP_DATAR32 0x40006C94 后备数据寄存器32 0x0000 +R16_BKP_DATAR33 0x40006C98 后备数据寄存器33 0x0000 +R16_BKP_DATAR34 0x40006C9C 后备数据寄存器34 0x0000 +R16_BKP_DATAR35 0x40006CA0 后备数据寄存器35 0x0000 +R16_BKP_DATAR36 0x40006CA4 后备数据寄存器36 0x0000 +R16_BKP_DATAR37 0x40006CA8 后备数据寄存器37 0x0000 +R16_BKP_DATAR38 0x40006CAC 后备数据寄存器38 0x0000 +R16_BKP_DATAR39 0x40006CB0 后备数据寄存器39 0x0000 +R16_BKP_DATAR40 0x40006CB4 后备数据寄存器40 0x0000 +R16_BKP_DATAR41 0x40006CB8 后备数据寄存器41 0x0000 +R16_BKP_DATAR42 0x40006CBC 后备数据寄存器42 0x0000 +注:后备数据寄存器(BKP_DATARx)(x=11-42)适用于CH32F20x_D8、CH32F20x_D8C、CH32F20x_D8W、 +CH32V20x_D8、CH32V20x_D8W、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C。 +4.3.1 后备数据寄存器(BKP_DATARx)(x=1-42) +偏移地址:0x04-0x28,0x40-0xBC +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +D[15:0] +位 名称 访问 描述 复位值 +后备数据,可以被用户程序调用。 +注:它们仅由后备域复位来复位(BDRST)或(如 +[15:0] D[15:0] RW 0 +果侵入检测引脚 TAMPER 功能被开启时)由侵 +入引脚事件复位。 +4.3.2 RTC 校准寄存器(BKP_OCTLR) +偏移地址:0x2C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved ASOS ASOE CCO CAL[6:0] +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留。 0 +TAMPER引脚闹钟/秒脉冲输出选择: +0:输出闹钟脉冲; +9 ASOS RW 0 +1:输出秒脉冲。 +注:此位只会由后备域复位(BDRST)来复位。 +TAMPER引脚使能脉冲输出位: +0:禁止输出闹钟脉冲或者秒脉冲; +8 ASOE RW 0 +1:使能输出闹钟脉冲或者秒脉冲。 +注:此位只会由后备域复位(BDRST)来复位。 +校准时钟输出选择位: +0:不输出校准时钟; +7 CCO RW 0 +1:TEMPER引脚输出经64分频的RTC时钟。 +注1:开启此功能必须关闭侵入检测功能。 +V2.4 57 + +# Page 61 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注2:当V 供电断开时,该位被清除。 +DD +校准值寄存器,这个寄存器的值表示在每220个 +[6:0] CAL[6:0] RW 时钟脉冲中有多少个被跳过。这个功能用来校 0 +准RTC时钟。RTC时钟可以被减慢0~121ppm。 +4.3.3 侵入检测控制寄存器(BKP_TPCTLR) +偏移地址:0x30 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TPAL TPE +位 名称 访问 描述 复位值 +[15:2] Reserved RO 保留。 0 +侵入检测引脚(TEMPER引脚)有效电平设置 +0:侵入检测引脚上的高电平会清除所有后备 +1 TPAL RW 数据寄存器(硬件锁定上升沿); 0 +1:侵入检测引脚上的低电平会清除所有后备 +数据寄存器(硬件锁定下降沿)。 +侵入检测引脚使能位 +0 TPE RW 0:TEMPER引脚做普通IO口用; 0 +1:TEMPER引脚做侵入检测用。 +注:同时将TPAL和TPE位清除会产生一个假的侵入事件,推荐只在TPE为0时才改变TPAL位的状 +态。 +4.3.4 侵入检测状态寄存器(BKP_TPCSR) +偏移地址:0x34 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TIF TEF Reserved TPIE CTI CTE +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留。 0 +侵入中断标志位,当检测到侵入事件且TPIE位 +置1时,此位会被置位。通过向CTI位写1来 +清除此标志位。如果TPIE位被复位,那么此位 +9 TIF RO 0 +同时也会被复位。 +注:仅当系统复位或由待机模式唤醒后才复位 +该位。 +侵入事件标志位,当检测到侵入事件时,此位 +会被置位。通过向CTE位写1会清除此位。 +8 TEF RO 注:当此位为1时,所有的BKP_DATARx寄存器 0 +的值会被清除,且在此位不复位前,所有对 +BKP_DATARx寄存器的写入操作都是无效的。 +[7:3] Reserved RO 保留。 0 +产生侵入中断使能位: +2 TPIE RW 0 +0:禁止侵入检测中断; +V2.4 58 + +# Page 62 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:使能侵入检测中断(TPE需置1)。 +注1:侵入中断无法将内核从低功耗模式唤醒。 +注 2:仅当系统复位或由待机模式唤醒后才复 +位该位。 +1 CTI WO 侵入检测中断清除位,写1清除,读取无效。 0 +0 CTE WO 侵入检测事件清除位,写1清除,读取无效。 0 +V2.4 59 + +# Page 63 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 5 章 循环冗余校验(CRC) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +循环冗余校验(CRC)计算单元是根据固定的生成多项式得到任一32位数据的CRC计算结果。一 +般用于数据存储和数据通讯领域用来核实数据的正确性。系统提供硬件 CRC 计算单元可以大大节省 +CPU和RAM资源提高效率。 +图5-1 CRC结构框图 +HB Bus +32-bit read +CRC computation +(polynomial: 0x4C11DB7) +32-bit write +Data register +(CRC_DATAR) +5.1 主要特征 + 使用CRC32多项式(0x4C11DB7):X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1; + 同一个32位寄存器作为数据的输入和CRC32计算输出 + 单次转换时间:4个HB时钟周期(HCLK) +5.2 功能描述 + CRC单元复位 +如果要开始一次新数据组的 CRC 计算,需要复位 CRC 计算单元。向控制寄存器 CRC_CTLR 的 RST +位写1,硬件将复位数据寄存器,恢复初始值0xFFFFFFFF。 + CRC计算 +CRC 单元的计算是前一次 CRC 计算结果和新参与的数据的 CRC结果。CRC_DATAR 数据寄存器,对 +其执行写操作将送入新数据到硬件计算单元;执行读取操作,将得到最新一轮的CRC计算值。硬件计 +算时会中断系统的写操作,因此可以连续写入新的值。 +注:CRC单元是对整个32位数据进行计算,而不是逐字节计算。 + 独立数据缓冲区 +CRC单元提供了一个8位独立数据寄存器CRC_IDATAR,用于应用代码临时存放1字节的数据,不 +受CRC单元复位影响。 +5.3 寄存器描述 +表5-1 CRC相关寄存器列表 +名称 访问地址 描述 复位值 +R32_CRC_DATAR 0x40023000 数据寄存器 0xFFFFFFFF +V2.4 60 + +# Page 64 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R8_CRC_IDATAR 0x40023004 独立数据缓冲 0x00 +R32_CRC_CTLR 0x40023008 控制寄存器 0x00000000 +5.3.1 数据寄存器(CRC_DATAR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DR[15:0] +位 名称 访问 描述 复位值 +[31:0] DR[31:0] RW 写入原始数据;读出计算结果。 0xFFFFFFFF +5.3.2 独立数据缓冲(CRC_IDATAR) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved IDR[7:0] +位 名称 访问 描述 复位值 +8 位通用寄存器,可以用作数据缓存,这个寄 +[7:0] IDR[7:0] RW 0 +存器不受控制寄存器的RST域影响。 +5.3.3 控制寄存器(CRC_CTLR) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RST +位 名称 访问 描述 复位值 +[31:1] Reserved RO 保留。 0 +CRC 计算单元复位控制,写 1 执行,硬件自动 +0 RST WO 0 +清零,执行完后,数据寄存器为0xFFFFFFFF。 +V2.4 61 + +# Page 65 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 6 章 实时时钟(RTC) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +实时时钟(RTC)是一个独立的定时器模块,其可编程计数器最大可达到32位,配合软件即可以 +实现实时时钟功能,并且可以修改计数器的值来重新配置系统的当前时间和日期。RTC模块在后备供 +电区域,系统复位和待机模式唤醒对其不造成影响。 +6.1 主要特征 + 最高为220的预分频系数 + 32位可编程计数器 + 多种时钟源,中断 + 独立复位 +6.2 功能描述 +6.2.1 概述 +图6-1 RTC结构框图 +PB1 bus +PCLK1 +PB1 interface +not powered in Standby +RTCCLK Backup domain +RTC_CR +RTC_PRL +Second event +SECF +Reload 32-bit programmable +counter SECIE +TR_CLK Overflow event +RTC_DIV RTC_CNT OWF +Rising edge OWIE +Alarm event +ALRF +RTC prescaler +ALRIE +RTC_ALRM +powered in Standby +powered in Standby +NVIC interrupt +powered in Standby controller +powered in Standby +WKUP pin RTC_Alarm exit +WKP_STDBY Standby mode +powered in Standby +由图6-1所示,RTC模块主要是PB1总线接口、分频器和计数器、控制和状态寄存器三部分组成, +其中分频器和计数器部分在后备区域,可由V 供电。RTCCLK输入分频器(RTC_DIV)之后,被分频成 +BAT +TR_CLK。值得注意的是,分频器(RTC_DIV)的内部是一个自减计数器,自减到溢出就会输出一个TR_CLK, +然后从重装值寄存器(RTC_PSCR)里取出预设值重装到分频器里,读分频器实际上是读取它的实时值 +V2.4 62 + +# Page 66 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +(read only),写分频系数应该写到重装值寄存器(RTC_PSCR)里。一般TR_CLK的周期被设置为1 +秒,TR_CLK 会触发秒事件,同时会使主计数器(RTC_CNT)自增 1;当主计数器增加到和闹钟寄存器 +的值一致时,会触发闹钟事件;当主计数器自增到溢出时,会触发溢出事件。以上三种事件都可以触 +发中断,并对应相应中断使能位控制。 +6.2.2 复位 +由于实时时钟的特殊用途,其处于后备域的四组寄存器:预分频,预分频重装值,主计数器和闹 +钟,只能通过后备域的复位信号复位,参照RCC的后备域复位章节。实时时钟的控制寄存器受系统复 +位或电源复位控制。 +6.2.3 较特别的读写寄存器操作 +由于实时时钟的特殊用处,RTC 和 PB1 总线是独立的,PB1对 RTC的读取不一定是实时的,通过 +PB1读取RTC的寄存器必须在PB1启动后并经过了一个RTC上升沿,这种情形可能出现在系统复位和 +电源复位之后、从待机或者停机模式唤醒后。方便的做法是等待控制寄存器(CTLR)的RSF位被置高。 +对RTC的写操作器必须等上一个写操作结束,且必须进入配置模式,具体的步骤为: +1) 查询RTOFF位,直到其变为1; +2) 置CNF位,进入配置模式; +3) 对一个或者多个RTC寄存器进行写操作; +4) 清CNF位,退出配置模式,PB1接口开始对RTC寄存器进行写入; +5) 查询RTOFF位,直到其变为1即为写完。 +6.3 寄存器描述 +表6-1 RTC相关寄存器列表 +名称 访问地址 描述 复位值 +R16_RTC_CTLRH 0x40002800 RTC控制寄存器高位 0x0000 +R16_RTC_CTLRL 0x40002804 RTC控制寄存器低位 0x0020 +R16_RTC_PSCRH 0x40002808 预分频器重装值寄存器高位 0x0000 +R16_RTC_PSCRL 0x4000280C 预分频器重装值寄存器低位 0xXXXX +R16_RTC_DIVH 0x40002810 分频器寄存器高位 0xXXXX +R16_RTC_DIVL 0x40002814 分频器寄存器低位 0xXXXX +R16_RTC_CNTH 0x40002818 RTC计数器高位 0xXXXX +R16_RTC_CNTL 0x4000281C RTC计数器低位 0xXXXX +R16_RTC_ALRMH 0x40002820 闹钟寄存器高位 0xXXXX +R16_RTC_ALRML 0x40002824 闹钟寄存器低位 0xXXXX +6.3.1 RTC 控制寄存器高位(RTC_CTLRH) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved OWIE ALRIE SECIE +位 名称 访问 描述 复位值 +[15:3] Reserved RO 保留。 0 +2 OWIE RW 溢出中断使能位。 0 +1 ALRIE RW 闹钟中断使能位。 0 +V2.4 63 + +# Page 67 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0 SECIE RW 秒中断使能位。 0 +6.3.2 RTC 控制寄存器低位(RTC_CTLRL) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RTOFF CNF RSF OWF ALRF SECF +位 名称 访问 描述 复位值 +[15:6] Reserved RO 保留。 0 +RTC 操作状态指示位,表示对 RTC 的最后一次 +操作的执行状态,对RTC的操作必须等待此位 +5 RTOFF RO 为1。 1 +0:上一次对RTC的操作还在进行中; +1:上一次对RTC的操作已经完成。 +配置标志位,将此位写1进入配置模式,从而 +允许向计数器(R16_RTC_CNTx)、闹钟寄存器 +(R16_RTC_ALRMx)和预分频器重装值寄存器 +4 CNF RW (R16_RTC_PSCRx)写入值.只有将该位写1并 0 +重新被软件清0后才会执行写的操作: +0:退出配置模式,开始更新RTC寄存器; +1:进入配置模式。 +寄存器同步标志位,在对 RTC 模块的预分频 +(PSCRx)、闹钟(ALRMx)、计数器(CNTx) +这些寄存器进行读写前,都要先保证这个位已 +经被硬件置位,以确定这些寄存器已经被同 +3 RSF RW0 0 +步;在进行读写这些寄存器时,或者PB1复位 +或PB1时钟停止后,第一步应该将此位复位。 +0:寄存器未被同步; +1:寄存器已被同步。 +计数器溢出标志,当32位计数器溢出时,此位 +由硬件置位。如果置位了OWIE位,还会产生一 +2 OWF RW0 0 +个溢出中断。此位只能由软件清零,不能被软 +件置位。 +闹钟标志,当计数器的值达到闹钟寄存器 +(ALRMx)的值,此位会被硬件置位,如果闹钟 +1 ALRF RW0 0 +中断使能位(ALRIE)置位,还会产生一个闹钟 +中断。此位只能由软件清零,不能被软件置位。 +秒事件标志,当时钟经过预分频器分频后每产 +生一个下降沿,就会使计数器自增一,同时产 +0 SECF RW0 生一个秒事件,此位会被置位,如果秒中断被 0 +使能(SECIE 被置位),同时还会产生一个秒 +中断。此位只能由软件清零,不能被软件置位。 +V2.4 64 + +# Page 68 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +6.3.3 预分频器重装值寄存器高位(RTC_PSCRH) +偏移地址:0x08 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved PRL[19:16] +位 名称 访问 描述 复位值 +[15:4] Reserved RO 保留。 0 +[3:0] PRL[19:16] WO 重装值高位。 0 +6.3.4 预分频器重装值寄存器低位(RTC_PSCRL) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PRL[15:0] +位 名称 访问 描述 复位值 +重 装 值 低 位 。 实 际 的 分 频 系 数 就 是 +(PRL[19:0]+1),比如如果 RTC 输入频率为 +[15:0] PRL[15:0] WO X +32768Hz,那么这个值设为0x7fff就可以分频 +出1秒周期的信号。 +6.3.5 分频器寄存器高位(RTC_DIVH) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DIV[19:16] +位 名称 访问 描述 复位值 +[15:4] Reserved RO 保留。 0 +[3:0] DIV[19:16] RO 分频器寄存器高位。 x +6.3.6 分频器寄存器低位(RTC_DIVL) +偏移地址:0x14 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DIV[15:0] +位 名称 访问 描述 复位值 +分频器寄存器低位。DIV 实际上是一个自减计 +数器,RTC_CLK 每来一个时钟 DIV 计数器就会 +[15:0] DIV[15:0] RO 减1,溢出后就会输出一个TR_CLK,同时从PSCR X +中重装载值。DIV 只能读取,读出的是当前分 +频器的计数器的剩余值。 +V2.4 65 + +# Page 69 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +6.3.7 RTC 计数器高位(RTC_CNTH) +偏移地址:0x18 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[31:16] +位 名称 访问 描述 复位值 +[15:0] CNT[31:16] RW 计数器高位。 X +6.3.8 RTC 计数器低位(RTC_CNTL) +偏移地址:0x1C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +计数器低位,RTC定时器的核心器件,由TRCLK +(周期一般设为 1 秒)提供时钟。通过读取 +[15:0] CNT[15:0] RW X +CNT[31:0]来计算出当前的时间。写这个值需 +要进入配置模式。 +6.3.9 闹钟寄存器高位(RTC_ALRMH) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ALR[31:16] +位 名称 访问 描述 复位值 +[15:0] ALR[31:16] WO 闹钟寄存器高位。 X +6.3.10 闹钟寄存器低位(RTC_ALRML) +偏移地址:0x24 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ALR[15:0] +位 名称 访问 描述 复位值 +闹钟寄存器低位。当闹钟寄存器ALRM[31:0]的 +[15:0] ALR[15:0] WO 值和计数器 CNT[31:0]的值一致时会产生一个 X +闹钟事件。更改这个值需要进入配置模式。 +V2.4 66 + +# Page 70 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 7 章 独立看门狗(IWDG) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +系统设有独立看门狗(IWDG)用来检测逻辑错误和外部环境干扰引起的软件故障。IWDG时钟源 +来自于LSI,可独立于主程序之外运行,适用于对精度要求低的场合。 +7.1 主要特征 + 12位自减型计数器 + 时钟来源LSI分频,可以在低功耗模式下运行 + 复位条件:计数器值减到0 +7.2 功能说明 +7.2.1 原理和用法 +独立看门狗的时钟来源LSI时钟,其功能在停机和待机模式时仍能正常工作。当看门狗计数器自 +减到0时,将会产生系统复位,所以超时时间为(重装载值+1)个时钟。 +图7-1 独立看门狗的结构框图 +CORE +Prescaler register Status register Reload register Conctrol register +IWDG_PSCR IWDG_STATR IWDG_RLDR IWDG_CTLR +12-bit reload value +8-bit +LSI +prescaler +(40kHz) +12-bit downcounter IWDG reset +VDD voltage domain + 启动独立看门狗 +系统复位后,看门狗处于关闭状态,向 IWDG_CTLR 寄存器写 0xCCCC 开启看门狗,随后它不能再 +被关闭,除非发生复位。 +如果在用户选择字开启了硬件独立看门狗使能位(IWDG_SW),在微控制器复位后将固定开启IWDG。 + 看门狗配置 +看门狗内部是一个递减运行的12位计数器,当计数器的值减为0时,将发生系统复位。开启IWDG +功能,需要执行下面几点操作: +1) 计数时基:IWDG时钟来源LSI,通过 IWDG_PSCR寄存器设置 LSI分频值时钟作为 IWDG的计数时 +基。操作方法先向IWDG_CTLR寄存器写0x5555,再修改IWDG_PSCR寄存器中的分频值。IWDG_STATR +寄存器中的 PVU 位指示了分频值更新状态,在更新完成的情况下才可以进行分频值的修改和读 +出。 +2) 重装载值:用于更新独立看门狗中计数器当前值,并且计数器由此值进行递减。操作方法先向 +IWDG_CTLR 寄存器写 0x5555,再修改 IWDG_RLDR 寄存器设置目标重装载值。IWDG_STATR 寄存器 +中的RVU位指示了重装载值更新状态,在更新完成的情况下才可以进行IWDG_RLDR寄存器的修改 +和读出。 +3) 看门狗使能:向IWDG_CTLR寄存器写0xCCCC,即可开启看门狗功能。 +4) 喂狗:即在看门狗计数器递减到0前刷新当前计数器值防止发生系统复位。向IWDG_CTLR寄存器 +写0xAAAA,让硬件将IWDG_RLDR寄存值更新到看门狗计数器中。此动作需要在看门狗功能开启后 +V2.4 67 + +# Page 71 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +定时执行,否则会出现看门狗复位动作。 +7.2.2 调试模式 +系统进入调试模式时,可以由调试模块寄存器配置IWDG的计数器继续工作或停止。 +7.3 寄存器描述 +表7-1 IWDG相关寄存器列表 +名称 访问地址 描述 复位值 +R16_IWDG_CTLR 0x40003000 控制寄存器 0x0000 +R16_IWDG_PSCR 0x40003004 分频因子寄存器 0x0000 +R16_IWDG_RLDR 0x40003008 重装载值寄存器 0x0FFF +R16_IWDG_STATR 0x4000300C 状态寄存器 0x0000 +7.3.1 IWDG 控制寄存器(IWDG_CTLR) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +KEY[15:0] +位 名称 访问 描述 复位值 +操作键值锁。 +0xAAAA:喂狗。加载IWDG_RLDR寄存器值到独 +立看门狗计数器中; +[15:0] KEY[15:0] WO 0x5555:允许修改R16_IWDG_PSCR和R16_IWDG_ 0 +RLDR寄存器; +0xCCCC:启动看门狗,如果启用了硬件看门狗 +(用户选择字配置)则不受这个限制。 +7.3.2 分频因子寄存器(IWDG_PSCR) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved PR[2:0] +位 名称 访问 描述 复位值 +[15:3] Reserved RO 保留。 0 +IWDG时钟分频系数,修改此域前要向KEY中写 +0x5555。 +000:4分频; 001:8分频; +010:16分频; 011:32分频; +[2:0] PR[2:0] RW 100:64分频; 101:128分频; 000b +110:256分频; 111:256分频。 +IWDG计数时基=LSI/分频系数。 +注:读该域值前,要确保IWDG_STATR寄存器中 +的PVU位为0,否则读出值无效。 +V2.4 68 + +# Page 72 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +7.3.3 重装载值寄存器(IWDG_RLDR) +偏移地址:0x08 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RL[11:0] +位 名称 访问 描述 复位值 +[15:12] Reserved RO 保留。 0 +计数器重装载值。修改此域前要向 KEY 中写 +0x5555。 +当向 KEY 中写 0xAAAA 后,此域的值将会被硬 +[11:0] RL[11:0] RW 件装载到计数器中,随后计数器从这个值开始 0xFFF +递减计数。 +注:读写该域值前,要确保IWDG_STATR寄存器 +中的RVU位为0,否则读写此域无效。 +7.3.4 状态寄存器(IWDG_STATR) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RVU PVU +位 名称 访问 描述 复位值 +[15:2] Reserved RO 保留。 0 +重装值更新标志位。硬件置位或清0。 +0:重装载更新结束(最多5个LSI周期); +1 RVU RO 1:重装载值更新正在进行中。 0 +注:重装载值寄存器IWDG_RLDR只有在RVU位 +被清0后才可读写访问。 +时钟分频系数更新标志位。硬件置位或清0。 +0:时钟分频值更新结束(最多5个LSI周期); +0 PVU RO 1:时钟分频值更新正在进行中。 0 +注:分频因子寄存器IWDG_PSCR只有在PVU位 +被清0后才可读写访问。 +注:在预分频或重装值更新后,不必等待RVU或PVU复位,可继续执行下面的代码。(即使在低功耗 +模式下,此写操作仍会被继续执行完成。) +V2.4 69 + +# Page 73 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 8 章 窗口看门狗(WWDG) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +窗口看门狗一般用来监测系统运行的软件故障,例如外部干扰、不可预见的逻辑错误等情况。它 +需要在一个特定的窗口时间(有上下限)内进行计数器刷新(喂狗),否则早于或者晚于这个窗口时 +间看门狗电路都会产生系统复位。 +8.1 主要特征 + 可编程的7位自减型计数器 + 双条件复位:当前计数器值小于0x40,或者计数器值在窗口时间外被重装载 + 唤醒提前通知功能(EWI),用于及时喂狗动作防止系统复位 +8.2 功能说明 +8.2.1 原理和用法 +窗口看门狗运行基于一个 7 位的递减计数器,其挂载在 PB1 总线下,计数时基 WWDG_CLK 来源 +(PCLK1/4096)时钟的分频,分频系数在配置寄存器WWDG_CFGR中的WDGTB[1:0]域设置。递减计数器 +处于自由运行状态,无论看门狗功能是否开启,计数器一直循环递减计数。如图8-1所示,窗口看门 +狗内部结构框图。 +图8-1 窗口看门狗结构框图 +Watchdog configuration register(WWDG_CFGR) +- W6 W5 W4 W3 W2 W1 W0 +T[6:0] > W[6:0] +RESET +Write WWDG_CTLR[6:0] +Watchdog control register(WWDG_CTLR) +WDGA T6 T5 T4 T3 T2 T1 T0 +WWDG enable control, software on +WWDG_CLK +PCLK1 / 4 0 96 WDGTB[1:0] + 启动窗口看门狗 +系统复位后,看门狗处于关闭状态,设置 WWDG_CTLR 寄存器的 WDGA 位能够开启看门狗,随后它 +不能再被关闭,除非发生复位。 +注:可以通过设置RCC_APB1PCENR寄存器关闭WWDG的时钟来源,暂停WWDG_CLK计数,间接停止看门 +狗功能,或者通过设置RCC_APB1PRSTR寄存器复位WWDG模块,等效为复位的作用。 + 看门狗配置 +看门狗内部是一个不断循环递减运行的7位计数器,支持读写访问。使用看门狗复位功能,需要 +执行下面几点操作: +1) 计数时基:通过 WWDG_CFGR 寄存器的 WDGTB[1:0]位域,注意要开启 RCC 单元的 WWDG 模块时钟。 +V2.4 70 + +# Page 74 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2) 窗口计数器:设置 WWDG_CFGR 寄存器的 W[6:0]位域,此计数器由硬件用作和当前计数器比较使 +用,数值由用户软件配置,不会改变。作为窗口时间的上限值。 +3) 看门狗使能:WWDG_CTLR寄存器WDGA位软件置1,开启看门狗功能,可以系统复位。 +4) 喂狗:即刷新当前计数器值,配置WWDG_CTLR寄存器的T[6:0]位域。此动作需要在看门狗功能开 +启后,在周期性的窗口时间内执行,否则会出现看门狗复位动作。 + 喂狗窗口时间 +如图 8-2 所示,灰色区域为窗口看门狗的监测窗口区域,其上限时间 t2 对应当前计数器值达到 +窗口值W[6:0]的时间点;其下限时间t3对应当前计数器值达到0x3F的时间点。此区域时间内t2> 2; +i-1 +pmpaddr = B_ADDR >> 2。 +i +固定4字节区域保护。 +10b NA4 pmp0cfg~pmp3cfg对应pmpaddr0~pmpaddr3作为起始地址。 +pmpaddr = A_ADDR >> 2。 +i +保护2(G+2)区域,G≥1,此时A_ADDR为2(G+2)对齐。 +11b NAPOT +pmpaddr = ((A_ADDR |(2(G+2)-1))& ~(1<> 2。 +i +9.5.4.2 PMP 地址 0 寄存器(PMPADDR0) +CSR地址:0x3B0 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADDR0[33:18] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDR0[17:2] +位 名称 访问 描述 复位值 +[31:0] ADDR0[31:0] MRW PMP设置地址0的bit[33:2],实际高2位未用。 0 +9.5.4.3 PMP 地址 1 寄存器(PMPADDR1) +CSR地址:0x3B1 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADDR1[33:18] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDR1[17:2] +位 名称 访问 描述 复位值 +[31:0] ADDR1[31:0] MRW PMP设置地址1的bit[33:2],实际高2位未用。 0 +9.5.4.4 PMP 地址 2 寄存器(PMPADDR2) +CSR地址:0x3B2 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADDR2[33:18] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDR2[17:2] +V2.4 102 + +# Page 106 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[31:0] ADDR2[31:0] MRW PMP设置地址2的bit[33:2],实际高2位未用。 0 +9.5.4.5 PMP 地址 3 寄存器(PMPADDR3) +CSR地址:0x3B3 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADDR3[33:18] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDR3[17:2] +位 名称 访问 描述 复位值 +[31:0] ADDR3[31:0] MRW PMP设置地址3的bit[33:2],实际高2位未用。 0 +9.5.5 RISC-V-SysTick 寄存器描述 +表9-6 STK相关寄存器列表 +名称 访问地址 描述 复位值 +R32_STK_CTLR 0xE000F000 系统计数控制寄存器 0x00000000 +R32_STK_SR 0xE000F004 系统计数状态寄存器 0x00000000 +R32_STK_CNTL 0xE000F008 系统计数器低位寄存器 0x00000000 +R32_STK_CNTH 0xE000F00C 系统计数器高位寄存器 0x00000000 +R32_STK_CMPLR 0xE000F010 计数比较低位寄存器 0x00000000 +R32_STK_CMPHR 0xE000F014 计数比较高位寄存器 0x00000000 +注:适用于基于32位RISC-V指令集及架构设计的通用微控制器。 +9.5.5.1 系统计数控制寄存器(STK_CTLR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +SWIE Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved INIT MODE STRE STCLK STIE STE +位 名称 访问 描述 复位值 +软件中断触发使能(SWI): +0:关闭触发; +31 SWIE RW 0 +1:触发软件中断。 +进入软件中断后,需软件清0,否则持续触发。 +[30:6] Reserved RO 保留。 0 +计数器初始值更新: +0:无效; +5 INIT W1 0 +1:向上计数时更新为0,向下计数时更新为比 +较值。 +4 MODE RW 计数模式: 0 +V2.4 103 + +# Page 107 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:向上计数; +1:向下计数。 +自动重装载计数使能位: +0:向上计数到比较值后继续向上计数,向下计 +3 STRE RW 数到0后,重新从最大值开始向下计数; 0 +1:向上计数到比较值后重新从0开始计数,向 +下计数到0后,重新从比较值开始计数。 +计数器时钟源选择位: +2 STCLK RW 0:HCLK/8做时基; 0 +1:HCLK做时基; +计数器中断使能控制位: +1 STIE RW 0:关闭计数器中断; 0 +1:使能计数器中断。 +系统计数器使能控制位: +0 STE RW 0:关闭系统计数器STK,计数器停止计数; 0 +1:启动系统计数器STK。 +9.5.5.2 系统计数状态寄存器(STK_SR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CNTIF +位 名称 访问 描述 复位值 +[31:1] Reserved RO 保留 0 +计数值比较标志,写0清除,写1无效: +0 CNTIF RW0 0:未达到比较值; 0 +1:向上计数达到比较值,向下计数到0。 +9.5.5.3 系统计数器低位寄存器(STK_CNTL) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CNT[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +[31:0] CNT[31:0] RW 当前计数器计数值低32位。 0 +注:寄存器STK_CNTL和寄存器STK_CNTH共同构成了64位系统计数器。 +9.5.5.4 系统计数器高位寄存器(STK_CNTH) +V2.4 104 + +# Page 108 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CNT[63:48] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[47:32] +位 名称 访问 描述 复位值 +[31:0] CNT[63:32] RW 当前计数器计数值高32位。 0 +注:寄存器STK_CNTL和寄存器STK_CNTH共同构成了64位系统计数器。 +9.5.5.5 计数比较低位寄存器(STK_CMPLR) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CMP[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CMP[15:0] +位 名称 访问 描述 复位值 +[31:0] CMP[31:0] RW 设置比较计数器值低32位。 0 +注:寄存器STK_CMPLR和寄存器STK_CMPHR共同构成了64位计数器比较值。 +9.5.5.6 计数比较高位寄存器(STK_CMPHR) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CMP[63:48] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CMP[47:32] +位 名称 访问 描述 复位值 +[31:0] CMP[63:32] RW 设置比较计数器值高32位。 0 +注:寄存器STK_CMPLR和寄存器STK_CMPHR共同构成了64位计数器比较值。 +9.5.6 ARM-SysTick 寄存器描述 +表9-7 SysTick相关寄存器列表 +名称 访问地址 描述 复位值 +R32_STK_CTRL 0xE000E010 SysTick控制及状态寄存器 0x00000000 +R32_STK_LOAD 0xE000E014 SysTick重装载数值寄存器 0x00000000 +R32_STK_VAL 0xE000E018 SysTick当前数值寄存器 0x00000000 +R32_STK_CALIB 0xE000E01C SysTick校准数值寄存器 0x00000000 +注:适用于基于ARM○RCortexTM-M3内核设计的通用微控制器 +V2.4 105 + +# Page 109 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +9.5.6.1 SysTick 控制及状态寄存器(STK_CTRL) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +COUNT +Reserved +FLAG +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CLKSO TICKI ENABL +Reserved +URCE NT E +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +如果在上次读取本寄存器后,SysTick 已经数 +16 COUNTFLAG RO 到了0,则该位为1。如果读取该位,该位将自 0 +动清零。 +[15:3] Reserved RO 保留。 0 +0:外部时钟源(STCLK); +2 CLKSOURCE RW 0 +1:内部时钟(FCLK)。 +0:数到0时无动作; +1 TICKINT RW 1:SysTick 倒数到 0 时产生 SysTick 异常请 0 +求。 +SysTick定时器的使能位: +0 ENABLE RW 0:禁止; 0 +1:使能。 +9.5.6.2 SysTick 重装载数值寄存器(STK_LOAD) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved RELOAD[23:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RELOAD[15:0] +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +[23:0] RELOAD[23:0] RW 当倒数至零时,将被重装载的值。 0 +9.5.6.3 SysTick 当前数值寄存器(STK_VAL) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved CURRENT[23:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CURRENT[15:0] +V2.4 106 + +# Page 110 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +读取时返回当前倒计数的值,写它则使之清 +[23:0] CURRENT RW 零,同时还会清除在SysTick控制及状态寄存 0 +器中的COUNTFLAG标志。 +9.5.6.4 SysTick 校准数值寄存器(STK_CALIB) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +NOREF SKEW Reserved TENMS[23:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TENMS[15:0] +位 名称 访问 描述 复位值 +0:外部参考时钟可用; +31 NOREF RO 0 +1:没有外部参考时钟(STCLK不可用)。 +0:校准值是准确的10ms; +30 SKEW RO 0 +1:校准值不是准确的10ms。 +[29:24] Reserved RO 保留。 0 +10ms的时间内倒计数的格数。芯片设计者应该 +[23:0] TENMS RW 通过Cortex-M3的输入信号提供该数值。若该 0 +数值读回零,则表示无法使用校准功能。 +V2.4 107 + +# Page 111 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 10 章 GPIO 及其复用功能(GPIO/AFIO) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +GPIO口可以配置成多种输入或输出模式,内置可关闭的上拉或下拉电阻,可以配置成推挽或开漏 +功能。GPIO口还可以复用成其他功能。 +10.1 主要特征 +端口的每个引脚可以配置成以下的多种模式之一: + 浮空输入  开漏输出 + 上拉输入  推挽输出 + 下拉输入  复用功能的输入和输出 + 模拟输入 +许多引脚拥有复用功能,很多其他的外设把自己的输出和输入通道映射到这些引脚上,这些复用 +引脚具体用法需要参照各个外设,而对这些引脚是否复用和是否重映射的内容由本章说明。 +10.2 功能描述 +10.2.1 概述 +图10-1 GPIO模块基本结构框图 +Analog Input V DD +To on-chip +peripheral Alternate Function Input +on/off +oonn//ooffff +Read Input data +V +register DD +TTL Schmitt +Protection +trigger +on/off diode +Write Bit set/reset Input driver V SS I/O pin +registers +Output driver V +DD Protection +diode +P-MOS +Output data +Read/write register O co u n t t p r u o t l V SS +N-MOS +V +SS Push-pull, +from on-chip open-drain or +peripheral Alternate Function Output disabled +如图 10-1 所示 IO 口结构,每个引脚在芯片内部都有两只保护二极管,IO 口内部可分为输入和 +输出驱动模块。其中输入驱动有弱上下拉电阻可选,可连接到 AD 等模拟输入的外设;如果输入到数 +字外设,就需要经过一个 TTL 施密特触发器,再连接到 GPIO 输入寄存器或其他复用外设。而输出驱 +动有一对 MOS管,可通过配置上下的 MOS 管是否使能来将 IO口配置成开漏或推挽输出;输出驱动内 +部也可以配置成由GPIO控制输出还是由复用的其他外设控制输出。 +10.2.2 GPIO 的初始化功能 +刚复位后,GPIO口运行在初始状态,这时大多数IO口都是运行在浮空输入状态,但也有HSE等 +外设相关的引脚是运行在外设复用的功能上。具体的初始化功能请参照引脚描述相关的章节。 +V2.4 108 + +# Page 112 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.2.3 外部中断 +所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个 +GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,比如 PA1(或 PB1、PC1、PD1、 +PE1等)只能映射到EXTI1上,且EXTI1只能接受PA1、PB1、PC1、PD1或PE1等其中之一的映射,两 +方都是一对一的关系。 +10.2.4 复用功能 +使用复用功能必须要注意: + 使用输入方向的复用功能,端口必须配置成复用输入模式,上下拉设置可根据实际需要来设置 + 使用输出方向的复用功能,端口必须配置成复用输出模式,推挽或开漏可根据实际情况设置 + 对于双向的复用功能,端口必须配置成复用输出模式,这时驱动器被配置成浮空输入模式 +同一个 IO 口可能有多个外设复用到此管脚,因此为了使各个外设都有最大的发挥空间,外设的 +复用引脚除了默认复用引脚,还可以进行重映射,重映射到其他的引脚,避开被占用的引脚。 +10.2.5 锁定机制 +锁定机制可以锁定IO口的配置。经过特定的一个写序列后,选定的IO引脚配置将被锁定,在下 +一个复位前无法更改。 +10.2.6 输入配置 +图10-2 GPIO模块输入配置结构框图 +VDD +on/off +on +Read Input data +register +VDD +TTL Schmitt +Protection +trigger +on/off diode +Write Bit se/treset Input driver VSS I/O pin +registers +Protection +diode +Read/write +Output data VSS +register +from on-chip peripheral Output driver +当 IO 口配置成输入模式时,输出驱动断开,输入上下拉可选,不连接复用功能和模拟输入。在 +每个 IO 口上的数据在每个 PB2 时钟被采样到输入数据寄存器,读取输入数据寄存器对应位即获取了 +对应引脚的电平状态。 +V2.4 109 + +# Page 113 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.2.7 输出配置 +图10-3 GPIO模块输出配置结构框图 +on +Read Input data +V +register DD +TTL Schmitt +Protection +trigger +diode +Write Bit set/reset Input driver I/O pin +registers +Output driver V +DD Protection +diode +P-MOS +Output data Output V +SS +Read/write register control +N-MOS +V +SS Push-pull, +open-drain or +disabled +当 IO 口配置成输出模式时,输出驱动器中的一对 MOS 可根据需要被配置成推挽或开漏模式,不 +使用复用功能。输入驱动的上下拉电阻被禁用,TTL施密特触发器被激活,出现在IO引脚上的电平将 +会在每个 PB2 时钟被采样到输入数据寄存器,所以读取输入数据寄存器将会得到 IO 状态,在推挽输 +出模式时,对输出数据寄存器的访问就会得到最后一次写入的值。 +10.2.8 复用功能配置 +图10-4 GPIO模块被其他外设复用时的结构框图 +To on-chip Alternate Function Input +peripheral +on +Read Input data V +register DD +TTL Schmitt +Protection +trigger +diode +Write Bit set/reset Input driver I/O pin +registers +Output driver V +DD Protection +diode +Output data P-MOS +Read/write register O co u n t t p r u o t l V SS +N-MOS +V +SS Push-pull, +from on-chip open-drain or +Alternate Function Output +peripheral disabled +在启用复用功能时,输出驱动器被使能,可以按需要被配置成开漏或推挽模式,施密特触发器也 +被打开,复用功能的输入和输出线都被连接,但是输出数据寄存器被断开,出现在 IO 引脚上的电平 +将会在每个 PB2 时钟被采样到输入数据寄存器,在开漏模式下,读取输入数据寄存器将会得到 IO 口 +当前状态;在推挽模式下,读取输出数据寄存器将会得到最后一次写入的值。 +V2.4 110 + +# Page 114 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.2.9 模拟输入配置 +图10-5 GPIO模块作为模拟输入时的配置结构框图 +To on-chip Analog Input +peripheral +off +Read Input data 0 +V +register DD +TTL Schmitt +Protection +trigger +diode +Write Bit set/reset Input driver I/O pin +registers +Output driver +Protection +diode +Output data V +Read/write SS +register +Push-pull, +open-drain or +disabled +在启用模拟输入时,输出缓冲器被断开,输入驱动中施密特触发器的输入被禁止以防止产生 IO +口上的消耗,上下拉电阻被禁止,读取输入数据寄存器将一直为0。 +10.2.10 外设的 GPIO 设置 +下列表格推荐了各个外设的引脚相应的GPIO口配置。 +表10-1 高级定时器(TIM1/8/9/10) +TIM1/8/9/10 配置 GPIO配置 +输入捕获通道x 浮空输入 +TIM1/8/9/10_CHx +输出比较通道x 推挽复用输出 +TIM1/8/9/10_CHxN 互补输出通道x 推挽复用输出 +TIM1/8/9/10_BKIN 刹车输入 浮空输入 +TIM1/8/9/10_ETR 外部触发时钟输入 浮空输入 +表10-2 通用定时器(TIM2/3/4/5) +TIM2/3/4/5引脚 配置 GPIO配置 +输入捕获通道x 浮空输入 +TIM2/3/4/5_CHx +输出比较通道x 推挽复用输出 +TIM2/3/4/5_ETR 外部触发时钟输入 浮空输入 +表10-3 通用同步异步串行收发器(USART) +USART引脚 配置 GPIO配置 +全双工模式 推挽复用输出 +USARTx_TX +半双工同步模式 开漏复用输出 +全双工模式 浮空输入或带上拉输入 +USARTx_RX +半双工同步模式 未使用 +USARTx_CK 同步模式 推挽复用输出 +USARTx_RTS 硬件流量控制 推挽复用输出 +USARTx_CTS 硬件流量控制 浮空输入或带上拉输入 +V2.4 111 + +# Page 115 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表10-4 串行外设接口(SPI)模块 +SPI引脚 配置 GPIO配置 +主模式 推挽复用输出 +SPIx_SCK +从模式 浮空输入 +全双工主模式 推挽复用输出 +全双工从模式 浮空输入或带上拉输入 +SPIx_MOSI +简单的双向数据线/主模式 推挽复用输出 +简单的双向数据线/从模式 未使用 +全双工主模式 浮空输入或带上拉输入 +全双工从模式 推挽复用输出 +SPIx_MISO +简单的双向数据线/主模式 未使用 +简单的双向数据线/从模式 推挽复用输出 +硬件主或从模式 浮空、上拉或下拉输入 +SPIx_NSS 硬件主模式/NSS输出使能 推挽复用输出 +软件模式 未使用 +表10-5 内置音频总线(I2S)模块 +I2S引脚 配置 GPIO配置 +主模式 推挽复用输出 +I2Sx_WS +从模式 浮空输入 +主模式 推挽复用输出 +I2Sx_CK +从模式 浮空输入 +发送器 推挽复用输出 +I2Sx_SD +接收器 浮空、上拉或下拉输入 +主模式 推挽复用输出 +I2Sx_MCK +从模式 未使用 +表10-6 内部集成总线(I2C)模块 +I2C引脚 配置 GPIO配置 +I2C_SCL I2C时钟 开漏复用输出 +I2C_SDA I2C数据 开漏复用输出 +表10-7 控制器局域网(CAN)模块 +CAN引脚 GPIO配置 +CANx_TX 推挽复用输出 +CANx_RX 浮空输入或上拉输入 +表10-8 USB全速设备(USBD)控制器 +USBD引脚 GPIO配置 +USBD_DM/USBD_DP 使能了USB模块之后,复用IO口会自动连接到内部USBD收发器 +表10-9 USB主机设备(USBFS)控制器 +USBFS引脚 GPIO配置 +USBFS_DM/USBFS_DP 使能了USB模块之后,复用IO口会自动连接到内部USBFS收发 +V2.4 112 + +# Page 116 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +器 +表10-10 USB OTG_FS控制器 +USB OTG_FS引脚 GPIO配置 +OTG_FS_VBUS 模拟输入 +OTG_FS_ID 上拉输入 +OTG_FS_DM 由USB断电自动控制 +OTG_FS_DP 由USB断电自动控制 +表10-11 安全数字输入输出(SDIO)模块 +SDIO引脚 配置 GPIO配置 +SDIO_CK 时钟 推挽复用输出 +SDIO_CMD 命令 推挽复用输出 +SDIO[D7:D0] 数据 推挽复用输出 +表10-12 直接存储器访问控制(FSMC)控制器 +FSMC引脚 GPIO配置 +FSMC_A[23:16] +推挽复用输出 +FSMC_D[15:0] +FSMC_CK 推挽复用输出 +FSMC_NOE +推挽复用输出 +FSMC_NWE +FSMC_NE1 +推挽复用输出 +FSMC_NCE2 +FSMC_NWAIT 浮空输入或带上拉输入 +FSMC_NBL[1:0] 推挽复用输出 +表10-13 模拟转数字转换器(ADC)及数字转模拟转换器(DAC) +ADC/DAC引脚 GPIO配置 +ADC/DAC 模拟输入 +表10-14 其他的IO功能设置 +引脚 配置功能 GPIO配置 +RTC输出 +TAMPER_RTC 硬件自动设置 +侵入事件输入 +MCO 时钟输出 推挽复用输出 +EXTI 外部中断输入 浮空、上拉或下拉输入 +10.2.11 复用功能重映射 GPIO 设置 +10.2.11.1 OSC32_IN/OSC32_OUT 作为 GPIO 端口 PC14/PC15 +当LSEON=0时,LSE振荡器引脚OSC32_IN/OSC32_OUT可以分别用做GPIO的PC14/PC15。 +当LSEON=1时,作为LSE引脚。 +10.2.11.2 OSC_IN/OSC_OUT 引脚作为 GPIO 端口 PD0/PD1 +V2.4 113 + +# Page 117 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置重映射寄存器1(AFIO_PCFR1)实现。 +这个重映射适用于 CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C、CH32F20x_D6、CH32F20x_D8、 +CH32F20x_D8C系列芯片,但对于LQFP100封装,由于PD0和PD1为固有的功能引脚,因此没有必要再 +由软件进行重映射设置。 +这个重映射对于CH32V20x_D6系列芯片,只适用于CH32V203CxT6、CH32V203CxU6、CH32V203K8T6、 +CH32V203G6U6、CH32V203F6P6芯片;对于CH32V20x_D8系列芯片CH32V203RBT6只有OSC_IN和OSC_OUT +功能脚,不支持映射。 +注:批号倒数第五位小于4且倒数第六位等于0的CH32V307R,CH32V305R,CH32V305G,CH32V305F, +CH32V303C,CH32V303R,CH32F205R,CH32F203R,CH32F203C芯片,PD0、PD1做普通引脚时,外部中 +断/事件功能没有被映射,不能用来产生外部中断/事件。 +10.2.11.3 定时器复用功能重映射 +表10-15 TIM1复用功能重映射 +TIM1_RM=00 TIM1_RM=01 TIM1_RM=11 +复用功能 +默认映射 部分映射 完全映射(1) +TIM1_ETR PA12 PA12 PE7 +TIM1_CH1 PA8 PA8 PE9 +TIM1_CH2 PA9 PA9 PE11 +TIM1_CH3 PA10 PA10 PE13 +TIM1_CH4 PA11 PA11 PE14 +TIM1_BKIN PB12 PA6 PE15 +TIM1_CH1N PB13 PA7 PE8 +TIM1_CH2N PB14 PB0 PE10 +TIM1_CH3N PB15 PB1 PE12 +注:(1)仅LQFP100封装,支持该位重映射功能。 +表10-16 TIM2复用功能重映射 +TIM2_RM=00 TIM2_RM=01 TIM2_RM=10 TIM2_RM=11 +复用功能 +默认映射 部分映射 部分映射 完全映射 +TIM2_ETR PA0 PA15 PA0 PA15 +TIM2_CH1 PA0 PA15 PA0 PA15 +TIM2_CH2 PA1 PB3 PA1 PB3 +TIM2_CH3 PA2 PA2 PB10 PB10 +TIM2_CH4 PA3 PA3 PB11 PB11 +表10-17 TIM3复用功能重映射 +TIM3_RM=00 TIM3_RM=10 TIM3_RM=11 +复用功能 +默认映射 部分映射 完全映射(1) +TIM3_CH1 PA6 PB4 PC6 +TIM3_CH2 PA7 PB5 PC7 +TIM3_CH3 PB0 PB0 PC8 +TIM3_CH4 PB1 PB1 PC9 +注:(1)64脚以下封装不支持该位映射。 +V2.4 114 + +# Page 118 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表10-18 TIM4复用功能重映射 +TIM4_RM=0 TIM4_RM=1 +复用功能 +默认映射 重映射(1) +TIM4_CH1 PB6 PD12 +TIM4_CH2 PB7 PD13 +TIM4_CH3 PB8 PD14 +TIM4_CH4 PB9 PD15 +注:(1)仅LQFP100封装,支持该位重映射功能。 +表10-19 TIM5复用功能重映射 +TIM5CH4_RM=0 TIM5CH4_RM=1 +复用功能 +默认映射 重映射 +TIM5_CH4 PA3 LSI内部时钟 +表10-20 TIM8复用功能重映射 +TIM8_RM=0 TIM8_RM=1 +复用功能 +默认映射 重映射 +TIM8_ETR PA0 PA0 +TIM8_CH1 PC6 PB6 +TIM8_CH2 PC7 PB7 +TIM8_CH3 PC8 PB8 +TIM8_CH4 PC9 PC13 +TIM8_BKIN PA6 PB9 +TIM8_CH1N PA7 PA13 +TIM8_CH2N PB0 PA14 +TIM8_CH3N PB1 PA15 +表10-21 TIM9复用功能重映射 +TIM9_RM=00 TIM9_RM=01 TIM9_RM=1x +复用功能 +默认映射 部分映射 完全映射(1) +TIM9_ETR PA2 PA2 PD9 +TIM9_CH1 PA2 PA2 PD9 +TIM9_CH2 PA3 PA3 PD11 +TIM9_CH3 PA4 PA4 PD13 +TIM9_CH4 PC4 PC14 PD15 +TIM9_BKIN PC5 PA1 PD14 +TIM9_CH1N PC0 PB0 PD8 +TIM9_CH2N PC1 PB1 PD10 +TIM9_CH3N PC2 PB2 PD12 +注:(1)仅LQFP100封装,支持该位重映射功能。 +表10-22 TIM10复用功能重映射 +TIM10_RM=00 TIM10_RM=01 TIM10_RM=1x +复用功能 +默认映射 部分映射 完全映射(1) +V2.4 115 + +# Page 119 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +TIM10_ETR PC10 PB11 PD0 +TIM10_CH1 PB8 PB3 PD1 +TIM10_CH2 PB9 PB4 PD3 +TIM10_CH3 PC3 PB5 PD5 +TIM10_CH4 PC11 PC15 PD7 +TIM10_BKIN PC12 PB10 PE2 +TIM10_CH1N PA12 PA5 PE3 +TIM10_CH2N PA13 PA6 PE4 +TIM10_CH3N PA14 PA7 PE5 +注:(1)仅LQFP100封装,支持该位重映射功能。 +10.2.11.4 USART 复用功能重映射 +表10-23 USART1复用功能重映射 +USART1_RM1=0(1) USART1_RM1=1(1) USART1_RM1=0(1) USART1_RM1=1(1) +复用功能 USART1_RM2=0(2) USART1_RM2=0(2) USART1_RM2=1(2) USART1_RM2=1(2) +默认映射 重映射 重映射 重映射 +USART1_CK PA8 PA8 PA10 PA5 +USART1_TX PA9 PB6 PB15 PA6 +USART1_RX PA10 PB7 PA8 PA7 +USART1_CTS PA11 PA11 PA5 PC4 +USART1_RTS PA12 PA12 PA9 PC5 +注:(1)USART1_RM1为AFIO_PCFR1 寄存器 bit2,为映射配置低位。 +(2)USART1_RM2为AFIO_PCFR2 寄存器 bit26,为映射配置高位,CH32V20x_D6、CH32F20x_D6不 +支持该位映射。 +表10-24 USART2复用功能重映射 +USART2_RM=0 USART2_RM=1 +复用功能 +默认映射 重映射(1) +USART2_CTS PA0 PD3 +USART2_RTS PA1 PD4 +USART2_TX PA2 PD5 +USART2_RX PA3 PD6 +USART2_CK PA4 PD7 +表10-25 USART3复用功能重映射 +USART3_RM=00 USART3_RM=01 USART3_RM=10 USART3_RM=11 +复用功能 +默认映射 部分映射(1) 部分映射(2) 完全映射(3) +USART3_TX PB10 PC10 PA13 PD8 +USART3_RX PB11 PC11 PA14 PD9 +USART3_CK PB12 PC12 PD10 PD10 +USART3_CTS PB13 PB13 PD11 PD11 +USART3_RTS PB14 PB14 PD12 PD12 +注:(1)48脚以下封装不支持该位映射。 +(2)只适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C系列芯片 +V2.4 116 + +# Page 120 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +批号倒数第五位等于大于2或批号倒数第六位不等于0。 +(3)仅LQFP100封装,支持该位重映射功能。 +表10-26 USART4复用功能重映射 +USART4_RM=00 USART4_RM=01 USART4_RM=1x +复用功能(1) +默认映射 重映射 重映射(2) +USART4_TX PC10 PB0 PE0 +USART4_RX PC11 PB1 PE1 +注:(1)适用于CH32V30x_D8C、CH32V31x_D8C、CH32V30x_D8、CH32V30x_D8W、CH32V20x_D8、CH32F20x_D8C、 +CH32F20x_D8、CH32F20x_D8W。 +(2)仅LQFP100封装,支持该位重映射功能。 +表10-27 USART4复用功能重映射(1) +USART4_RM=x0 USART4_RM=x1 +复用功能 +默认映射 重映射 +USART4_CK PB2 PA6 +USART4_TX PB0 PA5 +USART4_RX PB1 PB5 +USART4_CTS PB3 PA7 +USART4_RTS PB4 PA15 +注:(1)该功能仅支持CH32V203C8、CH32F203C8和64引脚及以上产品。 +表10-28 USART5复用功能重映射(2) +USART5_RM=00 USART5_RM=01 USART5_RM=1x +复用功能 +默认映射 重映射 重映射(1) +USART5_TX PC12 PB4 PE8 +USART5_RX PD2 PB5 PE9 +注:(1)仅LQFP100封装,支持该位重映射功能。 +(2)该功能不支持64引脚以下产品。 +表10-29 USART6复用功能重映射(2) +USART6_RM=00 USART6_RM=01 USART6_RM=1x +复用功能 +默认映射(2) 重映射 重映射(1) +USART6_TX PC0 PB8 PE10 +USART6_RX PC1 PB9 PE11 +注:(1)仅LQFP100封装,支持该位重映射功能。 +(2)该功能不支持64引脚以下产品。 +表10-30 USART7复用功能重映射(2) +USART7_RM=00 USART7_RM=01 USART7_RM=1x +复用功能 +默认映射 重映射 重映射(1) +USART7_TX PC2 PA6 PE12 +USART7_RX PC3 PA7 PE13 +注:(1)仅LQFP100封装,支持该位重映射功能。 +V2.4 117 + +# Page 121 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +(2)该功能不支持64引脚以下产品。 +表10-31 USART8复用功能重映射(2) +USART8_RM=00 USART8_RM=01 USART8_RM=1x +复用功能 +默认映射 重映射 重映射(1) +USART8_TX PC4 PA14 PE14 +USART8_RX PC5 PA15 PE15 +注:(1)仅LQFP100封装,支持该位重映射功能。 +(2)该功能不支持64引脚以下产品。 +10.2.11.5 SPI 复用功能重映射 +表10-32 SPI1复用功能重映射 +SPI1_RM=0 SPI1_RM=1 +复用功能 +默认映射 重映射 +SPI1_NSS PA4 PA15 +SPI1_SCK PA5 PB3 +SPI1_MISO PA6 PB4 +SPI1_MOSI PA7 PB5 +表10-33 SPI3/I2S3复用功能重映射 +SPI3_RM=0 SPI3_RM=1 +复用功能 +默认映射 重映射 +SPI3_NSS PA15 PA4 +SPI3_SCK PB3 PC10 +SPI3_MISO PB4 PC11 +SPI3_MOSI PB5 PC12 +I2S3_RM=0 I2S3_RM=1 +复用功能 +默认映射 重映射 +I2S3_WS PA15 PA4 +I2S3_CK PB3 PC10 +I2S3_MCK PC7 PC7 +I2S3_SD PB5 PC12 +10.2.11.6 I2C 复用功能重映射 +表10-34 I2C1复用功能重映射 +I2C1_RM=0 I2C1_RM=1 +复用功能 +默认映射 重映射 +I2C1_SCL PB6 PB8 +I2C1_SDA PB7 PB9 +V2.4 118 + +# Page 122 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.2.11.7 CAN 复用功能重映射 +表10-35 CAN1复用功能重映射 +CAN1_RM=00 CAN1_RM=10 CAN1_RM=11 +复用功能 +默认映射 重映射 重映射 +CAN1_RX PA11 PB8 PD0 +CAN1_TX PA12 PB9 PD1 +表10-36 CAN2复用功能重映射 +CAN2_RM=0 CAN2_RM=1 +复用功能 +默认映射 重映射 +CAN2_RX PB12 PB5 +CAN2_TX PB13 PB6 +10.2.11.8 ADC 复用功能重映射 +表10-37 ADC1外部触发注入转换复用功能重映射 +ADC1_ETRGINJ_RM=0 ADC1_ETRGINJ_RM=1 +复用功能 +默认映射 重映射 +ADC1外部触发注入转换与 ADC1外部触发注入转换与 +ADC1外部触发注入转换 +EXTI15相连 TIM8_CH4相连 +表10-38 ADC1外部触发规则转换复用功能重映射 +ADC1_ETRGREG_RM=0 ADC1_ETRGREG_RM=1 +复用功能 +默认映射 重映射 +ADC1外部触发规则转换与 ADC1外部触发规则转换与 +ADC1外部触发规则转换 +EXTI11相连 TIM8_TRGO相连 +表10-39 ADC2外部触发注入转换复用功能重映射 +ADC2_ETRGINJ_RM=0 ADC2_ETRGINJ_RM=1 +复用功能 +默认映射 重映射 +ADC2外部触发注入转换与 ADC2外部触发注入转换与 +ADC2外部触发注入转换 +EXTI15相连 TIM8_CH4相连 +表10-40 ADC2外部触发规则转换复用功能重映射 +ADC2_ETRGREG_RM=0 ADC2_ETRGREG_RM=1 +复用功能 +默认映射 重映射 +ADC2外部触发规则转换与 ADC2外部触发规则转换与 +ADC2外部触发规则转换 +EXTI11相连 TIM8_TRGO相连 +注:ADC1重映射只支持存在TIM8的产品,详细信息见相关数据手册。 +10.2.11.9 ETH 复用功能重映射 +表10-41 ETH复用功能重映射 +ETH_RM=0 ETH_RM=1 +复用功能(1) +默认映射 重映射(1) +ETH_RX_DV PA7 PD8 +V2.4 119 + +# Page 123 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +ETH_CRS_DV PA7 PD8 +ETH_RXD0 PC4 PD9 +ETH_RXD1 PC5 PD10 +ETH_RXD2 PB0 PD11 +ETH_RXD3 PB1 PD12 +注:(1)仅LQFP100封装互联型,支持该位重映射功能。 +10.2.11.10 FSMC_NADV 复用功能重映射(2) +表10-42 FSMC_NADV复用功能重映射 +FSMCEN=1 FSMCEN=1&USBHSEN=1 +复用功能(1) +默认映射 &RB_UC_RST_SIE=0 +FSMC_NADV PB7 PD2 +注:(1)当FSMC_NADV=1时禁止FSMC_NADV输出。 +(2)批号倒数第五位小于2且批号倒数第六位等于0的不支持该功能。 +10.2.11.11 DVP 复用功能重映射(1) +表10-43 DVP复用功能重映射 +DVPEN=1 DVPEN=1&USBHSEN=1 +复用功能 +默认映射 &RB_UC_RST_SIE=0 +DVP_D5 PB6 PB3 +注:(1)批号倒数第五位小于2且批号倒数第六位等于0的不支持该功能。 +10.2.11.12 SDIO 复用功能重映射(1) +表10-44 SDIO复用功能重映射 +复用功能 SDIOEN=1 SDIOEN=1ÐMACEN=1 +SDCK PC12 PC12 +CMD PD2 PD2 +SD0 PC8 PB14 +SD1 PC9 PB15 +SD2 PC10 PC10 +SD3 PC11 PC11 +SD4 PB8 PB8 +SD5 PB9 PB9 +SD6 PC6 PC6 +SD7 PC7 PC7 +注:(1)批号倒数第五位小于2且批号倒数第六位等于0的不支持该功能。 +10.2.11.13 SPI3/I2S3 复用功能重映射(1) +表10-45 SPI3复用功能重映射 +复用功能 SPI3EN=1 SPI3EN=1ÐMACEN=1(3) +SPI3_NSS PA15 无效(2) +V2.4 120 + +# Page 124 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +SPI3_SCK PB3 PB3 +SPI3_MISO PB4 PB4 +SPI3_MOSI PB5 PA15 +注:(1)批号第五位等于2且倒数第六位等于0的才支持该功能。 +(2)SPI3_NSS不支持硬件功能。 +(3)SPI3EN=1ÐMACEN=1时,I2S3禁用。 +10.2.11.14 SPI3/I2S3 复用功能重映射(1) +表10-46 I2S3复用功能重映射 +复用功能 SPI3EN=1 I2SMOD=1Ð10M=1(2) +I2S3_WS PA15 PA15 +I2S3_CK PB3 PB3 +I2S3_MCK PC7 PA8 +I2S3_SD PB5 PA9 +注:(1)仅批号第五位大于2或倒数第六位不等于0的支持该功能。 +(2)SPI_I2S_CFGR寄存器的I2SMOD位置1时选择I2S模式,EXTEN_CTR寄存器的ETH10M位置 +1时启用10M以太网功能并使能时钟。 +10.3 寄存器描述 +10.3.1 GPIO 的寄存器描述 +除非特殊说明,GPIO的寄存器必须以字的方式操作(以32位来操作这些寄存器)。 +表10-47 GPIO相关寄存器列表 +名称 访问地址 描述 复位值 +R32_GPIOA_CFGLR 0x40010800 PA端口配置寄存器低位 0x44444444 +R32_GPIOB_CFGLR 0x40010C00 PB端口配置寄存器低位 0x44444444 +R32_GPIOC_CFGLR 0x40011000 PC端口配置寄存器低位 0x44444444 +R32_GPIOD_CFGLR 0x40011400 PD端口配置寄存器低位 0x44444444 +R32_GPIOE_CFGLR 0x40011800 PE端口配置寄存器低位 0x44444444 +R32_GPIOA_CFGHR 0x40010804 PA端口配置寄存器高位 0x44444444 +R32_GPIOB_CFGHR 0x40010C04 PB端口配置寄存器高位 0x44444444 +R32_GPIOC_CFGHR 0x40011004 PC端口配置寄存器高位 0x44444444 +R32_GPIOD_CFGHR 0x40011404 PD端口配置寄存器高位 0x44444444 +R32_GPIOE_CFGHR 0x40011804 PE端口配置寄存器高位 0x44444444 +R32_GPIOA_INDR 0x40010808 PA端口输入数据寄存器 0x0000XXXX +R32_GPIOB_INDR 0x40010C08 PB端口输入数据寄存器 0x0000XXXX +R32_GPIOC_INDR 0x40011008 PC端口输入数据寄存器 0x0000XXXX +R32_GPIOD_INDR 0x40011408 PD端口输入数据寄存器 0x0000XXXX +R32_GPIOE_INDR 0x40011808 PE端口输入数据寄存器 0x0000XXXX +R32_GPIOA_OUTDR 0x4001080C PA端口输出数据寄存器 0x00000000 +R32_GPIOB_OUTDR 0x40010C0C PB端口输出数据寄存器 0x00000000 +R32_GPIOC_OUTDR 0x4001100C PC端口输出数据寄存器 0x00000000 +R32_GPIOD_OUTDR 0x4001140C PD端口输出数据寄存器 0x00000000 +R32_GPIOE_OUTDR 0x4001180C PE端口输出数据寄存器 0x00000000 +V2.4 121 + +# Page 125 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_GPIOA_BSHR 0x40010810 PA端口置位/复位寄存器 0x00000000 +R32_GPIOB_BSHR 0x40010C10 PB端口置位/复位寄存器 0x00000000 +R32_GPIOC_BSHR 0x40011010 PC端口置位/复位寄存器 0x00000000 +R32_GPIOD_BSHR 0x40011410 PD端口置位/复位寄存器 0x00000000 +R32_GPIOE_BSHR 0x40011810 PE端口置位/复位寄存器 0x00000000 +R32_GPIOA_BCR 0x40010814 PA端口复位寄存器 0x00000000 +R32_GPIOB_BCR 0x40010C14 PB端口复位寄存器 0x00000000 +R32_GPIOC_BCR 0x40011014 PC端口复位寄存器 0x00000000 +R32_GPIOD_BCR 0x40011414 PD端口复位寄存器 0x00000000 +R32_GPIOE_BCR 0x40011814 PE端口复位寄存器 0x00000000 +R32_GPIOA_LCKR 0x40010818 PA端口锁定配置寄存器 0x00000000 +R32_GPIOB_LCKR 0x40010C18 PB端口锁定配置寄存器 0x00000000 +R32_GPIOC_LCKR 0x40011018 PC端口锁定配置寄存器 0x00000000 +R32_GPIOD_LCKR 0x40011418 PD端口锁定配置寄存器 0x00000000 +R32_GPIOE_LCKR 0x40011818 PE端口锁定配置寄存器 0x00000000 +10.3.1.1 GPIO 配置寄存器低位(GPIOx_CFGLR)(x=A/B/C/D/E) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CNF7[1:0] MODE7[1:0] CNF6[1:0] MODE6[1:0] CNF5[1:0] MODE5[1:0] CNF4[1:0] MODE4[1:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNF3[1:0] MODE3[1:0] CNF2[1:0] MODE2[1:0] CNF1[1:0] MODE1[1:0] CNF0[1:0] MODE0[1:0] +位 名称 访问 描述 复位值 +(y=0-7),端口x的配置位,通过这些位配置 +相应的端口。 +[31:30] 在输入模式时(MODE=00b): +[27:26] 00:模拟输入模式; +[23:22] 01:浮空输入模式; +[19:18] 10:带有上下拉模式。 +CNFy[1:0] RW 01b +[15:14] 11:保留。 +[11:10] 在输出模式(MODE>00b): +[7:6] 00:通用推挽输出模式; +[3:2] 01:通用开漏输出模式; +10:复用功能推挽输出模式; +11:复用功能开漏输出模式。 +[29:28] +[25:24] (y=0-7),端口x模式选择,通过这些位配置 +[21:20] 相应的端口。 +[17:16] 00:输入模式; +MODEy[1:0] RW 00b +[13:12] 01:输出模式,最大速度10MHz; +[9:8] 10:输出模式,最大速度2MHz; +[5:4] 11:输出模式,最大速度50MHz。 +[1:0] +V2.4 122 + +# Page 126 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.3.1.2 GPIO 配置寄存器高位(GPIOx_CFGHR)(x=A/B/C/D/E) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CNF15[1:0] MODE15[1:0] CNF14[1:0] MODE14[1:0] CNF13[1:0] MODE13[1:0] CNF12[1:0] MODE12[1:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNF11[1:0] MODE11[1:0] CNF10[1:0] MODE10[1:0] CNF9[1:0] MODE9[1:0] CNF8[1:0] MODE8[1:0] +位 名称 访问 描述 复位值 +(y=8-15),端口x的配置位,通过这些位配 +置相应的端口。 +[31:30] 在输入模式时(MODE=00b): +[27:26] 00:模拟输入模式; +[23:22] 01:浮空输入模式; +[19:18] 10:带有上下拉模式。 +CNFy[1:0] RW 01b +[15:14] 11:保留。 +[11:10] 在输出模式(MODE>00b): +[7:6] 00:通用推挽输出模式; +[3:2] 01:通用开漏输出模式; +10:复用功能推挽输出模式; +11:复用功能开漏输出模式。 +[29:28] +[25:24] (y=8-15),端口x的模式位,通过这些位配 +[21:20] 置相应的端口。 +[17:16] 00:输入模式; +MODEy[1:0] RW 00b +[13:12] 01:输出模式,最大速度10MHz; +[9:8] 10:输出模式,最大速度2MHz; +[5:4] 11:输出模式,最大速度50MHz。 +[1:0] +10.3.1.3 端口输入寄存器(GPIOx_INDR)(x=A/B/C/D/E) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +IDR15 IDR14 IDR13 IDR12 IDR11 IDR10 IDR9 IDR8 IDR7 IDR6 IDR5 IDR4 IDR3 IDR2 IDR1 IDR0 +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +(y=0-15),端口输入数据。这些位只读并只 +[15:0] IDRy RO 能以 16 位形式读出。读出的值就是对应位的 X +高低状态。 +V2.4 123 + +# Page 127 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.3.1.4 端口输出寄存器(GPIOx_OUTDR)(x=A/B/C/D/E) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ODR15 ODR14 ODR13 ODR12 ODR11 ODR10 ODR9 ODR8 ODR7 ODR6 ODR5 ODR4 ODR3 ODR2 ODR1 ODR0 +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +对于输出模式: +(y=0-15),端口输出的数据。这些数据只能 +以 16 位的形式操作。IO 口对外输出这些寄存 +[15:0] ODRy RW 器的值。 0 +对于带有上下拉的输入模式: +0:下拉输入; +1:上拉输入。 +10.3.1.5 端口复位/置位寄存器(GPIOx_BSHR)(x=A/B/C/D/E) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +BR15 BR14 BR13 BR12 BR11 BR10 BR9 BR8 BR7 BR6 BR5 BR4 BR3 BR2 BR1 BR0 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +BS15 BS14 BS13 BS12 BS11 BS10 BS9 BS8 BS7 BS6 BS5 BS4 BS3 BS2 BS1 BS0 +位 名称 访问 描述 复位值 +(y=0-15),对这些位置位会清除对应的OUTDR +位,写0不产生影响。这些位只能以16位的形 +[31:16] BRy WO 0 +式访问。如果同时设置了BR和BS位,则BS位 +起作用。 +(y=0-15),对这些位置位会使对应的 OUTDR +位置位,写0不产生影响。这些位只能以16位 +[15:0] BSy WO 0 +的形式访问。如果同时设置了BR和BS位,则 +BS位起作用。 +10.3.1.6 端口复位寄存器(GPIOx_BCR)(x=A/B/C/D/E) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +BR15 BR14 BR13 BR12 BR11 BR10 BR9 BR8 BR7 BR6 BR5 BR4 BR3 BR2 BR1 BR0 +位 名称 访问 描述 复位值 +V2.4 124 + +# Page 128 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[31:16] Reserved RO 保留。 0 +(y=0-15),对这些位置位会清除对应的OUTDR +[15:0] BRy WO 位,写0不产生影响。这些位只能以16位的形 0 +式访问。 +10.3.1.7 配置锁定寄存器(GPIOx_LCKR)(x=A/B/C/D/E) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved LCKK +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +LCK15 LCK14 LCK13 LCK12 LCK11 LCK10 LCK9 LCK8 LCK7 LCK6 LCK5 LCK4 LCK3 LCK2 LCK1 LCK0 +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留 0 +锁定键,它可以通过特定的序列写入实现锁 +定,但它可以随时读出。它读出为0时表示未 +锁定生效,读出1时表示锁定生效。 +锁定键的写入序列为:写1-写0-写1-读0-读 +1,最后一步非必要,但是可以用以确认锁定键 +16 LCKK RW 0 +已经激活。 +在写入序列时任何错误都不会使激活锁定,且 +在写入序列时,不能更改 LCK[15:0]的值。锁 +定生效后,只有在下次复位后才能更改端口的 +配置。 +(y=0-15),这些位为1时表示锁定对应端口 +的配置。只能在LCKK未锁定前改变这些位。锁 +[15:0] LCKy RW 0 +定的配置指的是配置寄存器 GPIOx_CFGLR 和 +GPIOx_CFGHR。 +注:当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。 +10.3.2 AFIO 寄存器 +除非特殊说明,AFIO的寄存器必须以字的方式操作(以32位来操作这些寄存器)。 +表10-48 AFIO相关寄存器列表 +名称 访问地址 描述 复位值 +R32_AFIO_ECR 0x40010000 事件控制寄存器 0x00000000 +R32_AFIO_PCFR1 0x40010004 重映射寄存器1 0x00000000 +R32_AFIO_EXTICR1 0x40010008 外部中断配置寄存器1 0x00000000 +R32_AFIO_EXTICR2 0x4001000C 外部中断配置寄存器2 0x00000000 +R32_AFIO_EXTICR3 0x40010010 外部中断配置寄存器3 0x00000000 +R32_AFIO_EXTICR4 0x40010014 外部中断配置寄存器4 0x00000000 +R32_AFIO_PCFR2 0x4001001C 重映射寄存器2 0x00000000 +10.3.2.1 事件控制寄存器(AFIO_ECR) +偏移地址:0x00 +V2.4 125 + +# Page 129 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved EVOE PORT[2:0] PIN[3:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +允许事件输出位,对该位置位会使内核的 +7 EVOE RW 0 +EVENTOUT连接到PORT和PIN选定的IO口。 +用于选择内核输出EVENTOUT的端口: +000:选择PA口; 001:选择PB口; +[6:4] PORT[2:0] RW 000b +010:选择PC口; 011:选择PD口; +其他:保留。 +此位的值用来确定选择内核输出 EVENTOUT 到 +[3:0] PIN[3:0] RW 端口的具体引脚号,值0-15分别对应PORT中 0 +选定的Px的第0-15号引脚。 +10.3.2.2 重映射寄存器 1(AFIO_PCFR1) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +PTP_ TIM2 MII_R ADC2_ ADC2_ ADC1_ ADC1_ +Rese SPI3 Rese CAN2_ ETH_ TIM5C +PPS_ ITR1 SW_CFG[2:0] MII_ ETRGR ETRGI ETRGR ETRGI +rved _RM rved RM RM H4_RM +RM _RM SEL EG_RM NJ_RM EG_RM NJ_RM +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PDPD +CAN1_RM TIM4 TIM3_RM TIM2_RM] TIM1_RM] USART3_RM USART2 USART1 I2C1 SPI1 +1 +[1:0] _RM [1:0] [1:0] [1:0] [1:0] _RM _RM _RM _RM +_RM +位 名称 访问 描述 复位值 +31 Reserved RO 保留。 0 +以太网的PTP PPS重映射。 +0:PTP PPS不输出到PB5引脚; +30 PTP_PPS_RM RW 1:PTP PPS输出到PB5引脚。 0 +注:此位适用于 CH32V20x_D8C、CH32V30x_D8C、 +CH32V31x_D8C系列芯片。 +TIM2内部触发1重映射。 +0:在内部连接TIM2_ITR1至以太网的PTP输出; +1:在内部连接TIM2_ITR1至全速USB OTG的SOF +29 TIM2ITR1_RM RW 0 +输出。 +注:此位适用于CH32F20x、CH32V20x、CH32V30x和 +CH32V31x全系列芯片。 +SPI3重映射。 +28 SPI3_RM RW 0 +0:默认映射(NSS/PA15、SCK/PB3、MISO/PB4、 +V2.4 126 + +# Page 130 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +MOSI/PB5); +1:重映射(NSS/PA4、SCK/PC10、MISO/PC11、 +MOSI/PC12)。 +注:此位适用于 CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C和CH32F20x_D8、CH32F20x_D8C系 +列芯片。 +27 Reserved RO 保留。 0 +这些位用以配置SW功能和跟踪功能的IO口。SWD +(SDI)是访问内核的调试接口。系统复位后总是 +作为SWD端口。 +0xx:启用SWD(SDI); +[26:24] SW_CFG[2:0] RW 000b +100:关闭SWD(SDI),作为GPIO功能; +其他:无效。 +注:此位适用于CH32F20x、CH32V20x、CH32V30x和 +CH32V31x全系列芯片。 +MII 或 RMII 选择。配置内部的以太网 MAC 适用外 +部的MII接口还是RMII接口的收发器(PHY)。 +0:配置以太网的MAC使用外部MII接口的收发器 +(PHY); +23 MII_RMII_SEL RW 1:配置以太网的 MAC 使用外部 RMII 接口的收发 0 +器(PHY); +注:此位适用于 CH32F20x_D8C、CH32V30x_D8C、 +CH32V31x_D8C、CH32F20x_D8W、CH32V20x_D8、 +CH32V20x_D8W系列芯片。 +CAN2重映射位。 +0:默认映射(CAN2_RX/PB12,CAN2_TX/PB13); +1:重映射(CAN2_RX/PB5,CAN2_TX/PB6)。 +22 CAN2_RM RW 0 +注:此位适用于 CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C、CH32F20x_D8 和 CH32F20x_D8C、 +CH32V20x_D8系列芯片。 +以太网的重映射位。 +0:默认映射(RX_DV-CRS_DV/PA7,RXD0/PC4, +RXD1/PC5,RXD2/PB0,RXD3/PB1); +21 ETH_RM RW 1:重映射(RX_DV-CRS_DV/PD8, RXD0/PD9, 0 +RXD1/PD10,RXD2/PD11,RXD3/PD12) +注:以太网的重映射功能只适用于CH32F207VCT6、 +CH32V307VCT6、CH32V317VCT6芯片。 +ADC2外部触发规则转换的重映射位。 +0:ADC2外部触发规则转换与EXTI11相连; +20 ADC2_ETRGREG_RM RW 1:ADC2外部触发规则转换与TIM8_TRGO相连; 0 +注:此位适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x和CH32V31x全系列芯片。 +ADC2外部触发注入转换的重映射位。 +0:ADC2外部触发注入转换与EXTI15相连; +19 ADC2_ETRGINJ_RM RW 0 +1:ADC2外部触发注入转换与TIM8_CH4相连; +注:此位适用于 CH32F20x_D8、CH32F20x_D8C、 +V2.4 127 + +# Page 131 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CH32V30x和CH32V31x全系列芯片。 +ADC1外部触发规则转换的重映射位。 +0:ADC1外部触发规则转换与EXTI11相连; +18 ADC1_ETRGREG_RM RW 1:ADC1外部触发规则转换与TIM8_TRGO相连;注: 0 +注:此位适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x和CH32V31x全系列芯片。 +ADC1外部触发注入转换的重映射位。 +0:ADC1外部触发注入转换与EXTI15相连; +17 ADC1_ETRGINJ_RM RW 1:ADC1外部触发注入转换与TIM8_CH4相连;注: 0 +注:此位适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x和CH32V31x全系列芯片。 +定时器5通道4的重映射。 +0:默认映射,定时器5通道4的重映射; +16 TIM5CH4_RM RW 1:重映射,定时器5通道4映射至LSI内部时钟。 0 +注:此位适用于CH32V20x、CH32V30x和CH32V31x +全系列芯片。 +引脚PD0&PD1重映射位,该位可由用户读写。它控 +制 PD0 和 PD1 的 GPIO 功能是否进行重映射,即 +PD0&PD1映射到OSC_IN&OSC_OUT。 +0:引脚作为晶振引脚使用; +1:引脚作为GPIO口使用。 +注:(1)此位重映射适用于 CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C、CH32F20x_D6、 +CH32F20x_D8、CH32F20x_D8C 系列芯片,但对于 +15 PD0PD1_RM RW 0 +LQFP100封装,由于PD0和PD1为固有的功能引 +脚,因此没有必要再由软件进行重映像设置。 +(2)此位重映射对于CH32V20x_D6系列芯片,只 +适 用 于 CH32V203CxT6 、 CH32V203CxU6 、 +CH32V203K8T6、CH32V203G6U6、CH32V203F6P6 芯 +片。 +(3)对于CH32V20x_D8系列芯片CH32V203RBT6只 +有OSC_IN和OSC_OUT功能脚,不支持映射。 +CAN1 复用功能重映射位,这些位可由用户读写。 +控制CAN_RX和CAN_TX的重映射: +00:CAN1_RX映射到PA11,CAN1_TX映射到PA12; +10:CAN1_RX映射到PB8,CAN1_TX映射到PB9; +[14:13] CAN1_RM[1:0] RW 00b +01:保留; +11:CAN1_RX映射到PD0,CAN1_TX映射到PD1。 +注:(1)此位适用于CH32F20x、CH32V20x、CH32V30x +和CH32V31x系列芯片。 +定时器4的重映射位,该位可由用户读写。它控制 +定时器4的通道1至4 在GPIO端口的重映射: +0:默认映射(CH1/PB6,CH2/PB7,CH3/PB8, +12 TIM4_RM RW 0 +CH4/PB9); +1:重映射(CH1/PD12,CH2/PD13,CH3/PD14, +CH4/PD15)。 +V2.4 128 + +# Page 132 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:此位重映射适用于 CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6芯片。 +定时器3的重映射位,这些位可由用户读写。它控 +制定时器3的通道1至4在GPIO端口的重映射: +00:默认映射(CH1/PA6,CH2/PA7,CH3/PB0, +CH4/PB1); +01:保留; +10:部分映射(CH1/PB4,CH2/PB5,CH3/PB0, +[11:10] TIM3_RM[1:0] RW 00b +CH4/PB1); +11:完全映射(CH1/PC6,CH2/PC7,CH3/PC8, +CH4/PC9); +注:(1)重映射不影响在PD2上的TIM3_ETR。 +(2)此位重映射适用于 CH32F20x、CH32V20x、 +CH32V30x和CH32V31x系列64脚及以上封装芯片。 +定时器2的重映射位。这些位可由用户读写。它控 +制定时器 2 的通道 1 至 4 和外部触发(ETR)在 +GPIO端口的映射: +00:默认映射(ETR/PA0,CH1/PA0,CH2/PA1, +CH3/PA2,CH4/PA3); +01:部分映射(ETR/PA15,CH1/PA15,CH2/PB3, +[9:8] TIM2_RM[1:0] RW CH3/PA2,CH4/PA3); 00b +10:部分映射(ETR/PA0,CH1/PA0,CH2/PA1, +CH3/PB10,CH4/PB11); +11:完全映射(ETR/PA15,CH1/PA15,CH2/PB3, +CH3/PB10,CH4/PB11)。 +注:此位适用于CH32F20x、CH32V20x、CH32V30x和 +CH32V31x全系列芯片。 +定时器1的重映射位。这些位可由用户读写。 +它控制定时器 1 的通道 1 至 4、1N 至 3N、外部触 +发(ETR)和刹车输入(BKIN)在GPIO端口的映射: +00:默认映射(ETR/PA12,CH1/PA8,CH2/PA9, +CH3/PA10,CH4/PA11,BKIN/PB12,CH1N/PB13, +CH2N/PB14,CH3N/PB15); +01:部分映射(ETR/PA12,CH1/PA8,CH2/PA9, +CH3/PA10,CH4/PA11,BKIN/PA6,CH1N/PA7, +CH2N/PB0,CH3N/PB1); +[7:6] TIM1_RM[1:0] RW 00b +10:保留; +11:完全映射(ETR/PE7,CH1/PE9,CH2/PE11, +CH3/PE13,CH4/PE14,BKIN/PE15,CH1N/PE8, +CH2N/PE10,CH3N/PE12)。 +注:此位部分映射适用于 CH32F20x、CH32V20x、 +CH32V30x和CH32V31x全系列芯片;完全映射只适 +用 于 CH32V303VCT6 、 CH32V307VCT6 、 +CH32V317VCT6、CH32F203VCT6、CH32F207VCT6 芯 +片。 +V2.4 129 + +# Page 133 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USART3 的重映射位,这些位可由用户读写。它控 +制USART3的CTS、RTS、CK、TX和RX复用功能在 +GPIO端口的映射: +00:默认映射(TX/PB10,RX/PB11,CK/PB12, +CTS/PB13,RTS/PB14); +01:部分重映射(TX/PC10,RX/PC11,CK/PC12, +CTS/PB13,RTS/PB14); +10:部分重映射(TX/PA13,RX/PA14,CK/PD10, +CTS/PD11,RTS/PD12); +11:完全重映射(TX/PD8,RX/PD9,CK/PD10, +CTS/PD11,RTS/PD12)。 +[5:4] USART3_RM[1:0] RW 00b +注:(1)48 脚以下封装不支持(01b)部分重映 +射。 +(2)部分重映射(10b)只适用于CH32F20x_D8、 +CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C 系列芯片批号倒数第五位等于大于 +2或批号倒数第六位不等于0。 +(3)完全映射只适用于 CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6的LQFP100封装芯片。 +(4)CH32V20x_D6、CH32F20x_D6只存在默认映射 +(00b)。 +USART2 的重映射位。该位可由用户读写。它控制 +USART2的CTS、RTS、CK、TX和RX复用功能在GPIO +端口的映射: +0:默认映射(CTS/PA0,RTS/PA1,TX/PA2,RX/PA3, +3 USART2_RM RW CK/PA4); 0 +1:重映射(CTS/PD3,RTS/PD4,TX/PD5,RX/PD6, +CK/PD7)。 +注:CH32V20x_D6、CH32F20x_D6系列芯片只存在默 +认映射(0b)。 +USART1 映射配置低位(配合 AFIO_PCFR2 寄存器 +bit26 USART1_RM1使用)。 +00:默认映射(CK/PA8,TX/PA9,RX/PA10,CTS/PA11, +RTS/PA12); +01:重映射(CK/PA8,TX/PB6,RX/PB7,CTS/PA11, +RTS/PA12); +2 USART1_RM RW 10:重映射(CK/PA10,TX/PB15,RX/PA8,CTS/PA5, 0 +RTS/PA9); +11:重映射(CK/PA5,TX/PA6,RX/PA7,CTS/PC4, +RTS/PC5)。 +注:CH32F20x_D6、CH32F20x_D8、CH32F20x_D8W、 +CH32V20x_D6、CH32V20x_D8、CH32V20x_D8W只存在 +默认映射(00b)、重映射(01b)。 +I2C1的重映射。该位可由用户读写。它控制I2C1 +1 I2C1_RM RW 0 +的SCL和SDA复用功能在GPIO端口的映射: +V2.4 130 + +# Page 134 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:默认映射(SCL/PB6,SDA/PB7); +1:重映射(SCL/PB8,SDA/PB9)。 +注:此位适用于CH32F20x、CH32V20x、CH32V30x和 +CH32V31x全系列芯片。 +SPI1的重映射。该位可由用户读写。它控制SPI1 +的NSS、SCK、MISO和MOSI复用功能在GPIO端口 +的映射: +0:默认映射(NSS/PA4,SCK/PA5,MISO/PA6, +0 SPI1_RM RW MOSI/PA7); 0 +1:重映射(NSS/PA15,SCK/PB3,MISO/PB4, +MOSI/PB5)。 +注:此位适用于CH32F20x、CH32V20x、CH32V30x和 +CH32V31x全系列芯片。 +10.3.2.3 外部中断配置寄存器 1(AFIO_EXTICR1) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXTI3[3:0] EXTI2[3:0] EXTI1[3:0] EXTI0[3:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +(x=0-3),外部中断输入引脚配置位。用以决 +定外部中断引脚映射到哪个端口的引脚上: +[15:12] 0000:PA引脚的第x个引脚; +[11:8] 0001:PB引脚的第x个引脚; +EXTIx[3:0] RW 0000b +[7:4] 0010:PC引脚的第x个引脚; +[3:0] 0011:PD引脚的第x个引脚; +0100:PE引脚的第x个引脚; +其他:保留。 +10.3.2.4 外部中断配置寄存器 2(AFIO_EXTICR2) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXTI7[3:0] EXTI6[3:0] EXTI5[3:0] EXTI4[3:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:12] (x=4-7),外部中断输入引脚配置位。用以决 +EXTIx[3:0] RW 0000b +[11:8] 定外部中断引脚映射到哪个端口的引脚上: +V2.4 131 + +# Page 135 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[7:4] 0000:PA引脚的第x个引脚; +[3:0] 0001:PB引脚的第x个引脚; +0010:PC引脚的第x个引脚; +0011:PD引脚的第x个引脚; +0100:PE引脚的第x个引脚; +其他:保留。 +10.3.2.5 外部中断配置寄存器 3(AFIO_EXTICR3) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXTI11[3:0] EXTI10[3:0] EXTI9[3:0] EXTI8[3:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +(x=8-11),外部中断输入引脚配置位。用以 +决定外部中断引脚映射到哪个端口的引脚上: +[15:12] 0000:PA引脚的第x个引脚; +[11:8] 0001:PB引脚的第x个引脚; +EXTIx[3:0] RW 0000b +[7:4] 0010:PC引脚的第x个引脚; +[3:0] 0011:PD引脚的第x个引脚; +0100:PE引脚的第x个引脚; +其他:保留。 +10.3.2.6 外部中断配置寄存器 4(AFIO_EXTICR4) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXTI15[3:0] EXTI14[3:0] EXTI13[3:0] EXTI12[3:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +(x=12-15),外部中断输入引脚配置位。用以 +决定外部中断引脚映射到哪个端口的引脚上: +[15:12] 0000:PA引脚的第x个引脚; +[11:8] 0001:PB引脚的第x个引脚; +EXTIx[3:0] RW 0000b +[7:4] 0010:PC引脚的第x个引脚; +[3:0] 0011:PD引脚的第x个引脚; +0100:PE引脚的第x个引脚; +其他:保留。 +V2.4 132 + +# Page 136 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10.3.2.7 重映射寄存器 2(AFIO_PCFR2) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +USART USART8_RM USART7_RM USART6_RM USART5_RM USART4_RM +Reserved +1_RM1 [1:0] [1:0] [1:0] [1:0] [1:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FSMC_ TIM10_RM TIM9_RM TIM8 +Reserved Reserved Reserved +NADV [1:0] [1:0] _RM +位 名称 访问 描述 复位值 +[31:27] Reserved RO 保留。 0 +USART1 映射配置高位(配合 AFIO_PCFR1 寄存 +器bit2 USART1_RM使用)。 +00:默认映射(CK/PA8,TX/PA9,RX/PA10, +CTS/PA11,RTS/PA12); +01:重映射(CK/PA8,TX/PB6,RX/PB7, +CTS/PA11,RTS/PA12); +10:重映射(CK/PA10,TX/PB15,RX/PA8, +26 USART1_RM1 RW 0 +CTS/PA5,RTS/PA9); +11:重映射(CK/PA5,TX/PA6,RX/PA7,CTS/PC4, +RTS/PC5)。 +注 : CH32F20x_D6 、 CH32F20x_D8 、 +CH32F20x_D8W、CH32V20x_D6、CH32V20x_D8、 +CH32V20x_D8W只存在默认映射(00b)、重映射 +(01b)。 +USART8重映射。 +00:默认映射(TX/PC4,RX/PC5); +01:重映射(TX/PA14,RX/PA15); +1x:重映射(TX/PE14,RX/PE15)。 +[25:24] USART8_RM[1:0] RW 注:(1)此位(01b)重映射不支持64引脚以 00b +下产品。 +(2)(1xb)重映射只适用于CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6的LQFP100封装芯片。 +USART7重映射。 +00:默认映射(TX/PC2,RX/PC3); +01:重映射(TX/PA6,RX/PA7); +1x:重映射(TX/PE12,RX/PE13)。 +[23:22] USART7_RM[1:0] RW 注:(1)此位(01b)重映射不支持64引脚以 00b +下产品。 +(2)(1xb)重映射只适用于CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6的LQFP100封装芯片。 +USART6重映射。 +[21:20] USART6_RM[1:0] RW 00b +00:默认映射(TX/PC0,RX/PC1); +V2.4 133 + +# Page 137 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +01:重映射(TX/PB8,RX/PB9); +1x:重映射(TX/PE10,RX/PE11)。 +注:(1)(1xb)重映射只适用于CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6的LQFP100封装芯片。 +(2)此位映射不支持64引脚以下产品。 +USART5重映射。 +00:默认映射(TX/PC12,RX/PD2); +01:重映射(TX/PB4,RX/PB5); +1x:重映射(TX/PE8,RX/PE9)。 +[19:18] USART5_RM[1:0] RW 00b +注:(1)此位映射能不支持64引脚以下产品。 +(2)(1xb)重映射只适用于CH32V303VCT6、 +CH32V307VCT6、CH32V317VCT6、CH32F203VCT6、 +CH32F207VCT6的LQFP100封装芯片。 +UART4重映射。 +00:默认映射(TX/PC10,RX/PC11); +01:重映射(TX/PB0,RX/PB1); +1x:重映射(TX/PE0,RX/PE1)。 +注:适用于 CH32V30x_D8C、CH32V31x_D8C、 +CH32V30x_D8、CH32V30x_D8W、CH32V20x_D8、 +CH32F20x_D8C、CH32F20x_D8、CH32F20x_D8W。 +[17:16] USART4_RM[1:0] RW 00b +x0:默认映射(CK/PB2,TX/PB0,RX/PB1, +CTS/PB3,RTS/PB4); +x1:重映射(CK/PA6,TX/PA5,RX/PB5,CTS/PA7, +RTS/PA15)。 +注:该功能仅支持CH32V203C8、CH32F203C8和 +64引脚及以上产品。 +[15:11] Reserved RW 保留。 0 +FSMC_NADV重映射。 +0:FSMC NADV映射到PB7; +10 FSMC_NADV RW 1:禁止FSMC NADV输出。 0 +注:批号倒数第五位小于2且批号倒数第六位 +等于0的不支持该功能。 +[9:7] Reserved RO 保留。 0 +TIM10的重映射位。 +00:默认映射(ETR/PC10,CH1/PB8,CH2/PB9, +CH3/PC3,CH4/PC11,BKIN/PC12,CH1N/PA12, +CH2N/PA13,CH3N/PA14); +01:部分映射(ETR/PB11,CH1/PB3,CH2/PB4, +[6:5] TIM10_RM[1:0] RW CH3/PB5,CH4/PC15,BKIN/PB10,CH1N/PA5, 00b +CH2N/PA6,CH3N/PA7); +1x:完全映射(ETR/PD0,CH1/PD1,CH2/PD3, +CH3/PD5,CH4/PD7,BKIN/PE2,CH1N/PE3, +CH2N/PE4,CH3N/PE5)。 +注:此位完全映射适用于 CH32V303VCT6、 +V2.4 134 + +# Page 138 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CH32V307VCT6 、 CH32V317VCT6 和 +CH32F207VCT6、CH32F203VCT6芯片。 +TIM9的重映射位。 +00:默认映射(ETR/PA2,CH1/PA2,CH2/PA3, +CH3/PA4,CH4/PC4,BKIN/PC5,CH1N/PC0, +CH2N/PC1,CH3N/PC2); +01:部分映射(ETR/PA2,CH1/PA2,CH2/PA3, +CH3/PA4,CH4/PC14,BKIN/PA1,CH1N/PB0, +[4:3] TIM9_RM[1:0] RW CH2N/PB1,CH3N/PB2); 00b +1x:完全映射(ETR/PD9,CH1/PD9,CH2/PD11, +CH3/PD13,CH4/PD15,BKIN/PD14,CH1N/PD8, +CH2N/PD10,CH3N/PD12)。 +注:此位完全映射适用于 CH32V303VCT6、 +CH32V307VCT6 、 CH32V317VCT6 和 +CH32F207VCT6、CH32F203VCT6芯片。 +TIM8的重映射位。 +0:默认映射(ETR/PA0,CH1/PC6,CH2/PC7, +CH3/PC8,CH4/PC9,BKIN/PA6,CH1N/PA7, +CH2N/PB0,CH3N/PB1); +2 TIM8_RM RW 1:重映射(ETR/PA0,CH1/PB6,CH2/PB7, 0 +CH3/PB8,CH4/PC13,BKIN/PB9,CH1N/PA13, +CH2N/PA14,CH3N/PA15); +注:此位适用于CH32F20x_D8、CH32F20x_D8C、 +CH32V30x和CH32V31x系列芯片。 +[1:0] Reserved RW 保留。 0 +V2.4 135 + +# Page 139 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 11 章 直接存储器访问控制(DMA) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +直接存储器访问控制器(DMA)提供在外设和存储器之间或存储器和存储器之间的高速数据传输 +方式,无须CPU干预,数据可以通过DMA快速地移动,以节省CPU的资源来做其他操作。 +DMA控制器每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器 +来协调各通道之间的优先级。 +11.1 主要特性 + 多个独立可配置通道 + 每个通道都直接连接专用的硬件DMA请求,并支持软件触发 + 支持循环的缓冲器管理 + 多个通道之间的请求优先权可以通过软件编程设置(最高、高、中和低),优先权设置相等时 +由通道号决定(通道号越低优先级越高) + 支持外设到存储器、存储器到外设、存储器到存储器之间的传输 + 闪存、SRAM、外设的SRAM、PB1、PB2和HB外设均可作为访问的源和目标 + 可编程的数据传输字节数目:最大为65535 +11.2 功能描述 +11.2.1 DMA 通道处理 +1)仲裁优先级 +多个独立的通道产生的DMA请求通过逻辑或结构输入到DMA控制器,当前只会有一个通道的请求 +得到响应。模块内部的仲裁器根据通道请求的优先级来选择要启动的外设/存储器的访问。 +软件管理中,应用程序通过对DMA_CFGRx寄存器的PL[1:0]位设置,可以为每个通道独立配置优 +先等级,包括最高、高、中、低4个等级。当通道间的软件设置等级一致时,模块会按固定的硬件优 +先级选择,通道编号偏低的要比偏高的有较高优先权。 +2)DMA配置 +当DMA控制器收到一个请求信号时,会访问发出请求的外设或存储器,建立外设或存储器和存储 +器之间的数据传输。主要包括下面3个操作步骤: +1) 从外设数据寄存器或当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开 +始地址是DMA_PADDRx或DMA_MADDRx寄存器指定的外设基地址或存储器地址。 +2) 存数据到外设数据寄存器或当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开 +始地址是DMA_PADDRx或DMA_MADDRx寄存器指定的外设基地址或存储器地址。 +3) 执行一次DMA_CNTRx寄存器中数值的递减操作,该寄存器指示当前未完成转移的操作数目。 +每个通道包括3种DMA数据转移方式: + 外设到存储器(MEM2MEM=0,DIR=0) + 存储器到外设(MEM2MEM=0,DIR=1) + 存储器到存储器(MEM2MEM=1) +注:存储器到存储器方式无需外设请求信号,配置为此模式后(MEM2MEM=1),通道开启(EN=1)即可 +启动数据传输。此方式不支持循环模式。 +配置过程如下: +V2.4 136 + +# Page 140 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1) 在DMA_PADDRx寄存器中设置外设寄存器的首地址或存储器到存储器方式(MEM2MEM=1)下存储器 +数据地址。发生DMA请求时,这个地址将是数据传输的源或目标地址。 +2) 在DMA_MADDRx寄存器中设置存储器数据地址。发生DMA请求时,传输的数据将从这个地址读出或 +写入这个地址。 +3) 在DMA_CNTRx寄存器中设置要传输的数据数量。在每个数据传输后,这个数值递减。 +4) 在DMA_CFGRx寄存器的PL[1:0]位中设置通道的优先级。 +5) 在DMA_CFGRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储 +器的数据宽度、传输过半、传输完成、传输错误中断使能位, +6) 设置DMA_CFGRx寄存器的EN位,启动通道x。 +注:DMA_PADDRx/DMA_MADDRx/DMA_CNTRx寄存器以及DMA_CFGRx寄存器中的数据传输的方向(DIR)、 +循环模式(位置)、外设和存储器的增量模式(MINC/PINC)等控制位只有在DMA通道被关闭下才可 +以配置写入。 +3)循环模式 +设置DMA_CFGRx寄存器的CIRC位置1,可以启用通道数据传输的循环模式功能。循环模式下,当 +数据传输的数目变为0时,DMA_CNTRx寄存器的内容会自动被重新加载为其初始数值,内部的外设和 +存储器地址寄存器也被重新加载为DMA_PADDRx和DMA_MADDRx寄存器设定的初始地址值,DMA操作将 +继续进行,直到通道被关闭或关闭DMA模式。 +4)DMA处理状态 + 传输过半:对应DMA_INTFR寄存器中的HTIFx位硬件置位。当DMA的传输字节数目减至初始设定 +值一半以下将会产生 DMA 传输过半标志,如果在 DMA_CFGRx 寄存器中置位了 HTIE,则将产生中 +断。硬件通过此标志提醒应用程序,可以为新一轮数据传输做准备。 + 传输完成:对应DMA_INTFR寄存器中的TCIFx位硬件置位。当DMA的传输字节数目减至0将会产 +生DMA传输完成标志,如果在DMA_CFGRx寄存器中置位了TCIE,则将产生中断。 + 传输错误:对应DMA_INTFR寄存器中的TEIFx位硬件置位。读写一个保留的地址区域,将会产生 +DMA 传输错误。同时模块硬件会自动清 0 发生错误的通道所对应的 DMA_CFGRx 寄存器的 EN 位, +该通道被关闭。如果在DMA_CFGRx寄存器中置位了TEIE,则将产生中断。 +应用程序在查询 DMA 通道状态时,可以先访问 DMA_INTFR 寄存器的 GIFx位,判断出当前哪个通 +道发生了DMA事件,进而处理该通道的具体DMA事件内容。 +11.2.2 可编程的数据传输总大小/数据位宽/对齐方式 +DMA 每个通道一轮传输的数据量总大小可编程,最大 65535 次。DMA_CNTRx 寄存器中指示待传输 +字节数目。在EN=0时,写入设置值,在EN=1开启DMA传输通道后,此寄存器变为只读属性,在每次 +传输后数值递减。 +外设和存储器的传输数据取值支持地址指针自动递增功能,指针增量可编程。它们访问的第一个 +传输的数据地址存放在 DMA_PADDRx 和 DMA_MADDRx寄存器中,通过设置 DMA_CFGRx寄存器的PINC位 +或MINC位置1,可以分别开启外设地址自增模式或存储器地址自增模式,PSIZE[1:0]设置外设地址取 +数据大小及地址自增大小,MSIZE[1:0]设置存储器地址取数据大小及地址自增大小,包括 3 种选择: +8位、16位、32位。具体数据转移方式如下表: +表11-1 不同数据位宽下DMA转移(PINC=MINC=1) +源端 目标 传输 +源:地址/数据 目标:地址/数据 传输操作 +位宽 位宽 数目 +0x00/B0 0x00/B0  源端地址递增量与源端设置的 +8 8 4 0x01/B1 0x01/B1 数据位宽对齐,取值大小等于 +0x02/B2 0x02/B2 源端数据位宽 +V2.4 137 + +# Page 141 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0x03/B3 0x03/B3  目标地址递增量与目标设置数 +0x00/B0 0x00/00B0 据的位宽对齐,取值大小等于 +0x01/B1 0x02/00B1 目标数据位宽 +8 16 4 +0x02/B2 0x04/00B2  DMA转移送入目标端的数据依 +0x03/B3 0x06/00B3 据原则:数据大小不足高位补 +0x00/B0 0x00/000000B0 0,数据大小溢出高位去掉 +0x01/B1 0x04/000000B1  存储数据方式:小端模式,低 +8 32 4 +0x02/B2 0x08/000000B2 地址存放低字节,高地址存放 +0x03/B3 0x0C/000000B3 高字节 +0x00/B1B0 0x00/B0 +0x02/B3B2 0x01/B2 +16 8 4 +0x04/B5B4 0x02/B4 +0x06/B7B6 0x03/B6 +0x00/B1B0 0x00/B1B0 +0x02/B3B2 0x02/B3B2 +16 16 4 +0x04/B5B4 0x04/B5B4 +0x06/B7B6 0x06/B7B6 +0x00/B1B0 0x00/0000B1B0 +0x02/B3B2 0x04/0000B3B2 +16 32 4 +0x04/B5B4 0x08/0000B5B4 +0x06/B7B6 0x0C/0000B7B6 +0x00/B3B2B1B0 0x00/B0 +0x04/B7B6B5B4 0x01/B4 +32 8 4 +0x08/BBBAB9B8 0x02/B8 +0x0C/BFBEBDBC 0x03/BC +0x00/B3B2B1B0 0x00/B1B0 +0x04/B7B6B5B4 0x02/B5B4 +32 16 4 +0x08/BBBAB9B8 0x04/B9B8 +0x0C/BFBEBDBC 0x06/BDBC +0x00/B3B2B1B0 0x00/B3B2B1B0 +0x04/B7B6B5B4 0x04/B7B6B5B4 +32 32 4 +0x08/BBBAB9B8 0x08/BBBAB9B8 +0x0C/BFBEBDBC 0x0C/BFBEBDBC +11.2.3 DMA 请求映射 +青稞V4F MCU(包括CH32V30x_D8C、CH32V31x_D8C、CH32V30x_D8)以及ARM○RCortexTM-M3 MCU(包 +括CH32F20x_D8C、CH32F20x_D8),DMA控制器提供18个通道,其中DMA1包含7个通道,DMA2包含 +11个通道,每个通道对应多个外设请求,通过设置相应外设寄存器中对应DMA控制位,可以独立的开 +启或关闭各个外设的DMA功能,具体对应关系如下。 +注:(1)DMA1在使用时需注意,对于批号倒数第五位小于3且倒数第六位等于0的,DMA1所有通道 +的DMA访问地址不得超过64K边界。 +例如-CH32V307VCT6配置RAM为128K,此时配置DAM1需注意DMA源地址+传输数据数目,或DMA +目的地址+传输数据只能在0-64K,或64K-128K区域,不可出现63K-65K类似情况。对于批号倒数第 +五位等于3且倒数第六位等于0的,DAM1通道2,3,4,5,DMA访问地址不得超过128K边界,DMA1 +通道1,6,7DMA访问地址依然不得超过64K边界。 +(2)对于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数第六 +V2.4 138 + +# Page 142 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位不为0的产品DMA1使用上没有限制。 +(3)DMA2使用上没有限制。 +图11-1 DMA1请求映像 +ADC1 EN bit of channel 1 +Hardware request1 +TIM2_CH3 +Channel 1 +TIM4_CH1 +Software Trigger Arbiter +MEM2MEM bit +SPI1_RX +EN bit of channel 2 +USART3_TX +Hardware request2 +TIM1_CH1 +Channel 2 +TIM2_UP +Software Priority +TIM3_CH3 Software Trigger +MEM2MEM bit PL setting +value of +SPI1_TX EN bit of channel 3 +USART3_RX Hardware request3 channel +TIM1_CH2 Channel 3 +TIM3_CH4/TIM3_UP +Software Trigger +MEM2MEM bit +SPI/I2S2_RX DMA +EN bit of channel 4 Request +USART1_TX Hardware request4 +to internal +I2C2_TX +Channel 4 +TIM1_TRIG/TIM1_COM/TIM1_CH4 +Software Trigger +TIM4_CH2 +MEM2MEM bit +SPI/I2S2_TX +USART1_RX EN bit of channel 5 +Hardware request5 +I2C2_RX +TIM1_UP Channel 5 +TIM2_CH1 Fixed hardware +TIM4_CH3 Software Trigger priority +MEM2MEM bit +Channel +USART2_RX EN bit of channel 6 +Hardware request6 No. +I2C1_TX +TIM1_CH3 Channel 6 +TIM3_CH1/TIM3_TRIG Software Trigger +MEM2MEM bit +USART2_TX EN bit of channel 7 +Hardware request7 +I2C1_RX +TIM2_CH2/TIM2_CH4 Channel 7 +TIM4_UP Software Trigger +MEM2MEM bit +V2.4 139 + +# Page 143 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图11-2 DMA2请求映像 +TIM5_CH4/TIM5_TRIG EN bit of channel 1 +Hardware request1 +TIM8_CH3/TIM8_UP +Channel 1 +SPI/I2S3_RX +Software Trigger Arbiter +MEM2MEM bit +TIM5_CH3/TIM5_UP EN bit of channel 2 +TIM8_CH4/TIM8_TRIG/TIM8_COM Hardware request2 +UART5_RX Channel 2 +SPI/I2S3_TX Software Trigger Software Priority +MEM2MEM bit +PL setting +TIM6_UP EN bit of channel 3 value of +TIM8_CH1 Hardware request3 channel +UART4_RX Channel 3 +DAC1 Software Trigger +MEM2MEM bit +TIM5_CH2 +EN bit of channel 4 +TIM7_UP Hardware request4 +UART5_TX +Channel 4 +SDIO +Software Trigger +DAC2 +MEM2MEM bit +TIM5_CH1 EN bit of channel 5 +Hardware request5 +TIM8_CH2 +Channel 5 +UART4_TX +Software Trigger +MEM2MEM bit DMA +TIM9_UP EN bit of channel 6 Request +Hardware request6 to internal +TIM10_CH4 +Channel 6 +UART6_TX +Software Trigger +MEM2MEM bit +TIM9_CH1 EN bit of channel 7 +Hardware request7 +TIM10_TRIG/TIM10_COM +Channel 7 +UART6_RX +Software Trigger +MEM2MEM bit +TIM9_CH4 EN bit of channel 8 +Hardware request8 +TIM10_CH1 +Channel 8 +UART7_TX +Software Trigger +MEM2MEM bit +TIM9_CH2 EN bit of channel 9 +Hardware request9 Fixed hardware +TIM10_CH3 +Channel 9 priority +UART7_RX +Software Trigger Channel +MEM2MEM bit No. +TIM9_TRIG/TIM9_COM EN bit of channel 10 +Hardware request10 +TIM10_CH2 +Channel 10 +UART8_TX +Software Trigger +MEM2MEM bit +EN bit of channel 11 +TIM9_CH3 +Hardware request11 +TIM10_UP +Channel 11 +UART8_RX +Software Trigger +MEM2MEM bit +表11-2 DMA1各通道外设映射表 +外设 通道1 通道2 通道3 通道4 通道5 通道6 通道7 +ADC1 ADC1 +V2.4 140 + +# Page 144 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +SPI1 SPI1_RX SPI1_TX +SPI/I2S2 SPI/I2S2_RX SPI/I2S2_TX +USART1 USART1_TX USART1_RX +USART2 USART2_RX USART2_TX +USART3 USART3_TX USART3_RX +I2C1 I2C1_TX I2C1_RX +I2C2 I2C2_TX I2C2_RX +TIM1_CH4 +TIM1 TIM1_CH1 TIM1_CH2 TIM1_TRIG TIM1_UP TIM1_CH3 +TIM1_COM +TIM2_CH2 +TIM2 TIM2_CH3 TIM2_UP TIM2_CH1 +TIM2_CH4 +TIM3_CH4 TIM3_CH1 +TIM3 TIM3_CH3 +TIM3_UP TIM3_TRIG +TIM4 TIM4_CH1 TIM4_CH2 TIM4_CH3 TIM4_UP +表11-3 DMA2各通道外设映射表一 +外设 通道1 通道2 通道3 通道4 通道5 通道6 通道7 +TIM5_CH4 TIM5_CH3 +TIM5 TIM5_CH2 TIM5_CH1 +TIM5_TRIG TIM5_UP +TIM6 TIM6_UP +TIM7 TIM7_UP +TIM8_CH4 +TIM8_CH3 +TIM8 TIM8_TRIG TIM8_CH1 TIM8_CH2 +TIM8_UP +TIM8_COM +TIM9 TIM9_UP TIM9_CH1 +TIM10_TRIG +TIM10 TIM10_CH4 +TIM10_COM +USART4 USART4_RX USART4_TX +USART5 USART5_RX USART5_TX +USART6 USART6_TX USART6_RX +USART7 +USART8 +SPI/I2S3 SPI/I2S3_RX SPI/I2S3_TX +SDIO SDIO +DAC1 DAC1 +DAC2 DAC2 +ADC2(1) ADC2 +注:(1)ADC2的DMA通道外设映射仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C批号倒数第六位不为0的产品。 +表11-4 DMA2各通道外设映射表二 +外设 通道8 通道9 通道10 通道11 +TIM5 +TIM6 +V2.4 141 + +# Page 145 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +TIM7 +TIM8 +TIM9_TRIG +TIM9 TIM9_CH4 TIM9_CH2 TIM9_CH3 +TIM9_COM +TIM10 TIM10_CH1 TIM10_CH3 TIM10_CH2 TIM10_UP +USART4 +USART5 +USART6 +USART7 USART7_TX USART7_RX +USART8 USART8_TX USART8_RX +SPI/I2S3 +SDIO +DAC1 +DAC2 +青稞V4B MCU(包括CH32V20x_D6)以及ARM○RCortexTM-M3 MCU(包括CH32F20x_D6),DMA控制器 +提供8个通道,每个通道对应多个外设请求,通过设置相应外设寄存器中对应DMA控制位,可以独立 +的开启或关闭各个外设的DMA功能,具体对应关系如下。 +表11-5 DMA各通道外设映射表 +外设 通道1 通道2 通道3 通道4 通道5 通道6 通道7 通道8 +ADC1 ADC1 +SPI1 SPI1_RX SPI1_TX +SPI2 SPI2_RX SPI2_TX +USART1 USART1_TX USART1_RX +USART2 USART2_RX USART2_TX +USART3 USART3_TX USART3_RX +USART4 USART4_TX USART4_RX +I2C1 I2C1_TX I2C1_RX +I2C2 I2C2_TX I2C2_RX +TIM1_CH4 +TIM1 TIM1_CH1 TIM1_CH2 TIM1_TRIG TIM1_UP TIM1_CH3 +TIM1_COM +TIM2_CH2 +TIM2 TIM2_CH3 TIM2_UP TIM2_CH1 +TIM2_CH4 +TIM3_CH4 TIM3_CH1 +TIM3 TIM3_CH3 +TIM3_UP TIM3_TRIG +TIM4 TIM4_CH1 TIM4_CH2 TIM4_CH3 TIM4_UP +V2.4 142 + +# Page 146 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图11-3 DMA请求映像 +青稞V4C MCU(包括CH32V20x_D8W、CH32V20x_D8)以及ARM○RCortexTM-M3 MCU(包括CH32F20x_D8W), +DMA控制器提供8个通道,每个通道对应多个外设请求,通过设置相应外设寄存器中对应DMA控制位, +可以独立的开启或关闭各个外设的DMA功能,具体对应关系如下。 +表11-6 DMA各通道外设映射表 +外设 通道1 通道2 通道3 通道4 通道5 通道6 通道7 通道8 +ADC1 ADC1 +SPI1 SPI1_RX SPI1_TX +SPI2 SPI2_RX SPI2_TX +USART1 USART1_TX USART1_RX +USART2 USART2_RX USART2_TX +USART3 USART3_TX USART3_RX +USART4 USART4_TX USART4_RX +I2C1 I2C1_TX I2C1_RX +I2C2 I2C2_TX I2C2_RX +TIM1 TIM1_CH1 TIM1_CH2 TIM1_CH4 TIM1_UP TIM1_CH3 +V2.4 143 + +# Page 147 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +TIM1_TRIG +TIM1_COM +TIM2_CH2 +TIM2 TIM2_CH3 TIM2_UP TIM2_CH1 +TIM2_CH4 +TIM3_CH4 TIM3_CH1 +TIM3 TIM3_CH3 +TIM3_UP TIM3_TRIG +TIM4 TIM4_CH1 TIM4_CH2 TIM4_CH3 TIM4_UP +TIM5_CH1 +TIM5 TIM5_CH2 TIM5_CH3 TIM5_CH4 TIM5_UP +TIM5_TRIG +图11-4 DMA请求映像 +11.3 寄存器描述 +表11-7 DMA1相关寄存器列表 +名称 访问地址 描述 复位值 +V2.4 144 + +# Page 148 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_DMA1_INTFR 0x40020000 DMA1中断状态寄存器 0x00000000 +R32_DMA1_INTFCR 0x40020004 DMA1中断标志清除寄存器 0x00000000 +R32_DMA1_CFGR1 0x40020008 DMA1通道1配置寄存器 0x00000000 +R32_DMA1_CNTR1 0x4002000C DMA1通道1传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR1 0x40020010 DMA1通道1外设地址寄存器 0x00000000 +R32_DMA1_MADDR1 0x40020014 DMA1通道1存储器地址寄存器 0x00000000 +R32_DMA1_CFGR2 0x4002001C DMA1通道2配置寄存器 0x00000000 +R32_DMA1_CNTR2 0x40020020 DMA1通道2传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR2 0x40020024 DMA1通道2外设地址寄存器 0x00000000 +R32_DMA1_MADDR2 0x40020028 DMA1通道2存储器地址寄存器 0x00000000 +R32_DMA1_CFGR3 0x40020030 DMA1通道3配置寄存器 0x00000000 +R32_DMA1_CNTR3 0x40020034 DMA1通道3传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR3 0x40020038 DMA1通道3外设地址寄存器 0x00000000 +R32_DMA1_MADDR3 0x4002003C DMA1通道3存储器地址寄存器 0x00000000 +R32_DMA1_CFGR4 0x40020044 DMA1通道4配置寄存器 0x00000000 +R32_DMA1_CNTR4 0x40020048 DMA1通道4传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR4 0x4002004C DMA1通道4外设地址寄存器 0x00000000 +R32_DMA1_MADDR4 0x40020050 DMA1通道4存储器地址寄存器 0x00000000 +R32_DMA1_CFGR5 0x40020058 DMA1通道5配置寄存器 0x00000000 +R32_DMA1_CNTR5 0x4002005C DMA1通道5传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR5 0x40020060 DMA1通道5外设地址寄存器 0x00000000 +R32_DMA1_MADDR5 0x40020064 DMA1通道5存储器地址寄存器 0x00000000 +R32_DMA1_CFGR6 0x4002006C DMA1通道6配置寄存器 0x00000000 +R32_DMA1_CNTR6 0x40020070 DMA1通道6传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR6 0x40020074 DMA1通道6外设地址寄存器 0x00000000 +R32_DMA1_MADDR6 0x40020078 DMA1通道6存储器地址寄存器 0x00000000 +R32_DMA1_CFGR7 0x40020080 DMA1通道7配置寄存器 0x00000000 +R32_DMA1_CNTR7 0x40020084 DMA1通道7传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR7 0x40020088 DMA1通道7外设地址寄存器 0x00000000 +R32_DMA1_MADDR7 0x4002008C DMA1通道7存储器地址寄存器 0x00000000 +R32_DMA1_CFGR8 0x40020094 DMA1通道8配置寄存器 0x00000000 +R32_DMA1_CNTR8 0x40020098 DMA1通道8传输数据数目寄存器 0x00000000 +R32_DMA1_PADDR8 0x4002009C DMA1通道8外设地址寄存器 0x00000000 +R32_DMA1_MADDR8 0x400200A0 DMA1通道8存储器地址寄存器 0x00000000 +表11-8 DMA2相关寄存器列表 +名称 访问地址 描述 复位值 +R32_DMA2_INTFR 0x40020400 DMA2中断状态寄存器 0x00000000 +R32_DMA2_INTFCR 0x40020404 DMA2中断标志清除寄存器 0x00000000 +R32_DMA2_CFGR1 0x40020408 DMA2通道1配置寄存器 0x00000000 +R32_DMA2_CNTR1 0x4002040C DMA2通道1传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR1 0x40020410 DMA2通道1外设地址寄存器 0x00000000 +R32_DMA2_MADDR1 0x40020414 DMA2通道1存储器地址寄存器 0x00000000 +R32_DMA2_CFGR2 0x4002041C DMA2通道2配置寄存器 0x00000000 +V2.4 145 + +# Page 149 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_DMA2_CNTR2 0x40020420 DMA2通道2传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR2 0x40020424 DMA2通道2外设地址寄存器 0x00000000 +R32_DMA2_MADDR2 0x40020428 DMA2通道2存储器地址寄存器 0x00000000 +R32_DMA2_CFGR3 0x40020430 DMA2通道3配置寄存器 0x00000000 +R32_DMA2_CNTR3 0x40020434 DMA2通道3传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR3 0x40020438 DMA2通道3外设地址寄存器 0x00000000 +R32_DMA2_MADDR3 0x4002043C DMA2通道3存储器地址寄存器 0x00000000 +R32_DMA2_CFGR4 0x40020444 DMA2通道4配置寄存器 0x00000000 +R32_DMA2_CNTR4 0x40020448 DMA2通道4传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR4 0x4002044C DMA2通道4外设地址寄存器 0x00000000 +R32_DMA2_MADDR4 0x40020450 DMA2通道4存储器地址寄存器 0x00000000 +R32_DMA2_CFGR5 0x40020458 DMA2通道5配置寄存器 0x00000000 +R32_DMA2_CNTR5 0x4002045C DMA2通道5传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR5 0x40020460 DMA2通道5外设地址寄存器 0x00000000 +R32_DMA2_MADDR5 0x40020464 DMA2通道5存储器地址寄存器 0x00000000 +R32_DMA2_CFGR6 0x4002046C DMA2通道6配置寄存器 0x00000000 +R32_DMA2_CNTR6 0x40020470 DMA2通道6传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR6 0x40020474 DMA2通道6外设地址寄存器 0x00000000 +R32_DMA2_MADDR6 0x40020478 DMA2通道6存储器地址寄存器 0x00000000 +R32_DMA2_CFGR7 0x40020480 DMA2通道7配置寄存器 0x00000000 +R32_DMA2_CNTR7 0x40020484 DMA2通道7传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR7 0x40020488 DMA2通道7外设地址寄存器 0x00000000 +R32_DMA2_MADDR7 0x4002048C DMA2通道7存储器地址寄存器 0x00000000 +R32_DMA2_CFGR8 0x40020490 DMA2通道8配置寄存器 0x00000000 +R32_DMA2_CNTR8 0x40020494 DMA2通道8传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR8 0x40020498 DMA2通道8外设地址寄存器 0x00000000 +R32_DMA2_MADDR8 0x4002049C DMA2通道8存储器地址寄存器 0x00000000 +R32_DMA2_CFGR9 0x400204A0 DMA2通道9配置寄存器 0x00000000 +R32_DMA2_CNTR9 0x400204A4 DMA2通道9传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR9 0x400204A8 DMA2通道9外设地址寄存器 0x00000000 +R32_DMA2_MADDR9 0x400204AC DMA2通道9存储器地址寄存器 0x00000000 +R32_DMA2_CFGR10 0x400204B0 DMA2通道10配置寄存器 0x00000000 +R32_DMA2_CNTR10 0x400204B4 DMA2通道10传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR10 0x400204B8 DMA2通道10外设地址寄存器 0x00000000 +R32_DMA2_MADDR10 0x400204BC DMA2通道10存储器地址寄存器 0x00000000 +R32_DMA2_CFGR11 0x400204C0 DMA2通道11配置寄存器 0x00000000 +R32_DMA2_CNTR11 0x400204C4 DMA2通道11传输数据数目寄存器 0x00000000 +R32_DMA2_PADDR11 0x400204C8 DMA2通道11外设地址寄存器 0x00000000 +R32_DMA2_MADDR11 0x400204CC DMA2通道11存储器地址寄存器 0x00000000 +R32_DMA2_EXTEM_INTFR 0x400204D0 DMA2扩展中断状态寄存器 0x00000000 +R32_DMA2_EXTEM_INTFCR 0x400204D4 DMA2扩展中断标志清除寄存器 0x00000000 +11.3.1 DMAx 中断状态寄存器(DMAx_INTFR)(x=1/2) +偏移地址:0x00 + (x-1)*0x400 +V2.4 146 + +# Page 150 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TEIF8 HTIF8 TCIF8 GIF8 TEIF7 HTIF7 TCIF7 GIF7 TEIF6 HTIF6 TCIF6 GIF6 TEIF5 HTIF5 TCIF5 GIF5 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TEIF4 HTIF4 TCIF4 GIF4 TEIF3 HTIF3 TCIF3 GIF3 TEIF2 HTIF2 TCIF2 GIF2 TEIF1 HTIF1 TCIF1 GIF1 +位 名称 访问 描述 复位值 +通道x的传输错误标志(x=1/2/3/4/5/6/7/8): +31/27/23/ +0:在通道x上没有传输错误; +19/15/11/ TEIFx RO 0 +1:在通道x上发生了传输错误。 +7/3 +硬件置位,软件写CTEIFx位清除此标志。 +通道x的传输过半标志(x=1/2/3/4/5/6/7/8): +30/26/22/ +0:在通道x上没有传输过半; +18/14/10/ HTIFx RO 0 +1:在通道x上产生了传输过半事件。 +6/2 +硬件置位,软件写CHTIFx位清除此标志。 +通道x的传输完成标志(x=1/2/3/4/5/6/7/8): +29/25/21/ +0:在通道x上没有传输完成事件; +17/13/9/5 TCIFx RO 0 +1:在通道x上产生了传输完成事件。 +/1 +硬件置位,软件写CTCIFx位清除此标志。 +通道x的全局中断标志(x=1/2/3/4/5/6/7/8): +28/24/20/ +0:在通道x上没有发生TEIFx或HTIFx或TCIFx; +16/12/8/4 GIFx RO 0 +1:在通道x上产生了TEIFx或HTIFx或TCIFx。 +/0 +硬件置位,软件写CGIFx位清除此标志。 +注:通道8适用于CH32V20x_D8、CH32V20x_D8W、CH32F20x_D8W、CH32F20x_D6、CH32V20x_D6。 +11.3.2 DMAx 中断标志清除寄存器(DMAx_INTFCR)(x=1/2) +偏移地址:0x04 + (x-1)*0x400 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CTEIF8 CHTIF8 CTCIF8 CGIF8 CTEIF7 CHTIF7 CTCIF7 CGIF7 CTEIF6 CHTIF6 CTCIF6 CGIF6 CTEIF5 CHTIF5 CTCIF5 CGIF5 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CTEIF4 CHTIF4 CTCIF4 CGIF4 CTEIF3 CHTIF3 CTCIF3 CGIF3 CTEIF2 CHTIF2 CTCIF2 CGIF2 CTEIF1 CHTIF1 CTCIF1 CGIF1 +位 名称 访问 描述 复位值 +31/27/23/ 清除通道x的传输错误标志(x=1/2/3/4/5/6/7/8): +19/15/11/ CTEIFx WO 0:无作用; 0 +7/3 1:清除DMA_INTFR寄存器中的TEIFx标志。 +30/26/22/ 清除通道x的传输过半标志(x=1/2/3/4/5/6/7/8): +18/14/10/ CHTIFx WO 0:无作用; 0 +6/2 1:清除DMA_INTFR寄存器中的HTIFx标志。 +29/25/21/ 清除通道x的传输完成标志(x=1/2/3/4/5/6/7/8): +17/13/9/5 CTCIFx WO 0:无作用; 0 +/1 1:清除DMA_INTFR寄存器中的TCIFx标志。 +28/24/20/ 清除通道x的全局中断标志(x=1/2/3/4/5/6/7/8): +CGIFx WO 0 +16/12/8/4 0:无作用; +V2.4 147 + +# Page 151 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +/0 1:清除 DMA_INTFR 寄存器中的 TEIFx/HTIFx/TCIFx/ +GIFx标志。 +注:通道8适用于CH32V20x_D8、CH32V20x_D8W、CH32F20x_D8W、CH32F20x_D6、CH32V20x_D6。 +11.3.3 DMAy 通道 x 配置寄存器(DMAy_CFGRx)(x=1/2/3/4/5/6/7/8,y=1/2) +偏移地址:0x08 + (x-1)*20 + (y-1)*0x400 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser MEM2 +PL[1:0] MSIZE[1:0] PSIZE[1:0] MINC PINC CIRC DIR TEIE HTIE TCIE EN +ved MEM +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +存储器到存储器模式使能: +14 MEM2MEM RW 0:非存储器到存储器数据传输; 0 +1:使能存储器到存储器数据传输模式。 +通道优先级设置: +[13:12] PL[1:0] RW 00:低; 01:中; 00b +10:高; 11:最高。 +存储器地址数据宽度设置: +[11:10] MSIZE[1:0] RW 00:8位; 01:16位; 00b +10:32位; 11:保留。 +外设地址数据宽度设置: +[9:8] PSIZE[1:0] RW 00:8位; 01:16位; 00b +10:32位; 11:保留。 +存储器地址增量递增模式使能: +7 MINC RW 0:存储器地址保持不变操作; 0 +1:使能存储器地址增量递增操作。 +外设地址增量递增模式使能: +6 PINC RW 0:外设地址保持不变操作; 0 +1:使能外设地址增量递增操作。 +DMA通道循环模式使能: +5 CIRC RW 0:执行单次操作; 0 +1:使能循环操作。 +数据传输方向: +4 DIR RW 0:从外设读; 0 +1:从存储器读。 +传输错误中断使能控制: +3 TEIE RW 0:禁止传输错误中断; 0 +1:使能传输错误中断。 +传输过半中断使能控制: +2 HTIE RW 0:禁止传输过半中断; 0 +1:使能传输过半中断。 +V2.4 148 + +# Page 152 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +传输完成中断使能控制: +1 TCIE RW 0:禁止传输完成中断; 0 +1:使能传输完成中断。 +通道使能控制: +0:通道关闭; 1:通道开启。 +0 EN RW 0 +发生 DMA 传输错误时,硬件自动将此位清 0,关闭通 +道。 +注:通道8适用于CH32V20x_D8、CH32V20x_D8W、CH32F20x_D8W、CH32F20x_D6、CH32V20x_D6。 +11.3.4 DMAy 通道 x 传输数据数目寄存器(DMAy_CNTRx)(x=1/2/3/4/5/6/7/8, +y=1/2) +偏移地址:0x0C + (x-1)*20 + (y-1)*0x400 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +NDT[15:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +数据传输数量,范围0-65535。 +指示剩余的待传输数目(寄存器内容在每次 DMA 传输 +[15:0] NDT[15:0] RW 后递减)。 0 +在通道为循环模式下,寄存器的内容将被自动重新加 +载为之前配置的数值。 +注:表示当前待传输数目。此寄存器只能在EN=0时更改,EN=1时不可写。当寄存器内容为0时,无 +论通道是否开启,都不会发生任何数据传输。通道8适用于CH32V20x_D8、CH32V20x_D8W、CH32F20x_D8W、 +CH32F20x_D6、CH32V20x_D6。 +11.3.5 DMAy 通道 x 外设地址寄存器(DMAy_PADDRx)(x=1/2/3/4/5/6/7/8,y=1/2) +偏移地址:0x10 + (x-1)*20 + (y-1)*0x400 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PA[31:0] +位 名称 访问 描述 复位值 +外设基地址,作为外设数据传输的源或目标地址。 +当PSIZE[1:0]=‘01’(16位),模块自动忽略bit0, +[31:0] PA[31:0] RW 操作地址自动2字节对齐;当PSIZE[1:0]=‘10’(32 0 +位),模块自动忽略 bit[1:0],操作地址自动 4字节 +对齐。 +注:此寄存器只能在EN=0时更改,EN=1时不可写。通道8适用于CH32V20x_D8、CH32V20x_D8W、 +CH32F20x_D8W、CH32F20x_D6、CH32V20x_D6。 +11.3.6 DMAy 通道 x 存储器地址寄存器(DMAy_MADDRx)(x=1/2/3/4/5/6/7/8, +V2.4 149 + +# Page 153 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +y=1/2) +偏移地址:0x14 + (x-1)*20 + (y-1)*0x400 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MA[31:0] +位 名称 访问 描述 复位值 +存储器数据地址,作为数据传输的源或目标地址。 +当MSIZE[1:0]=‘01’(16位),模块自动忽略bit0, +[31:0] MA[31:0] RW 操作地址自动2字节对齐;当MSIZE[1:0]=‘10’(32 0 +位),模块自动忽略 bit[1:0],操作地址自动 4字节 +对齐。 +注:此寄存器只能在EN=0时更改,EN=1时不可写。通道8适用于CH32V20x_D8、CH32V20x_D8W、 +CH32F20x_D8W、CH32F20x_D6、CH32V20x_D6。 +11.3.7 DMA2 通道 x 配置寄存器(DMA2_CFGRx)(x=8/9/10/11) +偏移地址:0x490 + (x-8)*16 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser MEM2 +PL[1:0] MSIZE[1:0] PSIZE[1:0] MINC PINC CIRC DIR TEIE HTIE TCIE EN +ved MEM +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +存储器到存储器模式使能: +14 MEM2MEM RW 0:非存储器到存储器数据传输; 0 +1:使能存储器到存储器数据传输模式。 +通道优先级设置: +[13:12] PL[1:0] RW 00:低; 01:中; 00b +10:高; 11:最高。 +存储器地址数据宽度设置: +[11:10] MSIZE[1:0] RW 00:8位; 01:16位; 00b +10:32位; 11:保留。 +外设地址数据宽度设置: +[9:8] PSIZE[1:0] RW 00:8位; 01:16位; 00b +10:32位; 11:保留。 +存储器地址增量递增模式使能: +7 MINC RW 0:存储器地址保持不变操作; 0 +1:使能存储器地址增量递增操作。 +外设地址增量递增模式使能: +6 PINC RW 0:外设地址保持不变操作; 0 +1:使能外设地址增量递增操作。 +DMA通道循环模式使能: +5 CIRC RW 0 +0:执行单次操作; +V2.4 150 + +# Page 154 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:使能循环操作。 +数据传输方向: +4 DIR RW 0:从外设读; 0 +1:从存储器读。 +传输错误中断使能控制: +3 TEIE RW 0:禁止传输错误中断; 0 +1:使能传输错误中断。 +传输过半中断使能控制: +2 HTIE RW 0:禁止传输过半中断; 0 +1:使能传输过半中断。 +传输完成中断使能控制: +1 TCIE RW 0:禁止传输完成中断; 0 +1:使能传输完成中断。 +通道使能控制: +0:通道关闭; 1:通道开启。 +0 EN RW 0 +发生 DMA 传输错误时,硬件自动将此位清 0,关闭通 +道。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C。 +11.3.8 DMA2 通道 x 传输数据数目寄存器(DMA2_CNTRx)(x=8/9/10/11) +偏移地址:0x494 + (x-8)*16 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +NDT[15:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +数据传输数量,范围0-65535。 +指示剩余的待传输数目(寄存器内容在每次 DMA 传输 +[15:0] NDT[15:0] RW 后递减)。 0 +在通道为循环模式下,寄存器的内容将被自动重新加 +载为之前配置的数值。 +注:表示当前待传输数目。当寄存器内容为0时,无论通道是否开启,都不会发生任何数据传输,适 +用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C。 +11.3.9 DMA2 通道 x 外设地址寄存器(DMA2_PADDRx)(x=8/9/10/11) +偏移地址:0x498 + (x-8)*16 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PA[31:0] +位 名称 访问 描述 复位值 +[31:0] PA[31:0] RW 外设基地址,作为外设数据传输的源或目标地址。 0 +V2.4 151 + +# Page 155 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +当PSIZE[1:0]=‘01’(16位),模块自动忽略bit0, +操作地址自动2字节对齐;当PSIZE[1:0]=‘10’(32 +位),模块自动忽略 bit[1:0],操作地址自动 4字节 +对齐。 +注:此寄存器只能在EN=0时更改,EN=1时不可写,适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +11.3.10 DMA2 通道 x 存储器地址寄存器(DMA2_MADDRx)(x=8/9/10/11) +偏移地址:0x49C + (x-8)*16 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MA[31:0] +位 名称 访问 描述 复位值 +存储器数据地址,作为数据传输的源或目标地址。 +当MSIZE[1:0]=‘01’(16位),模块自动忽略bit0, +[31:0] MA[31:0] RW 操作地址自动2字节对齐;当MSIZE[1:0]=‘10’(32 0 +位),模块自动忽略 bit[1:0],操作地址自动 4字节 +对齐。 +注:此寄存器只能在EN=0时更改,EN=1时不可写,适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +11.3.11 DMA2 扩展中断状态寄存器(DMA2_EXTEM_INTFR) +偏移地址:0x4D0 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TEIF HTIF TCIF GIF TEIF HTIF TCIF GIF TEIF HTIF TCIF GIF TEIF HTIF TCIF GIF +11 11 11 11 10 10 10 10 9 9 9 9 8 8 8 8 +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +通道x的传输错误标志(x=8/9/10/11): +0:在通道x上没有传输错误; +15/11/7/3 TEIFx RO 0 +1:在通道x上发生了传输错误。 +硬件置位,软件写CTEIFx位清除此标志。 +通道x的传输过半标志(x=8/9/10/11): +0:在通道x上没有传输过半; +14/10/6/2 HTIFx RO 0 +1:在通道x上产生了传输过半事件。 +硬件置位,软件写CHTIFx位清除此标志。 +通道x的传输完成标志(x=8/9/10/11): +0:在通道x上没有传输完成事件; +13/9/5/1 TCIFx RO 0 +1:在通道x上产生了传输完成事件。 +硬件置位,软件写CTCIFx位清除此标志。 +12/8/4/0 GIFx RO 通道x的全局中断标志(x=8/9/10/11): 0 +V2.4 152 + +# Page 156 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:在通道x上没有发生TEIFx或HTIFx或TCIFx; +1:在通道x上产生了TEIFx或HTIFx或TCIFx。 +硬件置位,软件写CGIFx位清除此标志。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C。 +11.3.12 DMA2 扩展中断标志清除寄存器(DMA2_EXTEM_INTFCR) +偏移地址:0x4D4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CTEIF CHTIF CTCIF CGIF CTEIF CHTIF CTCIF CGIF CTEIF CHTI CTCIF CGIF CTEIF CHTIF CTCIF CGIF +11 11 11 11 10 10 10 10 9 F9 9 9 8 8 8 8 +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +清除通道x的传输错误标志(x=8/9/10/11): +15/11/7/3 CTEIFx WO 0:无作用; 0 +1:清除DMA_INTFR寄存器中的TEIFx标志。 +清除通道x的传输过半标志(x=8/9/10/11): +14/10/6/2 CHTIFx WO 0:无作用; 0 +1:清除DMA_INTFR寄存器中的HTIFx标志。 +清除通道x的传输完成标志(x=8/9/10/11): +13/9/5/1 CTCIFx WO 0:无作用; 0 +1:清除DMA_INTFR寄存器中的TCIFx标志。 +清除通道x的全局中断标志(x=8/9/10/11): +0:无作用; +12/8/4/0 CGIFx WO 0 +1:清除 DMA_INTFR 寄存器中的 TEIFx/HTIFx/TCIFx/ +GIFx标志。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C。 +V2.4 153 + +# Page 157 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 12 章 模拟/数字转换(ADC) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +ADC模块包含2个12位的逐次逼近型的模拟数字转换器,最高14MHz的输入时钟。支持16个 +外部通道和2个内部信号源采样源。可完成通道的单次转换、连续转换,通道间自动扫描模式、间 +断模式、外部触发模式、双重采样等功能。可以通过模拟看门狗功能监测通道电压是否在阈值范围 +内。 +12.1 主要特性 + 12位分辨率 + 支持16个外部通道和2个内部信号源采样 + 多通道的多种采样转换方式:单次、连续、扫描、触发、间断等 + 数据对齐模式:左对齐、右对齐 + 采样时间可按通道分别编程 + 规则转换和注入转换均支持外部触发 + 模拟看门狗监测通道电压,自校准功能 + 双重模式 + ADC通道输入范围:0≤V ≤V +IN DDA + 输入增益可调,可实现小信号放大采样 +V2.4 154 + +# Page 158 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +12.2 功能描述 +12.2.1 模块结构 +图12-1 ADC模块框图 +Rule channel data Conversion ends +V EOC=1 +DDA register (16 bits) +V +SSA End of Injection +V Injection channel data conversion +REF+ register (4×16 bits) JEOC=1 +VREF- +-ADC_IOFRx[1:1:0] +ADC_IN00 PGA ADCCLK +Analog to +ADC_IN11 GPIO Rule channel Digital AD M C a _ x S = A 1 M 4 P M T H P z x +Port PGA group Converters +Injection +ADC_IN15 DMA +channel group +Request +Temperature sensor +VREFINT +Analog Watchdog +High threshold (10-bit) +Low threshold (10-bit) Compare Results +AWD=1 +EXTSEL[2:0] +TIM11_CC11 +TIM1_CC2 +TIM1_CC3 +TIM2_CC2 +TIM3_TRG0 +TIM4_CC4 +SWSTART +EXTTRIG +EXTI11 +TIM8_TRGO +ADCx_ETRGREG_RM +JEXTSEL[2:0] +TIM1_TRG0 +TIM1_CC4 +TIM2_TRG0 +TIM2_CC1 +TIM3_CC4 +TIM4_TRG0 +JSWSTART +JEXTTRIG +EXTI15 +TIM8_CC4 +ADCx_ETRGINJ_RM +12.2.2 ADC 配置 +1)模块上电 +ADC_CTLR2寄存器的ADON位为1表示ADC模块上电。当ADC模块从断电模式(ADON=0)下进入 +上电状态(ADON=1)后,需要延迟一段时间t 用于模块稳定时间。之后再次写入ADON位为1,用 +STAB +于作为软件启动ADC转换的启动信号。通过清除ADON位为0,可以终止当前转换并将ADC模块置于 +断电模式,这个状态下,ADC几乎不耗电。 +2)采样时钟 +模块的寄存器操作基于PCLK2(PB2总线)时钟,其转换单元的时钟基准ADCCLK与PCLK2同 +步,由RCC_CFGR0寄存器的ADCPRE[1:0]域配置分频,最大不能超过14MHz。 +V2.4 155 + +# Page 159 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3)通道配置 +ADC模块提供了18个通道采样源,包括16个外部通道和2个内部通道。它们可以配置到两种 +转换组中:规则组和注入组。以实现任意多个通道上以任意顺序进行一系列转换构成的组转换。 +转换组: + 规则组:由多达16个转换组成。规则通道和它们的转换顺序在ADC_RSQRx寄存器中设置。 +规则组中转换的总数量应写入ADC_RSQR1寄存器的L[3:0]中。 + 注入组:由多达4个转换组成。注入通道和它们的转换顺序在ADC_ISQR寄存器中设置。注 +入组里的转换总数量应写入ADC_ISQR寄存器的JL[1:0]中。 +注:如果ADC_RSQRx或ADC_ISQR寄存器在转换期间被更改,当前的转换被终止,一个新的启动信号 +将发送到ADC以转换新选择的组。 +2个内部通道: + 温度传感器:连接ADC_IN16通道,用来测量器件周围的温度(TA)。 + V 内部参考电压:连接ADC_IN17通道。 +REFINT +4)校准 +通过写ADC_CTLR2寄存器的RSTCAL位置1初始化校准寄存器,等待RSTCAL硬件清0表示初始 +化完成。置位CAL位,启动校准功能,一旦校准结束,硬件会自动清除CAL位,将校准码存储到 +ADC_RDATAR中。之后可以开始正常的转换功能。建议在ADC模块上电时执行一次ADC校准。 +注:启动校准前,必须保证ADC模块处于上电状态(ADON=1)超过至少两个ADC时钟周期。 +5)可编程采样时间 +ADC使用若干个ADCCLK周期对输入电压采样,通道的采样周期数目可以通过ADC_SAMPTR1和 +ADC_SAMPTR2寄存器中的SMPx[2:0]位更改。每个通道可以分别使用不同的时间采样。 +总转换时间如下计算: +T = 采样时间 + 12.5T +CONV ADCCLK +ADC的规则通道转换支持DMA功能。规则通道转换的值储存在一个仅有的数据寄存器ADC_RDATAR +中,为防止连续转换多个规则通道时,没有及时取走 ADC_RDATAR 寄存器中的数据,可以开启 ADC 的 +DMA功能。硬件会在规则通道的转换结束时(EOC置位)产生DMA请求,并将转换的数据从ADC_RDATAR +寄存器传输到用户指定的目的地址。 +对DMA控制器模块的通道配置完成后,写ADC_CTLR2寄存器的DMA位置1,开启ADC的DMA功能。 +注:注入组转换不支持DMA功能。 +6)数据对齐 +ADC_CTLR2寄存器中的ALIGN位选择ADC转换后的数据存储对齐方式。12位数据支持左对齐和右 +对齐模式。 +规则组通道的数据寄存器ADC_RDATAR保存的是实际转换的12位数字值;而注入组通道的数据寄 +存器ADC_IDATARx是实际转换的数据减去ADC_IOFRx寄存器的定义的偏移量后写入的值,会存在正负 +情况,所以有符号位(SIGNB)。 +图12-2 数据左对齐 +规则组数据寄存器 +D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 +注入组数据寄存器 +SIGNB D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 +V2.4 156 + +# Page 160 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图12-3 数据右对齐 +规则组数据寄存器 +0 0 0 0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 +注入组数据寄存器 +SIGNB SIGNB SIGNB SIGNB D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 +12.2.3 外部触发源 +ADC转换的启动事件可以由外部事件触发。如果设置了ADC_CTLR2寄存器的EXTTRIG或JEXTTRIG +位,则可分别通过外部事件触发规则组或注入组通道的转换。此时,EXTSEL[2:0]和JEXTSEL[2:0]位 +的配置决定规则组和注入组的外部事件源。 +注:当外部触发信号被选为ADC规则或注入转换时,只有它的上升沿可以启动转换。 +表12-1 规则组通道的外部触发源 +EXTSEL[2:0] 触发源 类型 +000 定时器1的CC1事件 +001 定时器1的CC2事件 +010 定时器1的CC3事件 +来自片上定时器的内部信号 +011 定时器2的CC2事件 +100 定时器3的TRGO事件 +101 定时器4的CC4事件 +110 EXTI线11/TIM8_TRGO 来自外部引脚/内部定时器信号 +111 SWSTART位置1软件触发 软件控制位 +表12-2注入组通道的外部触发源 +JEXTSEL[2:0] 触发源 类型 +000 定时器1的TRGO事件 +001 定时器1的CC4事件 +010 定时器2的TRGO事件 +来自片上定时器的内部信号 +011 定时器2的CC1事件 +100 定时器3的CC4事件 +101 定时器4的TRGO事件 +110 EXTI线15/TIM8_CC4 来自外部引脚/内部定时器信号 +111 JSWSTART位置1软件触发 软件控制位 +12.2.4 转换模式 +表12-3 转换模式组合 +ADC_CTLR1和ADC_CTLR2寄存器控制位 +ADC转换模式 +CONT SCAN DISCEN/JDISCEN JAUTO 启动事件 +ADON位置 单次单通道模式:某一规则通道执行单次转 +1 换。 +0 0 0 +外部触发 单次单通道模式:规则通道或注入通道的某 +0 方式 一通道执行单次转换。 +ADON位置 单次扫描模式:按顺序对选中的所有规则组 +1 0 0 1或外部 通道(ADC_RSQRx)或所有注入组通道 +触发方式 (ADC_ISQR)逐个执行单次转换。 +V2.4 157 + +# Page 161 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +触发注入方式:当规则组通道转换过程中可 +以插入注入组通道所有转换,之后再继续规 +则组通道转换;但转换注入组通道时不会插 +入规则组通道转换。 +单次扫描模式:按顺序对选中的所有规则组 +通道(ADC_RSQRx)或所有注入组通道 +ADON位置 (ADC_ISQR)逐个执行单次转换。 +1 1或外部 自动注入方式:在规则组通道转换完之后, +触发方式 注入组通道被自动转换。 +注:转换过程中不允许出现注入通道的外部 +触发信号。 +单次间断模式:每次启动事件,执行一个短 +序列(DISCNUM[2:0]定义数量)的通道数量 +转换,直到所有选中通道转换完成才能重头 +1 +外部触发 开始。 +(DISCEN和 0 +0 方式 注:规则组和注入组选中此模式控制位分别 +JDISCEN不能同 +为DISCEN和JDISCEN,不能同时为规则组和 +时为1) +注入组配置间断模式,间断模式只能用于一 +组转换。 +1 - 禁止此模式。 +1 1 X - 无此模式。 +0 0 0 ADON位置 +连续单通道/扫描模式:每轮结束后重复新 +1 0 1或外部 +1 0 一轮的转换,直到CONT清0才能终止。 +1 触发方式 +注:规则组和注入组的外部触发事件是不一样的,而且‘ACON’位只能启动规则组通道转换,所以规 +则组和注入组通道转换的启动事件独立。 +1)单次单通道转换模式 +此模式下,对当前1个通道只执行一次转换。该模式对规则组或注入组中排序第1的通道执行转 +换,其中通过设置ADC_CTLR2寄存器的ADON位置1(只适用于规则通道)启动也可通过外部触发启动 +(适用于规则通道或注入通道)。一旦选择通道的转换完成将: +如果转换的是规则组通道,则转换数据被储存在 16 位 ADC_RDATAR 寄存器中,EOC 标志被置位, +如果设置了EOCIE位,将触发ADC中断。 +如果转换的是注入组通道,则转换数据被储存在16位ADC_IDATAR1寄存器中,EOC和JEOC标志 +被置位,如果设置了JEOCIE或EOCIE位,将触发ADC中断。 +2)单次扫描模式转换 +通过设置 ADC_CTLR1寄存器的 SCAN位为 1进入 ADC扫描模式。此模式用来扫描一组模拟通道, +对被 ADC_RSQRx 寄存器(对规则通道)或 ADC_ISQR(对注入通道)选中的所有通道逐个执行单次转 +换,当前通道转换结束时,同一组的下一个通道被自动转换。 +在扫描模式里,根据JAUTO位的状态,又分为触发注入方式和自动注入方式。 + 触发注入 +JAUTO 位为 0,当在扫描规则组通道过程中,发生了注入组通道转换的触发事件,当前转换被复 +位,注入通道的序列被以单次扫描方式进行,在所有选中的注入组通道扫描转换结束后,恢复上次被 +中断的规则组通道转换。 +如果当前在扫描注入组通道序列时,发生了规则通道的启动事件,注入组转换不会被中断,而是 +V2.4 158 + +# Page 162 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +在注入序列转换完成后再执行规则序列的转换。 +注:使用触发的注入转换时,必须保证触发事件的间隔长于注入序列。例如,完成注入序列的转换总 +体时间需要28个ADCCLK,那么触发注入通道的事件间隔时间最小值为29个ADCCLK。 + 自动注入 +JAUTO 位为 1,在扫描完规则组选中的所有通道转换后,自动进行注入组选中通道的转换。这种 +方式可以用来转换ADC_RSQRx和ADC_ISQR寄存器中多达20个转换序列。 +此模式里,必须禁止注入通道的外部触发(JEXTTRIG=0)。 +注:对于ADC时钟预分频系数(ADCPRE[1:0])为4至8时,当从规则转换切换到注入序列或从注入 +转换切换到规则序列时,会自动插入1个ADCCLK间隔;当ADC时钟预分频系数为2时,则有2个 +ADCCLK间隔的延迟。 +3)单次间断模式转换 +通过设置 ADC_CTLR1寄存器的 DISCEN或 JDISCEN位为 1进入规则组或注入组的间断模式。此模 +式区别扫描模式中扫描完整的一组通道,而是将一组通道分为多个短序列,每次外部触发事件将执行 +一个短序列的扫描转换。 +短序列的长度n(n<=8)定义在ADC_CTLR1寄存器的DISCNUM[2:0]中,当DISCEN为1,则是规则 +组的间断模式,待转换总长度定义在ADC_RSQR1寄存器的L[3:0]中;当JDISCEN为1,则是注入组的 +间断模式,待转换总长度定义在ADC_ISQR寄存器的JL[1:0]中。不能同时将规则组和注入组设置为间 +断模式。 +规则组间断模式举例: +DISCEN=1,DISCNUM[2:0]=3,L[3:0]=8,待转换通道=1,3,2,5,8,4,10,6 +第1次外部触发:转换序列为:1,3,2 +第2次外部触发:转换序列为:5,8,4 +第3次外部触发:转换序列为:10,6,同时产生EOC事件 +第4次外部触发:转换序列为:1,3,2 +注入组间断模式举例: +JDISCEN=1,JL[1:0]=3,待转换通道=1,3,2 +第1次外部触发:转换序列为:1 +第2次外部触发:转换序列为:3 +第3次外部触发:转换序列为:2,同时产生EOC和JEOC事件 +第4次外部触发:转换序列为:1 +注:1.当以间断模式转换一个规则组或注入组时,转换序列结束后不自动从头开始。当所有子组被转 +换完成,下一次触发事件启动第一个子组的转换。 +2.不能同时使用自动注入(JAUTO=1)和间断模式。 +3.不能同时为规则组和注入组设置间断模式,间断模式只能用于一组转换。 +4.注入组的间断模式下,外部触发后要转换的注入通道数目为1。 +4)连续转换 +在连续转换模式中,当前面ADC转换一结束马上就启动另一次转换,转换不会在选择组的最后一 +个通道上停止,而是再次从选择组的第一个通道继续转换。此模式的启动事件包括外部触发事件和 +ADON位置1,设置启动后,需将CONT位置1。 +如果一个规则通道被转换,转换数据被存储于ADC_RDATAR寄存器中,转换结束标志EOC被置位, +如果设置了EOCIE,则产生中断。 +如果一个注入通道被转换,转换数据被存储于 ADC_IDATARx 寄存器中,注入转换结束标志 JEOC +被置位,如果设置了JEOCIE,则产生中断。 +V2.4 159 + +# Page 163 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +12.2.5 模拟看门狗 +如果被ADC转换的模拟电压低于低阈值或高于高阈值,AWD模拟看门狗状态位被设置。阈值设 +置位于ADC_WDHTR和ADC_WDLTR寄存器的最低12个有效位中。通过设置ADC_CTLR1寄存器的AWDIE +位以允许产生相应中断。 +图12-4 模拟看门狗阈值区 +Analog voltage +conversion values +Alert High +ADC_WDHTR +Threshold +Alert Area +Alert Low +ADC_WDLTR +Threshold +配置ADC_CTLR1寄存器的AWDSGL、AWDEN、JAWDEN及AWDCH[4:0]位选择模拟看门狗警戒的通 +道,具体关系见下表: +表12-4 模拟看门狗通道选择 +ADC_CTLR1寄存器控制位 +模拟看门狗警戒通道 +AWDSGL AWDEN JAWDEN AWDCH[4:0] +不警戒 忽略 0 0 忽略 +所有注入通道 0 0 1 忽略 +所有规则通道 0 1 0 忽略 +所有注入和规则通道 0 1 1 忽略 +单一注入通道 1 0 1 决定通道编号 +单一规则通道 1 1 0 决定通道编号 +单一注入和规则通道 1 1 1 决定通道编号 +12.2.6 温度传感器 +芯片内置温度传感器,连接ADC_INT16通道,通过ADC将传感器输出的电压转换成数字值来反 +馈芯片内部温度,推荐设置采样时间是17.1us。温度传感器输出的电压随温度线性变化,由于制造 +离散性,其线性变化的曲线斜率和偏移有所不同,所以内部温度传感器更适合于检测温度的变化, +而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器。 +通过设置ADC_CTLR2寄存器的TSVREFE位置1,唤醒ADC内部采样通道,软件启动或外部触发 +启动ADC的温度传感器通道转换,读取数据结果(mV)。其中,数字值和温度(℃)换算公式如 +下: +温度(℃) = ((V -V )/Avg_Slope)+25 +SENSE 25 +V25:温度传感器在25℃下的电压值 +Avg_Slope:温度与V 曲线的平均斜率(mV/℃) +SENSE +参考数据手册电气特性章节中V 和Avg_Slope的实际值。 +25 +注:内部温度传感器上电(TSVREFE位从0改为1)需要一个建立时间,而ADC模块上电也需要一个 +建立时间(ADON位从0改为1),所以为了缩短等待时间,可以同时设置ADON和TSVREFE位。 +12.2.7 双 ADC 模式 +在有2个的ADC模块产品中,可以使2个ADC配合使用,实现双ADC模式。在双ADC模式中, +ADC1为主ADC,ADC2为从ADC。通过配置ADC1_CTLR1中DUALMODE[3:0]以选择模式,实现ADC1和 +ADC2交替触发或同步触发转换。 +V2.4 160 + +# Page 164 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:双ADC模式中,选择外部触发事件触发时,用户必须使能主从ADC的外部触发使能且需要将主 +ADC设为相应的触发,从ADC设置为软件触发,防止不必要的触发使从ADC进行转换。 +通过配置可以实现以下几种可能的模式: + 独立模式 + 同步注入模式 + 同步规则模式 + 快速交替模式 + 慢速交替模式 + 交替触发模式 + 同步规则模式+同步注入模式 + 同步规则模式+交替触发模式 + 同步注入模式+快速交替模式 + 同步注入模式+慢速交替模式 +注:1.双ADC模式中,为了主数据寄存器能够读取从ADC的转换数据,需要使能DMA位。 +2.只有ADC1拥有DMA功能。而ADC2转化的数据只可以通过双ADC模式,利用ADC1的DMA功能 +传输。 +V2.4 161 + +# Page 165 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图12-5 双ADC框图 +End of +ADC2 Regular channel data conversion +(slave) registers (16-bit) EOC=1 +End of injection +Injected channel data conversion +JEOC=1 +registers (4×16 bits) +-ADC_IOFRx[11:0] +PGA +ADCCLK +Rule channel Analog-to-digital Max=14MHz +group converter ADC_SAMPTRx +PGA +Injection +channel group DMA request +End of +ADC1 Regular channel data conversion EOC=1 +registers (16-bit) +(master) +Injected channel data End of injection +conversion +registers (4×16 bits) JEOC=1 +-ADC_IOFRx[11:0] +ADC_IN0 PGA +ADCCLK +ADC_IN1 Max=14MHz +GPIO Rule channel Analog-to-digital +port group converter ADC_SAMPTRx +PGA +Injection +ADC_IN15 +channel group DMA request +Temperature Sensor +VREFINT +EXTSEL[2:0] +TIM1_CC1 +TIM1_CC2 +TIM1_CC3 +TIM2_CC2 +TIM3_TRG0 +TIM4_CC4 +SWSTART +EXTTRIG +EXTI11 +TIM8_TRG0 +Dual ADC mode +ADCx_ETRGINJ_RM control +JEXTSEL[2:0] +TIM1_TRG0 +TIM1_CC4 +TIM2_TRG0 +TIM2_CC1 +TIM3_CC4 +TIM4_TRG0 +JSWSTART +JEXTTRIG +EXTI15 +TIM8_CC4 +ADCx_ETRGREG_RM +1)独立模式 +此模式下,双ADC不同步工作,相互之间独立工作。 +2)同步注入模式 +此模式下用于转换一个注入通道组,设置ADC1_CTLR2中JEXTSEL[2:0],以选择触发源,同时 +它也将用于同步触发ADC2。转换完成时,转换后的数据分别存储在ADCx的ADC_IDATARx中,且若 +使能任一ADC中断,转换结束后将产生JEOC中断。 +V2.4 162 + +# Page 166 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图12-6 4通道同步注入转换 +Sample +conversion +ADC2 CH0 CH1 CH2 CH3 +ADC1 CH3 CH2 CH1 CH0 +Trigger ADC1 and ADC2 injection conversion ends +注:1.同一时刻ADC1和ADC2的转换通道不应重合。 +2.同步模式下,ADC1和ADC2应有相同时间长度的转换序列或两者之中较长的转换序列的时长 +小于触发时间间隔,以保证每次触发两个序列均能转换完成。 +3)同步规则模式 +此模式下用于转换规则通道序列,设置ADC1_CTLR2中EXTSEL[2:0],以选择触发源,同时它也 +将用于同步触发ADC2。转换完成时,将产生一个32位DMA传输请求,将数据寄存器ADC1_RDATAR +的内容传输到SRAM中,高16位包含ADC2转换数据,低16位包含ADC1转换数据。若使能任一ADC +中断,将产生EOC中断。 +图12-7 16通道同步规则转换 +Sample +conversion +ADC1 CH0 CH1 CH2 CH3 ... CH15 +ADC2 CH15 CH14 CH13 CH12 ... CH0 +Trigger ADC1 and ADC2 injection conversion ends +注:1.同一时刻ADC1和ADC2的转换通道不应重合; +2.同步模式下,ADC1和ADC2应有相同时间长度的转换序列或两者之中较长的转换序列的时长 +小于触发时间间隔,以保证每次触发两个序列均能转换完成。 +4)快速交替模式 +此模式仅适用于规则通道(往往只有一个通道),设置ADC1_CTLR2中EXTSEL[2:0],以选择触 +发源,当触发产生后ADC2将立即启动转换,ADC1在延迟7个ADC时钟周期后启动转换。如果均开 +启连续模式(CONT被置位),两个ADC将对规则通道连续交替转换。如果使能中断,ADC1将产生 +EOC中断,若同时使能DMA,则将产生一个32位的DMA传输请求,将数据寄存器ADC1_RDATAR的内 +容传输到SRAM中,高16位包含ADC2转换数据,低16位包含ADC1转换数据。 +图12-8 单通道快速交替连续转换 +Sample +ADC2 conversion ends +conversion +ADC2 CH0 ... CH0 +ADC1 CH0 ... CH0 +Trigger ADC1 conversion ends +7 ADCCLK cycles +V2.4 163 + +# Page 167 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:采样时间应小于7个ADC时钟周期,以避免ADC1和ADC2在采样同一个通道时,出现采样周期重 +合的问题。 +5)慢速交替模式 +此模式仅适用于规则通道且只能一个通道。设置ADC1_CTLR2中EXTSEL[2:0],以选择触发源, +当触发产生后ADC2将立即启动转换,ADC1在延迟14个ADC时钟周期后启动转换,再次延时14个 +ADC时钟周期后ADC2再次启动,如此往复循环。若使能中断,ADC1将产生EOC中断,若同时使能 +DMA,则将产生一个32位的DMA传输请求,将数据寄存器ADC1_RDATAR的内容传输到SRAM中,高 +16位包含ADC2转换数据,低16位包含ADC1转换数据。 +图12-9 单通道慢速交替转换 +Sample +ADC2 conversion ends +conversion +ADC2 CH0 CH0 +ADC1 CH0 CH0 +Trigger +ADC1 conversion ends +14 ADCCLK cycles +28 ADCCLK cycles +注:1.采样时间应小于14个ADC时钟周期,以避免和下一次采样周期重合; +2.28个ADC时钟周期后自动启动新的ADC2转换; +3.不需要设置CONT位。 +6)交替触发模式 +此模式仅适用于注入通道组,设置ADC1_CTLR2中JEXTSEL[2:0],以选择触发源。当第一次触 +发事件发生时,ADC1上所有的注入通道被转换,当第二次触发事件发生时,ADC2上所有的注入通道 +被转换。依次循环往复,若使能中断,则当ADC1所有注入通道转换完成后产生JEOC中断,ADC2所 +有注入通道转换完成后产生JEOC中断。 +图12-10 每个ADC注入通道组交替触发转换 +1st 3rd Nth +trigger EOC, trigger EOC, trigger Sample +IEOC(ADC1) IEOC(ADC1) conversion +ADC1 +... +ADC2 +EOC, EOC, +2nd IEOC(ADC2) 4th IEOC(ADC2) N+1th +trigger trigger trigger +若同时使用注入间断模式,则当第一次触发事件发生时,ADC1上的第一个注入通道被转换,当 +第二次触发事件发生时,ADC2上第一个注入通道被转换。以此类推,往复循环。同时若使能中断, +则当ADC1所有注入通道转换完成后,产生JEOC中断,当ADC2所有注入通道转换完成后产生JEOC +中断。 +V2.4 164 + +# Page 168 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图12-11 间断模式下每个ADC注入通道交替触发转换 +1st 3rd 5th 7th +Sample +trigger trigger trigger trigger +IEOC(ADC1) conversion +ADC1 +ADC2 +IEOC(ADC2) +2nd 4th 6th 8th +trigger trigger trigger trigger +7)同步规则模式+同步注入模式 +此模式下规则组的同步转换可以打断,以启动注入组的同步转换。同时此模式下需要保准转换 +具有相同时间长度的序列,或保证触发时间间隔比两个序列中较长序列的时间长。 +8)同步规则模式+交替触发模式 +此模式下规则组的同步转换可以被打断,以启动注入组的交替触发转换。当发生注入事件时,交 +替触发转换立即启动。如果同步规则正在转换,则所有ADC的规则转换被停止,在注入转换结束后同 +步恢复。 +图12-12同步规则模式下交替触发注入通道转换 +1st trigger +ADC1 +rule +conversion +CH0 CH1 CH2 CH2 CH3 CH3 CH4 +ADC1 +injection CH0 +conversion +ADC2 +rule +conversion CH3 CH5 CH6 CH6 CH7 CH7 CH8 +ADC2 +injection CH0 +conversion +Sync but not lose +2nd trigger +注:此模式下需要保准转换具有相同时间长度的序列,或者保证触发时间间隔比两个序列中较长序列 +的时间长。 +如果注入触发事件发生在中断了规则转换的注入转换期间,则这个触发事件将会被忽略,例如下 +图描述的第2次触发的情况。 +图12-13 触发事件发生在注入转换期间 +1st trigger 3rd trigger +ADC1 +rule +conversion CH0 CH1 CH2 CH2 CH3 CH3 CH4 +ADC1 +injection +conversion CH0 CH0 +ADC2 +rule +conversion CH3 CH5 CH6 CH6 CH7 CH7 CH8 +ADC2 +injection CH0 +conversion +2nd trigger 4th trigger +9)同步注入模式+交替模式 +此模式下,注入转换可以打断交替转换。发生注入事件时,交替转换被打断,注入转换启动,在 +V2.4 165 + +# Page 169 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注入转换结束后,交替转换被恢复。 +图12-14 交替转换下触发注入组转换 +ADC1 CH0 CH0 CH0 Sample +conversion +ADC2 CH0 CH0 CH0 +CH11 CH12 +Trigger +CH12 CH11 +CH0 CH0 +CH0 CH0 +注:当ADC的预分频系数为4时,交替转换恢复后采样间隔不再是均匀的7个ADC时钟,改为8个和 +6个时钟周期交替。 +12.3 寄存器描述 +表12-5 ADC1相关寄存器列表 +名称 访问地址 描述 复位值 +R32_ADC1_STATR 0x40012400 ADC1状态寄存器 0x00000000 +R32_ADC1_CTLR1 0x40012404 ADC1控制寄存器1 0x00000000 +R32_ADC1_CTLR2 0x40012408 ADC1控制寄存器2 0x00000000 +R32_ADC1_SAMPTR1 0x4001240C ADC1采样时间配置寄存器1 0x00000000 +R32_ADC1_SAMPTR2 0x40012410 ADC1采样时间配置寄存器2 0x00000000 +R32_ADC1_IOFR1 0x40012414 ADC1注入通道数据偏移寄存器1 0x00000000 +R32_ADC1_IOFR2 0x40012418 ADC1注入通道数据偏移寄存器2 0x00000000 +R32_ADC1_IOFR3 0x4001241C ADC1注入通道数据偏移寄存器3 0x00000000 +R32_ADC1_IOFR4 0x40012420 ADC1注入通道数据偏移寄存器4 0x00000000 +R32_ADC1_WDHTR 0x40012424 ADC1看门狗高阈值寄存器 0x00000FFF +R32_ADC1_WDLTR 0x40012428 ADC1看门狗低阈值寄存器 0x00000000 +R32_ADC1_RSQR1 0x4001242C ADC1规则通道序列寄存器1 0x00000000 +R32_ADC1_RSQR2 0x40012430 ADC1规则通道序列寄存器2 0x00000000 +R32_ADC1_RSQR3 0x40012434 ADC1规则通道序列寄存器3 0x00000000 +R32_ADC1_ISQR 0x40012438 ADC1注入通道序列寄存器 0x00000000 +R32_ADC1_IDATAR1 0x4001243C ADC1注入数据寄存器1 0x00000000 +R32_ADC1_IDATAR2 0x40012440 ADC1注入数据寄存器2 0x00000000 +R32_ADC1_IDATAR3 0x40012444 ADC1注入数据寄存器3 0x00000000 +R32_ADC1_IDATAR4 0x40012448 ADC1注入数据寄存器4 0x00000000 +R32_ADC1_RDATAR 0x4001244C ADC1规则数据寄存器 0x00000000 +R32_ADC1_AUX 0x40012454 ADC1采样时间寄存器 0x00000000 +表12-6 ADC2相关寄存器列表 +名称 访问地址 描述 复位值 +R32_ADC2_STATR 0x40012800 ADC2状态寄存器 0x00000000 +R32_ADC2_CTLR1 0x40012804 ADC2控制寄存器1 0x00000000 +R32_ADC2_CTLR2 0x40012808 ADC2控制寄存器2 0x00000000 +R32_ADC2_SAMPTR1 0x4001280C ADC2采样时间配置寄存器1 0x00000000 +V2.4 166 + +# Page 170 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_ADC2_SAMPTR2 0x40012810 ADC2采样时间配置寄存器2 0x00000000 +R32_ADC2_IOFR1 0x40012814 ADC2注入通道数据偏移寄存器1 0x00000000 +R32_ADC2_IOFR2 0x40012818 ADC2注入通道数据偏移寄存器2 0x00000000 +R32_ADC2_IOFR3 0x4001281C ADC2注入通道数据偏移寄存器3 0x00000000 +R32_ADC2_IOFR4 0x40012820 ADC2注入通道数据偏移寄存器4 0x00000000 +R32_ADC2_WDHTR 0x40012824 ADC2看门狗高阈值寄存器 0x00000FFF +R32_ADC2_WDLTR 0x40012828 ADC2看门狗低阈值寄存器 0x00000000 +R32_ADC2_RSQR1 0x4001282C ADC2规则通道序列寄存器1 0x00000000 +R32_ADC2_RSQR2 0x40012830 ADC2规则通道序列寄存器2 0x00000000 +R32_ADC2_RSQR3 0x40012834 ADC2规则通道序列寄存器3 0x00000000 +R32_ADC2_ISQR 0x40012838 ADC2注入通道序列寄存器 0x00000000 +R32_ADC2_IDATAR1 0x4001283C ADC2注入数据寄存器1 0x00000000 +R32_ADC2_IDATAR2 0x40012840 ADC2注入数据寄存器2 0x00000000 +R32_ADC2_IDATAR3 0x40012844 ADC2注入数据寄存器3 0x00000000 +R32_ADC2_IDATAR4 0x40012848 ADC2注入数据寄存器4 0x00000000 +R32_ADC2_RDATAR 0x4001284C ADC2规则数据寄存器 0x00000000 +R32_ADC2_AUX 0x40012854 ADC2采样时间寄存器 0x00000000 +12.3.1 ADCx 状态寄存器(ADCx_STATR)(x=1/2) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved STRT JSTRT JEOC EOC AWD +位 名称 访问 描述 复位值 +[31:5] Reserved RO 保留。 0 +规则通道转换开始状态: +0:规则通道转换未开始; +4 STRT RW0 0 +1:规则通道转换已开始。 +该位由硬件置1,由软件清0(写1无效)。 +注入通道转换开始状态: +0:注入通道转换未开始; +3 JSTRT RW0 0 +1:注入通道转换已开始。 +该位由硬件置1,由软件清0(写1无效)。 +注入通道组转换结束状态: +0:转换未完成; +2 JEOC RW0 1:转换完成。 0 +该位由硬件置1(所有注入通道转换完),由软件清0 +(写1无效)。 +转换结束状态: +0:转换未完成; +1 EOC RW0 0 +1:转换完成。 +该位由硬件置1(规则或注入通道组转换结束),由软 +V2.4 167 + +# Page 171 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +件清0(写1无效)或读ADC_RDATAR时清除。 +模拟看门狗标志位: +0:没有发生模拟看门狗事件; +0 AWD RW0 1:发生模拟看门狗事件。 0 +该位由硬件置1(转换值超出ADC_WDHTR和ADC_WDLTR +寄存器范围),由软件清0(写1无效)。 +12.3.2 ADCx 控制寄存器 1(ADCx_CTLR1)(x=1/2) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +BUF TKI +Reserved PGA[1:0] TKENABLE AWDEN JAWDEN Reserved DUALMOD[3:0] +EN TUNE +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +JDISC DISC AWD JEOC EOC +DISCNUM[2:0] JAUTO SCAN AWDIE AWDCH[4:0] +EN EN SGL IE IE +位 名称 访问 描述 复位值 +[31:29] Reserved RO 保留。 0 +ADC通道增益配置: +00:x1; +01:x4; +[28:27] PGA[1:0] RW 10:x16; 00b +11:x64。 +注:输入增益可调,可实现小信号放大采样。使用此功 +能需开启ADC_Buffer。 +ADC BUFFER使能: +0:关闭输入Buffer; +1:使能输入Buffer。 +注:需要开启buffer的情况: +1.当TKENABLE位或TSVREFE位置1,buffer默认开启不 +可关闭(故在这两种情况下,ADC校准需在TKENABLE +26 BUFEN RW 位或TSVREFE位置1之前,且buffer需要关闭)。 0 +2.当外部输入阻抗大于最大输入阻抗要求,可开启 +buffer以改善ADC采集数据(此时ADC的采样时间不建 +议小于7.5T),外部输入阻抗详见 +CH32F203DS0/CH32F208DS0/CH32V203DS0/CH32V208DS +0数据手册表4-28 CH32V307DS0/CH32F207DS0数据手 +册表4-41。具体操作可参考EVT相关例程。 +TKEY模块充电电流配置: +25 TKITUNE RW 0:充电电流为35uA; 0 +1:充电电流减半。 +TKEY模块使能控制,包括TKEY_F和TKEY_V单元: +24 TKENABLE RW 0:关闭TKEY模块; 0 +1:开启TKEY模块。 +V2.4 168 + +# Page 172 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +在规则通道上模拟看门狗功能使能位: +23 AWDEN RW 0:规则通道上关闭模拟看门狗; 0 +1:规则通道上使能模拟看门狗。 +在注入通道上模拟看门狗功能使能位: +22 JAWDEN RW 0:注入通道上关闭模拟看门狗; 0 +1:注入通道上使能模拟看门狗。 +[21:20] Reserved RO 保留。 0 +双重模式选择。 +0000:独立模式 +0001:同步规则+同步注入模式 +0010:同步规则+交替触发模式 +0011:同步注入+快速交替模式 +0100:同步注入+慢速交替模式 +[19:16] DUALMOD[3:0] RW 0101:同步注入模式 0000b +0110:同步规则模式 +0111:快速交替模式 +1000:慢速交替模式 +1001:交替触发模式 +注:ADC2中这些位为保留位,任何配置位的修改应在 +双重模式关闭的情况下进行。 +间断模式下,外部触发后要转换的规则通道数目: +000:1个通道; +[15:13] DISCNUM[2:0] RW 000b +… +111:8个通道。 +注入通道上的间断模式使能位: +12 JDISCEN RW 0:关闭注入通道上的间断模式; 0 +1:使能注入通道上的间断模式。 +规则通道上的间断模式使能位: +11 DISCEN RW 0:关闭规则通道上的间断模式; 0 +1:使能规则通道上的间断模式。 +开启规则通道完成后,自动转换注入通道组使能位: +0:关闭自动的注入通道组转换; +10 JAUTO RW 0 +1:使能自动的注入通道组转换。 +注:此模式需要禁止注入通道的外部触发功能。 +扫描模式下,在单一通道上使用模拟看门狗使能位: +9 AWDSGL RW 0:在所有通道上使用模拟看门狗; 0 +1:在单一通道上使用模拟看门狗(AWDCH[4:0]选择)。 +扫描模式使能位: +0:关闭扫描模式; +8 SCAN RW 0 +1:使能扫描模式(连续转换 ADC_IOFRx和 ADC_RSQRx +选择的所有通道)。 +注入通道组转换结束中断使能位: +7 JEOCIE RW 0:关闭注入通道组转换完成中断; 0 +1:使能注入通道组转换完成中断(JEOC标志)。 +模拟看门狗中断使能位: +6 AWDIE RW 0 +0:关闭模拟看门狗中断; +V2.4 169 + +# Page 173 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:使能模拟看门狗中断。 +注:在扫描模式下,如果发生此中断将中止扫描。 +转换结束(规则或注入通道组)中断使能位: +5 EOCIE RW 0:关闭转换结束中断; 0 +1:使能转换结束中断(EOC标志)。 +模拟看门狗通道选择位: +00000:模拟输入通道0; +[4:0] AWDCH[4:0] RW 00001:模拟输入通道1; 00000b +… +10001:模拟输入通道17。 +12.3.3 ADCx 控制寄存器 2(ADCx_CTLR2)(x=1/2) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TS SW JSW EXT Reser +Reserved EXTSEL[2:0] +VREFE START START TRIG ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +JEXT RST +JEXTSEL[2:0] ALIGN Reserved DMA Reserved CAL CONT ADON +TRIG CAL +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +温度传感器和内部电压(V )通道使能位: +REFINT +0:禁止温度传感器和V 通道; +23 TSVREFE RW REFINT 0 +1:使能温度传感器和V 通道。 +REFINT +注:该位仅适用于ADC1。 +启动一个规则通道转换,需要设置软件触发: +0:复位状态; +22 SWSTART RW 0 +1:启动规则通道转换。 +此位由软件置位,转换开始后硬件清0。 +启动一个注入通道转换,需要设置软件触发: +0:复位状态; +21 JSWSTART RW 0 +1:启动注入通道转换。 +此位由软件置位,转换开始后硬件清0或者软件清0。 +规则通道的外部触发转换模式使能: +20 EXTTRIG RW 0:关闭外部事件启动功能; 0 +1:使用外部事件启动转换。 +启动规则通道转换的外部触发事件选择: +000:定时器1的CC1事件; +001:定时器1的CC2事件; +010:定时器1的CC3事件; +[19:17] EXTSEL[2:0] RW 000b +011:定时器2的CC2事件; +100:定时器3的TRGO事件; +101:定时器4的CC4事件; +110:EXTI线11/定时器8的TRGO事件; +V2.4 170 + +# Page 174 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +111:SWSTART软件触发。 +注:仅大容量产品中具有定时器8的TRGO事件 +16 Reserved RO 保留。 0 +注入通道的外部触发转换模式使能: +15 JEXTTRIG RW 0:关闭外部事件启动功能; 0 +1:使用外部事件启动转换。 +启动注入通道转换的外部触发事件选择: +000:定时器1的TRGO事件; +001:定时器1的CC4事件; +010:定时器2的TRGO事件; +011:定时器2的CC1事件; +[14:12] JEXTSEL[2:0] RW 000b +100:定时器3的CC4事件; +101:定时器4的TRGO事件; +110:EXTI线15/定时器8的CC4事件; +111:JSWSTART软件触发。 +注:仅大容量产品中具有定时器8的CC4事件 +数据对齐方式: +11 ALIGN RW 0 +0:右对齐; 1:左对齐。 +[10:9] Reserved RO 保留。 0 +直接存储访问(DMA)模式使能: +8 DMA RW 0:关闭DMA模式; 0 +1:使能DMA模式。 +[7:4] Reserved RO 保留。 0 +复位校准,此位由软件置位,复位完成后由硬件清0: +0:校准寄存器已初始化; +3 RSTCAL RW 1:初始化校准寄存器。 0 +注:如果正在进行转换时设置RSTCAL,清除校准寄存 +器需要额外的周期。 +A/D校准,该位由软件置位,校准结束时由硬件清0。 +2 CAL RW 0:校准完成; 0 +1:开始校准。 +连续转换使能: +0:单次转换模式; +1 CONT RW 0 +1:连续转换模式。 +如果设置了此位,则转换将连续进行直到该位被清除。 +开/关A/D转换器 +当该位为 0 时,写入 1 将把 ADC 从断电模式下唤醒; +当该位为1时,写入1将启动转换。 +0 ADON RW 0:关闭ADC转换/校准,并进入断电模式; 0 +1:开启ADC并启动转换。 +注:当寄存器只有ADON改变时,才会启动一次转换, +如果还有其他任意位发送变化,则不会启动新的转换。 +12.3.4 ADCx 采样时间配置寄存器 1(ADCx_SAMPTR1)(x=1/2) +偏移地址:0x0C +V2.4 171 + +# Page 175 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved SMP17[2:0] SMP16[2:0] SMP15[2:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SMP15[0] SMP14[2:0] SMP13[2:0] SMP12[2:0] SMP11[2:0] SMP10[2:0] +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +SMPx[2:0]:通道x的采样时间配置: +000:1.5周期; 001:7.5周期; +010:13.5周期; 011:28.5周期; +100:41.5周期; 101:55.5周期; +110:71.5周期; 111:239.5周期; +SMPx[2:0]:置 ADC_SMP_SELx 位时,通道 x 的采样时 +间配置(仅适用于 CH32F20x_D8、CH32F20x_D8C、 +[23:0] SMPx[2:0] RW CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数 000b +第六位不为0的产品): +000:1.5周期; 001:7.5周期; +010:13.5周期; 011:28.5周期; +100:2.5周期; 101:3.5周期; +110:4.5周期; 111:5.5周期; +这些位用于独立地选择每个通道的采样时间,在采样 +周期中通道配置值必须保持不变。 +12.3.5 ADCx 采样时间配置寄存器 2(ADCx_SAMPTR2)(x=1/2) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved SMP9[2:0] SMP8[2:0] SMP7[2:0] SMP6[2:0] SMP5[2:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SMP5[0] SMP4[2:0] SMP3[2:0] SMP2[2:0] SMP1[2:0] SMP0[2:0] +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +SMPx[2:0]:通道x的采样时间配置: +000:1.5周期; 001:7.5周期; +010:13.5周期; 011:28.5周期; +100:41.5周期; 101:55.5周期; +110:71.5周期; 111:239.5周期; +[29:0] SMPx[2:0] RW SMPx[2:0]:置 ADC_SMP_SELx 位时,通道 x 的采样时 000b +间配置(仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数 +第六位不为0的产品): +000:1.5周期; 001:7.5周期; +010:13.5周期; 011:28.5周期; +V2.4 172 + +# Page 176 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +100:2.5周期; 101:3.5周期; +110:4.5周期; 111:5.5周期; +这些位用于独立地选择每个通道的采样时间,在采样 +周期中通道配置值必须保持不变。 +12.3.6 ADCy 注入通道数据偏移寄存器 x(ADCy_IOFRx)(y=1/2;x=1/2/3/4) +偏移地址:0x14 + (x-1)*4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved JOFFSETx[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +注入通道x的数据偏移值。 +转换注入通道时,这个值定义了用于从原始转换数据 +[11:0] JOFFSETx[11:0] RW 0 +中减去的数值。转换的结果可以在 ADC_IDATARx 寄存 +器中读出。 +12.3.7 ADCx 看门狗高阈值寄存器(ADCx_WDHTR)(x=1/2) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved HT[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +[11:0] HT[11:0] RW 模拟看门狗高阈值设置值。 FFFh +注:可以在转换过程中更改WDHTR和WDLTR的值,但它们将在下次转换时生效。 +12.3.8 ADCx 看门狗低阈值寄存器(ADCx_WDLTR)(x=1/2) +偏移地址:0x28 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved LT[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +[11:0] LT[11:0] RW 模拟看门狗低阈值设置值。 0 +V2.4 173 + +# Page 177 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:可以在转换过程中更改WDHTR和WDLTR的值,但它们将在下次转换时生效。 +12.3.9 ADCx 规则通道序列寄存器 1(ADCx_RSQR1)(x=1/2) +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved L[3:0] RSQ16[4:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SQ16[0] SQ15[4:0] SQ14[4:0] SQ13[4:0] +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +规则通道转换序列中需要转换的通道数目: +[23:20] L[3:0] RW 0 +0000-1111:1-16个转换。 +[19:15] SQ16[4:0] RW 规则序列中的第16个转换通道的编号(0-17)。 0 +[14:10] SQ15[4:0] RW 规则序列中的第15个转换通道的编号(0-17)。 0 +[9:5] SQ14[4:0] RW 规则序列中的第14个转换通道的编号(0-17)。 0 +[4:0] SQ13[4:0] RW 规则序列中的第13个转换通道的编号(0-17)。 0 +12.3.10 ADCx 规则通道序列寄存器 2(ADCx_RSQR2)(x=1/2) +偏移地址:0x30 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved SQ12[4:0] SQ11[4:0] SQ10[4:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SQ10[0] SQ9[4:0] SQ8[4:0] SQ7[4:0] +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +[29:25] SQ12[4:0] RW 规则序列中的第12个转换通道的编号(0-17)。 0 +[24:20] SQ11[4:0] RW 规则序列中的第11个转换通道的编号(0-17)。 0 +[19:15] SQ10[4:0] RW 规则序列中的第10个转换通道的编号(0-17)。 0 +[14:10] SQ9[4:0] RW 规则序列中的第9个转换通道的编号(0-17)。 0 +[9:5] SQ8[4:0] RW 规则序列中的第8个转换通道的编号(0-17)。 0 +[4:0] SQ7[4:0] RW 规则序列中的第7个转换通道的编号(0-17)。 0 +12.3.11 ADCx 规则通道序列寄存器 3(ADCx_RSQR3)(x=1/2) +偏移地址:0x34 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved SQ6[4:0] SQ5[4:0] SQ4[4:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SQ4[0] SQ3[4:0] SQ2[4:0] SQ1[4:0] +V2.4 174 + +# Page 178 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +[29:25] SQ6[4:0] RW 规则序列中的第6个转换通道的编号(0-17)。 0 +[24:20] SQ5[4:0] RW 规则序列中的第5个转换通道的编号(0-17)。 0 +[19:15] SQ4[4:0] RW 规则序列中的第4个转换通道的编号(0-17)。 0 +[14:10] SQ3[4:0] RW 规则序列中的第3个转换通道的编号(0-17)。 0 +[9:5] SQ2[4:0] RW 规则序列中的第2个转换通道的编号(0-17)。 0 +[4:0] SQ1[4:0] RW 规则序列中的第1个转换通道的编号(0-17)。 0 +12.3.12 ADCx 注入通道序列寄存器(ADCx_ISQR)(x=1/2) +偏移地址:0x38 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved JL[1:0] JSQ4[4:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +JSQ4[0] JSQ3[4:0] JSQ2[4:0] JSQ1[4:0] +位 名称 访问 描述 复位值 +[31:22] Reserved RO 保留。 0 +注入通道转换序列中需要转换的通道数目: +[21:20] JL[1:0] RW 0 +00-11:1-4个转换。 +注入序列中的第4个转换通道的编号(0-17)。 +[19:15] JSQ4[4:0] RW 注:软件写入,并将通道编号(0-17)分配为要转换的 0 +序列中的第4个。 +[14:10] JSQ3[4:0] RW 注入序列中的第3个转换通道的编号(0-17)。 0 +[9:5] JSQ2[4:0] RW 注入序列中的第2个转换通道的编号(0-17)。 0 +[4:0] JSQ1[4:0] RW 注入序列中的第1个转换通道的编号(0-17)。 0 +注:不同于规则转换序列,如果JL[1:0]的长度小于4,则转换的序列顺序是从(4-JL)开始。 +例如,当JL[1:0]=3(定序器中有4次注入转换)时,ADC将按以下顺序转换通道:JSQ1[4:0]、JSQ2[4:0]、 +JSQ3[4:0]和JSQ4[4:0]; +当JL[1:0]=2(定序器中有3次注入转换)时,ADC将按以下顺序转换通道:JSQ2[4:0]、JSQ3[4:0] +和JSQ4[4:0]; +当JL[1:0]=1(定序器中有2次注入转换)时,ADC转换通道的顺序为:先是JSQ3[4:0],后是JSQ4[4:0]; +当JL[1:0]=0(定序器中有1次注入转换)时,ADC将仅转换JSQ4[4:0]通道。 +如果ADCx_ISQR[21:0]=10 00111 00011 00111 00010,ADC将按以下顺序转换通道:JSQ2[4:0]、 +JSQ3[4:0]和JSQ4[4:0],表示扫描转换按以下通道顺序进行:7、3、7。 +12.3.13 ADCy 注入数据寄存器 x(ADCy_IDATARx)(y=1/2;x=1/2/3/4) +偏移地址:0x3C + (x-1)*4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +JDATA[15:0] +位 名称 访问 描述 复位值 +V2.4 175 + +# Page 179 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[31:16] Reserved RO 保留。 0 +[15:0] JDATA[15:0] RO 注入通道转换数据(数据左对齐或右对齐)。 0 +12.3.14 ADCx 规则数据寄存器(ADCx_RDATAR)(x=1/2) +偏移地址:0x4C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADC2DATA[15:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA[15:0] +位 名称 访问 描述 复位值 +ADC2转换的数据: +在 ADC1 中:双模式下,这些位包含了 ADC2 转换的规 +[31:16] ADC2DATA[15:0] RO 0 +则通道数据。 +在ADC2中:不使用这些位。 +[15:0] DATA[15:0] RO 规则通道转换数据(数据左对齐或右对齐)。 0 +12.3.15 ADCx 采样时间寄存器(ADCx_AUX)(x=1/2) +偏移地址:0x54 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ADC_S ADC_S +Reserved MP_SE MP_SE +L17 L16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADC_SADC_SADC_SADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S ADC_S +MP_SEMP_SEMP_SEMP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE MP_SE +L15 L14 L13 L12 L11 L10 L9 L8 L7 L6 L5 L4 L3 L2 L1 L0 +位 名称 访问 描述 复位值 +[31:18] Reserved R0 保留。 0 +x=0-17,通道x的采样时间可选使能位(仅在SMPx为 +100-111): +0:采样时间为对应SMPx配置周期; +[17:0] ADC_SMP_SELx RW 1:SMPx=100:采样时间2.5个周期; 0 +SMPx=101:采样时间3.5个周期; +SMPx=110:采样时间4.5个周期; +SMPx=111:采样时间5.5个周期。 +注:ADCx_AUX寄存器仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C批号倒数第六位不为0的产品。 +V2.4 176 + +# Page 180 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 13 章 触摸按键检测(TKEY) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +触摸检测控制(TKEY)单元,借助ADC模块的电压转换功能,通过将电容量转换为电压量进行采 +样,实现触摸按键检测功能。检测通道复用 ADC 的 16 个外部通道,通过 ADC模块的单次转换模式实 +现触摸按键检测。 +13.1 TKEY 功能描述 + TKEY开启 +TKEY检测过程需要ADC模块配合进行,所以使用TKEY功能时,需要保证ADC模块处于上电状 +态(ADON=1),然后将ADC_CTLR1寄存器的TKENABLE位置1,打开TKEY单元功能,且可以通过 +TKITUNE位调整TKEY模块的充电电流。 +TKEY只支持单次单通道转换模式,将待转换的通道配置到ADC模块的规则组序列第一个,软件 +启动转换(写TKEY_ACT_DCG寄存器)。 +注:不进行TKEY转换时,仍然可以保留ADC通道配置转换功能。 +图13-1 TKEY工作时序图 +TKENABLE +TKCLK +Entire sampling period +TKACT +First conversion Next conversion +t +TKDISCHG DISCHG +t +TKCHG CHG +t +STAB +ADCACT +ADC conversion period +EOC ADC power up +Software clear interrupt bit + 可编程采样时间 +TKEY 单元转换需要先使用若干个 ADCCLK 时钟周期(t )进行放电,然后再通过若干个 +DISCHG +ADCCLK 周期(t )对通道进行充电进行电压采样,充电周期数为 TKEY_CHARGE1 和 TKEY_CHARGE2 +CHG +寄存器中的TKCGx[2:0]配置值加上TKEY_CHGOFFSET偏移量之和,每个通道可以分别用不同的充电周 +期来调整采样电压。 +13.2 TKEY 操作步骤 +TKEY检测属于ADC模块下的扩展功能,其工作原理是通过“触摸”和“非触摸”方式让硬件通道 +感知的电容量发生变化,进而通过可设置的充放电周期数将电容量的变化转换为电压的变化,最后通 +过ADC模块转换为数字值。 +采样时,需要将 ADC 配置为单次单通道工作模式,由 TKEY_ACT 寄存器的“写操作”启动一次转 +换,具体流程如下: +1) 初始化ADC功能,配置ADC模块为单次转换模块,置ACON位为1,唤醒ADC模块。将ADC_CTLR1 +寄存器的TKENABLE位置1,打开TKEY单元。 +V2.4 177 + +# Page 181 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2) 设置要转换的通道,将通道号写入ADC规则组序列中第一个转换位置(ADC_RSQR3[4:0]),设置 +L[3:0]为1。 +3) 设置通道的充电采样时间,写TKEY_CHARGEx寄存器,可为每个通道配置不同的充电时间。 +4) 写TKEY_CHGOFFSET寄存器,设置通道的充电时间偏移量(低八位有效),以调整充电时间。 +5) 写TKEY_ACT_DCG寄存器,设置放电时间(低八位有效),并启动一次TKEY的采样和转换。 +6) 等待ADC状态寄存器的EOC转换结束标志位置1,读取ADC_DR寄存器得到此次转换值。 +7) 如果需要进行下次转换,重复 2-6 步骤。如果不需修改通道充电采样时间,可省略步骤 3 或 4。 +13.3 TKEY 寄存器描述 +表13-1 TKEY1相关寄存器列表 +名称 访问地址 描述 复位值 +R32_TKEY1_CHARGE1 0x4001240C TKEY充电采样时间寄存器1 0x00000000 +R32_TKEY1_CHARGE2 0x40012410 TKEY充电采样时间寄存器2 0x00000000 +R32_TKEY1_CHGOFFSET 0x4001243C TKEY充电时间偏移量寄存器 0x00000000 +R32_TKEY1_ACT_DCG 0x4001244C TKEY启动和放电时间寄存器 0x00000000 +R32_TKEY1_DR 0x4001244C TKEY数据寄存器 0x00000000 +表13-2 TKEY2相关寄存器列表 +名称 访问地址 描述 复位值 +R32_TKEY2_CHARGE1 0x4001280C TKEY充电采样时间寄存器1 0x00000000 +R32_TKEY2_CHARGE2 0x40012810 TKEY充电采样时间寄存器2 0x00000000 +R32_TKEY2_CHGOFFSET 0x4001283C TKEY充电时间偏移量寄存器 0x00000000 +R32_TKEY2_ACT_DCG 0x4001284C TKEY启动和放电时间寄存器 0x00000000 +R32_TKEY2_DR 0x4001284C TKEY数据寄存器 0x00000000 +13.3.1 TKEYx 充电采样时间寄存器 1(TKEYx_CHARGE1)(x=1/2) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved TKCG17[2:0] TKCG16[2:0] TKCG15[2:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TKCG15 TKCG14[2:0] TKCG13[2:0] TKCG12[2:0] TKCG11[2:0] TKCG10[2:0] +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +TKCGx[2:0] (x=10-17):选择通道x的充电 +采样时间 +这些为用于独立地选择每个通道的充电时间。 +000:1.5周期 100:41.5周期 +[23:0] TKCGx[2:0] RW 000b +001:7.5周期 101:55.5周期 +010:13.5周期 110:71.5周期 +011:28.5周期 111:239.5周期 +时间基准:ADC时钟。 +注:此寄存器映射ADC模块的采样时间寄存器1(ADC_SAMPTR1)。配置ADC功能时,为通道的采用时 +V2.4 178 + +# Page 182 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +间;配置TKEY功能时,为通道充电时间。 +13.3.2 TKEYx 充电采样时间寄存器 2(TKEYx_CHARGE2)(x=1/2) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved TKCG9[2:0] TKCG8[2:0] TKCG7[2:0] TKCG6[2:0] TKCG5[2:1] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TKCG5 TKCG4[2:0] TKCG3[2:0] TKCG2[2:0] TKCG1[2:0] TKCG0[2:0] +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +TKCGx[2:0] (x=0-9):选择通道x的充电采 +样时间 +这些为用于独立地选择每个通道的充电时间。 +000:1.5周期 100:41.5周期 +[29:0] TKCGx[2:0] RW 000b +001:7.5周期 101:55.5周期 +010:13.5周期 110:71.5周期 +011:28.5周期 111:239.5周期 +时间基准:ADC时钟。 +注:此寄存器映射ADC模块的采样时间寄存器1(ADC_SAMPTR2)。配置ADC功能时,为通道的采用时 +间;配置TKEY功能时,为通道充电时间。 +13.3.3 TKEYx 充电时间偏移量寄存器(TKEYx_CHGOFFSET)(x=1/2) +偏移地址:0x3C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TKCGOFFSET[7:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +TKEY充电时间偏移量配置值。 +[7:0] TKCGOFFSET[7:0] WO 0 +总充电时间TCHG=TKCGOFFSET+ TKCGx +注:此寄存器映射ADC模块的注入数据寄存器1(ADC_IDATAR1)。因此当该地址寄存器进行“写操 +作”时,作为TKEY充电时间偏移量(TKEY_ CHGOFFSET)执行;进行“读操作”时,作为ADC模块的 +注入数据寄存器1(ADC_IDATAR1)执行。 +V2.4 179 + +# Page 183 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +13.3.4 TKEYx 启动和放电时间寄存器(TKEYx_ACT_DCG)(x=1/2) +偏移地址:0x4C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TKACT_DCG[7:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +[7:0] TKACT_DCG[7:0] WO 写放电时间并启动一次TKEY通道检测。 0 +注:此寄存器映射ADC模块的规则数据寄存器(ADC_RDATAR)。 +13.3.5 TKEYx 数据寄存器(TKEYx_DR)(x=1/2) +偏移地址:0x4C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA[15:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:0] DATA[15:0] RO 转换的数据。 0 +注:此寄存器映射ADC模块的规则数据寄存器(ADC_RDATAR)。 +V2.4 180 + +# Page 184 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 14 章 高级定时器(ADTM) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和 TIM10),可 +用于测量脉冲宽度或产生脉冲、PWM波等。用于电机控制、电源等领域。 +14.1 主要特征 +高级定时器(TIM1/8/9/10)的主要特征包括: + 16位自动重装计数器,支持增计数模式,减计数模式和增减计数模式; + 16位预分频器,分频系数从1~65536之间动态可调; + 支持四路独立的比较捕获通道; + 每路比较捕获通道支持多种工作模式,比如:输入捕获,输出比较,PWM生成和单脉冲输出; + 支持可编程死区时间的互补输出; + 支持外部信号控制定时器; + 支持使用重复计数器在确定周期后更新定时器; + 支持使用刹车信号将定时器复位或置其于确定状态; + 支持在多种模式下使用DMA; + 支持增量式编码器; + 支持定时器之间的级联和同步 +14.2 原理和结构 +本节主要论述高级定时器的内部构造。 +14.2.1 概述 +如图14-1,高级定时器的结构大致可以分为三部分,即输入时钟部分,核心计数器部分和比较捕 +获通道部分。 +高级定时器的时钟可以来自于PB总线时钟(CK_INT),可以来自外部时钟输入引脚(TIMx_ETR), +亦可以来自于其他具有时钟输出功能的定时器(ITRx),还可以来自于比较捕获通道的输入端 +(TIMx_CHx)。这些输入的时钟信号经过各种设定的滤波分频等操作后成为 CK_PSC 时钟,输出给核 +心计数器部分。另外,这些复杂的时钟来源还可以作为 TRGO 输出给其他的定时器、ADC 和 DAC 等外 +设。 +高级定时器的核心是一个16位计数器(CNT)。CK_PSC经过预分频器(PSC)分频后,成为CK_CNT +并输出给CNT,CNT支持增计数模式、减计数模式和增减计数模式,并有一个自动重装值寄存器(ATRLR) +在每个计数周期结束后为CNT重装载初始值。另外还有个辅助计数器在一旁计数ATRLR为CNT重装载 +初值的次数,当次数达到重复计数值寄存器(RPTCR)里设置的次数时,可以产生特定事件。 +高级定时器拥有四组比较捕获通道,每组比较捕获通道都可以从专属的引脚上输入脉冲,也可以 +向引脚输出波形,即比较捕获通道支持输入和输出模式。比较捕获寄存器每个通道的输入都支持滤波、 +分频和边沿检测等操作,并支持通道间的互触发,还能为核心计数器CNT提供时钟。每个比较捕获通 +道都拥有一组比较捕获寄存器(CHxCVR),支持与主计数器(CNT)进行比较而输出脉冲。 +V2.4 181 + +# Page 185 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图14-1 高级定时器的结构框图 +V2.4 182 +RTE_xMIT +Internal clock(CK_INT) +CK_TIMx from RCC +ETR Polarity selection & ETRF co T n r t i r g o g l e l r e r +Edge detector & Prescaler ETRP +TRGO To other timers +Input filter To DAC and ADC +ITR0 +TGI +ITR1 +ITR2 TRGI Slave mode +controller +ITR3 +TIF_ED +Reset, +Enable, UI +Up/Down, +TI1FP1 Encoder Count REP Register +TI2FP2 interface U +AutoReload +U Register +1CO +N1CO +2CO +1HC_xMIT +N1HC_xMIT +2HC_xMIT +N2HC_xMIT +3HC_xMIT +N3HC_xMIT +4HC_xMIT +OC2N +OC3 +N3CO +Repetition +counter +CK_PSC CK_CNT +PSC CNT +(prescaler) (counter) DTG[7:0]registers +CC4I CC4I +TI1 Input filter TI1FP1 IC1 IICC11PPSS Capture/Compare OC1REF +& Edge detector Prescaler 1 Register TI1FP2 +TRC CC3I U CC3I +TI2FP1 +TI2 Input filter IC2 IC2PS Capture/Compare OC2REF +& Edge detector TI2FP2 Prescaler 2 Register TRC CC2I U CC2I +TI3FP3 +TI3 & I E n d p g u e t d f e i t l e t c e t r o r IC3 Prescaler IC3PS Cap 3 t u R r e e g / i C s o t m e p r are OC3REF +TI3FP4 +TRC CC1I U CC1I +TI4 Input filter TI4FP3 IC4 IC4PS Capture/Compare OC4REF +& Edge detector Prescaler 4 Register +TI4FP4 +TRC U +OC4 +BRK BI Polarity selection +Clock failure event from clock +controller CSS (Clock Security System) +Interrupt&DMA output Event DTG Output control +Legend +Preload registers transferred to active registers on U event +Reg +according to control bit +1HC_xMIT +2HC_xMIT +3HC_xMIT +4HC_xMIT +NIKB_xMIT + +# Page 186 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +14.2.2 时钟输入 +图14-2 高级定时器的CK_PSC来源框图 +TIMx_SMCR +TS[2:0] +ITRx +0xx +TI1_ED 100 or TI2F or +TI1FP1 TI1F or Encoder +TI2F_Rising 101 mode +TI2 Filter de E t d e g c e tor TI2F_Falling 0 1 T E I2 T F R P F 2 110 +111 +TRGI External clock +ICF[3:0] CC2P mode 1 +CK_PSC +TIMx_CCMR1 TIMx_CCER +ETRF External clock +mode 2 +ETR +0 +ETR pin 1 /1 D ,/ i 2 vi , d /4 e , r /8 E f T D R TS P dow F n i c lt o e u r nter (int C e K r _ n I a N l T clock) I m n o te d r e nal clock +ETP ETPS[1:0] ETF[3:0] ECE SMS[2:0] +TIMx_SMCR TIMx_SMCR TIMx_SMCR TIMx_SMCR +高级定时器CK_PSC的时钟来源很多,可以分为4类: +1) 外部时钟引脚(ETR)输入时钟的路线:ETR→ETRP→ETRF; +2) 内部PB时钟输入路线:CK_INT; +3) 来自比较捕获通道引脚(TIMx_CHx)的路线:TIMx_CHx→TIx→TIxFPx,此路线也用于编码器模 +式; +4) 来自内部其他定时器的输入:ITRx; +通过决定CK_PSC来源的SMS的输入脉冲选择可以将实际的操作分为4类: +1) 选择内部时钟源(CK_INT); +2) 外部时钟源模式1; +3) 外部时钟源模式2; +4) 编码器模式; +上文提到的4种时钟源来源都可通过这4种操作选定。 +14.2.2.1 内部时钟源(CK_INT) +如果将 SMS 域保持 000b 时启动高级定时器,那么就是选定内部时钟源(CK_INT)为时钟。此时 +CK_INT就是CK_PSC。 +14.2.2.2 外部时钟源模式 1 +如果将 SMS域设置为 111b时,就会启用外部时钟源模式 1。启用外部时钟源1时,TRGI被选定 +为CK_PSC的来源,值得注意的,还需要通过配置TS域来选择TRGI的来源。TS域可选择以下几种脉 +冲作为时钟来源: +1) 内部触发(ITRx,x为0,1,2,3); +2) 比较捕获通道1经过边沿检测器后的信号(TI1F_ED); +3) 比较捕获通道的信号TI1FP1、TI2FP2; +4) 来自外部时钟引脚输入的信号ETRF。 +14.2.2.3 外部时钟源模式 2 +使用外部触发模式2能在外部时钟引脚输入的每一个上升沿或下降沿计数。将ECE位置位时,将 +使用外部时钟源模式2。使用外部时钟源模式2时,ETRF被选定为CK_PSC。ETR引脚经过可选的反相 +V2.4 183 + +# Page 187 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +器(ETP),分频器(ETPS)后成为ETRP,再经过滤波器(ETF)后即成为ETRF。 +在ECE位置位且将SMS设为111b时,相当于TS选择ETRF为输入。 +14.2.2.4 编码器模式 +将SMS置为001b,010b,011b将会启用编码器模式。启用编码器模式可以选择在TI1FP1和TI2FP2 +中某一个特定的电平下以另一个跳变沿作为信号进行信号输出。此模式用于外接编码器使用的情况下。 +具体功能参考14.3.9节。 +14.2.3 计数器和周边 +CK_PSC输入给预分频器(PSC)进行分频。PSC是16位的,实际的分频系数相当于R16_TIMx_PSC +的值+1。CK_PSC经过PSC会成为CK_INT。更改R16_TIM1_PSC的值并不会实时生效,而会在更新事件 +后更新给PSC。更新事件包括UG位清零和复位。定时器的核心是一个16位计数器(CNT),CK_CNT最 +终会输入给 CNT,CNT 支持增计数模式、减计数模式和增减计数模式,并有一个自动重装值寄存器 +(ATRLR)在每个计数周期结束后为 CNT 重新装载初始值。另外还有个辅助计数器在一旁记录 ATRLR +为 CNT 重新装载初值的次数,当达到重复计数值寄存器(RPTCR)里设置的次数时,可以产生特定事 +件。 +14.2.4 比较捕获通道和周边 +比较捕获通道是定时器实现复杂功能的主要组件,它的核心是比较捕获寄存器,辅以外围输入部 +分的数字滤波,分频和通道间复用、输出部分的比较器和输出控制组成。 +V2.4 184 + +# Page 188 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图14-3 比较捕获通道的结构框图 +TI1F_ED +To the slave mode controller +TI1 TI1F_Rising +Filter TI1F Edge 0 TI1FP1 +f DTS downcounter detector TI1F_Falling 1 01 +TI2FP1 IC1 Divider +10 +/1,/2,/4,/8 +ICF[3:0] CC1P/CC1NP +TRC +TIMx_CCMR1 TIMx_CCER 11 +(from slave mode +TI2F_Rising controller) +0 +(from channel 2) +CC1S[1:0] ICPS[1:0] CC1E +TI2F_Falling +1 +(from channel 2) TIMx_CHCTLR1 TIMx_CCER +PB Bus +MCU-peripheral interface +Capture/compare preload register +Capture/compare shadow register +比较捕获通道的结构框图如图14-3所示。信号从通道x引脚输入进来后可选做为TIx(TI1的来 +源可以不只是CH1,见定时器的结构框图14-1),TI1经过滤波器(ICF[3:0])生成TI1F,再经过边 +沿检测器分成TI1F_Rising和TI1F_Falling,这两个信号经过选择(CC1P)生成TI1FP1,TI1FP1和 +来自通道2的TI2FP1一起送给CC1S选择成为IC1,经过ICPS分频后送给比较捕获寄存器。 +比较捕获寄存器由一个预装载寄存器和一个影子寄存器组成,读写过程仅操作预装载寄存器。在 +V2.4 185 +8 +hgih +)tib-61 +fi( +8 +wol Write CCR1H +Read CCR1H write_in_progress S S +read_in_progress +Write CCR1L Read CCR1L R +R +Output CC1S[1] +capture_transfer compare_transfer mode +CC1S[0] +Input +CC1S[1] +mode OC1PE CC1S[0] OC1PE +UEV +TIM1_CHCTLR1 +(from time +IC1PS Capture Comparator base unit) +CC1E +CC1G Counter +TIM1_SWEVGR +To the master mode +controller +ETRF 0 Output OC1 +enable +‘0’ x0 1 circuit +OC1REF OC1REFC +01 +CNT > CCR1 Output OC1_DT 11 CC1P +mode Output Dead-time TIM1_CCER +CNT = CCR1 controller selector generator OC1N_DT +11 +10 0 Output +OCxREF ‘0’ 0x enable OC1N +OCxREF 1 circuit +CC1NE CC1E TIM1_CCER +OC1CEOC1M[3:0] DTG[7:0] CC1NE CC1E CC1NP MOE OSSI OSSR +TIM1_CHCTLR1 TIM1_BDTR TIM1_CCER TIM1_CCER TIM1_BDTR + +# Page 189 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +捕获模式下,捕获发生在影子寄存器上,然后复制到预装载寄存器;在比较模式下,预装载寄存器的 +内容被复制到影子寄存器中,然后影子寄存器的内容与核心计数器(CNT)进行比较。 +14.3 功能和实现 +高级定时器复杂功能的实现都是对定时器的比较捕获通道、时钟输入电路和计数器及周边部分的 +操作实现的。定时器的时钟输入可以来自于包括比较捕获通道的输入在内的多个时钟源。对比较捕获 +通道和时钟源选择的操作直接决定其功能。比较捕获通道是双向的,可以工作在输入和输出模式。 +14.3.1 输入捕获模式 +输入捕获模式是定时器的基本功能之一。输入捕获模式的原理是,当检测到ICxPS信号上确定的 +边沿后,则发生捕获事件,计数器当前的值会被锁存到比较捕获寄存器(R16_TIMx_CHCTLRx)中。发 +生捕获事件时,CCxIF(在R16_TIMx_INTFR中)被置位,如果使能了中断或DMA,还会产生相应中断 +或DMA。如果发生捕获事件时,CCxIF已经被置位了,那么CCxOF位会被置位。CCxIF可由软件清除, +也可以通过读取比较捕获寄存器由硬件清除。CCxOF由软件清除。 +举个通道1的例子来说明使用输入捕获模式的步骤,如下: +1) 配置CCxS域,选择ICx信号的来源。比如设为10b,选择TI1FP1作为IC1的来源,而不可以使 +用默认设置,CCxS域默认是使比较捕获模块作为输出通道; +2) 配置ICxF域,设定TI信号的数字滤波器。数字滤波器会以确定的频率,采样确定的次数,再输 +出一个跳变。这个采样频率和次数是通过ICxF来确定的; +3) 配置CCxP位,设定TIxFPx的极性。比如保持CC1P位为低,选择上升沿跳变; +4) 配置ICxPS域,设定ICx信号成为ICxPS之间的分频系数。比如保持ICxPS为00b,不分频; +5) 配置CCxE位,允许捕获核心计数器(CNT)的值到比较捕获寄存器中。置CC1E位; +6) 根据需要配置CCxIE和CCxDE位,决定是否允许使能中断或DMA。 +至此已经将比较捕获通道配置完成。 +当TI1输入了一个被捕获的脉冲时,核心计数器(CNT)的值会被记录到比较捕获寄存器中,CC1IF +被置位,当CC1IF在之前就已经被置位时,CCIOF位也会被置位。如果CC1IE位,那么会产生一个中 +断;如果 CC1DE 被置位,会产生一个 DMA 请求。可以通过写事件产生寄存器(TIMx_SWEVGR)的方式 +由软件产生一个输入捕获事件。 +14.3.2 比较输出模式 +比较输出模式是定时器的基本功能之一。比较输出模式的原理是在核心计数器(CNT)的值与比 +较捕获寄存器的值一致时,输出特定的变化或波形。OCxM 域(在 R16_TIMx_CHCTLRx 中)和 CCxP 位 +(在 R16_TIMx_CCER 中)决定输出的是确定的高低电平还是电平翻转。产生比较一致事件时还会置 +CCxIF位,如果预先置了CCxIE位,则会产生一个中断;如果预先设置了CCxDE位,则会产生一个DMA +请求。 +配置为比较输出模式的步骤为下: +1) 配置核心计数器(CNT)的时钟源和自动重装值; +2) 设置需要对比的计数值到比较捕获寄存器(R16_TIMx_CHxCVR)中; +3) 如果需要产生中断,置CCxIE位; +4) 保持OCxPE为0,禁用比较寄存器的预装载寄存器; +5) 设定输出模式,设置OCxM域和CCxP位; +6) 使能输出,置CCxE位; +7) 置CEN位启动定时器。 +V2.4 186 + +# Page 190 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +14.3.3 强制输出模式 +定时器的比较捕获通道的输出模式可以由软件强制输出确定的电平,而不依赖比较捕获寄存器的 +影子寄存器和核心计数器的比较。 +具体的做法是将OCxM置为100b,即为强制将OCxREF置为低;或者将OCxM置为101b,即为强制 +将OCxREF置为高。 +需要注意的是,将 OCxM 强制置为 100b 或者 101b,内部核心计数器和比较捕获寄存器的比较过 +程还在进行,相应的标志位还在置位,中断和DMA请求还在产生。 +14.3.4 PWM 输入模式 +PWM输入模式是用来测量PWM的占空比和频率的,是输入捕获模式的一种特殊情况。除下列区别 +外,操作和输入捕获模式相同:PWM占用两个比较捕获通道,且两个通道的输入极性设为相反,其中 +一个信号被设为触发输入,SMS设为复位模式。 +例如,测量从TI1输入的PWM波的周期和频率,需要进行以下操作: +1) 将TI1(TI1FP1)设为IC1信号的输入。将CC1S置为01b; +2) 将TI1FP1置为上升沿有效。将CC1P保持为0; +3) 将TI1(TI1FP2)置为IC2信号的输入。将CC2S置为10b; +4) 选TI1FP2置为下降沿有效。将CC2P置为1; +5) 时钟源的来源选择TI1FP1。将TS设为101b; +6) 将SMS设为复位模式,即100b; +7) 使能输入捕获。CC1E和CC2E置位; +这样比较捕获寄存器1的值就是PWM的周期,而比较捕获寄存器2的值就是其占空比。 +注:因只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1/TIMx_CH2。 +14.3.5 PWM 输出模式 +PWM 输出模式是定时器的基本功能之一。PWM 输出模式最常见的是使用重装值确定 PWM 频率,使 +用捕获比较寄存器确定占空比的方法。将 OCxM 域中置 110b 或 111b 使用 PWM 模式 1 或模式 2,置 +OCxPE 位使能预装载寄存器,最后置 ARPE 位使能预装载寄存器的自动重装载。由于在发生一个更新 +事件时,预装载寄存器的值才能被送到影子寄存器,所以在核心计数器开始计数之前,需要置 UG 位 +来初始化所有寄存器。在 PWM 模式下,核心计数器和比较捕获寄存器一直在进行比较,根据 CMS 位, +定时器能够输出边沿对齐或中央对齐的PWM信号。 + 边沿对齐 +使用边沿对齐时,核心计数器增计数或减计数,在PWM模式1的情景下,在核心计数器的值大于 +比较捕获寄存器时,OCxREF为高;当核心计数器的值小于比较捕获寄存器时(比如核心计数器增长到 +R16_TIMx_ATRLR的值而恢复成全0时),OCxREF为低。 + 中央对齐 +使用中央对齐模式时,核心计数器运行在增计数和减计数交替进行的模式下,OCxREF在核心计数 +器和比较捕获寄存器的值一致时进行上升和下降的跳变。但比较标志在三种中央对齐模式下,置位的 +时机有所不同。在使用中央对齐模式时,最好在启动核心计数器之前产生一个软件更新标志(置 UG +位)。 +14.3.6 互补输出和死区 +比较捕获通道一般有两个输出引脚(比较捕获通道4只有一个输出引脚),能输出两个互补的信 +号(OCx 和 OCxN),OCx和 OCxN可以通过 CCxP 和 CCxNP位独立地设置极性,通过 CCxE和 CCxNE 独 +立地设置输出使能,通过 MOE、OIS、OISN、OSSI、OSSR 位进行死区和其他的控制。同时使能 OCx 和 +OCxN输出将插入死区,每个通道都有一个10位的死区发生器。如果存在刹车电路则还要设置MOE位。 +OCx和OCxN由OCxREF关联产生,如果OCx和OCxN都是高有效,那么OCx与OCxREF相同,只是OCx +V2.4 187 + +# Page 191 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +的上升沿相当于 OCxREF 有一个延迟,OCxN 与 OCxREF 相反,它的上升沿相对参考信号的下降沿会有 +一个延迟,如果延迟大于有效输出宽度,则不会产生相应的脉冲。 +如图14-4展示了OCx和OCxN与OCxREF的关系,并展示出死区。 +图14-4 互补输出和死区 +14.3.7 刹车信号 +当产生刹车信号时,输出使能信号和无效电平都会根据MOE、OIS、OISN、OSSI和OSSR等位进行 +修改。但 OCx 和 OCxN 不会在任何时间都处在有效电平。刹车事件源可以来自于刹车输入引脚,也可 +以是一个时钟失败事件,而时钟失败事件由CSS(时钟安全系统)产生。 +在系统复位后,刹车功能被默认禁止(MOE位为低),置BKE位可以使能刹车功能,输入的刹车 +信号的极性可以通过设置BKP设置,BKE和BKP信号可以被同时写入,在真正写入之前会有一个PB时 +钟的延迟,因此需要等一个PB周期才能正确读出写入值。 +在刹车引脚出现选定的电平系统将产生如下动作: +1) MOE位被异步清零,根据SOOI位的设置将输出置为无效状态、空闲状态或复位状态; +2) 在MOE被清零后,每一个输出通道输出由OISx确定的电平; +3) 当使用互补输出时:输出被置于无效状态,具体取决于极性; +4) 如果 BIE被置位,当 BIF置位,会产生一个中断;如果设置了 BDE位,则会产生一个 DMA请求; +5) 如果AOE被置位,在下一个更新事件UEV时,MOE位被自动置位。 +14.3.8 单脉冲模式 +单脉冲模式可以用于让微控制器响应一个特定的事件,使之在一个延迟之后产生一个脉冲,延迟 +和脉冲的宽度可编程。置 OPM 位可以使核心计数器在产生下一个更新事件 UEV 时(计数器翻转到 0) +停止。 +如图14-5,需要在TI2输入引脚上检测到一个上升沿开始,延迟Tdelay之后,在OC1上产生一 +个长度为Tpulse的正脉冲: +图14-5 单脉冲的产生 +V2.4 188 +retnuoC + +# Page 192 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1) 设定TI2为触发。置CC2S域为01b,把 TI2FP2映射到 TI2;置 CC2P位为 0b,TI2FP2设为上升 +沿检测;置TS域为110b,TI2FP2设为触发源;置SMS域为110b,TI2FP2被用来启动计数器; +2) Tdelay 由比较捕获寄存器的的值确定,Tpulse 由自动重装值寄存器的值和比较捕获寄存器的值 +确定。 +14.3.9 编码器模式 +编码器模式是定时器的一个典型应用,可以用来接入编码器的双相输出,核心计数器的计数方向 +和编码器的转轴方向同步,编码器每输出一个脉冲就会使核心计数器加一或减一。使用编码器的步骤 +为:将SMS域置为001b(只在TI2边沿计数)、010b(只在TI1边沿计数)或011b(在TI1和TI2双 +边沿计数),将编码器接到比较捕获通道 1、2 的输入端,给重装值寄存器设一个值,这个值可以设 +的大一点。在编码器模式时,定时器内部的比较捕获寄存器,预分频器,重复计数寄存器等都正常工 +作。下表表明了计数方向和编码器信号的关系。 +表14-1 定时器编码器模式的计数方向和编码器信号之间的关系 +相对信号 TI1FP1信号边沿 TI2FP2信号 +计数有效边沿 +的电平 上升沿 下降沿 上升沿 下降沿 +高 向下计数 向上计数 +仅在TI1边沿计数 不计数 +低 向上计数 向下计数 +高 向上计数 向下计数 +仅在TI2边沿计数 不计数 +低 向下计数 向上计数 +高 向下计数 向上计数 向上计数 向下计数 +在TI1和TI2双边沿计数 +低 向上计数 向下计数 向下计数 向上计数 +14.3.10 定时器同步模式 +定时器能够输出时钟脉冲(TRGO),也能接收其他定时器的输入(ITRx)。不同的定时器的ITRx +的来源(别的定时器的TRGO)是不一样的。定时器内部触发连接如表14-2所示。 +表14-2 TIMx内部触发连接 +ITR0 ITR1 ITR2 ITR3 +从定时器 +(TS=000) (TS=001) (TS=010) (TS=011) +TIM1 TIM5 TIM2 TIM3 TIM4 +TIM8 TIM1 TIM2 TIM4 TIM5 +TIM9 TIM10 TIM5 TIM6 TIM7 +TIM10 TIM9 TIM2 TIM4 TIM5 +14.3.11 双边沿捕获模式 +可通过TIMx_AUX寄存器对脉冲进行测量。 +例如:通过通道2来捕获脉冲宽度,在捕获功能配置上,选择IC2信号的来源(TIMx_CHCTLR1寄 +存器的 CC2S 位为 11b),使能通道 2 的双边沿捕获功能(TIMx_AUX 寄存器的 CAP_ED_CH2 位为 1)。 +至此已经将双边沿捕获配置完成。 +可通过TIMx_CH2CVR寄存器的CCR2位读取捕获的双边沿脉冲宽度值。 +注:仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数第 +六位不为0的产品。 +14.3.12 调试模式 +当系统进入调试模式时,定时器根据DBG模块的设置继续运转或停止。 +V2.4 189 + +# Page 193 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +14.4 寄存器描述 +表14-3 TIM1相关寄存器列表 +名称 访问地址 描述 复位值 +R16_TIM1_CTLR1 0x40012C00 控制寄存器1 0x0000 +R16_TIM1_CTLR2 0x40012C04 控制寄存器2 0x0000 +R16_TIM1_SMCFGR 0x40012C08 从模式控制寄存器 0x0000 +R16_TIM1_DMAINTENR 0x40012C0C DMA/中断使能寄存器 0x0000 +R16_TIM1_INTFR 0x40012C10 中断状态寄存器 0x0000 +R16_TIM1_SWEVGR 0x40012C14 事件产生寄存器 0x0000 +R16_TIM1_CHCTLR1 0x40012C18 比较/捕获控制寄存器1 0x0000 +R16_TIM1_CHCTLR2 0x40012C1C 比较/捕获控制寄存器2 0x0000 +R16_TIM1_CCER 0x40012C20 比较/捕获使能寄存器 0x0000 +R16_TIM1_CNT 0x40012C24 计数器 0x0000 +R16_TIM1_PSC 0x40012C28 计数时钟预分频器 0x0000 +R16_TIM1_ATRLR 0x40012C2C 自动重装值寄存器 0xFFFF +R16_TIM1_RPTCR 0x40012C30 重复计数值寄存器 0x0000 +R16_TIM1_CH1CVR 0x40012C34 比较/捕获寄存器1 0x0000 +R16_TIM1_CH2CVR 0x40012C38 比较/捕获寄存器2 0x0000 +R16_TIM1_CH3CVR 0x40012C3C 比较/捕获寄存器3 0x0000 +R16_TIM1_CH4CVR 0x40012C40 比较/捕获寄存器4 0x0000 +R16_TIM1_BDTR 0x40012C44 刹车和死区寄存器 0x0000 +R16_TIM1_DMACFGR 0x40012C48 DMA控制寄存器 0x0000 +R16_TIM1_DMAADR 0x40012C4C 连续模式的DMA地址寄存器 0x0000 +R16_TIM1_AUX 0x40012C50 双边沿捕获寄存器 0x0000 +表14-4 TIM8相关寄存器列表 +名称 访问地址 描述 复位值 +R16_TIM8_CTLR1 0x40013400 控制寄存器1 0x0000 +R16_TIM8_CTLR2 0x40013404 控制寄存器2 0x0000 +R16_TIM8_SMCFGR 0x40013408 从模式控制寄存器 0x0000 +R16_TIM8_DMAINTENR 0x4001340C DMA/中断使能寄存器 0x0000 +R16_TIM8_INTFR 0x40013410 中断状态寄存器 0x0000 +R16_TIM8_SWEVGR 0x40013414 事件产生寄存器 0x0000 +R16_TIM8_CHCTLR1 0x40013418 比较/捕获控制寄存器1 0x0000 +R16_TIM8_CHCTLR2 0x4001341C 比较/捕获控制寄存器2 0x0000 +R16_TIM8_CCER 0x40013420 比较/捕获使能寄存器 0x0000 +R16_TIM8_CNT 0x40013424 计数器 0x0000 +R16_TIM8_PSC 0x40013428 计数时钟预分频器 0x0000 +R16_TIM8_ATRLR 0x4001342C 自动重装值寄存器 0xFFFF +R16_TIM8_RPTCR 0x40013430 重复计数值寄存器 0x0000 +R16_TIM8_CH1CVR 0x40013434 比较/捕获寄存器1 0x0000 +R16_TIM8_CH2CVR 0x40013438 比较/捕获寄存器2 0x0000 +R16_TIM8_CH3CVR 0x4001343C 比较/捕获寄存器3 0x0000 +R16_TIM8_CH4CVR 0x40013440 比较/捕获寄存器4 0x0000 +V2.4 190 + +# Page 194 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_TIM8_BDTR 0x40013444 刹车和死区寄存器 0x0000 +R16_TIM8_DMACFGR 0x40013448 DMA控制寄存器 0x0000 +R16_TIM8_DMAADR 0x4001344C 连续模式的DMA地址寄存器 0x0000 +R16_TIM8_AUX 0x40013450 双边沿捕获寄存器 0x0000 +表14-5 TIM9相关寄存器列表 +名称 访问地址 描述 复位值 +R16_TIM9_CTLR1 0x40014C00 控制寄存器1 0x0000 +R16_TIM9_CTLR2 0x40014C04 控制寄存器2 0x0000 +R16_TIM9_SMCFGR 0x40014C08 从模式控制寄存器 0x0000 +R16_TIM9_DMAINTENR 0x40014C0C DMA/中断使能寄存器 0x0000 +R16_TIM9_INTFR 0x40014C10 中断状态寄存器 0x0000 +R16_TIM9_SWEVGR 0x40014C14 事件产生寄存器 0x0000 +R16_TIM9_CHCTLR1 0x40014C18 比较/捕获控制寄存器1 0x0000 +R16_TIM9_CHCTLR2 0x40014C1C 比较/捕获控制寄存器2 0x0000 +R16_TIM9_CCER 0x40014C20 比较/捕获使能寄存器 0x0000 +R16_TIM9_CNT 0x40014C24 计数器 0x0000 +R16_TIM9_PSC 0x40014C28 计数时钟预分频器 0x0000 +R16_TIM9_ATRLR 0x40014C2C 自动重装值寄存器 0xFFFF +R16_TIM9_RPTCR 0x40014C30 重复计数值寄存器 0x0000 +R16_TIM9_CH1CVR 0x40014C34 比较/捕获寄存器1 0x0000 +R16_TIM9_CH2CVR 0x40014C38 比较/捕获寄存器2 0x0000 +R16_TIM9_CH3CVR 0x40014C3C 比较/捕获寄存器3 0x0000 +R16_TIM9_CH4CVR 0x40014C40 比较/捕获寄存器4 0x0000 +R16_TIM9_BDTR 0x40014C44 刹车和死区寄存器 0x0000 +R16_TIM9_DMACFGR 0x40014C48 DMA控制寄存器 0x0000 +R16_TIM9_DMAADR 0x40014C4C 连续模式的DMA地址寄存器 0x0000 +R16_TIM9_AUX 0x40014C50 双边沿捕获寄存器 0x0000 +表14-6 TIM10相关寄存器列表 +名称 访问地址 描述 复位值 +R16_TIM10_CTLR1 0x40015000 控制寄存器1 0x0000 +R16_TIM10_CTLR2 0x40015004 控制寄存器2 0x0000 +R16_TIM10_SMCFGR 0x40015008 从模式控制寄存器 0x0000 +R16_TIM10_DMAINTENR 0x4001500C DMA/中断使能寄存器 0x0000 +R16_TIM10_INTFR 0x40015010 中断状态寄存器 0x0000 +R16_TIM10_SWEVGR 0x40015014 事件产生寄存器 0x0000 +R16_TIM10_CHCTLR1 0x40015018 比较/捕获控制寄存器1 0x0000 +R16_TIM10_CHCTLR2 0x4001501C 比较/捕获控制寄存器2 0x0000 +R16_TIM10_CCER 0x40015020 比较/捕获使能寄存器 0x0000 +R16_TIM10_CNT 0x40015024 计数器 0x0000 +R16_TIM10_PSC 0x40015028 计数时钟预分频器 0x0000 +R16_TIM10_ATRLR 0x4001502C 自动重装值寄存器 0xFFFF +R16_TIM10_RPTCR 0x40015030 重复计数值寄存器 0x0000 +V2.4 191 + +# Page 195 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_TIM10_CH1CVR 0x40015034 比较/捕获寄存器1 0x0000 +R16_TIM10_CH2CVR 0x40015038 比较/捕获寄存器2 0x0000 +R16_TIM10_CH3CVR 0x4001503C 比较/捕获寄存器3 0x0000 +R16_TIM10_CH4CVR 0x40015040 比较/捕获寄存器4 0x0000 +R16_TIM10_BDTR 0x40015044 刹车和死区寄存器 0x0000 +R16_TIM10_DMACFGR 0x40015048 DMA控制寄存器 0x0000 +R16_TIM10_DMAADR 0x4001504C 连续模式的DMA地址寄存器 0x0000 +R16_TIM10_AUX 0x40015050 双边沿捕获寄存器 0x0000 +14.4.1 控制寄存器 1(TIMx_CTLR1)(x=1/8/9/10) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CKD[1:0] ARPE CMS[1:0] DIR OPM URS UDIS CEN +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留。 0 +这2位定义在定时器时钟(CK_INT)频率、死区时 +间和由死区发生器与数字滤波器(ETR,TIx)所用 +的采样时钟之间的分频比例: +[9:8] CKD[1:0] RW 00:Tdts=Tck_int 00b +01:Tdts = 2 x Tck_int +10:Tdts = 4 x Tck_int +11:保留。 +自动重装预装使能位: +7 ARPE RW 0:禁止自动重装值寄存器(ATRLR); 0 +1:使能自动重装值寄存器(ATRLR)。 +中央对齐模式选择: +00:边沿对齐模式。计数器依据方向位(DIR)向上 +或向下计数。 +01:中央对齐模式 1。计数器交替地向上和向下计 +数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) +的输出比较中断标志位,只在计数器向下计数时被 +设置。 +10:中央对齐模式 2。计数器交替地向上和向下计 +[6:5] CMS[1:0] RW 数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) 00b +的输出比较中断标志位,只在计数器向上计数时被 +设置。 +11:中央对齐模式 3。计数器交替地向上和向下计 +数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) +的输出比较中断标志位,在计数器向上和向下计数 +时均被设置。 +注:在计数器使能时(CEN=1),不允许从边沿对齐 +模式转换到中央对齐模式。 +计数器方向: +4 DIR RW 0 +0:计数器的计数模式为增计数; +V2.4 192 + +# Page 196 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:计数器的计数模式为减计数。 +注:当计数器配置为中央对齐模式或编码器模式时, +该位无效。 +单脉冲模式: +0:在发生下一次更新事件时,计数器不停止; +3 OPM RW 0 +1:在发生下一次更新事件时,计数器停止(清除CEN +位)。 +更新请求源,软件通过该位选择UEV事件的源。 +0:如果使能了更新中断或DMA请求,则下述任一事 +件产生更新中断或DMA请求。 +-计数器溢出/下溢 +2 URS RW 0 +-设置UG位 +-从模式控制产生的更新。 +1:如果使能了更新中断或DMA请求,则只有计数器 +溢出/下溢才产生更新中断或DMA请求。 +禁止更新,软件通过该位允许/禁止 UEV 事件的产 +生。 +0:允许 UEV。更新(UEV)事件由下述任一事件产 +生。 +-计数器溢出/下溢 +-设置UG位 +1 UDIS RW 0 +-从模式控制产生的更新 +具有缓存的寄存器被装入它们的预装载值。 +1:禁止 UEV。不产生更新事件,各寄存器(ARR、 +PSC、CHxCVR)保持它们的值。如果设置了UG位或 +从模式控制器发出了一个硬件复位,则计数器和预 +分频器被重新初始化; +使能计数器: +0:禁止计数器; +1:使能计数器。 +0 CEN RW 0 +注:在软件设置了CEN位后,外部时钟、门控模式 +和编码器模式才能工作。触发模式可以自动地通过 +硬件设置CEN位。 +14.4.2 控制寄存器 2(TIMx_CTLR2)(x=1/8/9/10) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved OIS4 OIS3N OIS3 OIS2N OIS2 OIS1N OIS1 TI1S MMS[2:0] CCDS CCUS Reserved CCPC +位 名称 访问 描述 复位值 +15 Reserved RO 保留。 0 +输出空闲状态4: +0:当MOE=0时,如果实施了OC4N,则死区后OC4=0; +14 OIS4 RW 0 +1:当MOE=0时,如果实施了OC4N,则死区后OC4=1。 +注:已经设置了LOCK(TIMx_BDTR寄存器)级别1、 +V2.4 193 + +# Page 197 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2或3后,该位不能被修改。 +输出空闲状态3: +0:当MOE=0时,死区后OC3N=0; +13 OIS3N RW 1:当MOE=0时,死区后OC3N=1。 0 +注:已经设置了LOCK(TIMx_BDTR寄存器)级别1、 +2或3后,该位不能被修改。 +12 OIS3 RW 输出空闲状态3,参见OIS4。 0 +11 OIS2N RW 输出空闲状态2,参见OIS3N。 0 +10 OIS2 RW 输出空闲状态2,参见OIS4。 0 +9 OIS1N RW 输出空闲状态1,参见OIS3N。 0 +8 OIS1 RW 输出空闲状态1,参见OIS4。 0 +TI1选择: +0:TIMx_CH1引脚直连到TI1输入; +7 TI1S RW 0 +1:TIMx_CH1、TIMx_CH2和TIMx_CH3引脚经异或后 +连到TI1输入。 +主模式选择:这 3 位用于选择在主模式下送到从定 +时器的同步信息(TRGO)。 +可能的组合如下: +000:复位–TIMx_EGR寄存器的UG位被用于作为触 +发输出(TRGO)。如果是触发输入产生的复位(从 +模式控制器处于复位模式),则TRGO上的信号相对 +实际的复位会有一个延迟; +001:使能–计数器使能信号CNT_EN被用于作为触 +发输出(TRGO)。有时需要在同一时间启动多个定 +时器或控制在一段时间内使能从定时器。计数器使 +能信号是通过CEN控制位和门控模式下的触发输入 +信号的逻辑或产生。当计数器使能信号受控于触发 +输入时,TRGO 上会有一个延迟,除非选择了主/从 +模式(见TIMx_SMCR寄存器中MSM位的描述); +[6:4] MMS[2:0] RW 000b +010:更新–更新事件被选为触发输出(TRGO)。例 +如,一个主定时器的时钟可以被用作一个从定时器 +的预分频器; +011:比较脉冲–在发生一次捕获或一次比较成功 +时,当要设置CC1IF标志时(即使它已经为高), +触发输出送出一个正脉冲(TRGO); +100:比较–OC1REF 信号被用于作为触发输出 +(TRGO); +101:比较–OC2REF 信号被用于作为触发输出 +(TRGO); +110:比较–OC3REF 信号被用于作为触发输出 +(TRGO); +111:比较–OC4REF 信号被用于作为触发输出 +(TRGO)。 +捕获比较的DMA选择: +3 CCDS RW 0:当发生CHxCVR时,产生CHxCVR的DMA请求; 0 +1:当发生更新事件时,送出CHxCVR的DMA请求。 +V2.4 194 + +# Page 198 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +比较捕获控制更新选择位: +0:如果CCPC置位,只能通过设置COM位更新它们; +2 CCUS RW 1:如果CCPC置位,可以通过设置COM位或TRGI上 0 +的一个上升沿更新它们。 +注:该位只对具有互补输出的通道起作用。 +1 Reserved RO 保留。 0 +比较捕获预装载控制位: +0:CCxE,CCxNE和OCxM位不是预装载的; +0 CCPC RW 1:CCxE,CCxNE 和 OCxM 位是预装载的,设置该位 0 +后,它们只在设置了COM位后被更新。 +注:该位只对具有互补输出的通道起作用。 +14.4.3 从模式控制寄存器(TIMx_SMCFGR)(x=1/8/9/10) +偏移地址:0x08 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ETP ECE ETPS[1:0] ETF[3:0] MSM TS[2:0] Reserved SMS[2:0] +位 名称 访问 描述 复位值 +ETR 触发极性选择,该位选择是直接输入 ETR 还是 +输入ETR的反相。 +15 ETP RO 0 +0:ETR,高电平或上升沿有效; +1:将ETR反相,低电平或下降沿有效。 +外部时钟模式2启用选择: +0:禁用外部时钟模式2; +1:使能外部时钟模式2。 +注1:从模式可以与外部时钟模式2同时使用:复 +14 ECE RW 0 +位模式,门控模式和触发模式;但是,这时TRGI不 +能连到ETRF(TS位不能是’111’)。 +注2:外部时钟模式1和外部时钟模式2同时被使 +能时,外部时钟的输入是ETRF。 +外部触发信号(ETRP)分频,这个信号频率最大不 +能超过 TIMxCLK 频率的 1/4,可以通过这个域来降 +频: +[13:12] ETPS[1:0] RW 00:关闭预分频; 00b +01:ETRP频率除以2; +10:ETRP频率除以4; +11:ETRP频率除以8。 +外部触发滤波,实际上,数字滤波器是一个事件计 +数器,它使用一定的采样的频率,记录到N个事件 +后会产生一个输出的跳变。 +0000:无滤波器,以Fdts采样; +[11:8] ETF[3:0] RW 0000b +0001:采样频率Fsampling=Fck_int,N=2; +0010:采样频率Fsampling=Fck_int,N=4; +0011:采样频率Fsampling=Fck_int,N=8; +0100:采样频率Fsampling=Fdts/2,N=6; +V2.4 195 + +# Page 199 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +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。 +主/从模式选择: +0:不发挥作用; +1:触发输入(TRGI)上的事件被延迟了,以允许在 +7 MSM RW 0 +当前定时器(通过TRGO)与它的从定时器间的完美 +同步。这对要求把几个定时器同步到一个单一的外 +部事件时是非常有用的。 +触发选择域,这3位选择用于同步计数器的触发输 +入源: +000:内部触发0(ITR0); +001:内部触发1(ITR1); +010:内部触发2(ITR2); +011:内部触发3(ITR3); +[6:4] TS[2:0] RW 000b +100:TI1的边沿检测器(TI1F_ED); +101:滤波后的定时器输入1(TI1FP1); +110:滤波后的定时器输入2(TI2FP2); +111:外部触发输入(ETRF); +以上只有在SMS为0时改变。 +注:具体见表14-2。 +3 Reserved RO 保留。 0 +输入模式选择域。选择核心计数器的时钟和触发模 +式。 +000:由内部时钟CK_INT驱动; +001:编码器模式 1,根据 TI1FP1 的电平,核心计 +数器在TI2FP2的边沿增减计数; +010:编码器模式 2,根据 TI2FP2 的电平,核心计 +数器在TI1FP1的边沿增减计数; +011:编码器模式3,根据另一个信号的输入电平, +[2:0] SMS[2:0] RW 000b +核心计数器在TI1FP1和TI2FP2的边沿增减计数; +100:复位模式,触发输入(TRGI)的上升沿将初始 +化计数器,并且产生一个更新寄存器的信号; +101:门控模式,当触发输入(TRGI)为高时,计数 +器的时钟开启;在触发输入变为低,计数器停止, +计数器的启停都是受控的; +110:触发模式,计数器在触发输入TRGI的上升沿 +启动,只有计数器的启动是受控的; +V2.4 196 + +# Page 200 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +111:外部时钟模式1,选中的触发输入(TRGI)的 +上升沿驱动计数器。 +14.4.4 DMA/中断使能寄存器(TIMx_DMAINTENR)(x=1/8/9/10) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TDE COMDE CC4DE CC3DE CC2DE CC1DE UDE BIE TIE COMIE CC4IE CC3IE CC2IE CC1IE UIE +位 名称 访问 描述 复位值 +15 Reserved RO 保留。 0 +触发DMA请求使能位: +14 TDE RW 0:禁止触发DMA请求; 0 +1:允许触发DMA请求。 +COM的DMA请求使能位: +13 COMDE RW 0:禁止COM的DMA请求; 0 +1:允许COM的DMA请求。 +比较捕获通道4的DMA请求使能位: +12 CC4DE RW 0:禁止比较捕获通道4的DMA请求; 0 +1:允许比较捕获通道4的DMA请求。 +比较捕获通道3的DMA请求使能位: +11 CC3DE RW 0:禁止比较捕获通道3的DMA请求; 0 +1:允许比较捕获通道3的DMA请求。 +比较捕获通道2的DMA请求使能位: +10 CC2DE RW 0:禁止比较捕获通道2的DMA请求; 0 +1:允许比较捕获通道2的DMA请求。 +比较捕获通道1的DMA请求使能位: +9 CC1DE RW 0:禁止比较捕获通道1的DMA请求; 0 +1:允许比较捕获通道1的DMA请求。 +更新的DMA请求使能位: +8 UDE RW 0:禁止更新的DMA请求; 0 +1:允许更新的DMA请求。 +刹车中断使能位: +7 BIE RW 0:禁止刹车中断; 0 +1:允许刹车中断。 +触发中断使能位: +6 TIE RW 0:禁止触发中断; 0 +1:使能触发中断。 +COM中断允许位: +5 COMIE RW 0:禁止COM中断; 0 +1:允许COM中断。 +比较捕获通道4中断使能位: +4 CC4IE RW 0:禁止比较捕获通道4中断; 0 +1:允许比较捕获通道4中断。 +比较捕获通道3中断使能位: +3 CC3IE RW 0 +0:禁止比较捕获通道3中断; +V2.4 197 + +# Page 201 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:允许比较捕获通道3中断。 +比较捕获通道2中断使能位: +2 CC2IE RW 0:禁止比较捕获通道2中断; 0 +1:允许比较捕获通道2中断。 +比较捕获通道1中断使能位: +1 CC1IE RW 0:禁止比较捕获通道1中断; 0 +1:允许比较捕获通道1中断。 +更新中断使能位: +0 UIE RW 0:禁止更新中断; 0 +1:允许更新中断。 +14.4.5 中断状态寄存器(TIMx_INTFR)(x=1/8/9/10) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CC4OF CC3OF CC2OF CC1OF Reserved BIF TIF COMIF CC4IF CC3IF CC2IF CC1IF UIF +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +12 CC4OF RW0 比较捕获通道4重复捕获标志位。 0 +11 CC3OF RW0 比较捕获通道3重复捕获标志位。 0 +10 CC2OF RW0 比较捕获通道2重复捕获标志位。 0 +比较捕获通道1重复捕获标志位,仅用于比较捕获 +通道被配置为输入捕获模式时。该标记由硬件置位, +软件写0可清除此位。 +9 CC1OF RW0 0 +0:无重复捕获产生; +1:计数器的值被捕获到捕获比较寄存器时,CC1IF +的状态已经被置位。 +8 Reserved RO 保留。 0 +刹车中断标志位,一旦刹车输入有效,由硬件对该 +位置位,可由软件清零。 +7 BIF RW0 0 +0:无刹车事件产生; +1:刹车引脚输入上检测到设定的有效电平。 +触发器中断标志位,当发生触发事件时由硬件对该 +位置位,由软件清零。触发事件包括从除门控模式 +外的其它模式时,在TRGI输入端检测到有效边沿, +6 TIF RW0 0 +或门控模式下的任一边沿。 +0:无触发器事件产生; +1:触发器事件产生。 +COM 中断标志位,一旦产生 COM 事件,该位由硬件 +置位,由软件清零。COM事件包括CCxE、CCxNE、OCxM +5 COMIF RW0 被更新。 0 +0:无COM事件产生; +1:COM事件产生。 +4 CC4IF RW0 比较捕获通道4中断标志位。 0 +3 CC3IF RW0 比较捕获通道3中断标志位。 0 +V2.4 198 + +# Page 202 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2 CC2IF RW0 比较捕获通道2中断标志位。 0 +比较捕获通道1中断标志位。 +如果比较捕获通道配置为输出模式: +当计数器值与比较值匹配时该位由硬件置位,但在 +中心对称模式下除外。该位由软件清零。 +0:无匹配发生; +1 CC1IF RW0 1:核心计数器的值与比较捕获寄存器1的值匹配。 0 +如果比较捕获通道1配置为输入模式: +当捕获事件发生时该位由硬件置位,它由软件清零 +或通过读比较捕获寄存器清零。 +0:无输入捕获产生; +1:计数器值已被捕获比较捕获寄存器1。 +更新中断标志位,当产生更新事件时该位由硬件置 +位,由软件清零。 +0:无更新事件产生; +1:更新中断产生。 +以下情形会产生更新事件: +0 UIF RW0 0 +若UDIS=0,当重复计数器数值上溢或下溢时; +若URS=0、UDIS=0,当置UG位时,或当通过软件对 +计数器核心计数器重新初始化时; +若 URS=0、UDIS=0,当计数器 CNT 被触发事件重新 +初始化时; +14.4.6 事件产生寄存器(TIMx_SWEVGR)(x=1/8/9/10) +偏移地址:0x14 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved BG TG COMG CC4G CC3G CC2G CC1G UG +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +刹车事件产生位,此位由软件置位和清零,用来产 +生一个刹车事件。 +7 BG WO 0:无动作; 0 +1:产生一个刹车事件。此时MOE=0、BIF=1,若使能 +对应的中断和DMA,则产生相应的中断和DMA。 +触发事件产生位,该位由软件置位,硬件清零,用 +于产生一个触发事件。 +6 TG WO 0:无动作; 0 +1:产生一个触发事件,TIF被置位,若使能对应的 +中断和DMA,则产生相应的中断和DMA。 +比较捕获控制更新产生位。产生比较捕获控制更新 +事件。该位由软件置位,由硬件自动清零。 +5 COMG WO 0:无动作; 0 +1:当CCPC=1,允许更新CCxE、CCxNE、OCxM位。 +注:该位只对拥有互补输出的通道(通道1,2,3) +V2.4 199 + +# Page 203 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +有效。 +4 CC4G WO 比较捕获事件产生位4。产生比较捕获事件4。 0 +3 CC3G WO 比较捕获事件产生位3。产生比较捕获事件3。 0 +2 CC2G WO 比较捕获事件产生位2。产生比较捕获事件2。 0 +比较捕获事件产生位1,产生比较捕获事件1。 +该位由软件置位,由硬件清零。用于产生一个比较 +捕获事件。 +0:无动作; +1:在比较捕获通道1上产生一个比较捕获事件: +若比较捕获通道1配置为输出: +1 CC1G WO 置 CC1IF 位。若使能对应的中断和 DMA,则产生相 0 +应的中断和DMA; +若比较捕获通道1配置为输入: +当前核心计数器的值被捕获至比较捕获寄存器 1; +置 CC1IF 位,若使能了对应的中断和 DMA,则产生 +相应的中断和DMA。若CC1IF已经置位,则置CC1OF +位。 +更新事件产生位,产生更新事件。该位由软件置位, +由硬件自动清零。 +0:无动作; +1:初始化计数器,并产生一个更新事件。 +0 UG WO 0 +注:预分频器的计数器也被清零,但是预分频系数 +不变。若在中心对称模式下或增计数模式下则核心 +计数器被清零;若减计数模式下则核心计数器取重 +装值寄存器的值。 +14.4.7 比较/捕获控制寄存器 1(TIMx_CHCTLR1)(x=1/8/9/10) +偏移地址:0x18 +通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的 CCxS 位定义。该寄存 +器其它位的作用在输入和输出模式下不同。OCxx 描述了通道在输出模式下的功能,ICxx 描述了通道 +在输入模式下的功能。 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OC2CE OC2M[2:0] OC2PE OC2FE OC1CE OC1M[2:0] OC1PE OC1FE +CC2S[1:0] CC1S[1:0] +IC2F[3:0] IC2PSC[1:0] IC1F[3:0] IC1PSC[1:0] +比较模式(引脚方向为输出): +位 名称 访问 描述 复位值 +比较捕获通道2清零使能位: +0:OC2REF不受ETRF输入的影响; +15 OC2CE RW 0 +1:一旦检测到 ETRF 输入高电平,清除 OC2REF 位 +零。 +比较捕获通道2模式设置域: +该 3 位定义了输出参考信号 OC2REF 的动作,而 +[14:12] OC2M[2:0] RW 000b +OC2REF决定了OC2、OC2N的值。OC2REF是高电平有 +效,而OC2和OC2N的有效电平取决于CC2P、CC2NP +V2.4 200 + +# Page 204 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位。 +000:冻结。比较捕获寄存器的值与核心计数器间的 +比较值对OC2REF不起作用; +001:强制设为有效电平。当核心计数器与比较捕获 +寄存器2的值相同时,强制OC2REF为高; +010:强制设为无效电平。当核心计数器的值与比较 +捕获寄存器2相同时,强制OC2REF为低; +011:翻转。当核心计数器与比较捕获寄存器2的值 +相同时,翻转OC2REF的电平。 +100:强制为无效电平。强制OC2REF为低。 +101:强制为有效电平。强制OC2REF为高。 +110:PWM模式1:在向上计数时,一旦核心计数器 +小于比较捕获寄存器的值时,通道2为有效电平, +否则为无效电平;在向下计数时,一旦核心计数器 +大于比较捕获寄存器的值时,通道 2 为无效电平 +(OC2REF=0),否则为有效电平(OC2REF=1)。 +111:PWM模式2:在向上计数时,一旦核心计数器 +小于比较捕获寄存器的值时,通道2为无效电平, +否则为有效电平;在向下计数时,一旦核心计数器 +大于比较捕获寄存器的值时,通道 2 为有效电平 +(OC2REF=1),否则为无效电平(OC2REF=0)。 +注:一旦LOCK级别设为3并且CC2S=00b则该位不 +能被修改。在PWM模式1或PWM模式2中,只有当 +比较结果改变了或在输出比较模式中从冻结模式切 +换到PWM模式时,OC2REF电平才改变。 +比较捕获寄存器2预装载使能位: +0:禁止比较捕获寄存器2的预装载功能,可随时写 +入比较捕获寄存器 2,并且新写入的数值立即起作 +用; +1:开启比较捕获寄存器2的预装载功能,读写操作 +仅对预装载寄存器操作,比较捕获寄存器2的预装 +11 OC2PE RW 0 +载值在更新事件到来时被加载至当前影子寄存器 +中。 +注:一旦LOCK级别设为3并且CC2S=00,则该位不 +能被修改;仅仅在单脉冲模式下(OPM=1)可以在未 +确认预装载寄存器情况下使用PWM模式,否则其动 +作不确定。 +比较捕获通道2快速使能位,该位用于加快比较捕 +获通道输出对触发输入事件的响应。 +0:根据计数器与比较捕获寄存器1的值,比较捕获 +通道2正常操作,即使触发器是打开的。当触发器 +10 OC2FE RW 的输入有一个有效沿时,激活比较捕获通道2输出 0 +的最小延时为5个时钟周期; +1:输入到触发器的有效沿的作用就像发生了一次比 +较匹配。因此,OC被设置为比较电平而与比较结果 +无关。采样触发器的有效沿和比较捕获通道2输出 +V2.4 201 + +# Page 205 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +间的延时被缩短为3个时钟周期。 +注:OC2FE只在通道被配置成PWM1或PWM2模式时 +起作用。 +比较捕获通道2输入选择域: +00:比较捕获通道2被配置为输出; +01:比较捕获通道2被配置为输入,IC2映射在TI2 +上; +10:比较捕获通道2被配置为输入,IC2映射在TI1 +[9:8] CC2S[1:0] RW 上; 00b +11:比较捕获通道2被配置为输入,IC2映射在TRC +上。此模式仅工作在内部触发器输入被选中时(由 +TS位选择)。 +注:比较捕获通道2仅在通道关闭时(CC2E为零时) +才是可写的。 +7 OC1CE RW 比较捕获通道1清零使能位。 0 +[6:4] OC1M[2:0] RW 比较捕获通道1模式设置域。 0 +3 OC1PE RW 比较捕获寄存器1预装载使能位。 0 +2 OC1FE RW 比较捕获通道1快速使能位。 0 +[1:0] CC1S[1:0] RW 比较捕获通道1输入选择域。 0 +捕获模式(引脚方向为输入): +位 名称 访问 描述 复位值 +输入捕获滤波器2配置域,这几位设置了TI1输入 +的采样频率及数字滤波器长度。数字滤波器由一个 +事件计数器组成,它记录到N个事件后会产生一个 +输出的跳变。 +0000:无滤波器,以fDTS采样; +1000:采样频率Fsampling=Fdts/8,N=6; +0001:采样频率Fsampling=Fck_int,N=2; +1001:采样频率Fsampling=Fdts/8,N=8; +0010:采样频率Fsampling=Fck_int,N=4; +1010:采样频率Fsampling=Fdts/16,N=5; +[15:12] IC2F[3:0] RW 0000b +0011:采样频率Fsampling=f=Fck_int,N=8; +1011:采样频率Fsampling=Fdts/16,N=6; +0100:采样频率Fsampling=Fdts/2,N=6; +1100:采样频率Fsampling=Fdts/16,N=8; +0101:采样频率Fsampling=Fdts/2,N=8; +1101:采样频率Fsampling=Fdts/32,N=5; +0110:采样频率Fsampling=Fdts/4,N=6; +1110:采样频率Fsampling=Fdts/32,N=6; +0111:采样频率Fsampling=Fdts/4,N=8; +1111:采样频率Fsampling=Fdts/32,N=8。 +比较捕获通道2预分频配置域,这2位定义了比较 +[11:10] IC2PSC[1:0] RW 捕获通道2的预分频系数。一旦CC1E=0,则预分频 00b +器复位。 +V2.4 202 + +# Page 206 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +00:无预分频器,捕获输入口上检测到的每一个边 +沿都触发一次捕获; +01:每2个事件触发一次捕获; +10:每4个事件触发一次捕获; +11:每8个事件触发一次捕获。 +比较捕获通道2输入选择域,这2位定义通道的方 +向(输入/输出),及输入脚的选择。 +00:比较捕获通道2通道被配置为输出; +01:比较捕获通道 2 通道被配置为输入,IC1 映射 +在TI1上; +[9:8] CC2S[1:0] RW 10:比较捕获通道 2 通道被配置为输入,IC1 映射 00b +在TI2上; +11:比较捕获通道 2 通道被配置为输入,IC1 映射 +在TRC上。此模式仅工作在内部触发器输入被选中 +时(由TS位选择)。 +注:CC2S仅在通道关闭时(CC2E为0)才是可写的。 +[7:4] IC1F[3:0] RW 输入捕获滤波器1配置域。 0 +[3:2] IC1PSC[1:0] RW 比较捕获通道1预分频配置域。 0 +[1:0] CC1S[1:0] RW 比较捕获通道1输入选择域。 0 +14.4.8 比较/捕获控制寄存器 2(TIMx_CHCTLR2)(x=1/8/9/10) +偏移地址:0x1C +通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的 CCxS 位定义。该寄存 +器其它位的作用在输入和输出模式下不同。OCxx 描述了通道在输出模式下的功能,ICxx 描述了通道 +在输入模式下的功能。 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OC4CE OC4M[2:0] OC4PE OC4FE OC3CE OC3M[2:0] OC3PE OC3FE +CC4S[1:0] CC3S[1:0] +IC4F[3:0] IC4PSC[1:0] IC3F[3:0] IC3PSC[1:0] +比较模式(引脚方向为输出): +位 名称 访问 描述 复位值 +15 OC4CE RW 比较捕获通道4清零使能位。 0 +[14:12] OC4M[2:0] RW 比较捕获通道4模式设置域。 0 +11 OC4PE RW 比较捕获寄存器4预装载使能位。 0 +10 OC4FE RW 比较捕获通道4快速使能位。 0 +[9:8] CC4S[1:0] RW 比较捕获通道4输入选择域。 0 +7 OC3CE RW 比较捕获通道3清零使能位。 0 +[6:4] OC3M[2:0] RW 比较捕获通道3模式设置域。 0 +3 OC3PE RW 比较捕获寄存器3预装载使能位。 0 +2 OC3FE RW 比较捕获通道3快速使能位。 0 +[1:0] CC3S[1:0] RW 比较捕获通道3输入选择域。 0 +捕获模式(引脚方向为输入): +位 名称 访问 描述 复位值 +V2.4 203 + +# Page 207 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[15:12] IC4F[3:0] RW 输入捕获滤波器4配置域。 0 +[11:10] IC4PSC[1:0] RW 比较捕获通道4预分频配置域。 0 +[9:8] CC4S[1:0] RW 比较捕获通道4输入选择域。 0 +[7:4] IC3F[3:0] RW 输入捕获滤波器3配置域。 0 +[3:2] IC3PSC[1:0] RW 比较捕获通道3预分频配置域。 0 +[1:0] CC3S[1:0] RW 比较捕获通道3输入选择域。 0 +14.4.9 比较/捕获使能寄存器(TIMx_CCER)(x=1/8/9/10) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CC4P CC4E CC3NP CC3NE CC3P CC3E CC2NP CC2NE CC2P CC2E CC1NP CC1NE CC1P CC1E +位 名称 访问 描述 复位值 +[15:14] Reserved RO 保留。 0 +13 CC4P RW 比较捕获通道4输出极性设置位。 0 +12 CC4E RW 比较捕获通道4输出使能位。 0 +11 CC3NP RW 比较捕获通道3互补输出极性设置位。 0 +10 CC3NE RW 比较捕获通道3互补输出使能位。 0 +9 CC3P RW 比较捕获通道3输出极性设置位。 0 +8 CC3E RW 比较捕获通道3输出使能位。 0 +7 CC2NP RW 比较捕获通道2互补输出极性设置位。 0 +6 CC2NE RW 比较捕获通道2互补输出使能位。 0 +5 CC2P RW 比较捕获通道2输出极性设置位。 0 +4 CC2E RW 比较捕获通道2输出使能位。 0 +3 CC1NP RW 比较捕获通道1互补输出极性设置位。 0 +2 CC1NE RW 比较捕获通道1互补输出使能位。 0 +比较捕获通道1输出极性设置位。 +CC1通道配置为输出: +0:OC1高电平有效; +1:OC1低电平有效。 +CC1通道配置为输入: +该位选择是IC1还是IC1的反相信号作为触发或捕 +1 CC1P RW 获信号。 0 +0:不反相:捕获发生在IC1的上升沿;当用作外部 +触发器时,IC1不反相; +1:反相:捕获发生在IC1的下降沿;当用作外部触 +发器时,IC1反相。 +注:一旦LOCK级别(TIMx_BDTR寄存器中的LOCK +位)设为3或2,则该位不能被修改。 +比较捕获通道1输出使能位。 +CC1通道配置为输出: +0 CC1E RW 0:关闭。OC1禁止输出,因此OC1的输出电平依赖 0 +于 MOE、OSSI、OSSR、OIS1、OIS1N 和 CC1NE 位的 +值; +V2.4 204 + +# Page 208 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:开启。OC1信号输出到对应的输出引脚,其输出 +电平依赖于MOE、OSSI、OSSR、OIS1、OIS1N和CC1NE +位的值。 +CC1通道配置为输入: +该位决定了计数器的值是否能捕获入TIMx_CCR1寄 +存器。 +0:捕获禁止; +1:捕获使能。 +14.4.10 高级定时器的计数器(TIMx_CNT)(x=1/8/9/10) +偏移地址:0x24 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +[15:0] CNT[15:0] RW 定时器的计数器的实时值。 0 +14.4.11 计数时钟预分频器(TIMx_PSC)(x=1/8/9/10) +偏移地址:0x28 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PSC[15:0] +位 名称 访问 描述 复位值 +定时器的预分频器的分频系数;计数器的时钟频率 +[15:0] PSC[15:0] RW 0 +等于分频器的输入频率/(PSC+1)。 +14.4.12 自动重装值寄存器(TIMx_ATRLR)(x=1/8/9/10) +偏移地址:0x2C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ARR[15:0] +位 名称 访问 描述 复位值 +此域的值将会被装入计数器,ATRLR 何时动作和更 +[15:0] ARR[15:0] RW FFFFh +新见14.2.3章节;ATRLR为空时,计数器停止。 +14.4.13 重复计数值寄存器(TIMx_RPTCR)(x=1/8/9/10) +偏移地址:0x30 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved REP[7:0] +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +V2.4 205 + +# Page 209 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[7:0] REP[7:0] RW 重复计数器的值。 0 +14.4.14 比较/捕获寄存器 1(TIMx_CH1CVR)(x=1/8/9/10) +偏移地址:0x34 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR1[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR1[15:0] RW 比较捕获寄存器通道1的值。 0 +14.4.15 比较/捕获寄存器 2(TIMx_CH2CVR)(x=1/8/9/10) +偏移地址:0x38 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR2[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR2[15:0] RW 比较捕获寄存器通道2的值。 0 +14.4.16 比较/捕获寄存器 3(TIMx_CH3CVR)(x=1/8/9/10) +偏移地址:0x3C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR3[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR3[15:0] RW 比较捕获寄存器通道3的值。 0 +14.4.17 比较/捕获寄存器 4(TIMx_CH4CVR)(x=1/8/9/10) +偏移地址:0x40 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR4[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR4[15:0] RW 比较捕获寄存器通道4的值。 0 +14.4.18 刹车和死区寄存器(TIMx_BDTR)(x=1/8/9/10) +偏移地址:0x44 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MOE AOE BKP BKE OSSR OSSI LOCK[1:0] DTG[7:0] +位 名称 访问 描述 复位值 +15 MOE RW 主输出使能位。一旦刹车信号有效,将被异步清零。 0 +V2.4 206 + +# Page 210 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:禁止OCx和OCxN的输出或者强制为空闲状态; +1:允许OCx和OCxN设为输出。 +自动输出使能: +0:MOE只能被软件置位; +14 AOE RW 0 +1:MOE可以被软件置位或者在下一个更新事件中被 +置位。 +刹车输入极性设置位: +0:刹车输入低电平有效; +13 BKP RW 1:刹车输入高电平有效。 0 +注:当设置了LOCK级别1后,该位不能被修改。对 +该位的写需要一个PB时钟以后才能生效。 +刹车功能使能位: +0:禁止刹车输入; +12 BKE RW 1:开启刹车输入。 0 +注:当设置了LOCK级别1后,该位不能被修改。对 +该位的写需要一个PB时钟以后才能生效。 +0:当定时器不工作时,禁止OC/OCN输出; +1:当定时器不工作时,一旦 CCxE=1 或 CCxNE=1, +11 OSSR RW 首先开启 OC/OCN 并输出无效电平,然后置 OCx、 0 +OCxN使能输出信号=1。 +注:当设置了LOCK级别1后,该位不能被修改。 +0:当定时器不工作时,禁止OC/OCN输出; +1:当定时器不工作时,一旦 CCxE=1 或 CCxNE=1, +10 OSSI RW OC/OCN首先输出其空闲电平,然后OCx、OCxN使能 0 +输出信号=1。 +注:当设置了LOCK级别1后,该位不能被修改。 +锁定功能设置域: +00:关闭锁定功能; +01:锁定级别1,不能写DTG、BKE、BKP、AOE、OISx +和OISxN位; +10:锁定级别 2,不能写入锁定级别 1 中的各位, +[9:8] LOCK[1:0] RW 00b +也不能写入CC极性位以及OSSR和OSSI位; +11:锁定级别 3,不能写入锁定级别 2 中的各位, +也不能写入CC控制位。 +注:在系统复位后,只能写一次LOCK位,无法再次 +修改直到复位。 +死区设置位,这些位定义了互补输出之间的死区持 +续时间。 +假设DT表示其持续时间: +DTG[7:5]=0xx=>DT=DTG[7:0]*Tdtg,Tdtg =TDTS; +DTG[7:5]=10x=>DT=(64+DTG[5:0])*Tdtg,Tdtg= +[7:0] DTG[7:0] RW 0 +2*TDTS; +DTG[7:5]=110=>DT=(32+DTG[4:0])*Tdtg,Tdtg =8 +×TDTS; +DTG[7:5]=111=>DT=(32+DTG[4:0])*Tdtg,Tdtg =16 +*TDTS。 +V2.4 207 + +# Page 211 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:一旦 LOCK 级别(TIMx_BDTR 寄存器中的 +LOCK[1:0]位)设为01b、10b或11b,则不能修改 +这些位。 +14.4.19 DMA 控制寄存器(TIMx_DMACFGR)(x=1/8/9/10) +偏移地址:0x48 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DBL[4:0] Reserved DBA[4:0] +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +DMA连续传送的长度,实际值为此域的值+1。 +当对TIMx_DMAADR寄存器进行读或写时,定时器则 +进行一次连续传送),即:定义传输的次数,传输 +可以是半字(双字节)或字节: +00000:1次传输; +00001:2次传输; +00002:3次传输; +…… +…… +10001:18次传输。 +假 如 , 我 们 进 行 这 样 的 传 输 : DBL=7 , +DBA=TIM2_CTLR1。 +如果DBL=7,DBA=TIM2_CTLR1表示待传输数据的地 +[12:8] DBL[4:0] RW 0 +址,那么传输的地址由以下公式给出:(TIMx_CTLR1 +的地址)+DBA+(DMA索引),其中DMA索引=DBL, +其中(TIMx_CTLR1的地址)+DBA再加上7,给出了 +将要写入或者读出数据的地址,这样数据的传输将 +发生在从地址(TIMx_CR1的地址)+DBA开始的7个 +寄存器。根据DMA数据长度的设置,可能发生以下 +情况: +1、如果设置数据为半字(16位),那么数据就会传 +输给全部7个寄存器。 +2、如果设置数据为字节,数据仍然会传输给全部7 +个寄存器:第一个寄存器包含第一个MSB字节,第 +二个寄存器包含第一个LSB字节,依此类推。因此 +对于定时器,用户必须指定由DMA传输的数据宽度。 +[7:5] Reserved RO 保留。 0 +这些位定义了DMA在连续模式下从控制寄存器1所 +在地址的偏移量。 +00000:TIMx_CTLR1; +[4:0] DBA[4:0] RW 0 +00001:TIMx_CTLR2; +00010:TIMx_SMCFGR; +…… +V2.4 208 + +# Page 212 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +14.4.20 连续模式的 DMA 地址寄存器(TIMx_DMAADR)(x=1/8/9/10) +偏移地址:0x4C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DMAB[15:0] +位 名称 访问 描述 复位值 +连续模式下,DMA的地址。 +对TIMx_DMAADR寄存器的读或写会导致对以下地址 +所在寄存器的存取操作:TIMx_CTLR1地址+DBA+ DMA +索引,其中:“TIMx_CTLR1地址”是控制寄存器1 +[15:0] DMAB[15:0] RW 0 +(TIMx_CTLR1)所在的地址;“DBA”是 TIMx_ +DMACFGR寄存器中定义的基地址;“DMA索引”是由 +DMA自动控制的偏移量,它取决于TIMx_DMACFGR寄 +存器中定义的DBL。 +14.4.21 双边沿捕获寄存器(TIMx_AUX)(x=1/8/9/10) +偏移地址:0x50 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CAP_ED_CH4 CAP_ED_CH3 CAP_ED_CH2 +位 名称 访问 描述 复位值 +[15:3] Reserved R0 保留。 0 +通道4的双边沿捕获使能: +2 CAP_ED_CH4 RW 0:关闭通道4的双边沿捕获使能; 0 +1:使能通道4的双边沿捕获使能。 +通道3的双边沿捕获使能: +1 CAP_ED_CH3 RW 0:关闭通道3的双边沿捕获使能; 0 +1:使能通道3的双边沿捕获使能。 +通道2的双边沿捕获使能: +0 CAP_ED_CH2 RW 0:关闭通道2的双边沿捕获使能; 0 +1:使能通道2的双边沿捕获使能。 +注:TIMx_AUX 寄存器仅适用于 CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C批号倒数第六位不为0的产品。 +V2.4 209 + +# Page 213 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 15 章 通用定时器(GPTM) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +通用定时器模块包含四个16位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉 +冲宽度或者产生特定频率的脉冲、PWM波等。可用于自动化控制、电源等领域。 +注:对于CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品TIM5为32位,其他系列芯片的 +TIM5为16位。 +15.1 主要特征 +通用定时器的主要特征包括: + 16位自动重装计数器,支持增计数模式,减计数模式和增减计数模式 + 16位预分频器,分频系数从1~65536之间动态可调 + 支持四路独立的比较捕获通道 + 每路比较捕获通道支持多种工作模式,比如:输入捕获、输出比较、PWM生成和单脉冲输出 + 支持外部信号控制定时器 + 支持在多种模式下使用DMA + 支持增量式编码,定时器之间的级联和同步 +V2.4 210 + +# Page 214 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15.2 原理和结构 +图15-1 通用定时器的结构框图 +15.2.1 概述 +如图 15-1 所示,通用定时器的结构大致可以分为三部分,即输入时钟部分,核心计数器部分和 +比较捕获通道部分。 +通用定时器的时钟可以来自于HB总线时钟(CK_INT),可以来自外部时钟输入引脚(TIMx_ETR), +可以来自于其他具有时钟输出功能的定时器(ITRx),还可以来自于比较捕获通道的输入端(TIMx_CHx)。 +这些输入的时钟信号经过各种设定的滤波分频等操作后成为 CK_PSC 时钟,输出给核心计数器部分。 +另外,这些复杂的时钟来源还可以作为TRGO输出给其他的定时器、ADC和DAC等外设。 +通用定时器的核心是一个16位计数器(CNT)。CK_PSC经过预分频器(PSC)分频后,成为CK_CNT +再最终输给 CNT,CNT 支持增计数模式、减计数模式和增减计数模式,并有一个自动重装值寄存器 +(ATRLR)在每个计数周期结束后为CNT重装载初始化值。 +通用定时器拥有四组比较捕获通道,每组比较捕获通道都可以从专属的引脚上输入脉冲,也可以 +向引脚输出波形,即比较捕获通道支持输入和输出模式。比较捕获寄存器每个通道的输入都支持滤波、 +V2.4 211 +RTE_xMIT +Internal clock(CK_INT) +CK_TIMx from RCC +ETR Polarity selection & ETRF co T n r t i r g o g l e l r e r +Edge detector & Prescaler ETRP +TRGO +Input filter +ITR0 +TGI +ITR1 +ITR2 TRGI Slave mode +controller +ITR3 +TIF_ED +Reset, +Enable, +Up/Down, +TI1FP1 Encoder Count +TI2FP2 interface +AutoReload +U Register UI +U +1HC_xMIT +2HC_xMIT +3HC_xMIT +4HC_xMIT +CK_PSC CK_CNT +PSC CNT +(prescaler) (counter) +CC1I CC1I +TI1 Input filter TI1FP1 IC1 IICC11PPSS Capture/Compare OC1REF OC1 +& Edge detector Prescaler 1 Register +TI1FP2 +TRC CC2I U CC2I +TI2 & I E n d p g u e t d f e i t l e t c e t r o r T T I I 2 2 F F P P 1 2 IC2 Prescaler IC2PS Cap 2 t u R r e e g / i C s o t m e p r are OC2REF OC2 +TRC CC3I U CC3I +TI3 & I E n d p g u e t d f e i t l e t c e t r o r TI3FP3 IC3 Prescaler IC3PS Cap 3 t u R r e e g / i C s o t m e p r are OC3REF OC3 +TI3FP4 +TRC CC4I U CC4I +TI4 Input filter TI4FP3 IC4 IC4PS Capture/Compare OC4REF OC4 +& Edge detector Prescaler 4 Register +TI4FP4 +TRC U +Interrupt&DMA output Event Output control +Legend +Preload registers transferred to active registers on U event +Reg +according to control bit +1HC_xMIT +2HC_xMIT +3HC_xMIT +4HC_xMIT +To other timers +To DAC and ADC +Stop,clear,Up/Down + +# Page 215 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +分频、边沿检测等操作,并支持通道间的互触发,还能为核心计数器CNT提供时钟。每个比较捕获通 +道都拥有一组比较捕获寄存器(CHxCVR),支持与主计数器(CNT)进行比较而输出脉冲。 +15.2.2 通用定时器和高级定时器的区别 +与高级定时器相比,通用定时器缺少以下功能: +1) 通用定时器缺少对核心计数器的计数周期进行计数的重复计数寄存器。 +2) 通用定时器的比较捕获通道缺少死区产生,没有互补输出。 +3) 通用定时器没有刹车信号机制。 +4) 通用定时器的默认时钟CK_INT都来自PB1,而高级定时器的CK_INT都来自PB2。 +15.2.3 时钟输入 +本节论述CK_PSC的来源。此处截取通用定时器的整体结构框图的时钟源部分。 +图15-2 通用定时器CK_PSC来源框图 +TIMx_SMCR +TS[2:0] +ITRx +0xx +TI1_ED 100 or TI2F or +TI1FP1 TI1F or Encoder +TI2F_Rising 101 mode +TI2 Filter de E t d e g c e tor TI2F_Falling 0 1 T E I2 T F R P F 2 110 +111 +TRGI External clock +ICF[3:0] CC2P mode 1 +CK_PSC +TIMx_CCMR1 TIMx_CCER +ETRF External clock +mode 2 +ETR +0 +ETR pin 1 /1 D ,/ i 2 vi , d /4 e , r /8 E f T D R TS P dow F n i c lt o e u r nter (int C e K r _ n I a N l T clock) I m nt o e d r e nal clock +ETP ETPS[1:0] ETF[3:0] ECE SMS[2:0] +TIMx_SMCR TIMx_SMCR TIMx_SMCR TIMx_SMCR +可选的输入时钟可以分为4类: +1) 外部时钟引脚(ETR)输入的路线:ETR→ETRP→ETRF; +2) 内部PB时钟输入路线:CK_INT; +3) 来自比较捕获通道引脚(TIMx_CHx)的路线:TIMx_CHx→TIx→TIxFPx,此路线也用于编码器模 +式; +4) 来自内部其他定时器的输入:ITRx。 +通过决定CK_PSC来源的SMS的输入脉冲选择可以将实际的操作分为三类: +1) 选择内部时钟源(CK_INT); +2) 外部时钟源模式1; +3) 外部时钟源模式2; +4) 编码器模式。 +上文提到的4种时钟源来源都可通过这4种操作选定。 +15.2.3.1 内部时钟源(CK_INT) +如果将 SMS 域保持为 000b 时启动通用定时器,那么就是选定内部时钟源(CK_INT)为时钟。此 +时CK_INT就是CK_PSC。 +15.2.3.2 外部时钟源模式 1 +V2.4 212 + +# Page 216 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +如果将 SMS域设置为 111b时,就会启用外部时钟源模式 1。启用外部时钟源1时,TRGI被选定 +为CK_PSC的来源,值得注意的,用户还需要通过配置TS域来选择TRGI的来源。TS域可选择以下几 +种脉冲作为时钟来源: +1) 内部触发(ITRx,x为0,1,2,3); +2) 比较捕获通道1经过边沿检测器后的信号(TI1F_ED); +3) 比较捕获通道的信号TI1FP1、TI2FP2; +4) 来自外部时钟引脚输入的信号ETRF。 +15.2.3.3 外部时钟源模式 2 +使用外部触发模式2能在外部时钟引脚输入的每一个上升沿或下降沿计数。将ECE位置位时,将 +使用外部时钟源模式2。使用外部时钟源模式2时,ETRF被选定为CK_PSC。ETR引脚经过可选的反相 +器(ETP),分频器(ETPS)后成为ETRP,再经过滤波器(ETF)后即成为ETRF。 +在ECE位置位且将SMS设为111b时,那么,相当于TS选择ETRF为输入。 +15.2.3.4 编码器模式 +将SMS置为001b,010b,011b将会启用编码器模式。启用编码器模式可以选择在TI1FP1和TI2FP2 +中某一个特定的电平下以另一个跳变沿作为信号进行信号输出。此模式用于外接编码器使用的情况下。 +具体功能参考15.3.7节。 +15.2.4 计数器和周边 +CK_PSC输入给预分频器(PSC)进行分频。PSC是16位的,实际的分频系数相当于R16_TIMx_PSC +的值+1。CK_PSC经过PSC会成为CK_INT。更改R16_TIM1_PSC的值并不会实时生效,而会在更新事件 +后更新给PSC。更新事件包括UG位清零和复位。 +15.2.5 比较捕获通道 +比较捕获通道是定时器实现复杂功能的核心,它的核心是比较捕获寄存器,辅以外围输入部分的 +数字滤波,分频和通道间复用,输出部分的比较器和输出控制组成。比较捕获通道的结构框图如图15- +3所示。 +V2.4 213 + +# Page 217 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图15-3 比较捕获通道的结构框图 +TI1F_ED +To the slave mode controller +TI1 TI1F_Rising +Filter TI1F Edge 0 TI1FP1 +f DTS downcounter detector TI1F_Falling 1 01 +TI2FP1 IC1 Divider +10 +/1,/2,/4,/8 +ICF[3:0] CC1P/CC1NP +TRC +TIMx_CHCTLR1 TIMx_CCER 11 +(from slave mode +controller) +TI2F_Rising +0 +(from channel 2) CC1S[1:0] ICPS[1:0] CC1E +TI2F_Falling +1 TIMx_CCER +(from channel 2) +PB Bus +MCU-peripheral interface +Capture/compare preload register +Capture/compare shadow register +信号从通道 x 引脚输入进来后可选做为 TIx(TI1 的来源可以不只是 CH1,见定时器的框图 14- +1),TI1经过滤波器(ICF[3:0])生成TI1F,再经过边沿检测器分成TI1F_Rising和TI1F_Falling, +这两个信号经过选择(CC1P)生成TI1FP1,TI1FP1和来自通道 2的 TI2FP1一起送给 CC1S选择成为 +IC1,经过ICPS分频后送给比较捕获寄存器。 +比较捕获寄存器由一个预装载寄存器和一个影子寄存器组成,读写过程仅操作预装载寄存器。在 +捕获模式下,捕获发生在影子寄存器上,然后复制到预装载寄存器;在比较模式下,预装载寄存器的 +内容被复制到影子寄存器中,然后影子寄存器的内容与核心计数器(CNT)进行比较。 +15.3 功能和实现 +通用定时器复杂功能的实现都是对定时器的比较捕获通道、时钟输入电路和计数器及周边组件进 +行操作实现的。定时器的时钟输入可以来自于包括比较捕获通道的输入在内的多个时钟源。对比较捕 +V2.4 214 +8 +hgih +)tib-61 +fi( +8 +wol +TIMx_CHCTLR1 +Write CCR1H +Read CCR1H write_in_progress S S +read_in_progress +Write CCR1L Read CCR1L R +R +Output +CC1S[1] +capture_transfer compare_transfer mode +CC1S[0] +Input +CC1S[1] +mode OC1PE CC1S[0] OC1PE +UEV +TIMx_CHCTLR1 +(from time +IC1PS Capture Comparator base unit) +CC1E +CC1G Counter +TIM1_SWEVGR +To the master mode +ETRF controller +0 Output +OC1 +enable +1 circuit +CNT > CCR1 +Output OC1REF +mode +CNT = CCR1 controller CC1P +TIM1_CCER +CC1E +OC1M[2:0] TIM1_CCER +TIMx_CHCTLR1 + +# Page 218 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +获寄存通道和时钟源选择的操作直接决定其功能。比较捕获通道是双向的,可以工作在输入和输出模 +式。 +15.3.1 输入捕获模式 +输入捕获模式是定时器的基本功能之一。输入捕获模式的原理是,当检测到ICxPS信号上确定的 +边沿后,则产生捕获事件,计数器当前的值会被锁存到比较捕获寄存器(R16_TIMx_CHCTLRx)中。发 +生捕获事件时,CCxIF(在R16_TIMx_INTFR中)被置位,如果使能了中断或者DMA,还会产生相应中 +断或者DMA。如果发生捕获事件时,CCxIF已经被置位了,那么CCxOF位会被置位。CCxIF可由软件清 +除,也可以通过读取比较捕获寄存器由硬件清除。CCxOF由软件清除。 +举个通道1的例子来说明使用输入捕获模式的步骤,如下: +1) 配置CCxS域,选择ICx信号的来源。比如设为10b,选择TI1FP1作为IC1的来源,不可以使用 +默认设置,CCxS域默认是使比较捕获模块作为输出通道; +2) 配置ICxF域,设定TI信号的数字滤波器。数字滤波器会以确定的频率,采样确定的次数,再输 +出一个跳变。这个采样频率和次数是通过ICxF来确定的; +3) 配置CCxP位,设定TIxFPx的极性。比如保持CC1P位为低,选择上升沿跳变; +4) 配置ICxPS域,设定ICx信号成为ICxPS之间的分频系数。比如保持ICxPS为00b,不分频; +5) 配置CCxE位,允许捕获核心计数器(CNT)的值到比较捕获寄存器中。置CC1E位; +6) 根据需要配置CCxIE和CCxDE位,决定是否允许使能中断或者DMA。 +至此已经将比较捕获通道配置完成。 +当TI1输入了一个被捕获的脉冲时,核心计数器(CNT)的值会被记录到比较捕获寄存器中,CC1IF +被置位,当CC1IF在之前就已经被置位时,CCIOF位也会被置位。如果CC1IE位,那么会产生一个中 +断;如果CC1DE被置位,会产生一个DMA请求。可以通过写事件产生寄存器的方式(R16_TIMx_SWEVGR) +的方式由软件产生一个输入捕获事件。 +15.3.2 比较输出模式 +比较输出模式是定时器的基本功能之一。比较输出模式的原理是在核心计数器(CNT)的值与比 +较捕获寄存器的值一致时,输出特定的变化或波形。OCxM 域(在 R16_TIMx_CHCTLRx 中)和 CCxP 位 +(在 R16_TIMx_CCER 中)决定输出的是确定的高低电平还是电平翻转。产生比较一致事件时还会置 +CCxIF位,如果预先置了CCxIE位,则会产生一个中断;如果预先设置了CCxDE位,则会产生一个DMA +请求。 +配置为比较输出模式的步骤为下: +1) 配置核心计数器(CNT)的时钟源和自动重装值; +2) 设置好需要对比的计数值到比较捕获寄存器(R16_TIMx_CHxCVR)中; +3) 如果需要产生中断,置CCxIE位; +4) 保持OCxPE为0,禁用比较捕获寄存器的预装载寄存器; +5) 设定输出模式,设置OCxM域和CCxP位; +6) 使能输出,置CCxE位; +7) 置CEN位启动定时器; +15.3.3 强制输出模式 +定时器的比较捕获通道的输出模式可以由软件强制输出确定的电平,而不依赖比较捕获寄存器的 +影子寄存器和核心计数器的比较。 +具体的做法是将OCxM置为100b,即为强制将OCxREF置为低;或者将OCxM置为101b,即为强制 +将OCxREF置为高。 +需要注意的是,将 OCxM 强制置为 100b 或者 101b,内部主计数器和比较捕获寄存器的比较过程 +还在进行,相应的标志位还在置位,中断和DMA请求还在产生。 +V2.4 215 + +# Page 219 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15.3.4 PWM 输入模式 +PWM输入模式是用来测量PWM的占空比和频率的,是输入捕获模式的一种特殊情况。除下列区别 +外,操作和输入捕获模式相同:PWM占用两个比较捕获通道,且两个通道的输入极性设为相反,其中 +一个信号被设为触发输入,SMS设为复位模式。 +例如,测量从TI1输入的PWM波的周期和频率,需要进行以下操作: +1) 将TI1(TI1FP1)设为IC1信号的输入。将CC1S置为01b; +2) 将TI1FP1置为上升沿有效。将CC1P保持为0; +3) 将TI1(TI1FP2)置为IC2信号的输入。将CC2S置为10b; +4) 选TI1FP2置为下降沿有效。将CC2P置为1; +5) 时钟源的来源选择TI1FP1。将TS设为101b; +6) 将SMS设为复位模式,即100b; +7) 使能输入捕获。CC1E和CC2E置位。 +注:因只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1/TIMx_CH2。 +15.3.5 PWM 输出模式 +PWM 输出模式是定时器的基本功能之一。PWM 输出模式最常见的是使用重装值确定 PWM 频率,使 +用捕获比较寄存器确定占空比的方法。将 OCxM 域中置 110b 或者 111b 使用 PWM 模式 1 或者模式 2, +置 OCxPE 位使能预装载寄存器,最后置 ARPE 位使能预装载寄存器的自动重装载。在发生一个更新事 +件时,预装载寄存器的值才能被送到影子寄存器,所以在核心计数器开始计数之前,需要置 UG 位来 +初始化所有寄存器。在PWM模式下,核心计数器和比较捕获寄存器一直在进行比较,根据CMS位,定 +时器能够输出边沿对齐或者中央对齐的PWM信号。 + 边沿对齐 +使用边沿对齐时,核心计数器增计数或者减计数,在PWM模式1的情景下,在核心计数器的值大 +于比较捕获寄存器时,OCxREF上升为高;当核心计数器的值小于比较捕获寄存器时(比如核心计数器 +增长到R16_TIMx_ATRLR的值而恢复成全0时),OCxREF下降为低。 + 中央对齐 +使用中央对齐模式时,核心计数器运行在增计数和减计数交替进行的模式下,OCxREF在核心计数 +器和比较捕获寄存器的值一致时进行上升和下降的跳变。但比较标志在三种中央对齐模式下,置位的 +时机有所不同。在使用中央对齐模式时,最好在启动核心计数器之前产生一个软件更新标志(置 UG +位)。 +15.3.6 单脉冲模式 +单脉冲模式可以响应一个特定的事件,在一个延迟之后产生一个脉冲,延迟和脉冲的宽度可编程。 +置OPM位可以使核心计数器在产生下一个更新事件UEV时(计数器翻转到0)停止。 +V2.4 216 + +# Page 220 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图15-4 事件产生和脉冲响应 +如图15-4所示,需要在TI2输入引脚上检测到一个上升沿开始,延迟Tdelay之后,在OC1上产 +生一个长度为Tpulse的正脉冲: +1) 设定TI2为触发。置CC2S域为01b,把 TI2FP2映射到 TI2;置 CC2P位为 0b,TI2FP2设为上升 +沿检测;置TS域为110b,TI2FP2设为触发源;置SMS域为110b,TI2FP2被用来启动计数器; +2) Tdelay由比较捕获寄存器定义,Tpulse由自动重装值寄存器的值和比较捕获寄存器的值确定。 +15.3.7 编码器模式 +编码器模式是定时器的一个典型应用,可以用来接入编码器的双相输出,核心计数器的计数方向 +和编码器的转轴方向同步,编码器每输出一个脉冲就会使核心计数器加一或减一。使用编码器的步骤 +为:将SMS域置为001b(只在TI2边沿计数)、010b(只在TI1边沿计数)或者011b(在TI1和TI2 +双边沿计数),将编码器接到比较捕获通道 1、2 的输入端,设一个重装值计数器的值,这个值可以 +设的大一点。在编码器模式时,定时器内部的比较捕获寄存器,预分频器,重复计数寄存器等都正常 +工作。下表表明了计数方向和编码器信号的关系。 +表15-1定时器编码器模式的计数方向和编码器信号之间的关系 +相对信号 TI1FP1信号边沿 TI2FP2信号 +计数有效边沿 +的电平 上升沿 下降沿 上升沿 下降沿 +高 向下计数 向上计数 +仅在TI1边沿计数 不计数 +低 向上计数 向下计数 +高 向上计数 向下计数 +仅在TI2边沿计数 不计数 +低 向下计数 向上计数 +高 向下计数 向上计数 向上计数 向下计数 +在TI1和TI2双边沿计数 +低 向上计数 向下计数 向下计数 向上计数 +15.3.8 定时器同步模式 +定时器能够输出时钟脉冲(TRGO),也能接收其他定时器的输入(ITRx)。不同的定时器的ITRx +的来源(别的定时器的TRGO)是不一样的。定时器内部触发连接如表15-2所示。 +表15-2 GTPM内部触发连接 +ITR0 ITR1 ITR2 ITR3 +从定时器 +(TS=000) (TS=001) (TS=010) (TS=011) +TIM2 TIM1 TIM8/USB/ETH TIM3 TIM4 +V2.4 217 + +# Page 221 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +TIM3 TIM1 TIM2 TIM5 TIM4 +TIM4 TIM1 TIM2 TIM3 TIM8 +TIM5 TIM2 TIM3 TIM4 TIM8 +15.3.9 双边沿捕获模式 +可通过TIMx_AUX寄存器对脉冲进行测量。 +例如:通过通道2来捕获脉冲宽度,在捕获功能配置上,选择IC2信号的来源(TIMx_CHCTLR1寄 +存器的 CC2S 位为 11b),使能通道 2 的双边沿捕获功能(TIMx_AUX 寄存器的 CAP_ED_CH2 位为 1)。 +至此已经将双边沿捕获配置完成。 +可通过TIMx_CH2CVR寄存器的CCR2位读取捕获的双边沿脉冲宽度值。 +注:仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数第 +六位不为0的产品。 +15.3.10 调试模式 +当系统进入调试模式时,根据DBG模块的设置可以控制定时器继续运转或者停止。 +15.4 寄存器描述 +表15-3 TIM2相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM2_CTLR1 0x40000000 TIM2控制寄存器1 0x0000 +R16_TIM2_CTLR2 0x40000004 TIM2控制寄存器2 0x0000 +R16_TIM2_SMCFGR 0x40000008 TIM2从模式控制寄存器 0x0000 +R16_TIM2_DMAINTENR 0x4000000C TIM2 DMA/中断使能寄存器 0x0000 +R16_TIM2_INTFR 0x40000010 TIM2中断状态寄存器 0x0000 +R16_TIM2_SWEVGR 0x40000014 TIM2事件产生寄存器 0x0000 +R16_TIM2_CHCTLR1 0x40000018 TIM2比较/捕获控制寄存器1 0x0000 +R16_TIM2_CHCTLR2 0x4000001C TIM2比较/捕获控制寄存器2 0x0000 +R16_TIM2_CCER 0x40000020 TIM2比较/捕获使能寄存器 0x0000 +R16_TIM2_CNT 0x40000024 TIM2计数器 0x0000 +R16_TIM2_PSC 0x40000028 TIM2计数时钟预分频器 0x0000 +R16_TIM2_ATRLR 0x4000002C TIM2自动重装值寄存器 0xFFFF +R16_TIM2_CH1CVR 0x40000034 TIM2比较/捕获寄存器1 0x0000 +R16_TIM2_CH2CVR 0x40000038 TIM2比较/捕获寄存器2 0x0000 +R16_TIM2_CH3CVR 0x4000003C TIM2比较/捕获寄存器3 0x0000 +R16_TIM2_CH4CVR 0x40000040 TIM2比较/捕获寄存器4 0x0000 +R16_TIM2_DMACFGR 0x40000048 TIM2 DMA控制寄存器 0x0000 +R16_TIM2_DMAADR 0x4000004C TIM2连续模式的DMA地址寄存器 0x0000 +R16_TIM2_AUX 0x40000050 TIM2双边沿捕获寄存器 0x0000 +表15-4 TIM3相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM3_CTLR1 0x40000400 TIM3控制寄存器1 0x0000 +R16_TIM3_CTLR2 0x40000404 TIM3控制寄存器2 0x0000 +R16_TIM3_SMCFGR 0x40000408 TIM3从模式控制寄存器 0x0000 +V2.4 218 + +# Page 222 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_TIM3_DMAINTENR 0x4000040C TIM3 DMA/中断使能寄存器 0x0000 +R16_TIM3_INTFR 0x40000410 TIM3中断状态寄存器 0x0000 +R16_TIM3_SWEVGR 0x40000414 TIM3事件产生寄存器 0x0000 +R16_TIM3_CHCTLR1 0x40000418 TIM3比较/捕获控制寄存器1 0x0000 +R16_TIM3_CHCTLR2 0x4000041C TIM3比较/捕获控制寄存器2 0x0000 +R16_TIM3_CCER 0x40000420 TIM3比较/捕获使能寄存器 0x0000 +R16_TIM3_CNT 0x40000424 TIM3计数器 0x0000 +R16_TIM3_PSC 0x40000428 TIM3计数时钟预分频器 0x0000 +R16_TIM3_ATRLR 0x4000042C TIM3自动重装值寄存器 0xFFFF +R16_TIM3_CH1CVR 0x40000434 TIM3比较/捕获寄存器1 0x0000 +R16_TIM3_CH2CVR 0x40000438 TIM3比较/捕获寄存器2 0x0000 +R16_TIM3_CH3CVR 0x4000043C TIM3比较/捕获寄存器3 0x0000 +R16_TIM3_CH4CVR 0x40000440 TIM3比较/捕获寄存器4 0x0000 +R16_TIM3_DMACFGR 0x40000448 TIM3 DMA控制寄存器 0x0000 +R16_TIM3_DMAADR 0x4000044C TIM3连续模式的DMA地址寄存器 0x0000 +R16_TIM3_AUX 0x40000450 TIM3双边沿捕获寄存器 0x0000 +表15-5 TIM4相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM4_CTLR1 0x40000800 TIM4控制寄存器1 0x0000 +R16_TIM4_CTLR2 0x40000804 TIM4控制寄存器2 0x0000 +R16_TIM4_SMCFGR 0x40000808 TIM4从模式控制寄存器 0x0000 +R16_TIM4_DMAINTENR 0x4000080C TIM4 DMA/中断使能寄存器 0x0000 +R16_TIM4_INTFR 0x40000810 TIM4中断状态寄存器 0x0000 +R16_TIM4_SWEVGR 0x40000814 TIM4事件产生寄存器 0x0000 +R16_TIM4_CHCTLR1 0x40000818 TIM4比较/捕获控制寄存器1 0x0000 +R16_TIM4_CHCTLR2 0x4000081C TIM4比较/捕获控制寄存器2 0x0000 +R16_TIM4_CCER 0x40000820 TIM4比较/捕获使能寄存器 0x0000 +R16_TIM4_CNT 0x40000824 TIM4计数器 0x0000 +R16_TIM4_PSC 0x40000828 TIM4计数时钟预分频器 0x0000 +R16_TIM4_ATRLR 0x4000082C TIM4自动重装值寄存器 0xFFFF +R16_TIM4_CH1CVR 0x40000834 TIM4比较/捕获寄存器1 0x0000 +R16_TIM4_CH2CVR 0x40000838 TIM4比较/捕获寄存器2 0x0000 +R16_TIM4_CH3CVR 0x4000083C TIM4比较/捕获寄存器3 0x0000 +R16_TIM4_CH4CVR 0x40000840 TIM4比较/捕获寄存器4 0x0000 +R16_TIM4_DMACFGR 0x40000848 TIM4 DMA控制寄存器 0x0000 +R16_TIM4_DMAADR 0x4000084C TIM4连续模式的DMA地址寄存器 0x0000 +R16_TIM4_AUX 0x40000850 TIM4双边沿捕获寄存器 0x0000 +表15-6 TIM5相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM5_CTLR1 0x40000C00 TIM5控制寄存器1 0x0000 +R16_TIM5_CTLR2 0x40000C04 TIM5控制寄存器2 0x0000 +R16_TIM5_SMCFGR 0x40000C08 TIM5从模式控制寄存器 0x0000 +V2.4 219 + +# Page 223 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_TIM5_DMAINTENR 0x40000C0C TIM5 DMA/中断使能寄存器 0x0000 +R16_TIM5_INTFR 0x40000C10 TIM5中断状态寄存器 0x0000 +R16_TIM5_SWEVGR 0x40000C14 TIM5事件产生寄存器 0x0000 +R16_TIM5_CHCTLR1 0x40000C18 TIM5比较/捕获控制寄存器1 0x0000 +R16_TIM5_CHCTLR2 0x40000C1C TIM5比较/捕获控制寄存器2 0x0000 +R16_TIM5_CCER 0x40000C20 TIM5比较/捕获使能寄存器 0x0000 +R32_TIM5_CNT 0x40000C24 TIM5计数器 0x0000 +R16_TIM5_PSC 0x40000C28 TIM5计数时钟预分频器 0x0000 +R32_TIM5_ATRLR 0x40000C2C TIM5自动重装值寄存器 0x0000FFFF +R32_TIM5_CH1CVR 0x40000C34 TIM5比较/捕获寄存器1 0x00000000 +R32_TIM5_CH2CVR 0x40000C38 TIM5比较/捕获寄存器2 0x00000000 +R32_TIM5_CH3CVR 0x40000C3C TIM5比较/捕获寄存器3 0x00000000 +R32_TIM5_CH4CVR 0x40000C40 TIM5比较/捕获寄存器4 0x00000000 +R16_TIM5_DMACFGR 0x40000C48 TIM5 DMA控制寄存器 0x0000 +R16_TIM5_DMAADR 0x40000C4C TIM5连续模式的DMA地址寄存器 0x0000 +R16_TIM5_AUX 0x40000C50 TIM5双边沿捕获寄存器 0x0000 +15.4.1 控制寄存器 1(TIMx_CTLR1)(x=2/3/4/5) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CKD[1:0] ARPE CMS[1:0] DIR OPM URS UDIS CEN +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留。 0 +这2位定义在定时器时钟(CK_INT)频率、数字滤 +波器所用的采样时钟之间的分频比例: +00:Tdts=Tck_int; +[9:8] CKD[1:0] RW 00b +01:Tdts= 2xTck_int; +10:Tdts= 4xTck_int; +11:保留。 +自动重装预装使能位: +7 ARPE RW 0:禁止自动重装值寄存器(ATRLR); 0 +1:使能自动重装值寄存器(ATRLR)。 +中央对齐模式选择: +00:边沿对齐模式。计数器依据方向位(DIR)向上 +或向下计数。 +01:中央对齐模式 1。计数器交替地向上和向下计 +数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) +[6:5] CMS[1:0] RW 的输出比较中断标志位,只在计数器向下计数时被 00b +设置。 +10:中央对齐模式 2。计数器交替地向上和向下计 +数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) +的输出比较中断标志位,只在计数器向上计数时被 +设置。 +V2.4 220 + +# Page 224 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +11:中央对齐模式 3。计数器交替地向上和向下计 +数。配置为输出的通道(CHCTLRx寄存器中CCxS=00) +的输出比较中断标志位,在计数器向上和向下计数 +时均被设置。 +注:在计数器使能时(CEN=1),不允许从边沿对齐 +模式转换到中央对齐模式。 +计数器方向: +0:计数器的计数模式为增计数; +4 DIR RW 1:计数器的计数模式为减计数。 0 +注:当计数器配置为中央对齐模式或编码器模式时, +该位无效。 +单脉冲模式。 +0:在发生下一次更新事件时,计数器不停止; +3 OPM RW 0 +1:在发生下一次更新事件(清除CEN位)时,计数 +器停止。 +更新请求源,软件通过该位选择UEV事件的源。 +0:如果使能了更新中断或DMA请求,则下述任一事 +件产生更新中断或DMA请求。 +-计数器溢出/下溢 +2 URS RW 0 +-设置UG位 +-从模式控制器产生的更新 +1:如果使能了更新中断或DMA请求,则只有计数器 +溢出/下溢才产生更新中断或DMA请求。 +禁止更新,软件通过该位允许/禁止 UEV 事件的产 +生。 +0:允许 UEV。更新(UEV)事件由下述任一事件产 +生:-计数器溢出/下溢 +-设置UG位 +1 UDIS RW -从模式控制器产生的更新具有缓存的寄存器被装 0 +入它们的预装载值。 +1:禁止UEV。不产生更新事件,各寄存器(ATRLR、 +PSC、CHCTLRx)保持它们的值。如果设置了UG位或 +从模式控制器发出了一个硬件复位,则计数器和预 +分频器被重新初始化。 +使能计数器(Counter enable): +0:禁止计数器; +1:使能计数器。 +0 CEN RW 0 +注:在软件设置了CEN位后,外部时钟、门控模式 +和编码器模式才能工作。触发模式可以自动地通过 +硬件设置CEN位。 +15.4.2 控制寄存器 2(TIMx_CTLR2)(x=2/3/4/5) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TI1S MMS[2:0] CCDS CCUS Reserved CCPC +V2.4 221 + +# Page 225 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +TI1选择: +0:TIMx_CH1引脚直连到TI1输入; +7 TI1S RW 0 +1:TIMx_CH1、TIMx_CH2和TIMx_CH3引脚经异或后 +连到TI1输入。 +主模式选择:这3位用于选择在主模式下送到从定 +时器的同步信息(TRGO)。可能的组合如下: +000:复位–UG位被用于作为触发输出(TRGO)。如 +果是触发输入产生的复位(从模式控制器处于复位 +模式),则TRGO上的信号相对实际的复位会有一个 +延迟; +001:使能–计数器使能信号CNT_EN被用于作为触 +发输出(TRGO)。有时需要在同一时间启动多个定 +时器或控制在一段时间内使能从定时器。计数器使 +能信号是通过CEN控制位和门控模式下的触发输入 +信号的逻辑或产生。当计数器使能信号受控于触发 +[6:4] MMS[2:0] RW 输入时,TRGO 上会有一个延迟,除非选择了主/从 000b +模式(见TIMx_SMCFGR寄存器中MSM位的描述); +010:更新事件被选为触发输出(TRGO)。例如,一 +个主定时器的时钟可以被用作一个从定时器的预分 +频器; +011:比较脉冲,在发生一次捕获或一次比较成功时, +当要设置CC1IF标志时(即使它已经为高),触发 +输出送出一个正脉冲(TRGO); +100:OC1REF信号被用于作为触发输出(TRGO; +101:OC2REF信号被用于作为触发输出(TRGO); +110:OC3REF信号被用于作为触发输出(TRGO); +111:OC4REF信号被用于作为触发输出(TRGO)。 +0:当发生CHxCVR时,产生CHxCVR的DMA请求; +3 CCDS RW 0 +1:当发生更新事件时,送出CHxCVR的DMA请求。 +比较捕获控制更新选择位: +0:如果CCPC置位,只能通过设置COM位更新它们; +2 CCUS RW 1:如果CCPC置位,可以通过设置COM位或TRGI上 0 +的一个上升沿更新它们。 +注:该位只对具有互补输出的通道起作用。 +1 Reserved RO 保留。 0 +比较捕获预装载控制位: +0:CCxE,CCxNE和OCxM位不是预装载的; +0 CCPC RW 1:CCxE,CCxNE 和 OCxM 位是预装载的,设置该位 0 +后,它们只在设置了COM位后被更新。 +注:该位只对具有互补输出的通道起作用。 +15.4.3 从模式控制寄存器(TIMx_SMCFGR)(x=2/3/4/5) +偏移地址:0x08 +V2.4 222 + +# Page 226 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ETP ECE ETPS[1:0] ETF[3:0] MSM TS[2:0] Reserved SMS[2:0] +位 名称 访问 描述 复位值 +ETR 触发极性选择,该位选择是直接输入 ETR 还是 +输入ETR的反相。 +15 ETP RO 0 +0:ETR,高电平或上升沿有效; +1:将ETR反相,低电平或下降沿有效。 +外部时钟模式2启用选择: +0:禁用外部时钟模式2; +1:使能外部时钟模式2。 +注1:从模式可以与外部时钟模式2同时使用:复 +14 ECE RW 0 +位模式,门控模式和触发模式;但是,这时TRGI不 +能连到ETRF(TS位不能是111b)。 +注2:外部时钟模式1和外部时钟模式2同时被使 +能时,外部时钟的输入是ETRF。 +外部触发信号(ETRP)分频,这个信号频率最大不 +能超过是 TIMxCLK 频率的 1/4,可以通过这个域来 +降频。 +[13:12] ETPS[1:0] RW 00:关闭预分频; 00b +01:ETRP频率除以2; +10:ETRP频率除以4; +11:ETRP频率除以8。 +外部触发滤波,实际上,数字滤波器是一个事件计 +数器,它使用一定的采样的频率,记录到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; +[11:8] ETF[3:0] RW 0110:采样频率Fsampling=Fdts/4,N=6; 0000b +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。 +主/从模式选择: +7 MSM RW 0:不发挥作用; 0 +1:触发输入(TRGI)上的事件被延迟了,以允许在 +V2.4 223 + +# Page 227 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +当前定时器(通过TRGO)与它的从定时器间的完美 +同步。这对要求把几个定时器同步到一个单一的外 +部事件时是非常有用的。 +触发选择域,这3位选择用于同步计数器的触发输 +入源。 +000:内部触发0(ITR0); +100:TI1的边沿检测器(TI1F_ED); +001:内部触发1(ITR1); +[6:4] TS[2:0] RW 101:滤波后的定时器输入1(TI1FP1); 000b +010:内部触发2(ITR2); +110:滤波后的定时器输入2(TI2FP2); +011:内部触发3(ITR3); +111:外部触发输入(ETRF); +以上只有在SMS为0时改变。 +3 Reserved RO 保留。 0 +输入模式选择域。选择核心计数器的时钟和触发模 +式。 +000:由内部时钟CK_INT驱动; +001:编码器模式 1,根据 TI1FP1 的电平,核心计 +数器在TI2FP2的边沿增减计数; +010:编码器模式 2,根据 TI2FP2 的电平,核心计 +数器在TI1FP1的边沿增减计数; +011:编码器模式3,根据另一个信号的输入电平, +核心计数器在TI1FP1和TI2FP2的边沿增减计数; +[2:0] SMS[2:0] RW 000b +100:复位模式,触发输入(TRGI)的上升沿将初始 +化计数器,并且产生一个更新寄存器的信号; +101:门控模式,当触发输入(TRGI)为高时,计数 +器的时钟开启;在触发输入变为低,计数器停止, +计数器的启停都是受控的; +110:触发模式,计数器在触发输入TRGI的上升沿 +启动,只有计数器的启动是受控的; +111:外部时钟模式1,选中的触发输入(TRGI)的 +上升沿驱动计数器。 +15.4.4 DMA/中断使能寄存器(TIMx_DMAINTENR)(x=2/3/4/5) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserv COMD CC4D CC3D CC2D CC1D UD Reserve Reser CC4I CC3I CC2I CC1I +TDE TIE UIE +ed E E E E E E d ved E E E E +位 名称 访问 描述 复位值 +15 Reserved RO 保留。 0 +触发DMA请求使能位: +14 TDE RW 0:禁止触发DMA请求; 0 +1:允许触发DMA请求。 +V2.4 224 + +# Page 228 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +COM的DMA请求使能位: +13 COMDE RW 0:禁止COM的DMA请求; 0 +1:允许COM的DMA请求。 +比较捕获通道4的DMA请求使能位: +12 CC4DE RW 0:禁止比较捕获通道4的DMA请求; 0 +1:允许比较捕获通道4的DMA请求。 +比较捕获通道3的DMA请求使能位: +11 CC3DE RW 0:禁止比较捕获通道3的DMA请求; 0 +1:允许比较捕获通道3的DMA请求。 +比较捕获通道2的DMA请求使能位: +10 CC2DE RW 0:禁止比较捕获通道2的DMA请求; 0 +1:允许比较捕获通道2的DMA请求。 +比较捕获通道1的DMA请求使能位: +9 CC1DE RW 0:禁止比较捕获通道1的DMA请求; 0 +1:允许比较捕获通道1的DMA请求。 +更新的DMA请求使能位: +8 UDE RW 0:禁止更新的DMA请求; 0 +1:允许更新的DMA请求。 +7 Reserved RO 保留。 0 +触发中断使能位: +6 TIE RW 0:禁止触发中断; 0 +1:使能触发中断。 +5 Reserved RO 保留。 0 +比较捕获通道4中断使能位: +4 CC4IE RW 0:禁止比较捕获通道4中断; 0 +1:允许比较捕获通道4中断。 +比较捕获通道3中断使能位: +3 CC3IE RW 0:禁止比较捕获通道3中断; 0 +1:允许比较捕获通道3中断。 +比较捕获通道2中断使能位: +2 CC2IE RW 0:禁止比较捕获通道2中断; 0 +1:允许比较捕获通道2中断。 +比较捕获通道1中断使能位: +1 CC1IE RW 0:禁止比较捕获通道1中断; 0 +1:允许比较捕获通道1中断。 +更新中断使能位: +0 UIE RW 0:禁止更新中断; 0 +1:允许更新中断。 +15.4.5 中断状态寄存器(TIMx_INTFR)(x=2/3/4/5) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CC4OF CC3OF CC2OF CC1OF Reserved TIF Reserved CC4IF CC3IF CC2IF CC1IF UIF +V2.4 225 + +# Page 229 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +12 CC4OF RW0 比较捕获通道4重复捕获标志位。 0 +11 CC3OF RW0 比较捕获通道3重复捕获标志位。 0 +10 CC2OF RW0 比较捕获通道2重复捕获标志位。 0 +比较捕获通道1重复捕获标志位,仅用于比较捕获 +通道被配置为输入捕获模式时。该标记由硬件置 +位,软件写0可清除此位。 +9 CC1OF RW0 0 +0:无重复捕获产生; +1:计数器的值被捕获到捕获比较寄存器时,CC1IF +的状态已经被置位。 +[8:7] Reserved RO 保留。 0 +触发器中断标志位,当发生触发事件时由硬件对该 +位置位,由软件清零。触发事件包括从除门控模式 +外的其它模式时,在TRGI输入端检测到有效边沿, +6 TIF RW0 0 +或门控模式下的任一边沿。 +0:无触发器事件产生; +1:触发器事件产生。 +5 Reserved RO 保留。 0 +4 CC4IF RW0 比较捕获通道4中断标志位。 0 +3 CC3IF RW0 比较捕获通道3中断标志位。 0 +2 CC2IF RW0 比较捕获通道2中断标志位。 0 +比较捕获通道1中断标志位。 +如果比较捕获通道配置为输出模式,当计数器值与 +比较值匹配时该位由硬件置位,但在中心对称模式 +下除外。该位由软件清零。 +0:无匹配发生。 +1 CC1IF RW0 1:核心计数器的值与比较捕获寄存器1的值匹配。 0 +如果比较捕获通道1配置为输入模式,当捕获事件 +发生时该位由硬件置位,它由软件清零或通过读比 +较捕获寄存器清零。 +0:无输入捕获产生; +1:计数器值已被捕获比较捕获寄存器1。 +更新中断标志位,当产生更新事件时该位由硬件置 +位,由软件清零。 +0:无更新事件产生; +1:更新中断产生。 +以下情形会产生更新事件: +0 UIF RW0 0 +若UDIS=0,当重复计数器数值上溢或下溢时; +若URS=0、UDIS=0,当置UG位时,或当通过软件对 +计数器核心计数器重新初始化时; +若 URS=0、UDIS=0,当计数器 CNT 被触发事件重新 +初始化时。 +15.4.6 事件产生寄存器(TIMx_SWEVGR)(x=2/3/4/5) +偏移地址:0x14 +V2.4 226 + +# Page 230 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved BG TG COMG CC4G CC3G CC2G CC1G UG +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +刹车事件产生位,此位由软件置位和清零,用来产 +生一个刹车事件。 +7 BG WO 0:无动作; 0 +1:产生一个刹车事件。此时MOE=0、BIF=1,若使能 +对应的中断和DMA,则产生相应的中断和DMA。 +触发事件产生位,该位由软件置位,硬件清零,用 +于产生一个触发事件。 +6 TG WO 0:无动作; 0 +1:产生一个触发事件,TIF被置位,若使能对应的 +中断和DMA,则产生相应的中断和DMA。 +比较捕获控制更新产生位。产生比较捕获控制更新 +事件。该位由软件置位,由硬件自动清零。 +0:无动作; +5 COMG WO 0 +1:当CCPC=1,允许更新CCxE、CCxNE、OCxM位。 +注:该位只对拥有互补输出的通道(通道1,2,3) +有效。 +4 CC4G WO 比较捕获事件产生位4。产生比较捕获事件4。 0 +3 CC3G WO 比较捕获事件产生位3。产生比较捕获事件3。 0 +2 CC2G WO 比较捕获事件产生位2。产生比较捕获事件2。 0 +比较捕获事件产生位1,产生比较捕获事件1。该位 +由软件置位,由硬件清零。用于产生一个比较捕获 +事件。 +0:无动作; +1:在比较捕获通道1上产生一个比较捕获事件: +1 CC1G WO 若比较捕获通道1配置为输出:置CC1IF位。若使 0 +能对应的中断和DMA,则产生相应的中断和DMA; +若比较捕获通道1配置为输入:当前核心计数器的 +值被捕获至比较捕获寄存器 1;置 CC1IF 位,若使 +能了对应的中断和DMA,则产生相应的中断和DMA。 +若CC1IF已经置位,则置CC1OF位。 +更新事件产生位,产生更新事件。该位由软件置位, +由硬件自动清零。 +0:无动作; +1:初始化计数器,并产生一个更新事件。 +0 UG WO 0 +注:预分频器的计数器也被清零,但是预分频系数 +不变。若在中心对称模式下或增计数模式下则核心 +计数器被清零;若减计数模式下则核心计数器取重 +装值寄存器的值。 +15.4.7 比较/捕获控制寄存器 1(TIMx_CHCTLR1)(x=2/3/4/5) +V2.4 227 + +# Page 231 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x18 +通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的 CCxS 位定义。该寄存 +器其它位的作用在输入和输出模式下不同。OCxx 描述了通道在输出模式下的功能,ICxx 描述了通道 +在输入模式下的功能。 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OC2CE OC2M[2:0] OC2PE OC2FE OC1CE OC1M[2:0] OC1PE OC1FE +CC2S[1:0] CC1S[1:0] +IC2F[3:0] IC2PSC[1:0] IC1F[3:0] IC1PSC[1:0] +比较模式(引脚方向为输出): +位 名称 访问 描述 复位值 +比较捕获通道2清零使能位: +0:OC2REF不受ETRF输入的影响; +15 OC2CE RW 0 +1:一旦检测到 ETRF 输入高电平,清除 OC2REF 位 +零。 +比较捕获通道2模式设置域。 +该 3 位定义了输出参考信号 OC2REF 的动作,而 +OC2REF决定了OC2、OC2N的值。OC2REF是高电平有 +效,而OC2和OC2N的有效电平取决于CC2P、CC2NP +位。 +000:冻结。比较捕获寄存器的值与核心计数器间的 +比较值对OC2REF不起作用; +001:强制设为有效电平。当核心计数器与比较捕获 +寄存器2的值相同时,强制OC2REF为高; +010:强制设为无效电平。当核心计数器的值与比较 +捕获寄存器2相同时,强制OC2REF为低; +011:翻转。当核心计数器与比较捕获寄存器2的值 +相同时,翻转OC2REF的电平。 +100:强制为无效电平。强制OC2REF为低。 +[14:12] OC2M[2:0] RW 101:强制为有效电平。强制OC2REF为高。 000b +110:PWM模式1:在向上计数时,一旦核心计数器 +小于比较捕获寄存器的值时,通道2为有效电平, +否则为无效电平;在向下计数时,一旦核心计数器 +大于比较捕获寄存器的值时,通道 2 为无效电平 +(OC2REF=0),否则为有效电平(OC2REF=1)。 +111:PWM模式2:在向上计数时,一旦核心计数器 +小于比较捕获寄存器的值时,通道2为无效电平, +否则为有效电平;在向下计数时,一旦核心计数器 +大于比较捕获寄存器的值时,通道 2 为有效电平 +(OC2REF=1),否则为无效电平(OC2REF=0)。 +注:一旦LOCK级别设为3并且CC2S=00b则该位不 +能被修改。在PWM模式1或PWM模式2中,只有当 +比较结果改变了或在输出比较模式中从冻结模式切 +换到PWM模式时,OC2REF电平才改变。 +V2.4 228 + +# Page 232 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +比较捕获寄存器2预装载使能位: +0:禁止比较捕获寄存器2的预装载功能,可随时写 +入比较捕获寄存器 2,并且新写入的数值立即起作 +用; +1:开启比较捕获寄存器2的预装载功能,读写操作 +仅对预装载寄存器操作,比较捕获寄存器2的预装 +11 OC2PE RW 0 +载值在更新事件到来时被加载至当前影子寄存器 +中。 +注:一旦LOCK级别设为3并且CC2S=00,则该位不 +能被修改。仅仅在单脉冲模式下(OPM=1)可以在未 +确认预装载寄存器情况下使用PWM模式,否则其动 +作不确定。 +比较捕获通道2快速使能位,该位用于加快比较捕 +获通道输出对触发输入事件的响应。 +0:根据计数器与比较捕获寄存器1的值,比较捕获 +通道2正常操作,即使触发器是打开的。当触发器 +的输入有一个有效沿时,激活比较捕获通道2输出 +的最小延时为5个时钟周期; +10 OC2FE RW 0 +1:输入到触发器的有效沿的作用就像发生了一次比 +较匹配。因此,OC被设置为比较电平而与比较结果 +无关。采样触发器的有效沿和比较捕获通道2输出 +间的延时被缩短为3个时钟周期。 +注:OC2FE只在通道被配置成PWM1或PWM2模式时 +起作用。 +比较捕获通道2输入选择域: +00:比较捕获通道2被配置为输出; +01:比较捕获通道2被配置为输入,IC2映射在TI2 +上; +10:比较捕获通道2被配置为输入,IC2映射在TI1 +[9:8] CC2S[1:0] RW 上; 00b +11:比较捕获通道2被配置为输入,IC2映射在TRC +上。此模式仅工作在内部触发器输入被选中时(由 +TS位选择)。 +注:比较捕获通道2仅在通道关闭时(CC2E为零时) +才是可写的。 +7 OC1CE RW 比较捕获通道1清零使能位。 0 +[6:4] OC1M[2:0] RW 比较捕获通道1模式设置域。 0 +3 OC1PE RW 比较捕获寄存器1预装载使能位。 0 +2 OC1FE RW 比较捕获通道1快速使能位。 0 +[1:0] CC1S[1:0] RW 比较捕获通道1输入选择域。 0 +捕获模式(引脚方向为输入): +位 名称 访问 描述 复位值 +输入捕获滤波器2配置域,这几位设置了TI1输入 +[15:12] IC2F[3:0] RW 0000b +的采样频率及数字滤波器长度。数字滤波器由一个 +V2.4 229 + +# Page 233 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +事件计数器组成,它记录到N个事件后会产生一个 +输出的跳变。 +0000:无滤波器,以fDTS采样; +1000:采样频率Fsampling=Fdts/8,N=6; +0001:采样频率Fsampling=Fck_int,N=2; +1001:采样频率Fsampling=Fdts/8,N=8; +0010:采样频率Fsampling=Fck_int,N=4; +1010:采样频率Fsampling=Fdts/16,N=5; +0011:采样频率Fsampling=f=Fck_int,N=8; +1011:采样频率Fsampling=Fdts/16,N=6; +0100:采样频率Fsampling=Fdts/2,N=6; +1100:采样频率Fsampling=Fdts/16,N=8; +0101:采样频率Fsampling=Fdts/2,N=8; +1101:采样频率Fsampling=Fdts/32,N=5; +0110:采样频率Fsampling=Fdts/4,N=6; +1110:采样频率Fsampling=Fdts/32,N=6; +0111:采样频率Fsampling=Fdts/4,N=8; +1111:采样频率Fsampling=Fdts/32,N=8。 +比较捕获通道2预分频配置域,这2位定义了比较 +捕获通道2的预分频系数。一旦CC1E=0,则预分频 +器复位。 +00:无预分频器,捕获输入口上检测到的每一个边 +[11:10] IC2PSC[1:0] RW 00b +沿都触发一次捕获; +01:每2个事件触发一次捕获; +10:每4个事件触发一次捕获; +11:每8个事件触发一次捕获。 +比较捕获通道2输入选择域,这2位定义通道的方 +向(输入/输出),及输入脚的选择。 +00:比较捕获通道1通道被配置为输出; +01:比较捕获通道 1 通道被配置为输入,IC1 映射 +在TI1上; +[9:8] CC2S[1:0] RW 10:比较捕获通道 1 通道被配置为输入,IC1 映射 00b +在TI2上; +11:比较捕获通道 1 通道被配置为输入,IC1 映射 +在TRC上。此模式仅工作在内部触发器输入被选中 +时(由TS位选择)。 +注:CC1S仅在通道关闭时(CC1E为0)才是可写的。 +[7:4] IC1F[3:0] RW 输入捕获滤波器1配置域。 0 +[3:2] IC1PSC[1:0] RW 比较捕获通道1预分频配置域。 0 +[1:0] CC1S[1:0] RW 比较捕获通道1输入选择域。 0 +15.4.8 比较/捕获控制寄存器 2(TIMx_CHCTLR2)(x=2/3/4/5) +偏移地址:0x1C +通道可用于输入(捕获模式)或输出(比较模式),通道的方向由相应的 CCxS 位定义。该寄存 +器其它位的作用在输入和输出模式下不同。OCxx 描述了通道在输出模式下的功能,ICxx 描述了通道 +在输入模式下的功能。 +V2.4 230 + +# Page 234 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OC4CE OC4M[2:0] OC4PE OC4FE OC3CE OC3M[2:0] OC3PE OC3FE +CC4S[1:0] CC3S[1:0] +IC4F[3:0] IC4PSC[1:0] IC3F[3:0] IC3PSC[1:0] +比较模式(引脚方向为输出): +位 名称 访问 描述 复位值 +15 OC4CE RW 比较捕获通道4清零使能位。 0 +[14:12] OC4M[2:0] RW 比较捕获通道4模式设置域。 0 +11 OC4PE RW 比较捕获寄存器4预装载使能位。 0 +10 OC4FE RW 比较捕获通道4快速使能位。 0 +[9:8] CC4S[1:0] RW 比较捕获通道4输入选择域。 0 +7 OC3CE RW 比较捕获通道3清零使能位。 0 +[6:4] OC3M[2:0] RW 比较捕获通道3模式设置域。 0 +3 OC3PE RW 比较捕获寄存器3预装载使能位。 0 +2 OC3FE RW 比较捕获通道3快速使能位。 0 +[1:0] CC3S[1:0] RW 比较捕获通道3输入选择域。 0 +捕获模式(引脚方向为输入): +位 名称 访问 描述 复位值 +[15:12] IC4F[3:0] RW 输入捕获滤波器4配置域。 0 +[11:10] IC4PSC[1:0] RW 比较捕获通道4预分频配置域。 0 +[9:8] CC4S[1:0] RW 比较捕获通道4输入选择域。 0 +[7:4] IC3F[3:0] RW 输入捕获滤波器3配置域。 0 +[3:2] IC3PSC[1:0] RW 比较捕获通道3预分频配置域。 0 +[1:0] CC3S[1:0] RW 比较捕获通道3输入选择域。 0 +15.4.9 比较/捕获使能寄存器(TIMx_CCER)(x=2/3/4/5) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CC4P CC4E Reserved CC3P CC3E Reserved CC2P CC2E Reserved CC1P CC1E +位 名称 访问 描述 复位值 +[15:14] Reserved RO 保留。 0 +13 CC4P RW 比较捕获通道4输出极性设置位。 0 +12 CC4E RW 比较捕获通道4输出使能位。 0 +[11:10] Reserved RO 保留。 0 +9 CC3P RW 比较捕获通道3输出极性设置位。 0 +8 CC3E RW 比较捕获通道3输出使能位。 0 +[7:6] Reserved RO 保留。 0 +5 CC2P RW 比较捕获通道2输出极性设置位。 0 +4 CC2E RW 比较捕获通道2输出使能位。 0 +[3:2] Reserved RO 保留。 0 +V2.4 231 + +# Page 235 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +比较捕获通道1输出极性设置位。 +CC1通道配置为输出: +0:OC1高电平有效; +1:OC1低电平有效。 +CC1通道配置为输入: +1 CC1P RW 该位选择是IC1还是IC1的反相信号作为触发或捕 0 +获信号。 +0:不反相:捕获发生在IC1的上升沿;当用作外部 +触发器时,IC1不反相; +1:反相:捕获发生在IC1的下降沿;当用作外部触 +发器时,IC1反相。 +比较捕获通道1输出使能位。 +CC1通道配置为输出: +0:关闭:OC1禁止输出; +1:开启:OC1信号输出到对应的输出引脚。 +0 CC1E RW CC1通道配置为输入: 0 +该位决定了计数器的值是否能捕获入TIMx_CCR1寄 +存器。 +0:捕获禁止; +1:捕获使能。 +15.4.10 通用定时器的计数器(TIMx_CNT)(x=2/3/4) +偏移地址:0x24 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +[15:0] CNT[15:0] RW 定时器的计数器的实时值。 0 +15.4.11 通用定时器的计数器(TIMx_CNT)(x=5) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CNT[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +[31:0] CNT[31:0] RW 定时器的计数器的实时值。 0 +注:32位的TIM5_CNT仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品,其 +他系列芯片的TIM5_CNT为16位。 +15.4.12 计数时钟预分频器(TIMx_PSC)(x=2/3/4/5) +偏移地址:0x28 +V2.4 232 + +# Page 236 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PSC[15:0] +位 名称 访问 描述 复位值 +定时器的预分频器的分频系数;计数器的时钟频率 +[15:0] PSC[15:0] RW 0 +等于分频器的输入频率/(PSC+1)。 +15.4.13 自动重装值寄存器(TIMx_ATRLR)(x=2/3/4) +偏移地址:0x2C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ARR[15:0] +位 名称 访问 描述 复位值 +ATRLR[15:0]的值将会被装入计数器, +[15:0] ARR[15:0] RW ATRLR何时动作和更新请阅读15.2.4节; FFFFh +ATRLR为空时,计数器停止。 +15.4.14 自动重装值寄存器(TIMx_ATRLR)(x=5) +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ARR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ARR[15:0] +位 名称 访问 描述 复位值 +ATRLR[31:0]的值将会被装入计数器,ATRLR何时动 +0000FF +[31:0] ARR[31:0] RW 作和更新请阅读15.2.4节;ATRLR为空时,计数器 +FFh +停止。 +注:32位的TIM5_ATRLR仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品, +其他系列芯片的TIM5_ATRLR为16位。 +15.4.15 比较/捕获寄存器 1(TIMx_CH1CVR)(x=2/3/4) +偏移地址:0x34 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR1[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR1[15:0] RW 比较捕获寄存器通道1的值。 0 +V2.4 233 + +# Page 237 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15.4.16 比较/捕获寄存器 1(TIMx_CH1CVR)(x=5) +偏移地址:0x34 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CCR1[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR1[15:0] +位 名称 访问 描述 复位值 +[31:0] CCR1[31:0] RW 比较捕获寄存器通道1的值。 0 +注:32位的TIM5_CH1CVR仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品, +其他系列芯片的TIM5_CH1CVR为16位。 +15.4.17 比较/捕获寄存器 2(TIMx_CH2CVR)(x=2/3/4) +偏移地址:0x38 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR2[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR2[15:0] RW 比较捕获寄存器通道2的值。 0 +15.4.18 比较/捕获寄存器 2(TIMx_CH2CVR)(x=5) +偏移地址:0x38 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CCR2[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR2[15:0] +位 名称 访问 描述 复位值 +[31:0] CCR1[31:0] RW 比较捕获寄存器通道2的值。 0 +注:32位的TIM5_CH2CVR仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品, +其他系列芯片的TIM5_CH2CVR为16位。 +15.4.19 比较/捕获寄存器 3(TIMx_CH3CVR)(x=2/3/4) +偏移地址:0x3C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR3[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR3[15:0] RW 比较捕获寄存器通道3的值。 0 +V2.4 234 + +# Page 238 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15.4.20 比较/捕获寄存器 3(TIMx_CH3CVR)(x=5) +偏移地址:0x3C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CCR3[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR3[15:0] +位 名称 访问 描述 复位值 +[31:0] CCR3[31:0] RW 比较捕获寄存器通道3的值。 0 +注:32位的TIM5_CH3CVR仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品, +其他系列芯片的TIM5_CH3CVR为16位。 +15.4.21 比较/捕获寄存器 4(TIMx_CH4CVR)(x=2/3/4) +偏移地址:0x40 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR4[15:0] +位 名称 访问 描述 复位值 +[15:0] CCR4[15:0] RW 比较捕获寄存器通道4的值。 0 +15.4.22 比较/捕获寄存器 4(TIMx_CH4CVR)(x=5) +偏移地址:0x40 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CCR4[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CCR4[15:0] +位 名称 访问 描述 复位值 +[31:0] CCR4[31:0] RW 比较捕获寄存器通道4的值。 0 +注:32位的TIM5_CH4CVR仅适用于型号为CH32F20x_D8W、CH32V20x_D8、CH32V20x_D8W系列的产品, +其他系列芯片的TIM5_CH4CVR为16位。 +15.4.23 DMA 控制寄存器(TIMx_DMACFGR)(x=2/3/4/5) +偏移地址:0x48 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DBL[4:0] Reserved DBA[4:0] +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +[12:8] DBL[4:0] RW DMA连续传送的长度,实际值为此域的值+1。 0 +[7:5] Reserved RO 保留。 0 +V2.4 235 + +# Page 239 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +这些位定义了DMA在连续模式下从控制寄存器1所 +[4:0] DBA[4:0] RW 0 +在地址的偏移量。 +15.4.24 连续模式的 DMA 地址寄存器(TIMx_DMAADR)(x=2/3/4/5) +偏移地址:0x4C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DMAB[15:0] +位 名称 访问 描述 复位值 +[15:0] DMAB[15:0] RW 连续模式下,DMA的地址。 0 +15.4.25 双边沿捕获寄存器(TIMx_AUX)(x=2/3/4/5) +偏移地址:0x50 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CAP_ED_CH4 CAP_ED_CH3 CAP_ED_CH2 +位 名称 访问 描述 复位值 +[15:3] Reserved R0 保留。 0 +通道4的双边沿捕获使能: +2 CAP_ED_CH4 RW 0:关闭通道4的双边沿捕获使能; 0 +1:使能通道4的双边沿捕获使能。 +通道3的双边沿捕获使能: +1 CAP_ED_CH3 RW 0:关闭通道3的双边沿捕获使能; 0 +1:使能通道3的双边沿捕获使能。 +通道2的双边沿捕获使能: +0 CAP_ED_CH2 RW 0:关闭通道2的双边沿捕获使能; 0 +1:使能通道2的双边沿捕获使能。 +注:TIMx_AUX 寄存器仅适用于 CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C批号倒数第六位不为0的产品。 +V2.4 236 + +# Page 240 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 16 章 基本定时器(BCTM) +本章模块描述适用于CH32F20x、CH32V30x和CH32V31x微控制器全系列产品。 +基本定时器模块包含一个16位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件 +产生中断或DMA请求。 +16.1 主要特征 +基本定时器的主要特征包括: + 16位自动重装计数器,支持增计数模式 + 16位预分频器,分频系数从1~65536之间动态可调 + 触发DAC同步电路 + 在更新事件时产生中断或DMA请求 +16.2 原理和结构 +图16-1 基本定时器的结构框图 +Internal clock(CK_INT) +CK_TIM from RCC +TRGO +To DAC +Trigger +controller +Reset, +Enable, +Up, Count +AutoReload +U Register U +Stop, clear or up +U +CK_PSC PSC CK_CNT CNT +(prescaler) (counter) +16.2.1 概述 +如图16-1所示,基本定时器的结构大致可以分为两部分,即输入时钟部分和核心计数器部分。 +基本定时器的时钟来自于 HB 总线时钟(CK_INT)。这些输入的时钟信号经过各种设定的滤波分 +频等操作后成为CK_PSC时钟,输出给核心计数器部分。另外,这些复杂的时钟来源还可以作为TRGO +输出至DAC外设。 +基本定时器的核心是一个16位计数器(CNT)。CK_PSC经过预分频器(PSC)分频后,成为CK_CNT +再最终输给CNT,CNT支持增计数模式,并有一个自动重装值寄存器(ATRLR)在每个计数周期结束后 +为CNT重装载初始化值。 +16.2.2 基本定时器和通用定时器的区别 +与通用定时器相比,基本定时器缺少以下功能: +V2.4 237 + +# Page 241 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1) 基本定时器缺少减计数模式和增减计数模式。 +2) 基本定时器缺少四路独立的比较捕获通道。 +3) 基本定时器不支持外部信号控制定时器。 +4) 基本定时器不支持增量式编码,定时器之间的级联和同步。 +16.2.3 时钟输入 +基本定时器的时钟由内部时钟CK_INT提供。 +16.2.4 计数器和周边 +CK_PSC输入给预分频器(PSC)进行分频。PSC是16位的,实际的分频系数相当于R16_TIMx_PSC +的值+1。CK_PSC经过PSC会成为CK_INT。更改R16_TIM1_PSC的值并不会实时生效,而会在更新事件 +后更新给PSC。更新事件包括UG位清零和复位。 +16.3 调试模式 +当系统进入调试模式时,根据DBG模块的设置可以控制定时器继续运转或者停止。 +16.4 寄存器描述 +表16-1 TIM6相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM6_CTLR1 0x40001000 TIM6控制寄存器1 0x0000 +R16_TIM6_CTLR2 0x40001004 TIM6控制寄存器2 0x0000 +R16_TIM6_DMAINTENR 0x4000100C TIM6 DMA/中断使能寄存器 0x0000 +R16_TIM6_INTFR 0x40001010 TIM6中断状态寄存器 0x0000 +R16_TIM6_SWEVGR 0x40001014 TIM6事件产生寄存器 0x0000 +R16_TIM6_CNT 0x40001024 TIM6计数器 0x0000 +R16_TIM6_PSC 0x40001028 TIM6计数时钟预分频器 0x0000 +R16_TIM6_ATRLR 0x4000102C TIM6自动重装值寄存器 0xFFFF +表16-2 TIM7相关寄存器列表 +名称 偏移地址 描述 复位值 +R16_TIM7_CTLR1 0x40001400 TIM7控制寄存器1 0x0000 +R16_TIM7_CTLR2 0x40001404 TIM7控制寄存器2 0x0000 +R16_TIM7_DMAINTENR 0x4000140C TIM7 DMA/中断使能寄存器 0x0000 +R16_TIM7_INTFR 0x40001410 TIM7中断状态寄存器 0x0000 +R16_TIM7_CNT 0x40001424 TIM7计数器 0x0000 +R16_TIM7_PSC 0x40001428 TIM7计数时钟预分频器 0x0000 +R16_TIM7_ATRLR 0x4000142C TIM7自动重装值寄存器 0xFFFF +16.4.1 控制寄存器 1(TIMx_CTLR1)(x=6/7) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved ARPE Reserved OPM URS UDIS CEN +V2.4 238 + +# Page 242 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +自动重装预装使能位: +7 ARPE RW 0:禁止自动重装值寄存器(ATRLR); 0 +1:使能自动重装值寄存器(ATRLR)。 +[6:4] Reserved RO 保留。 0 +单脉冲模式。 +0:在发生下一次更新事件时,计数器不停止; +3 OPM RW 0 +1:在发生下一次更新事件(清除CEN位)时,计数 +器停止。 +更新请求源,软件通过该位选择UEV事件的源。 +0:如果使能了更新中断或DMA请求,则下述任一事 +件产生更新中断或DMA请求。 +-计数器溢出/下溢 +2 URS RW 0 +-设置UG位 +-从模式控制器产生的更新。 +1:如果使能了更新中断或DMA请求,则只有计数器 +溢出/下溢才产生更新中断或DMA请求。 +禁止更新,软件通过该位允许/禁止 UEV 事件的产 +生。 +0:允许 UEV。更新(UEV)事件由下述任一事件产 +生:-计数器溢出/下溢 +-设置UG位 +1 UDIS RW -从模式控制器产生的更新具有缓存的寄存器被装 0 +入它们的预装载值。 +1:禁止UEV。不产生更新事件,各寄存器(ATRLR、 +PSC、CHCTLRx)保持它们的值。如果设置了UG位或 +从模式控制器发出了一个硬件复位,则计数器和预 +分频器被重新初始化。 +使能计数器(Counter enable): +0 CEN RW 0:禁止计数器; 0 +1:使能计数器。 +16.4.2 控制寄存器 2(TIMx_CTLR2)(x=6/7) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved MMS[2:0] Reserved +位 名称 访问 描述 复位值 +[15:7] Reserved RO 保留。 0 +主模式选择:这3位用于选择在主模式下送到从定 +时器的同步信息(TRGO)。可能的组合如下: +[6:4] MMS[2:0] RW 000b +000:复位–UG位被用于作为触发输出(TRGO)。如 +果是触发输入产生的复位(从模式控制器处于复位 +V2.4 239 + +# Page 243 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +模式),则TRGO上的信号相对实际的复位会有一个 +延迟; +001:使能–计数器使能信号CNT_EN被用于作为触 +发输出(TRGO)。有时需要在同一时间启动多个定 +时器或控制在一段时间内使能从定时器。计数器使 +能信号是通过CEN控制位和门控模式下的触发输入 +信号的逻辑或产生。当计数器使能信号受控于触发 +输入时,TRGO 上会有一个延迟,除非选择了主/从 +模式(见TIMx_SMCFGR寄存器中MSM位的描述); +010:更新事件被选为触发输出(TRGO)。例如,一 +个主定时器的时钟可以被用作一个从定时器的预分 +频器。 +[3:0] Reserved RO 保留。 0 +16.4.3 DMA/中断使能寄存器(TIMx_DMAINTENR)(x=6/7) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved UDE Reserved UIE +位 名称 访问 描述 复位值 +[15:9] Reserved RO 保留。 0 +更新的DMA请求使能位: +8 UDE RW 0:禁止更新的DMA请求; 0 +1:允许更新的DMA请求。 +[7:1] Reserved RO 保留。 0 +更新中断使能位: +0 UIE RW 0:禁止更新中断; 0 +1:允许更新中断。 +16.4.4 中断状态寄存器(R16_TIMx_INTFR)(x=6/7) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved UIF +位 名称 访问 描述 复位值 +[15:1] Reserved RO 保留。 0 +更新中断标志位,当产生更新事件时该位由硬件置 +位,由软件清零。 +0:无更新事件产生; +0 UIF RW0 1:更新中断产生。 0 +以下情形会产生更新事件: +若UDIS=0,当重复计数器数值上溢或下溢时; +若URS=0、UDIS=0,当置UG位时,或当通过软件对 +V2.4 240 + +# Page 244 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +计数器核心计数器重新初始化时。 +16.4.5 事件产生寄存器(TIMx_SWEVGR)(x=6/7) +偏移地址:0x14 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved UG +位 名称 访问 描述 复位值 +[15:1] Reserved RO 保留。 0 +更新事件产生位,产生更新事件。该位由软件置位, +由硬件自动清零。 +0:无动作; +0 UG WO 0 +1:初始化计数器,并产生一个更新事件。 +注:预分频器的计数器也被清零,但是预分频系数 +不变。若在增计数模式下则核心计数器被清零。 +16.4.6 通用定时器的计数器(TIMx_CNT)(x=6/7) +偏移地址:0x24 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CNT[15:0] +位 名称 访问 描述 复位值 +[15:0] CNT[15:0] RW 定时器的计数器的实时值。 0 +16.4.7 计数时钟预分频器(TIMx_PSC)(x=6/7) +偏移地址:0x28 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PSC[15:0] +位 名称 访问 描述 复位值 +定时器的预分频器的分频系数;计数器的时钟频率 +[15:0] PSC[15:0] RW 0 +等于分频器的输入频率/(PSC+1)。 +16.4.8 自动重装值寄存器(TIMx_ATRLR)(x=6/7) +偏移地址:0x2C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ARR[15:0] +位 名称 访问 描述 复位值 +ATRLR[15:0]的值将会被装入计数器,ATRLR何时动 +[15:0] ARR[15:0] RW FFFFh +作和更新请阅读16.2.4节;ATRLR为空时,计数器 +V2.4 241 + +# Page 245 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +停止。 +V2.4 242 + +# Page 246 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 17 章 数字/模拟转换(DAC) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器部分产品。 +数字/模拟转换模块(DAC),包含2个可配置8/12位数字输入转换2路模拟电压输出的转换器。 +内置三角波、噪声波形发生器,支持多种事件触发转换,DMA功能等。 +17.1 主要特性 + 2个DAC转换器,每个转换器对应1个输出通道 + 三角波、噪声波形发生器 + 可配置8位或12位输出 + 12位数据左对齐或右对齐 + 双DAC同时或分别转换 + 支持DMA功能 + 多种触发事件 +V2.4 243 + +# Page 247 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +17.2 功能描述 +17.2.1 DAC 模块结构 +图17-1 DAC模块框图 +DAC Control Register +(DAC_CTLR) +TSELx[2:0] +SWTRIG +TIM2_TRGO +DMAENx +TIM4_TRGO +TENx +Control logic +BOFFx +Triangular wave +xDHRx 12bit generator +WAVEx[2:0]/MAMPx[3:0] +Noise Generator +DMA request +DORx +V2.4 244 +12bit +Digital to Analog +Converter +12bit +TIM5_TRGO +TIM6_TRGO +TIM7_TRGO +TIM8_TRGO +EXTI_9 +V +DDA +V +SSA +V +REF+ +DAC_OUTx +EN +17.2.2 DAC 通道配置 +17.2.2.1 开启 DAC 功能: +将DAC_CTLR寄存器的ENx位置1,即可打开对DAC通道x的模拟供电。经过一段启动时间, +DAC通道x即被使能。DAC包含2个模拟输出通道,可同时或分别独立输出。 +注:为了避免寄生的干扰和额外的功耗,DAC通道对应的引脚需提前设置成模拟输入(AIN)模式。 +17.2.2.2 打开输出缓冲: +DAC集成了输出缓冲,可以用来减少输出阻抗,增加驱动能力直接驱动外部负载。每个DAC通 +道输出缓存可以通过设置DAC_CTLR寄存器的BOFFx位来使能或关闭。 +17.2.2.3 数据格式: +单DAC通道模式下,包括8位数据右对齐、12位数据左对齐、12位数据右对齐。 +8位数据右对齐时,写入数据到DAC_R8BDHRx[7:0],模块将加载(1个PB1时钟周期后)其左 + +# Page 248 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +移数据到数据输出寄存器DAC_DORx[11:4]。 +12位数据右对齐时,写入数据到DAC_R12BDHRx[11:0],模块将加载(1个PB1时钟周期后)右 +对齐数据到数据输出寄存器DAC_DORx[11:0]。 +12数据左对齐时,写入数据到DAC_L12BDHRx[15:4],模块经过相应的移位后,将加载(1个 +PB1时钟周期后)左对齐数据到数据输出寄存器DAC_DORx[11:0]。 +图17-2 单通道数据格式 +31 24 15 7 0 +8 Bit right-aligned +12Bit left-aligned +12 Bit right-aligned +双DAC通道模式下,同样包括8位数据右对齐、12数据左对齐、12位数据右对齐三种方式。 +8位数据右对齐时,写入数据到DAC_RD8BDHR[7:0],模块将加载(1个PB1时钟周期后)位 +[7:0]移位后到DAC_DOR1[11:4],位[15:8]移位后到DAC_DOR2[11:4]。 +12数据左对齐时,写入数据到DAC_LD12BDHR[31:0],模块将加载(1个PB时钟周期后)位 +[15:4]数据移位后到DAC_DOR1[11:0],位[31:20]数据移位后到DAC_DOR2[11:0]。 +12位数据右对齐,写入数据到DAC_RD12BDHR[31:0],模块将加载(1个PB时钟周期后)位 +[11:0]数据到DAC_DOR1[11:0],位[27:16]数据到DAC_DOR2[11:0]。 +图17-3 双通道数据格式 +31 24 15 7 0 +8Bit right-aligned +12Bit left-aligned +12 Bit right-aligned +17.2.2.4 DMA 功能: +DAC通道具有DMA功能。设置DAC_CTLR寄存器的DMAENx位为1,开启对应通道的DMA功能。当 +有触发事件(不包括软件触发)发生,则产生一个DMA请求,然后DAC_DORx寄存器的数据将被更 +新。 +17.2.2.5 触发事件选择: +DAC转换可以由以下事件触发进行转换。当配置DAC_CTLR寄存器的TENx位为1,配置 +TSELx[2:0]控制位选择某个触发事件触发DAC转换。 +表17-1 触发事件 +触发源 类型 TSELx[2:0] +定时器6 TRGO事件 000 +定时器8 TRGO事件 001 +定时器7 TRGO事件 010 +来自片上定时器内部信号 +定时器5 TRGO事件 011 +定时器2 TRGO事件 100 +定时器4 TRGO事件 101 +EXTI线路9 外部引脚 110 +SWTRIG(软件触发) 软件控制位 111 +V2.4 245 + +# Page 249 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +DAC接口会监测到来自选中的定时器TRGO输出或外部中断线9的上升沿,在触发后的3个PB1 +时钟周期后,将寄存器DAC_DORx更新为新值。 +如果配置的是软件触发方式,SWTRIG位一旦置1,将会启动一次转换,在触发后的1个PB1时 +钟周期后,将寄存器DAC_DORx更新为新值,并且硬件对SWTRIG位自动清0。 +注:不能在ENx为1时改变TSELx[2:0]位。 +17.2.3 DAC 转换 +DAC通道的数据来自DAC_DORx寄存器,但不能直接对寄存器DAC_DORx写入数据,任何输出到 +DAC通道x的数据都必须写入DAC_R12BDHR1、DAC_L12BDHR1、DAC_R12BDHR2、DAC_L12BDHR2、 +DAC_RD12BDHR、DAC_LD12BDHR、DAC_RD8BDHR寄存器中。由系统内部的保持寄存器DAC_DHRx会获取 +上述寄存器值将其经过相应时间送入DAC_DORx寄存器。 +非触发方式下,写入寄存器DAC_xDHRx的数据会在1个PB1时钟周期后移入DAC_DORx寄存器。 +软件触发下,事件触发上升沿后1个PB1时钟周期后自动更新DAC_DORx寄存器。 +硬件触发(定时器TRGO事件或者外部中断线9上升沿)下,触发事件后3个PB1时钟周期后自 +动更新DAC_DORx寄存器。 +装入DAC_DORx寄存器数据,在经过时间t 之后,输出即有效,这段时间的长短依电源电压 +SETTLING +和模拟输出负载的不同会有所变化。 +数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到V 。任一DAC通道引脚上的输 +DDA +出电压满足下面的关系: +DAC输出电压 = V * (DAC_DORx/ 4096)。 +DDA +17.2.4 DAC 三角波生成器 +模块内置了一个三角波生成器,可以在基准信号上加上一个小幅度的三角波。设置WAVEx[1:0] +位为‘10’选择DAC的三角波生成功能。设置DAC_CTLR寄存器的MAMPx[3:0]位来选择三角波的幅 +度。 +系统内部包含一个从0开始的三角波计数器,在每次触发事件后3个PB1时钟周期后累加1。 +计数器的值与DAC_DHRx寄存器的数值相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx +寄存器的数值小于MAMPx[3:0]位定义的最大幅度时,三角波计数器逐步累加,一旦达到设置的最大 +幅度,则计数器开始递减,达到0后再开始累加,周而复始。将WAVEx[1:0]位置‘00’,可以复位 +三角波的生成。 +注:1.为了产生三角波,必须使能DAC触发,即设DAC_CTLR寄存器的TENx位为1。 +2.MAMPx[3:0]位必须在使能DAC之前设置,否则其值不能修改。 +图17-4 三角波生成 +MAMPx[3:0] +maximum amplitude + +DAC_DHRx base value +Decreasing +Cumulative +DAC_DHRx base value +0 +17.2.5 DAC 噪声生成器 +模块内置了一个噪声生成器,是利用线性反馈移位寄存器(Linear Feedback Shift Register +LFSR)产生幅度变化的伪噪声。设置WAVE[1:0]位为‘01’选择DAC噪声生成功能。设置DAC_CTLR +寄存器的MAMPx[3:0]位来选择屏蔽部分LFSR的数据。 +寄存器LFSR的预装入值为0xAAA。按照特定算法,在每次触发事件后3个PB1时钟周期之后更 +新该寄存器的值。设置DAC_CR寄存器的MAMPx[3:0]位可以屏蔽部分或者全部LFSR的数据,这样的 +V2.4 246 + +# Page 250 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +得到的LSFR值与DAC_DHRx的数值相加,去掉溢出位之后即被写入DAC_DORx寄存器。如果寄存器 +LFSR值为0x000,则会注入‘1’(防锁定机制)。将WAVEx[1:0]位置‘00’,可以复位LFSR波形 +的生成算法。 +注:为了产生噪声,必须使能DAC触发,即设DAC_CTLR寄存器的TENx位为1。 +图17-5 LFSR寄存器算法 +17.3 双 DAC 转换 +当需要2个DAC同时转换的情况下,为了更加便捷和高效的操作DAC模块,模块集成3个双 +DAC模式下的数据寄存器DAC_RD8BDHR、DAC_LD12BDHR、DAC_RD12BDHR。只需操作其中之一寄存器即 +可更新2个DAC的转换值。 +针对双DAC的转换可配合模块的其他寄存器,可实现11种不同组合的转换模式,两个通道待转 +换值需写入上述3个双通道数据寄存器之一。 +17.3.1 不同触发下使用相同 LFSR +设置TENx置位,TSELx为不同值,WAVEx为0b01,MAMPx为相同的LFSR屏蔽值。当通道1触发 +事件发生时,将通道1数据寄存器DAC_DHR1值加上带相同屏蔽的LFSR1计数值,延迟3个PB1时钟 +后送给DAC_DOR1,用于转换,并更新LFSR1;当通道2触发事件发生时,将通道2数据寄存器 +DAC_DHR2值加上带相同屏蔽的LFSR2计数值,延迟3个PB1时钟后送给DAC_DOR2,用于转换,并更 +新LFSR2。 +17.3.2 不同触发下使用不同 LFSR +设置TENx置位,TSELx为不同值,WAVEx为0b01,MAMPx为不同的LFSR屏蔽值。当通道1触发 +事件发生时,将通道1数据寄存器DAC_DHR1值加上按MAMP1[3:0]所设屏蔽的LFSR1计数值,延迟 +3个PB1时钟后送给DAC_DOR1,用于转换,并更新LFSR1;当通道2触发事件发生时,将通道2数 +据寄存器DAC_DHR2值加上按MAMP2[3:0]所设屏蔽的LFSR2计数值,延迟3个PB1时钟后送给 +DAC_DOR2,用于转换,并更新LFSR2。 +17.3.3 不同触发下产生相同三角波 +设置TENx置位,TSELx为不同值,WAVEx为0b1x,MAMPx设为相同三角波幅值。当通道1触发 +事件发生时,将通道1数据寄存器DAC_DHR1值加上MAMPx所设的相同幅值的三角波计数器值,延迟 +3个PB1时钟后送给DAC_DOR1,用于转换,并更新通道1三角波计数器;当通道2触发事件发生 +时,将通道2数据寄存器DAC_DHR2值加上MAMPx所设的相同幅值的三角波计数器值,延迟3个PB1 +时钟后送给DAC_DOR2,用于转换,并更新通道2三角波计数器。 +17.3.4 不同触发下产生不同三角波 +设置TENx置位,TSELx为不同值,WAVEx为0b1x,MAMPx设为不同的三角波幅值。当通道1触 +发事件发生时,将通道1数据寄存器DAC_DHR1值加上MAMP1所设幅值的三角波计数器值,延迟3个 +PB1时钟后送给DAC_DOR1,用于转换,并更新通道1三角波计数器;当通道2触发事件发生时,将 +通道2数据寄存器DAC_DHR2值加上MAMP2所设幅值的三角波计数器值,延迟3个PB1时钟后送给 +V2.4 247 + +# Page 251 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +DAC_DOR2,用于转换,并更新通道2三角波计数器。 +17.3.5 不同触发下不使用波形发生器 +设置TENx置位,TSELx为不同值选择不同触发源。当通道1触发事件发生时,将通道1数据寄 +存器DAC_DHR1值延迟3个PB1时钟后送给DAC_DOR1,用于转换;当通道2触发事件发生时,将通 +道2数据寄存器DAC_DHR2值延迟3个PB1时钟后送给DAC_DOR2,用于转换。 +17.3.6 均使用软件触发 +在此配置下,双通道数据寄存器写入需要转换值,1个PB1时钟周期后,DAC_DHR1和DAC_DHR2 +的数据被分别送到DAC_DOR1和DAC_DOR2用于转换。 +17.3.7 相同触发下使用相同 LFSR +设置TENx置位,TSELx为相同值,WAVEx为0b01,MAMPx为相同的LFSR屏蔽值。当触发事件发 +生后,寄存器DAC_DHR1的值加上带相同屏蔽的LFSR1计数值,延迟3个PB1时钟后送给 +DAC_DOR1,用于转换,并更新LFSR1,同时寄存器DAC_DHR2的值加上带相同屏蔽的LFSR2计数值, +延迟3个PB1时钟后送给DAC_DOR2,用于转换,并更新LFSR2。 +17.3.8 相同触发下使用不同 LFSR +设置TENx置位,TSELx为相同值,WAVEx为0b01,MAMPx为不同的LFSR屏蔽值。当触发事件发 +生后,寄存器DAC_DHR1的值加上带不同屏蔽值的LFSR1计数值,延迟3个PB1时钟后送给 +DAC_DOR1,用于转换,并更新LFSR1,同时寄存器DAC_DHR2的值加上带不同屏蔽值的LFSR2计数 +值,延迟3个PB1时钟后送给DAC_DOR2,用于转换,并更新LFSR2。 +17.3.9 相同触发下产生相同三角波 +设置TENx置位,TSELx为相同值,WAVEx为0b1x,MAMPx为相同的三角波幅值。当触发事件发 +生后,寄存器DAC_DHR1的值加上相同三角波幅值的计数器值,延迟3个PB1时钟后送给 +DAC_DOR1,用于转换,并更新通道1三角波计数器,同时寄存器DAC_DHR2的值加上相同三角波幅值 +的计数器值,延迟3个PB1时钟后送给DAC_DOR2,用于转换,并更新通道2三角波计数器值。 +17.3.10 相同触发下产生不同三角波 +设置TENx置位,TSELx为相同值,WAVEx为0b1x,MAMPx为不同的三角波幅值。当触发事件发 +生后,寄存器DAC_DHR1的值加上MAMP1[3:0]所设的三角波幅值计数器值,延迟3个PB1时钟后送 +给DAC_DOR1,用于转换,并更新通道1三角波计数器,同时寄存器DAC_DHR2的值加上MAMP2[3:0] +所设的三角波幅值计数器值,延迟3个PB1时钟后送给DAC_DOR2,用于转换,并更新通道2三角波 +计数器值。 +17.3.11 相同触发下不使用波形发生器 +设置TENx置位,TSELx为相同值。该配置下,当触发事件发生后,寄存器DAC_DHR1和 +DAC_DHR2的值在延迟3个PB1时钟后分别送给DAC_DOR1和DAC_DOR2用于DAC转换。 +17.4 寄存器描述 +表17-2 DAC相关寄存器列表 +名称 访问地址 描述 复位值 +R32_DAC_CTLR 0x40007400 DAC配置寄存器 0x00000000 +R32_DAC_SWTR 0x40007404 DAC软件触发寄存器 0x00000000 +V2.4 248 + +# Page 252 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +DAC 通道 1 右对齐 12 位数据保存寄存 +R32_DAC_R12BDHR1 0x40007408 0x00000000 +器 +DAC 通道 1 左对齐 12 位数据保存寄存 +R32_DAC_L12BDHR1 0x4000740C 0x00000000 +器 +R32_DAC_R8BDHR1 0x40007410 DAC通道1右对齐8位数据保存寄存器 0x00000000 +DAC 通道 2 右对齐 12 位数据保存寄存 +R32_DAC_R12BDHR2 0x40007414 0x00000000 +器 +DAC 通道 2 左对齐 12 位数据保存寄存 +R32_DAC_L12BDHR2 0x40007418 0x00000000 +器 +R32_DAC_R8BDHR2 0x4000741C DAC通道2右对齐8位数据保存寄存器 0x00000000 +R32_DAC_RD12BDHR 0x40007420 双通道右对齐12位数据保存寄存器 0x00000000 +R32_DAC_LD12BDHR 0x40007424 双通道左对齐12位数据保存寄存器 0x00000000 +R32_DAC_RD8BDHR 0x40007428 双通道右对齐8位数据保存寄存器 0x00000000 +R32_DAC_DOR1 0x4000742C DAC通道1数据输出寄存器 0x00000000 +R32_DAC_DOR2 0x40007430 DAC通道2数据输出寄存器 0x00000000 +17.4.1 DAC 配置寄存器(DAC_CTLR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved DMAEN2 MAMP2[3:0] WAVE2[2:0] TSEL2[2:0] TEN2 BOFF2 EN2 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DMAEN1 MAMP1[3:0] WAVE1[2:0] TSEL1[2:0] TEN1 BOFF1 EN1 +位 名称 访问 描述 复位值 +[31:29] Reserved RO 保留。 0 +DAC通道2的DMA使能: +28 DMAEN2 RW 0:关闭DAC通道2 DMA功能; 0 +1:使能DAC通道2 DMA功能。 +DAC 通道 2 屏蔽/幅值设置,软件设置这个区域用来在 +噪声生成模式下选择LFSR数据屏蔽位,在三角波形生 +成模式下选择波形的幅值: +0000:不屏蔽LFSR位0/三角波幅值为1; +0001:不屏蔽LFSR位[1:0]/三角波幅值为3; +0010:不屏蔽LFSR位[2:0]/三角波幅值为7; +0011:不屏蔽LFSR位[3:0]/三角波幅值为15; +[27:24] MAMP2[3:0] RW 0100:不屏蔽LFSR位[4:0]/三角波幅值为31; 0000b +0101:不屏蔽LFSR位[5:0]/三角波幅值为63; +0110:不屏蔽LFSR位[6:0]/三角波幅值为127; +0111:不屏蔽LFSR位[7:0]/三角波幅值为255; +1000:不屏蔽LFSR位[8:0]/三角波幅值为511; +1001:不屏蔽LFSR位[9:0]/三角波幅值为1023; +1010:不屏蔽LFSR位[10:0]/三角波幅值为2047; +≥1011:不屏蔽LFSR位[11:0]/三角波幅值为4095。 +[23:22] WAVE2[1:0] RW DAC通道2的噪声/三角波生成使能 00b +V2.4 249 + +# Page 253 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +00:关闭波形发生器; +01:使能噪声波形发生器; +1x:使能三角波波形发生器。 +DAC通道2触发事件选择设置: +000:TIM6 TRGO事件; +001:TIM8 TRGO事件; +010:TIM7 TRGO事件 +011:TIM5 TRGO事件 +[21:19] TSEL2[2:0] RW 000b +100:TIM2 TRGO事件; +101:TIM4 TRGO事件; +110:外部中断线9; +111:软件触发; +其他:保留。 +DAC通道2外部触发模式使能: +0:关闭 DAC 通道 2 触发功能,写入 DAC_xDHR 寄存器 +的数据在1个PB1时钟周期后送入DAC_DOR2寄存器。 +18 TEN2 RW 1:使能 DAC 通道 2 触发功能,写入 DAC_xDHR 寄存器 0 +的数据在3个PB1时钟周期后送入DAC_DOR2寄存器。 +注:如果选择软件触发,DAC_xDHR中的数据只需1个 +PB1时钟周期后送入DAC_DOR2寄存器。 +DAC通道2输出缓冲关闭控制(建议打开): +17 BOFF2 RW 0:打开DAC通道2输出缓存; 0 +1:关闭DAC通道2输出缓存。 +DAC通道2使能: +16 EN2 RW 0:关闭DAC通道2; 0 +1:使能DAC通道2。 +[15:13] Reserved RO 保留。 0 +DAC通道1的DMA使能: +12 DMAEN1 RW 0:关闭DAC通道1 DMA功能; 0 +1:使能DAC通道1 DMA功能。 +DAC 通道 1 屏蔽/幅值设置,软件设置这个区域用来在 +噪声生成模式下选择LFSR数据屏蔽位,在三角波形生 +成模式下选择波形的幅值: +0000:不屏蔽LFSR位0/三角波幅值为1; +0001:不屏蔽LFSR位[1:0]/三角波幅值为3; +0010:不屏蔽LFSR位[2:0]/三角波幅值为7; +0011:不屏蔽LFSR位[3:0]/三角波幅值为15; +[11:8] MAMP1[3:0] RW 0100:不屏蔽LFSR位[4:0]/三角波幅值为31; 0000b +0101:不屏蔽LFSR位[5:0]/三角波幅值为63; +0110:不屏蔽LFSR位[6:0]/三角波幅值为127; +0111:不屏蔽LFSR位[7:0]/三角波幅值为255; +1000:不屏蔽LFSR位[8:0]/三角波幅值为511; +1001:不屏蔽LFSR位[9:0]/三角波幅值为1023; +1010:不屏蔽LFSR位[10:0]/三角波幅值为2047; +≥1011:不屏蔽LFSR位[11:0]/三角波幅值为4095。 +[7:6] WAVE1[1:0] RW DAC通道1的噪声/三角波生成使能。 00b +V2.4 250 + +# Page 254 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +00:关闭波形发生器; +01:使能噪声波形发生器; +1x:使能三角波波形发生器。 +DAC通道1触发事件选择设置: +000:TIM6 TRGO事件; +001:TIM8 TRGO事件; +010:TIM7 TRGO事件 +011:TIM5 TRGO事件 +[5:3] TSEL1[2:0] RW 000b +100:TIM2 TRGO事件; +101:TIM4 TRGO事件; +110:外部中断线9; +111:软件触发; +其他:保留。 +DAC通道1外部触发模式使能: +0:关闭 DAC 通道 1 触发功能,写入 DAC_xDHR 寄存器 +的数据在1个PB1时钟周期后送入DAC_DOR1寄存器。 +2 TEN1 RW 1:使能 DAC 通道 1 触发功能,写入 DAC_xDHR 寄存器 0 +的数据在3个PB1时钟周期后送入DAC_DOR1寄存器。 +注:如果选择软件触发,DAC_xDHR中的数据只需1个 +PB1时钟周期后送入DAC_DOR1寄存器。 +DAC通道1输出缓冲关闭控制(建议打开): +1 BOFF1 RW 0:打开DAC通道1输出缓存; 0 +1:关闭DAC通道1输出缓存。 +DAC通道1使能: +0 EN1 RW 0:关闭DAC通道1; 0 +1:使能DAC通道1。 +17.4.2 DAC 软件触发寄存器(DAC_SWTR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SW SW +Reserved +TRIG2 TRIG1 +位 名称 访问 描述 复位值 +[31:2] Reserved RO 保留。 0 +DAC通道2软件触发控制位: +0:关闭DAC通道2软件触发; +1:使能DAC通道2软件触发。 +1 SWTRIG2 WO 0 +注:一旦DAC_xDHR中的数据(1个PB1时钟 +周期后)送入DAC_DOR2寄存器,该位将硬件 +清0。 +0 SWTRIG1 WO DAC通道1软件触发控制位: 0 +V2.4 251 + +# Page 255 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:关闭DAC通道1软件触发; +1:使能DAC通道1软件触发。 +注:一旦DAC_xDHR中的数据(1个PB1时钟 +周期后)送入DAC_DOR1寄存器,该位将硬件 +清0。 +17.4.3 DAC 通道 1 右对齐 12 位数据保存寄存器(DAC_R12BDHR1) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC1DHR[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +[11:0] DACC1DHR[11:0] RW DAC通道1的12位右对齐数据。 0 +17.4.4 DAC 通道 1 左对齐 12 位数据保存寄存器(DAC_L12BDHR1) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DACC1DHR[11:0] Reserved +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:4] DACC1DHR[11:0] RW DAC通道1的12位左对齐数据。 0 +[3:0] Reserved RO 保留。 0 +17.4.5 DAC 通道 1 右对齐 8 位数据保存寄存器(DAC_R8BDHR1) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC1DHR[7:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +[7:0] DACC1DHR[7:0] RW DAC通道1的8位右对齐数据。 0 +V2.4 252 + +# Page 256 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +17.4.6 DAC 通道 2 右对齐 12 位数据保存寄存器(DAC_R12BDHR2) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC2DHR[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +[11:0] DACC2DHR[11:0] RW DAC通道2的12位右对齐数据。 0 +17.4.7 DAC 通道 2 左对齐 12 位数据保存寄存器(DAC_L12BDHR2) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DACC2DHR[11:0] Reserved +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:4] DACC2DHR[11:0] RW DAC通道2的12位左对齐数据。 0 +[3:0] Reserved RO 保留。 0 +17.4.8 DAC 通道 2 右对齐 8 位数据保存寄存器(DAC_R8BDHR2) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC2DHR[7:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +[7:0] DACC2DHR[7:0] RW DAC通道2的8位右对齐数据。 0 +17.4.9 DAC 双通道右对齐 12 位数据保存寄存器(DAC_RD12BDHR) +偏移地址:0x20 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved DACC2DHR[11:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC1DHR[11:0] +V2.4 253 + +# Page 257 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[31:28] Reserved RO 保留。 0 +[27:16] DACC2DHR[11:0] RW DAC通道2的12位右对齐数据。 0 +[15:12] Reserved RO 保留。 0 +[11:0] DACC1DHR[11:0] RW DAC通道1的12位右对齐数据。 0 +17.4.10 DAC 双通道左对齐 12 位数据保存寄存器(DAC_LD12BDHR) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DACC2DHR[11:0] Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DACC1DHR[11:0] Reserved +位 名称 访问 描述 复位值 +[31:20] DACC2DHR[11:0] RW DAC通道2的12位左对齐数据。 0 +[19:16] Reserved RO 保留。 0 +[15:4] DACC1DHR[11:0] RW DAC通道1的12位左对齐数据。 0 +[3:0] Reserved RO 保留。 0 +17.4.11 DAC 双通道右对齐 8 位数据保存寄存器(DAC_RD8BDHR) +偏移地址:0x28 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DACC2DHR[7:0] DACC1DHR[7:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:8] DACC2DHR[7:0] RW DAC通道2的8位右对齐数据。 0 +[7:0] DACC1DHR[7:0] RW DAC通道1的8位右对齐数据。 0 +17.4.12 DAC 通道 1 数据输出寄存器(DAC_DOR1) +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC1DOR[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +V2.4 254 + +# Page 258 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[11:0] DACC1DOR[11:0] RO DAC通道1输出数据。 0 +17.4.13 DAC 通道 2 数据输出寄存器(DAC_DOR2) +偏移地址:0x30 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DACC2DOR[11:0] +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +[11:0] DACC2DOR[11:0] RO DAC通道2输出数据。 0 +V2.4 255 + +# Page 259 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 18 章 通用同步异步收发器(USART) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +该模块包含3个通用同步异步收发器(USART1/2/3)和5个通用异步收发器(UART4/5/6/7/8)。 +注:对于CH32V203C8、CH32F203C8,串口4为同步异步收发器(USART4)。 +18.1 主要特征 + 全双工或半双工的同步或异步通信 + NRZ数据格式 + 分数波特率发生器,最高9Mbps + 可编程数据长度 + 可配置的停止位 + 支持LIN,IrDA编码器,智能卡 + 支持DMA + 多种中断源 +V2.4 256 + +# Page 260 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +18.2 概述 +图18-1 通用同步/异步收发器的结构框图 +当 TE(发送使能位)置位时,发送移位寄存器里的数据在 TX 引脚上输出,时钟在 CK 引脚上输 +出。在发送时,最先移出的是最低有效位,每个数据帧都由一个低电平的起始位开始,然后发送器根 +据M(字长)位上的设置发送八位或九位的数据字,最后是数目可配置的停止位。如果配有奇偶检验 +位,数据字的最后一位为校验位。在 TE置位后会发送一个空闲帧,空闲帧是 10 位或 11位高电平, +包含停止位。断开帧是10位或11位低电平,后跟着停止位。 +18.3 波特率发生器 +收发器的波特率 = FCLK/(16*USARTDIV),FCLK是PBx的时钟,即PCLK1或PCLK2,USART1模 +块使用PCLK2,其余的使用PCLK1。USARTDIV的值是根据USART_BRR中的DIV_M和DIV_F两个域决定 +的,具体计算的公式为: +V2.4 257 + +# Page 261 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USARTDIV = DIV_M+(DIV_F/16) +需要注意的是,波特率产生器产生的波特率不一定能刚好生成用户所需要的,这其中可能是存在 +偏差。除了尽量取接近的值,减小偏差的方法还可以是增大PBx的时钟。比如设定波特率为9600bps +的时,USARTDIV的值设为78.125,在12MHz时可以得到9600bps的波特率,但是如果你需要115200bps +的波特率时,计算的 USARTDIV 是 6.51,但是实际上在 USART_BRR里填入的值最接近只能是 6.5,实 +际产生的波特率是115384bps,误差达到0.16%。 +发送方发出的串口波形传到接收端时,接收方和发送方的波特率是有一定误差的。误差主要来自 +三个方面:接收方和发送方实际的波特率不一致;接收方和发送方的时钟有误差;波形在线路中产生 +的变化。外设模块的接收器是有一定接收容差能力的,当以上三个方面产生的总偏差之和小于模块的 +容差能力极限时,这个总偏差不影响收发。模块的容差能力极限受是否采用分数波特率和M位(数据 +域字长)影响,采用分数波特率和使用9位数据域长度会使容差能力极限降低,但不低于3%。 +18.4 同步模式 +同步模式使得系统在使用USART模块时可以输出时钟信号。在开启同步模式对外发送数据时,CK +引脚会同时对外输出时钟。 +开启同步模式的方式是对控制寄存器2(R16_USARTx_CTLR2)的CLKEN位置位,但同时需要关闭 +LIN模式、智能卡模式、红外模式和半双工模式,即保证SCEN、HDSEL和IREN位处于复位状态,这三 +位在控制寄存器3(R16_USARTx_CTLR3)中。 +同步模式使用的要点在于时钟的输出控制。有以下几点需要注意: +USART模块同步模式只工作在主模式,即CK引脚只输出时钟,不接收输入; +只在TX引脚输出数据时输出时钟信号; +LBCL位决定在发送最后一位数据位时是否输出时钟,CPOL位决定时钟的极性,CPHA决定时钟的 +相位,这三个位在控制寄存器2(R16_USARTx_CTLR2)中,这三个位需要在TE和RE未被使能的情况 +下设置,具体区别见图18-2。 +接收器在同步模式下只会在输出时钟时采样,需要从设备保持一定的信号建立时间和保持时间, +具体见图18-3。 +V2.4 258 + +# Page 262 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图18-2 USART时钟时序示例(M=0) +图18-3 数据采样保持时间 +CK (capture strobe on CK +rising edge in this example) +Data on RX +valid DATA bit +(from slave) +t t +SETUP HOLD +t = t 1/16 bit time +SETUP HOLD +18.5 单线半双工模式 +半双工模式支持使用单个引脚(只使用TX引脚)来接收和发送,TX引脚和RX引脚在芯片内部连 +接。 +开启半双工模式的方式是对控制寄存器3(R16_USARTx_CTLR3)的HDSEL位置位,但同时需要关 +闭 LIN 模式、智能卡模式、红外模式和同步模式,即保证 SCEN、CLKEN 和 IREN 位处于复位状态,这 +三位在控制寄存器2和3(R16_USARTx_CTLR2和R16_USARTx_CTLR3)中。 +设置成半双工模式之后,需要把 TX的 IO 口设置成开漏输出高模式。在 TE置位的情况下,只要 +将数据写到数据寄存器上,就会发送出去。特别要注意的是,半双工模式可能会出现多设备使用单总 +线收发时的总线冲突,这需要用户用软件自行避免。 +18.6 智能卡 +智能卡模式支持ISO7816-3协议访问智能卡控制器。 +开启智能卡模式的方式是对控制寄存器3(R16_USARTx_CTLR3)的SCEN位置位,但同时需要关闭 +LIN 模式、半双工模式和红外模式,即保证 LINEN、HDSEL 和 IREN 位处于复位状态,但是可以开启 +V2.4 259 + +# Page 263 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CLKEN来输出时钟,这些位在控制寄存器2和3(R16_USARTx_CTLR2和R16_USARTx_CTLR3)中。 +为了支持智能卡模式,USART应当被置为8位数据位外加1位校验位,它的停止位建议配置成发 +送和接收都为 1.5 位,智能卡模式是一种单线半双工的协议,它使用 TX 线作为数据通讯,应当被配 +置为开漏输出加上拉。当接收方接收一帧数据检测到奇偶校验错误时,会在停止位时,发出一个NACK +信号,即在停止位期间主动把TX拉低一个周期,发送方检测到NACK信号后,会产生帧错误,应用程 +序据此可以重发。图17-4展示了正确情况下和发生奇偶校验错误情况下的TX引脚上的波形图。USART +的TC标志(发送完成标志)可以延迟GT(保护时间)个时钟产生,接收方也不会将自己置的NACK信 +号认成起始位。 +图18-4 (未)发生奇偶校验错误示意图 +在智能卡模式下,CK引脚使能后输出的波形和通讯无关,它仅仅是给智能卡提供时钟的,它的值 +是PB时钟再经过五位可设置的时钟分频(分频值为PSC的两倍,最高62分频)。 +18.7 IrDA +USART模块支持控制IrDA红外收发器进行物理层通信。使用IrDA必须清除LINEN、STOP、CLKEN、 +SCEN和HDSEL位。USART模块和SIR物理层(红外收发器)之间使用NRZ(不归零)编码,最高支持 +到115200bps速率。 +IrDA是一个半双工的协议,如果UASRT正在给SIR物理层发数据,那么IrDA解码器将会忽视新 +发来的红外信号,如果 USART 正在接受从 SIR 发来的数据,那么 SIR 不会接受来自 USART 的信号。 +USART 发给 SIR 和 SIR 发给 USART 的电平逻辑是不一样的,SIR 接收逻辑中,高电平为 1,低电平为 +0,但是在SIR发送逻辑中,高电平为0,低电平为1。 +18.8 DMA +USART模块支持DMA功能,可以利用DMA实现快速连续收发。当启用DMA时,TXE被置位时,DMA +就会从设定的内存空间向发送缓冲区写数据。当使用DMA接收时,每次RXNE置位后,DMA就会将接收 +缓冲区里的数据转移到特定的内存空间。 +18.9 中断 +USART模块支持多种中断源,包括发送数据寄存器空(TXE)、CTS、发送完成(TC)、接收数据 +就绪(RXNE)、数据溢出(ORE)、线路空闲(IDLE)、奇偶校验出错(PE)、断开标志(LBD)、噪 +声(NE)、多缓冲通信的溢出(ORE)和帧错误(FE)等等。 +表18-1 中断和对应的使能位的关系 +中断源 使能位 +V2.4 260 + +# Page 264 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +数据寄存器空(TXE) TXEIE +允许发送(CTS) CTSIE +发送完成(TC) TCIE +接收数据就绪(RXNE) +RXNEIE +数据溢出(ORE) +线路空闲(IDLE) IDLEIE +奇偶校验出错(PE) PEIE +断开标志(LBD) LBDIE +噪声(NE) +多缓冲通信的溢出(ORE) EIE +多缓冲通信的帧错误(FE) +18.10 寄存器描述 +表18-2 USART1相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART1_STATR 0x40013800 UASRT1状态寄存器 0x000000C0 +R32_USART1_DATAR 0x40013804 UASRT1数据寄存器 0x00000000 +R32_USART1_BRR 0x40013808 UASRT1波特率寄存器 0x00000000 +R32_USART1_CTLR1 0x4001380C UASRT1控制寄存器1 0x00000000 +R32_USART1_CTLR2 0x40013810 UASRT1控制寄存器2 0x00000000 +R32_USART1_CTLR3 0x40013814 UASRT1控制寄存器3 0x00000000 +R32_USART1_GPR 0x40013818 UASRT1保护时间和预分频寄存器 0x00000000 +R32_USART1_CTRL4 0x4001381C UASRT1控制寄存器4 0x00000000 +表18-3 USART2相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART2_STATR 0x40004400 UASRT2状态寄存器 0x000000C0 +R32_USART2_DATAR 0x40004404 UASRT2数据寄存器 0x00000000 +R32_USART2_BRR 0x40004408 UASRT2波特率寄存器 0x00000000 +R32_USART2_CTLR1 0x4000440C UASRT2控制寄存器1 0x00000000 +R32_USART2_CTLR2 0x40004410 UASRT2控制寄存器2 0x00000000 +R32_USART2_CTLR3 0x40004414 UASRT2控制寄存器3 0x00000000 +R32_USART2_GPR 0x40004418 UASRT2保护时间和预分频寄存器 0x00000000 +R32_USART2_CTRL4 0x4000441C UASRT2控制寄存器4 0x00000000 +表18-4 USART3相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART3_STATR 0x40004800 UASRT3状态寄存器 0x000000C0 +R32_USART3_DATAR 0x40004804 UASRT3数据寄存器 0x00000000 +R32_USART3_BRR 0x40004808 UASRT3波特率寄存器 0x00000000 +R32_USART3_CTLR1 0x4000480C UASRT3控制寄存器1 0x00000000 +R32_USART3_CTLR2 0x40004810 UASRT3控制寄存器2 0x00000000 +R32_USART3_CTLR3 0x40004814 UASRT3控制寄存器3 0x00000000 +V2.4 261 + +# Page 265 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_USART3_GPR 0x40004818 UASRT3保护时间和预分频寄存器 0x00000000 +R32_USART3_CTRL4 0x4000481C UASRT3控制寄存器4 0x00000000 +表18-5 USART4相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART4_STATR 0x40004C00 USART4状态寄存器 0x000000C0 +R32_USART4_DATAR 0x40004C04 USART4数据寄存器 0x00000000 +R32_USART4_BRR 0x40004C08 USART4波特率寄存器 0x00000000 +R32_USART4_CTLR1 0x40004C0C USART4控制寄存器1 0x00000000 +R32_USART4_CTLR2 0x40004C10 USART4控制寄存器2 0x00000000 +R32_USART4_CTLR3 0x40004C14 USART4控制寄存器3 0x00000000 +R32_USART4_GPR 0x40004C18 USART4保护时间和预分频寄存器 0x00000000 +R32_USART4_CTRL4 0x40004C1C UASRT4控制寄存器4 0x00000000 +表18-6 USART5相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART5_STATR 0x40005000 USART5状态寄存器 0x000000C0 +R32_USART5_DATAR 0x40005004 USART5数据寄存器 0x00000000 +R32_USART5_BRR 0x40005008 USART5波特率寄存器 0x00000000 +R32_USART5_CTLR1 0x4000500C USART5控制寄存器1 0x00000000 +R32_USART5_CTLR2 0x40005010 USART5控制寄存器2 0x00000000 +R32_USART5_CTLR3 0x40005014 USART5控制寄存器3 0x00000000 +R32_USART5_GPR 0x40005018 USART5保护时间和预分频寄存器 0x00000000 +R32_USART5_CTRL4 0x4000501C UASRT5控制寄存器4 0x00000000 +表18-7 USART6相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART6_STATR 0x40001800 USART6状态寄存器 0x000000C0 +R32_USART6_DATAR 0x40001804 USART6数据寄存器 0x00000000 +R32_USART6_BRR 0x40001808 USART6波特率寄存器 0x00000000 +R32_USART6_CTLR1 0x4000180C USART6控制寄存器1 0x00000000 +R32_USART6_CTLR2 0x40001810 USART6控制寄存器2 0x00000000 +R32_USART6_CTLR3 0x40001814 USART6控制寄存器3 0x00000000 +R32_USART6_GPR 0x40001818 USART6保护时间和预分频寄存器 0x00000000 +R32_USART6_CTRL4 0x4000181C UASRT6控制寄存器4 0x00000000 +表18-8 USART7相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART7_STATR 0x40001C00 USART7状态寄存器 0x000000C0 +R32_USART7_DATAR 0x40001C04 USART7数据寄存器 0x00000000 +R32_USART7_BRR 0x40001C08 USART7波特率寄存器 0x00000000 +R32_USART7_CTLR1 0x40001C0C USART7控制寄存器1 0x00000000 +R32_USART7_CTLR2 0x40001C10 USART7控制寄存器2 0x00000000 +R32_USART7_CTLR3 0x40001C14 USART7控制寄存器3 0x00000000 +V2.4 262 + +# Page 266 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_USART7_GPR 0x40001C18 USART7保护时间和预分频寄存器 0x00000000 +R32_USART7_CTRL4 0x40001C1C UASRT7控制寄存器4 0x00000000 +表18-9 USART8相关寄存器列表 +名称 访问地址 描述 复位值 +R32_USART8_STATR 0x40002000 USART8状态寄存器 0x000000C0 +R32_USART8_DATAR 0x40002004 USART8数据寄存器 0x00000000 +R32_USART8_BRR 0x40002008 USART8波特率寄存器 0x00000000 +R32_USART8_CTLR1 0x4000200C USART8控制寄存器1 0x00000000 +R32_USART8_CTLR2 0x40002010 USART8控制寄存器2 0x00000000 +R32_USART8_CTLR3 0x40002014 USART8控制寄存器3 0x00000000 +R32_USART8_GPR 0x40002018 USART8保护时间和预分频寄存器 0x00000000 +R32_USART8_CTRL4 0x4000201C UASRT8控制寄存器4 0x00000000 +18.10.1 USART 状态寄存器(USARTx_STATR)(x=1/2/3/4/5/6/7/8) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MS_ER RX_BU +Reserved CTS LBD TXE TC RXNE IDLE ORE NE FE PE +R SY +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +MARK或SPACE校验错误标志。在接收模式下, +如果产生 MARK 或 SPACE 校验错误,硬件置位 +此位。读此位再读数据寄存器的操作会复位此 +位。如果之前MS_ERRIE被置位,那么此位被置 +11 MS_ERR RO 0 +位会产生相应中断。 +注:仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批 +号倒数第六位不为0的产品。 +接收状态指示位: +0:处于非接收状态; +1:工作在接收状态时,此位置位。 +10 RX_BUSY RO 0 +注:仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批 +号倒数第六位不为0的产品。 +CTS 状态改变标志。如果设置了 CTSE 位,当 +nCTS输出状态改变时,该位将由硬件置高。由 +软件清零。如果CTSIE位已经被置位,则会产 +9 CTS RW0 0 +生中断。 +0:nCTS状态线上没有变化; +1:nCTS状态线上存在变化。 +V2.4 263 + +# Page 267 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +LIN Break检测标志。当检测到LIN Break时, +该位被硬件置位。由软件清零。如果LBDIE已 +8 LBD RW0 经被置位,则将会产生中断。 0 +0:没有检测待LIN Break; +1:检测到LIN Break。 +发送数据寄存器空标志。当TDR寄存器中的的 +数据被硬件转移到移位寄存器的时候,该位被 +硬件置位。如果TXEIE已经被置位时,就会产 +7 TXE RO 生中断,对数据寄存器进行写操作,此位将会 1 +被复位。 +0:数据还没被转移到移位寄存器; +1:数据已经被转移到移位寄存器。 +发送完成标志。当含有数据的一帧发送完成 +后,并且TXE被置位,则硬件将会此位置位, +如果TCIE被置位,还会产生对应中断,软件读 +6 TC RW0 了此位再写数据寄存器则会清除此位。也可以 1 +直接写0来清除此位。 +0:发送还未完成; +1:发送完成。 +读数据寄存器非空标志,当移位寄存器中的数 +据被转移到数据寄存器中,该位会被硬件置 +位。如果RXNEIE已经被置位,则还会产生对应 +5 RXNE RW0 的中断。对数据寄存器的读操作可以将该位清 0 +除。也可以直接写0来清除该位。 +0:数据还没收到; +1:数据收到,能够读出。 +总线空闲标志。当总线空闲时,该位将会被硬 +件置位。如果IDLEIE已经被置位,则会产生对 +应的中断。读状态寄存器再读数据寄存器的操 +4 IDLE RO 作会清除此位。 0 +0:没有检测到总线空闲; +1:总线正空闲。 +注:此位不会被再次置位直到RXNE被置位。 +过载错误标志。当接收移位寄存器存在数据需 +要转到数据寄存器时,但是数据寄存器的接收 +域还有数据未读出时,此位将会被置位。如果 +RXNEIE被置位了,还会产生对应中断。 +0:没有过载错误; +3 ORE RO 0 +1:发生过载错误。 +注:发生过载错误时,数据寄存器的值不会丢 +失,但是移位寄存器的值会被覆盖。如果设置 +可EIE位,在多缓冲区通讯模式下,ORE标志 +位置位会产生中断。 +噪声错误标志。当检测到噪声错误标志时,由 +2 NE RO 硬件置位。读状态寄存器后,再读数据寄存器 0 +的操作会复位此位。 +V2.4 264 + +# Page 268 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:没有检测到噪声; +1:检测到噪声。 +注:该位不会产生中断。如果设置了EIE位, +在多缓冲区通讯模式下,FE标志位置位会产生 +中断。 +帧错误标志。当检测到同步错误,过多的噪声 +或者断开符,该位将会被硬件置位。读此位再 +读数据寄存器的操作会复位此位。 +0:没有检测到帧错误; +1 FE RO 0 +1:检测到帧错误。 +注:该位不会产生中断,如果设置了EIE位, +在多缓冲区通讯模式下,FE标志位置位会产生 +中断。 +校验错误标志。在接收模式下,如果产生奇偶 +检验错误,硬件置位此位。读此位再读数据寄 +存器的操作会复位此位。在清除此位前,软件 +必须等RXNE标志位被置位。如果PEIE之前已 +0 PE RO 0 +经被置位,那么此位被置位会产生对应的中 +断。 +0:没有检验错误; +1:出现奇偶校验错误。 +18.10.2 USART 数据寄存器(USARTx_DATAR)(x=1/2/3/4/5/6/7/8) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DR[8:0] +位 名称 访问 描述 复位值 +[31:9] Reserved RO 保留。 0 +数据寄存器。这个寄存器实际上是接收数据寄 +存器(RDR)和发送寄存器(TDR)两个寄存器 +[8:0] DR[8:0] RW 0 +组成,DR的读写操作起始分别是读接收寄存器 +(RDR)和写发送寄存器(TDR)。 +18.10.3 USART 波特率寄存器(USARTx_BRR)(x=1/2/3/4/5/6/7/8) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DIV_Mantissa[11:0] DIV_Fraction[3:0] +V2.4 265 + +# Page 269 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +DIV_Mantissa +[15:4] RW 这12位定义了分频器除法因子的整数部分。 0 +[11:0] +[3:0] DIV_Fraction[3:0] RW 这4位定义了分频器除法因子的小数部分。 0 +18.10.4 USART 控制寄存器 1(USARTx_CTLR1)(x=1/2/3/4/5/6/7/8) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +M_EXT UE M WAKE PCE PS PEIE TXEIE TCIE RXNEIE IDLEIE TE RE RWU SBK +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +字长扩展位: +00:无效,M位决定数据长度。 +01:7个数据位; +10:6个数据位; +[15:14] M_EXT RW 0 +11:5个数据位。 +注:仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批 +号倒数第六位不为0的产品。 +USART使能位。 +0:禁止USART; +13 UE RW 1:使能USART。 0 +当此位被清零后,在当前字节传输完成后, +USART的分频器和输出都会停止工作。 +字长位。 +12 M RW 0:8个数据位; 0 +1:9个数据位。 +唤醒位。此位决定了把USART唤醒的方法: +11 WAKE RW 0:总线空闲; 0 +1:地址标记。 +校验位使能。 +0:校验位关闭; +1:校验位使能。 +10 PCE RW 对于接收方,就是进行对数据的奇偶校验;对 0 +于发送方,就是插入校验位。一旦设置了此位, +只有当前字节传输完成后,校验位使能才生 +效。 +奇偶校验选择: +9 PS RW 0:偶校验; 0 +1:奇校验。 +V2.4 266 + +# Page 270 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +设置了该位后,只有当前字节传输完成后,校 +验位使能才生效。 +奇偶检验中断使能位。 +8 PEIE RW 0:禁止产生奇偶检验错误中断; 0 +1:允许产生奇偶检验错误中断。 +发送缓冲区空中断使能: +7 TXEIE RW 0:禁止产生发送缓冲区空中断; 0 +1:允许产生发送缓冲区空中断。 +发送完成中断使能: +6 TCIE RW 0:禁止产生发送完成中断; 0 +1:允许产生发送完成中断。 +接收缓冲区非空中断使能: +5 RXNEIE RW 0:禁止产生接收缓冲区非空中断; 0 +1:允许产生接收缓冲区非空中断。 +总线空闲中断使能: +4 IDLEIE RW 0:禁止产生总线空闲中断; 0 +1:允许产生总线空闲中断。 +发送使能。 +3 TE RW 0:关闭发送器; 0 +1:使能发送器。 +接收使能。 +0:关闭接收器; +2 RE RW 0 +1:使能接收器,接收器开始检测RX引脚上的 +起始位。 +接收唤醒。该位决定是否把USART置于静默模 +式: +0:接收器处于正常工作模式; +1:接收器处于静默模式。 +1 RWU RW 注1:置RWU位之前,USART需要先接收一个数 0 +据字节,否则在静默模式下,不能被总线空闲 +唤醒; +注2:当配置成地址标记唤醒时,在RXNE被置 +位时,不能用软件修改RWU位。 +发送帧断开字符控制位。置此位来发送一个帧 +断开字符。在断开帧的停止位时,由硬件复位。 +0 SBK RW 0 +0:不发送; +1:发送。 +18.10.5 USART 控制寄存器 2(USARTx_CTLR2)(x=1/2/3/4/5/6/7/8) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ReserLINEN STOP CLKEN CPOL CPHA LBCL Reser LBDIE LBDL Reser ADD[3:0] +V2.4 267 + +# Page 271 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +ved ved ved +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +LIN模式使能位,置位则使能LIN模式。在LIN +14 LINEN RW 模式下,可以使用SBK位发送LIN同步断开符 0 +号,以及检测LIN同步断开符。 +停止位设置域。这两位来设置停止位。 +00:1个停止位; +[13:12] STOP RW 01:0.5个停止位; 00b +10:2个停止位; +11:1.5个停止位。 +时钟使能,使能CK引脚。 +11 CLKEN RW 0:禁止; 0 +1:使能。 +时钟极性设置位。在同步模式下,可以用该位 +选择SLCK引脚上时钟输出的极性,和CPHA一 +起配合来产生需要的时钟/数据的采样关系。 +10 CPOL RW 0 +0:总线空闲时CK引脚上保持低电平; +1:总线空闲时CK引脚上保持高电平。 +注:使能发送后此位不可被修改。 +时钟相位设置位。在同步模式下,可以用该位 +选择 SLCK 引脚上的时钟输出的相位,和 CPOL +位一起配合来产生需要的时钟/数据的采样关 +9 CPHA RW 系。 0 +0:在时钟的第一个边沿进行数据捕获; +1:在时钟的第二个边沿进行数据捕获。 +注:使能发送后此位不可被修改。 +最后一个时钟脉冲控制位: +在同步模式下,使用该位来控制是否在 CK 引 +脚上输出最后发送的那个数据字节对应的时 +8 LBCL RW 钟脉冲; 0 +0:最后一位数据的时钟脉冲会从CK输出; +1:最后一位数据的时钟脉冲不从CK输出。 +注:使能发送后此位不可被修改。 +7 Reserved RW 保留。 0 +LIN Break检测中断使能: +6 LBDIE RW 0:关闭LBD引起的中断; 0 +1:使能LBD引起的中断。 +LIN Break检测长度,该位用来选择是11位还 +是10位的断开符检测。 +5 LBDL RW 0 +0:10位的断开符检测; +1:11位的断开符检测。 +4 Reserved RW 保留。 0 +[3:0] ADD[3:0] RW 地址域,用来设置本设备的USART节点地址。 0 +V2.4 268 + +# Page 272 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +在多处理器通讯下的静默模式中使用的,使用 +地址标记来唤醒某个USART设备。 +18.10.6 USART 控制寄存器 3(USARTx_CTLR3)(x=1/2/3/4/5/6/7/8) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CTSIE CTSE RTSE DMAT DMAR SCEN NACK HDSEL IRLP IREN EIE +位 名称 访问 描述 复位值 +[31:11] Reserved RO 保留。 0 +CTSIE中断使能位: +10 CTSIE RW 0:在CTS被置位时不产生中断; 0 +1:在CTS被置位时会产生中断。 +CTS使能位: +9 CTSE RW 0:关闭CTS流控; 0 +1:使能CTS流控。 +RTS使能位: +8 RTSE RW 0:关闭RTS流控; 0 +1:使能RTS流控。 +DMA发送使能位: +7 DMAT RW 0:在发送时不使用DMA; 0 +1:在发送时使用DMA。 +DMA接收使能位: +6 DMAR RW 0:在接收时不使用DMA; 0 +1:在接收时使用DMA。 +智能卡模式使能位: +5 SCEN RW 0:关闭智能卡模式; 0 +1:使能智能卡模式。 +智能卡NACK使能位: +4 NACK RW 0:在校验错误出现时,不发送NACK; 0 +1:在校验错误出现时,发送NACK。 +半双工模式选择位: +3 HDSEL RW 0:关闭半双工模式; 0 +1:开启半双工模式。 +红外低功耗选择位: +2 IRLP RW 0:在选择红外线时,关闭低功耗模式; 0 +1:在选择红外线时,启用低功耗模式。 +红外线使能位: +1 IREN RW 0:关闭红外模式; 0 +1:使能红外模式。 +错误中断位使能: +0 EIE RW 0 +0:关闭错误中断; +V2.4 269 + +# Page 273 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:使能错误中断。 +置此位后,在DMAR被置位的前提下,如果FE、 +ORE或NE被置位,就会产生中断。 +18.10.7 USART 保护时间和预分频寄存器(USARTx_GPR)(x=1/2/3/4/5/6/7/8) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +GT[7:0] PSC[7:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +保护时间值域。该域规定了以波特率时钟为单 +[15:8] GT[7:0] RW 位的保护时间。在智能卡模式下,当保护时间 0 +过去后,才会设置发送完成标志。 +预分频器值域。 +在红外低功耗模式下,源时钟被该值(全部 8 +位有效)分频,值为0时表示保留; +[7:0] PSC[7:0] RW 在红外正常模式下,此位只能被设置为1; 0 +在智能卡模式下,源时钟被该值(低5位有效) +的两倍分频,来给智能卡提供时钟,值为0表 +示保留。 +18.10.8 USART 控制寄存器 4(USARTx_CTLR4)(x=1/2/3/4/5/6/7/8) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CHECK_SEL[ MS_ER Reser +Reserved +1:0] RIE ved +位 名称 访问 描述 复位值 +[31:4] Reserved RO 保留。 0 +校验功能选择位: +0x:关闭MARK和SPACE校验。 +[3:2] CHECK_SEL[1:0] RW 0 +10:使能MARK校验。 +11:使能SPACE校验。 +SPACE或MARK校验使能位: +1 MS_ERRIE RW 0:禁止产生SPACE或MARK校验错误中断; 0 +1:允许产生SPACE或MARK校验错误中断。 +0 Reserved RO 保留。 0 +注:USARTx_CTLR4 寄存器仅适用于 CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +V2.4 270 + +# Page 274 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CH32V31x_D8C批号倒数第六位不为0的产品。 +V2.4 271 + +# Page 275 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 19 章 两线通信总线(I2C) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +内部集成电路总线(I2C)广泛用在微控制器和传感器及其他片外模块的通讯上,它本身支持多 +主多从模式,仅仅使用两根线(SDA和SCL)就能以100kHz(标准)和400kHz(快速)两种速度通讯。 +I2C总线还兼容SMBus协议,不仅支持I2C的时序,还支持仲裁、定时和DMA,拥有CRC校验功能。 +19.1 主要特征 + 支持主模式和从模式 + 支持7位或10位地址 + 从设备支持双7位地址 + 支持两种速度模式:100kHz和400kHz + 多种状态模式,多种错误标志 + 支持加长的时钟功能 + 2个中断向量 + 支持DMA + 支持PEC + 兼容SMBus +19.2 概述 +I2C是半双工的总线,它同时只能运行在下列四种模式中之一:主设备发送模式、主设备接收模 +式、从设备发送模式和从设备接收模式。I2C模块默认工作在从模式,在产生起始条件后,会自动地 +切换到主模式,当仲裁丢失或产生停止信号后,会切换到从模式。I2C模块支持多主机功能。工作在 +主模式时,I2C模块会主动发出数据和地址。数据和地址都以8位为单位进行传输,高位在前,低位 +在后,在起始事件后的是一个字节(7位地址模式下)或两个字节(10位地址模式下)地址,主机每 +发送8位数据或地址,从机需要回复一个应答ACK,即把SDA总线拉低,如图19-1所示。 +图19-1 I2C时序图 +为了正常使用必须给I2C输入正确的时钟,其中标准模式下,输入时钟最低为2MHz,在快速模式 +下,输入时钟最低为4MHz。 +图19-2是I2C模块功能框图。 +V2.4 272 + +# Page 276 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图19-2 I2C功能框图 +Data register +Noise Data +SDA Data shift register +filter control +Comparator PEC calculation +Own address register +Dual address register +Noise Clock PEC register +SCL +filter control +Clock control +Register (CKCFGR) +Control registers +(CTLR1&CTLR2) +Control +Status registers +logic +(STAR1&STAR2) +SMBA +Interrupts DMA requests & ACK +19.3 主模式 +主模式时,I2C模块主导数据传输并输出时钟信号,数据传输以开始事件开始,以结束事件结束。 +使用主模式通讯的步骤为: +在控制寄存器2(R16_I2Cx_CTLR2)和时钟控制寄存器(R16_I2Cx_CKCFGR)中设置正确的时 +钟; +在上升沿寄存器(R16_I2Cx_RTR)设置合适的上升沿; +在控制寄存器(R16_I2Cx_CTLR1)中置PE位启动外设; +在控制寄存器(R16_I2Cx_CTLR1)中置START位,产生起始事件。 +在置 START 位后,I2C 模块会自动切换到主模式,MSL 位会置位,产生起始事件,在产生起始事 +件后,SB 位会置位,如果 ITEVTEN 位(在 R16_I2Cx_CTLR2)被置位,则会产生中断。此时应该读取 +状态寄存器1(R16_I2Cx_STAR1),写从地址到数据寄存器后,SB位会自动清除; +如果是使用10位地址模式,那么写数据寄存器发送头序列(头序列为11110xx0b,其中的xx位 +是10位地址的最高两位)。 +在发送完头序列之后,状态寄存器的ADD10位会被置位,如果ITEVTEN位已经置位,则会产生中 +断,此时应读取R16_I2Cx_STAR1寄存器后,写第二个地址字节到数据寄存器后,清除ADD10位。 +然后写数据寄存器发送第二个地址字节,在发送完第二个地址字节后,状态寄存器的 ADDR 位会 +被置位,如果 ITEVTEN 位已经置位,则会产生中断,此时应读取 R16_I2Cx_STAR1 寄存器后再读一次 +R16_I2Cx_STAR2寄存器以清除ADDR位; +如果使用的是7位地址模式,那么写数据寄存器发送地址字节,在发送完地址字节后,状态寄存 +器的ADDR位会被置位,如果ITEVTEN位已经置位,则会产生中断,此时应读取R16_I2Cx_STAR1寄存 +器后再读一次R16_I2Cx_STAR2寄存器以清除ADDR位; +V2.4 273 + +# Page 277 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +在7位地址模式下,发送的第一个字节为地址字节,头7位代表的是目标从设备地址,第8位决 +定了后续报文的方向,0代表是主设备写入数据到从设备,1代表是主设备向从设备读取信息。 +在10位地址模式下,如图18-3所示,在发送地址阶段,第一个字节为11110xx0,xx为10位地 +址的最高 2 位,第二个字节为 10 位地址的低 8位。若后续进入主设备发送模式,则继续发送数据; +若后续准备进入主设备接收模式,则需要重新发送一个起始条件,跟随发送一个字节为11110xx1,然 +后进入主设备接收模式。 +图19-3 10位地址时主机收发数据示意图 +Transmitter +S 1 1 1 1 0 X X 0 A Address 7- 0 A DATA A DATA A P +(The upper 2 bits (Write) The lower 8 bits of +of the address) the address +Receiver +S 1 1 1 1 0 X X 0 A Address 7- 0 A S 1 1 1 1 0 X X 1 A DATA A DATA A P +(The upper 2 bits (Write) The lower 8 bits of (Read) +of the address) the address +主发送模式: +主设备内部的移位寄存器将数据从数据寄存器发送到SDA线上,当主设备接收到ACK时,状态寄 +存器1(R16_I2Cx_STAR1)的TxE被置位,如果ITEVTEN和ITBUFEN被置位,还会产生中断。向数据 +寄存器写入数据将会清除TxE位。 +如果 TxE 位被置位且上次发送数据之前没有新的数据被写入数据寄存器,那么 BTF 位会被置位, +在其被清除之前,SCL将保持低电平,读R16_I2Cx_STAR1后,向数据寄存器写入数据将会清除BTF位。 +图19-4 主发送器传送序列图 +7-bit master transmit +S Address A Data1 A Data2 A DataN A P +…… +EVT5 EVT6 EVT8_1 EVT8 EVT8 EVT8 EVT8_2 +10-bit master transmit +Frame +S A Address A Data1 A DataN A P +header …… +EVT5 EVT9 EVT6 EVT8_1 EVT8 EVT8 EVT8_2 +Description: S=Start (start condition), Sr=repeated start condition, P=Stop (stop condition), A=response, NA=non- +response, EVTx=event (interrupt generated when ITEVFEN=1) +EVT5: SB=1, reading SR1 and then writing the address to the DR register will clear the event. +EVT6;ADDR=1,reading SR1 then reading SR2 will clear the event. +EVT8_1: TxE=1, shift register empty, data register empty, write DR register. +EVT8: TxE=1,shift register is not empty,data register is empty,writing DR register will clear +the event. +EVT8_2: TxE=1, BTF=1, request to set the stop bit. the TxE and BTF bits are cleared by hardware +when the stop condition is generated. +EVT9: ADDR10=1, reading SR1 and then writing to DR register will clear the event. +Note: 1: EVT5, EVT6, EVT9, EVT8_1 and EVT8_2 events elongate the SCL low until the end of the +corresponding software sequence. +2: The software sequence of EVT8 must be completed before the end of the current byte transfer. +主接收模式: +I2C模块会从SDA线接收数据,通过移位寄存器写进数据寄存器。在每个字节之后,如果ACK位 +被置位,那么 I2C 模块将会发出一个应答低电平,同时 RxNE 位会被置位,如果 ITEVTEN 和 ITBUFEN +被置位,还会产生中断。如果RxNE被置位且在新的数据被接收前,原有的数据没有被读出,则BTF位 +将被置位,在清除BTF之前,SCL将保持低电平,读取R16_I2Cx_STAR1后,再读取数据寄存器将会清 +V2.4 274 + +# Page 278 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +除BTF位。 +图19-5 接收器传送序列图 +7-bit master reception +S Address A Data1 A(1) Data2 A DataN NA P +…… +EVT5 EVT6 EVT6_1 EVT7 EVT7 EVT7_1 EVT7 +10-bit master reception +Frame +S A Address A +header +EVT5 EVT9 EVT6 +Frame +Sr +header +A Data1 A(1) Data2 A DataN NA P +…… +EVT5 EVT6 EVT6_1 EVT7 EVT7 EVT7_1 EVT7 +Description: S=Start (start condition), Sr=repeated start condition, P=Stop (stop condition), A=response, NA=non-response, +EVTx=event (interrupt generated when ITEVFEN=1) +EVT5: SB=1, reading SR1 and then writing the address to DR register will clear the event. +EVT6: ADDR=1,reading SR1 and then reading SR2 will erase this event. In 10-bit master receive mode, START=1 of CR2 should be +set after this event. +EVT6_1: There is no corresponding event flag and it is only suitable for receiving 1 byte. Exactly after EVT6 (i.e. after ADDR +is cleared), the response and stop condition generation bits should be cleared. +EVT7: RxNE=1, read DR register to clear the event. +EVT7_1: RxNE=1, read the DR register to clear this event. Set ACK=0 and STOP request. +EVT9: ADDR10=1, reading SR1 and then writing to DR register will clear this event. +主设备在结束发送数据时,会主动发一个结束事件,即置STOP位,I2C将切换至从模式。在接收 +模式时,主设备需要在最后一个数据位的应答位置NAK,接收到NACK后,从设备释放对SCL和SDA线 +的控制;主设备就可以发送一个停止/重起始条件。注意,产生停止条件后,I2C模块将会自动切换至 +从模式。 +19.4 从模式 +从模式时,I2C模块能识别它自己的地址和广播呼叫地址。软件能控制开启或禁止广播呼叫地 +址的识别。一旦检测到起始事件,I2C模块将SDA的数据通过移位寄存器与自己的地址(位数取决 +于ENDUAL和ADDMODE)或广播地址(ENGC置位时)相比较,如果不匹配将会忽略,直到产生新的起 +始事件;如果与头序列相匹配,则会产生一个ACK信号并等待第二个字节的地址;如果第二字节的 +地址也匹配或者7位地址情况下全段地址匹配,那么: +首先产生一个ACK应答; +ADDR位被置位,如果ITEVTEN位已经置位,那么还会产生相应的中断; +如果使用的是双地址模式(ENDUAL位被置位),还需要读取DUALF位来判断主机唤起的是哪一 +个地址。 +从模式默认是接收模式,在接收的头序列的最后一位为1,或者7位地址最后一位为1后(取 +决于第一次接收到头序列还是普通的7位地址),当接收到重复的起始条件时,I2C模块将进入到 +发送器模式,TRA位将指示当前是接收器还是发送器模式。 +从发送模式: +在清除ADDR位后,I2C模块将字节从数据寄存器通过移位寄存器发送到SDA线上。从设备保持 +SCL为低电平,直到ADDR位被清除且待发送数据已写入数据寄存器。(见下图中的EVT1和 +EVT3)。在收到一个应答ACK后,TxE位将被置位,如果设置了ITEVTEN和ITBUFEN,还会产生一个 +中断。如果TxE被置位但在下一个数据发送结束前没有新的数据被写入数据寄存器时,BTF位将被 +置位。在清除BTF前,SCL将保持低电平,读取状态寄存器1(R16_I2Cx_STAR1)后,再向数据寄存 +器写入数据将会清除BTF位。 +V2.4 275 + +# Page 279 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图19-6 从发送器的传送序列图 +7-bit slave send +S Address A Data1 A Data2 A DataN NA P +…… +EVT1 EVT3_1 EVT3 EVT3 EVT3 EVT3_2 +10-bit slave send +Frame +S A Address A +header +EVT1 +Frame +Sr A Data1 A DataN NA P +header +…… +EVT1 EVT3_1 EVT3 EVT3 EVT3_2 +Description: S=Start (start condition), Sr=repeated start condition, P=Stop (stop condition), A=response, NA=non- +response, EVTx=event (interrupt is generated when ITEVFEN=1) +EVT1;ADDR=1,read SR1 then read SR2 will eliminate the event. +EVT3_1: TxE=1, shift register empty, data register empty, write DR. +EVT3: TxE=1,shift register is not empty,data register is empty,writing DR will clear the event. +EVT3_2: AF=1, write '0' in AF bit of SR1 register to clear AF bit. +Note: 1: EVT1 and EVT3_1 events elongate SCL low until the end of the corresponding software sequence. +2: The software sequence of EVT3 must be completed before the end of the current byte transfer. +从接收模式: +在ADDR被清除后,I2C模块将SDA上的数据通过移位寄存器存进数据寄存器,在每接收到一个 +字节后,I2C模块都会置一个ACK位,并置RxNE位。如果设置了ITEVTEN和ITBUFEN,还会产生一 +个中断。如果RxNE被置位,且在接收到新的数据前旧的数据没有被读出,那么BTF会被置位。在清 +除BTF位之前SCL会保持低电平。读取状态寄存器1(R16_I2Cx_STAR1)并读取数据寄存器里的数 +据会清除BTF位。 +图19-7 从接收器的传送序列图 +7-bit slave reception +S Address A Data1 A Data2 A DataN A P +…… +EVT1 EVT2 EVT2 EVT2 EVT4 +10-bit slave reception +Frame +S A Address A Data1 A DataN A P +header …… +EVT1 EVT2 EVT2 EVT4 +Description: S=Start (start condition), Sr=repeated start condition, P=Stop (stop condition), A=response, NA=non- +response, EVTx=event (interrupt generated when ITEVFEN=1) +EVT1;ADDR=1,reading SR1 then SR2 will erase the event. +EVT2: RxNE=1, reading DR will clear the event. +EVT4: STOPF=1,reading SR1 and then writing CR1 register will clear the event. +Note: 1: EVT1 event elongates SCL low until the end of the corresponding software sequence. +2: The software sequence of EVT2 must be completed before the end of the current byte transfer. +主设备在传输完最后一个数据字节后,将产生一个停止条件,当I2C模块检测到停止事件时, +将置STOPF位,如果设置了ITEVFEN位,还会产生一个中断。用户需要读取状态寄存器 +(R16_I2Cx_STAR1)再写控制寄存器(比如复位控制字SWRST)来清除。(见上图中的EVT4)。 +V2.4 276 + +# Page 280 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +19.5 错误 +19.5.1 总线错误 BERR +在传输地址或数据期间,I2C模块检测到外部的起始或停止事件时,将产生一个总线错误。产生 +总线错误时,BERR位被置位,如果设置了ITERREN还会产生一个中断。在从模式下,数据被丢弃,硬 +件释放总线。如果是起始信号,硬件会认为是重启信号,开始等待地址或停止信号;如果是停止信号, +则提前按正常的停止条件操作。在主模式下,硬件不会释放总线,同时不影响当前传输,由用户代码 +决定是否中止传输。 +19.5.2 应答错误 AF +当I2C模块检测到一个字节后没有应答时,会产生应答错误。产生应答错误时:AF会被置位,如 +果设置了 ITERREN还会产生一个中断;遇到 AF 错误,如果 I2C 模块工作在从模式,硬件必须释放总 +线,如果处于主模式,软件必须生成一个停止事件。 +19.5.3 仲裁丢失 ARLO +当I2C模块检测到仲裁丢失时,产生仲裁丢失错误。产生仲裁丢失错误时:ARLO位被置位,如果 +设置了ITERREN还会产生一个中断;I2C模块切换到从模式,并不再响应针对它的从地址发起的传输, +除非有主机发起新的起始事件;硬件会释放总线。 +19.5.4 过载/欠载错误 OVR + 过载错误: +在从机模式下,如果禁止时钟延长,I2C模块正在接收数据,如果已经接受到一个字节的数 +据,但是上一次接收到数据还没有被读出,则会产生过载错误。发生过载错误时,最后收到的字节 +将被丢弃,发送方应当重发最后一次发送的字节。 + 欠载错误: +在从模式下,如果禁止时钟延长,I2C模块正在发送数据,如果在下一个字节的时钟到来之前 +新的数据还没有被写入到数据寄存器,那么将产生欠载错误。在发生欠载错误时,前一次数据寄存 +器里的数据将被发送两次,如果发生欠载错误,那么接收方应该丢弃重复收到的数据。为了不产生 +欠载错误,I2C模块应当在下一个字节的第一个上升沿之前将数据写入数据寄存器。 +19.6 时钟延长 +如果禁止时钟延长,那么就存在发生过载/欠载错误的可能。但如果使能了时钟延长: + 在发送模式下,如果TxE置位且BTF置位,SCL将一直为低,一直等待用户读取状态寄存器, +并向数据寄存器写入待发送的数据; + 在接收模式下,如果RxNE置位且BTF置位,那么SCL在接收到数据后将保持低,直到用户读取 +状态寄存器,并读取数据寄存器; +由此可见,使能时钟延长可以避免出现过载/欠载错误。 +19.7 SMBus +SMBus也是一种双线接口,它一般应用在系统和电源管理之间。SMBus和I2C有很多相似的地 +方,例如SMBus使用和I2C一样的7位地址模式,以下是SMBus和I2C的共同点: +1) 主从通信模式,主机提供时钟,支持多主多从; +2) 两线通讯结构,其中SMBus可选一个警示线; +V2.4 277 + +# Page 281 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +3) 都支持7位地址格式。 +同时SMBus和I2C也存在区别: +1) I2C支持的速度最高400kHz,而SMBus支持的最高是100kHz,且SMBus有最小10kHz的速度限 +制; +2) SMBus的时钟为低超过35mS时,会报超时,但I2C无此限制; +3) SMBus有固定的逻辑电平,而I2C没有,取决于V ; +DD +4) SMBus有总线协议,而I2C没有。 +SMBus还包括设备识别、地址解析协议、唯一的设备标识符、SMBus提醒和各种总线协议,具体 +请参考SMBus规范2.0版本。当使用SMBus时,只需要置控制寄存器的SMBus位,按需配置 +SMBTYPE位和ENAARP位。 +19.8 中断 +每个I2C模块都有两种中断向量,分别是事件中断和错误中断。两种中断支持图19-4的中断 +源。 +图19-8 I2C中断请求 +19.9 DMA +可以使用DMA来进行批量数据的收发。使用DMA时不能对控制寄存器的ITBUFEN位进行置位。 + 利用DMA发送 +通过将CTLR2寄存器的DMAEN位置位可以激活DMA模式。只要TxE位被置位,数据将由DMA从 +设定的内存装载进I2C的数据寄存器。需要进行以下设定来为I2C分配通道。 +1) 向DMA_PADDRx寄存器设置I2Cx_DATAR寄存器地址,DMA_MADDRx寄存器中设置存储器地址,这 +样在每个TxE事件后,数据将从存储器送至I2Cx_DATAR寄存器。 +2) 在DMA_CNTRx寄存器中设置所需的传输字节数。在每个TxE事件后,此值将被递减。 +3) 利用DMA_CFGRx寄存器中的PL[0:1]位配置通道优先级。 +4) 设置DMA_CFGRx寄存器中的DIR位,并根据应用要求可以配置在整个传输完成一半或全部完成 +时发出中断请求。 +5) 通过设置DMA_CFGRx寄存器上的EN位激活通道。 +V2.4 278 + +# Page 282 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +当DMA控制器中设置的数据传输字节数目已经完成时,DMA控制器给I2C接口发送一个传输结 +束的 EOT/ EOT_1信号。在中断允许的情况下,将产生一个DMA中断。 + 利用DMA接收 +置位CTLR2寄存器的DMAEN后即可进行DMA接收模式。使用DMA接收时,DMA将数据寄存器里 +的数据传送到预设的内存区域。需要以下步骤来为I2C分配通道。 +1) 向DMA_PADDRx寄存器设置I2Cx_DATAR寄存器地址,DMA_MADDRx寄存器中设置存储器地址,这 +样在每个RxNE事件后,数据将从I2Cx_DATAR寄存器写入存储器。 +2) 在DMA_CNTRx寄存器中设置所需的传输字节数。在每个RxNE事件后,此值将被递减。 +3) 用DMA_CFGRx寄存器中的PL[0:1]配置通道优先级。 +4) 清除DMA_CFGRx寄存器中的DIR位,根据应用要求可以设置在数据传输完成一半或全部完成时 +发出中断请求。 +5) 设置DMA_CFGRx寄存器中的EN位激活该通道。 +当DMA控制器中设置的数据传输字节数目已经完成时,DMA控制器给I2C接口发送一个传输结 +束的EOT/EOT_1信号。在中断允许的情况下,将产生一个DMA中断。 +19.10 包校验错误 +包错误校验(PEC)是为了提供传输的可靠性而增加一项CRC8校验的步骤,使用以下多项式对 +每一位串行数据进行计算: +C=X8+X2+X+1 +PEC计算是由控制寄存器的ENPEC位激活,对所有信息字节进行计算,包括地址和读写位在 +内。在发送时,启用PEC会在最后一字节数据之后加上一个字节的CRC8计算结果;而在接收模式, +在最后一字节被认为是CRC8校验结果,如果和内部的计算结果不符合,就会回复一个NAK,如果是 +主接收器,无论校验结果正确与否,都会回复一个NAK。 +19.11 调试模式 +当系统进入调试模式之后,可以通过DEBUG模块的DBG_I2Cx_SMBUS_TIMEOUT位来决定 +I2CSMBus的超时控制是继续工作还是停止。 +19.12 寄存器描述 +表19-1 I2C1相关寄存器列表 +名称 访问地址 描述 复位值 +R16_I2C1_CTLR1 0x40005400 I2C1控制寄存器1 0x0000 +R16_I2C1_CTLR2 0x40005404 I2C1控制寄存器2 0x0000 +R16_I2C1_OADDR1 0x40005408 I2C1地址寄存器1 0x0000 +R16_I2C1_OADDR2 0x4000540C I2C1地址寄存器2 0x0000 +R16_I2C1_DATAR 0x40005410 I2C1数据寄存器 0x0000 +R16_I2C1_STAR1 0x40005414 I2C1状态寄存器1 0x0000 +R16_I2C1_STAR2 0x40005418 I2C1状态寄存器2 0x0000 +R16_I2C1_CKCFGR 0x4000541C I2C1时钟寄存器 0x0000 +R16_I2C1_RTR 0x40005420 I2C1上升时间寄存器 0x0002 +V2.4 279 + +# Page 283 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表19-2 I2C2相关寄存器列表 +名称 访问地址 描述 复位值 +R16_I2C2_CTLR1 0x40005800 I2C2控制寄存器1 0x0000 +R16_I2C2_CTLR2 0x40005804 I2C2控制寄存器2 0x0000 +R16_I2C2_OADDR1 0x40005808 I2C2地址寄存器1 0x0000 +R16_I2C2_OADDR2 0x4000580C I2C2地址寄存器2 0x0000 +R16_I2C2_DATAR 0x40005810 I2C2数据寄存器 0x0000 +R16_I2C2_STAR1 0x40005814 I2C2状态寄存器1 0x0000 +R16_I2C2_STAR2 0x40005818 I2C2状态寄存器2 0x0000 +R16_I2C2_CKCFGR 0x4000581C I2C2时钟寄存器 0x0000 +R16_I2C2_RTR 0x40005820 I2C2上升时间寄存器 0x0002 +19.12.1 I2C 控制寄存器(I2Cx_CTLR1)(x=1/2) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser NOSTR SMBTY Reser +SWRST ALERT PEC POS ACK STOP START ENGC ENPEC ENARP SMBUS PE +ved ETCH PE ved +位 名称 访问 描述 复位值 +软件重置,用户代码置此位会使I2C外设重置。 +在复位前确定I2C总线的引脚被释放,总线处 +15 SWRST RW 于空闲状态。 0 +注:该位可以在总线上没有检测到停止条件但 +是busy位为1时,重置I2C模块。 +14 Reserved RO 保留。 0 +SMBus 提醒位,用户代码可以设置此位或清除 +此位;当PE置位后,此位可以被硬件清除。 +0:释放SMBusALERT引脚使其变高,响应地址 +13 ALERT RW 0 +头应紧跟在NACK信号后面; +1:驱动SMBusALERT引脚使其变低,响应地址 +头应紧跟在ACK信号后面。 +数据包出错检测使能位,置此位启用数据包出 +错检测。用户代码可以对此位置位或清零;当 +PEC被传输后,产生开始或结束信号,或PE位 +12 PEC RW 清0时,硬件清零该位; 0 +0:不带PEC; +1:带PEC。 +注:仲裁丢失时,PEC失效。 +ACK 和 PEC 位置设置位,该位可以被用户代码 +置位或清零,在 PE 被清零后,可以被硬件清 +除; +11 POS RW 0 +0:ACK位控制当前移位寄存器内正在接受的字 +节的 ACK 或 NAK。PEC 位表明当位前移位寄存 +器的字节是PEC。 +V2.4 280 + +# Page 284 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:ACK位控制在移位寄存器里接收的下一个字 +节的 ACK 或 NAK。PEC 移位寄存器里接收的下 +一字节是PEC。 +注:POS位在2字节数据接收中的用法如下: +必须在接收之前配置好。为了NACK第2个字 +节,必须在清除ADDR位后立刻清除ACK位;为 +了检测第二个字节的PEC,必须在ADDR事件发 +生后,配置POS位后设置PEC位。 +应答使能位,该位可以被用户代码置位或清 +零,当PE位被置位时,该位可以被硬件清除; +10 ACK RW 0 +0:不设应答; +1:在接收到一个字节后返回一个应答。 +停止事件产生位,该位可以被用户代码置位或 +清零,或当检测到停止事件时,由硬件清除, +或检测到超时错误时,由硬件将其置位。 +主模式下: +0:无停止事件产生; +9 STOP RW 0 +1:在当前字节传输或当前起始条件发出后产 +生停止事件。 +从模式下: +0:无停止事件产生; +1:在当前字节传输后释放SCL和SDA线。 +起始事件产生位,该位可以被用户代码置位或 +清零,当起始条件发出后或PE被清零时,由硬 +件清零。 +主模式下: +8 START RW 0:无起始事件产生; 0 +1:重复产生起始事件。 +从模式下: +0:无起始事件产生; +1:当总线空闲时,产生起始事件。 +禁止时钟延长位,此位用于在 ADDR 或 BTF 标 +志被置位的情况下,禁止从模式下的时钟延 +7 NOSTRETCH RW 长,直至被软件清零。 0 +0:允许时钟延长; +1:禁止时钟延长; +广播呼叫使能位,置此位使能广播呼叫,应答 +6 ENGC RW 0 +广播地址00h。 +PEC使能位: +5 ENPEC RW 0:关闭PEC计算; 0 +1:开启PEC计算。 +ARP使能位: +0:关闭ARP; +4 ENARP RW 1:使能ARP。 0 +如果 SMBTYPE=0,则使用 SMBus 设备的默认地 +址;如果SMBTYPE=1,则使用SMBus的主地址。 +V2.4 281 + +# Page 285 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +SMBus设备类型: +3 SMBTYPE RW 0:SMBus从设备; 0 +1:SMBus主设备。 +2 Reserved RO 保留。 0 +SMBus模式选择位: +1 SMBUS RW 0:使用I2C模式; 0 +1:使用SMBus模式。 +I2C外设使能位。 +0 PE RW 0:禁用I2C模块; 0 +1:启用I2C模块。 +19.12.2 I2C 控制寄存器 2(I2Cx_CTLR2)(x=1/2) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ITBUFITEVT ITERR +Reserved LAST DMAEN Reserved FREQ[5:0] +EN EN EN +位 名称 访问 描述 复位值 +[15:13] Reserved RO 保留。 0 +DMA最后一次传输设置位。 +0:下一次DMA的EOT不是最后的传输; +12 LAST RW 1:下一次DMA的EOT是最后的传输。 0 +注:该位在主接收模式使用,可以在最后一次 +接收数据时产生一个NAK。 +DMA请求使能位: +11 DMAEN RW 0:在TxE或RxNE被置位时禁止DMA请求; 0 +1:在TxE或RxNE被置位时允许DMA请求。 +缓冲器中断使能位。 +10 ITBUFEN RW 0:当TxE或RxNE被置位时,不产生中断; 0 +1:当TxE或RxNE被置位时,产生事件中断。 +事件中断使能位: +0:关闭事件中断; +1:使能事件中断; +在下列条件下,将产生此中断: +SB=1(主模式); +9 ITEVTEN RW ADDR=1(主从模式); 0 +ADDR10=1(主模式); +STOPF=1(从模式); +BTF=1,但是没有TxE或RxNE事件; +如果ITBUFEN=1,TxE事件为1; +如果ITBUFEN=1,RxNE事件为1。 +出错中断使能位: +0:禁止出错中断; +8 ITERREN RW 0 +1:允许出错中断; +在下列条件下,将产生该中断; +V2.4 282 + +# Page 286 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +BERR=1;ARLO=1;AF=1;OVR=1;PECERR=1; +TIMEOUT=1;SMBAlert=1。 +[7:6] Reserved RO 保留。 0 +I2C 模块时钟频率域,必须输入正确的时钟频 +率以产生正确的时序,允许的范围在 4-60MHz +[5:0] FREQ[5:0] RW 0 +之间。必须设置在000100b到111100b之间, +单位为MHz。 +19.12.3 I2C 地址寄存器 1(I2Cx_OADDR1)(x=1/2) +偏移地址:0x08 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADD +Reserved ADD[9:8] ADD[7:1] ADD0 +MODE +位 名称 访问 描述 复位值 +地址模式。 +15 ADDMODE RW 0:7位从机地址(不响应10位地址); 0 +1:10位从机地址(不响应7位地址)。 +[14:10] Reserved RO 保留。 0 +接口地址,在使用10位地址时为第9-8位,在 +[9:8] ADD[9:8] RW 0 +使用7位地址时忽略。 +[7:1] ADD[7:1] RW 接口地址,第7-1位。 0 +接口地址,使用10位地址时为第0位,在使用 +0 ADD0 RW 0 +7位地址时忽略。 +19.12.4 I2C 地址寄存器 2(I2Cx_OADDR2)(x=1/2) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved ADD2[7:1] ENDUAL +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +[7:1] ADD2[7:1] RW 接口地址,双地址模式下地址的7-1位。 0 +双地址模式使能位,置此位可以让 ADD2 也能 +0 ENDUAL RW 0 +被识别。 +19.12.5 I2C 数据寄存器(I2Cx_DATAR)(x=1/2) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DR[7:0] +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +V2.4 283 + +# Page 287 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +数据寄存器,该域用来存放接收到的数据或存 +[7:0] DR[7:0] RW 0 +放用于发送到总线的数据。 +19.12.6 I2C 状态寄存器 1(I2Cx_STAR1)(x=1/2) +偏移地址:0x14 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SMBAL TIME Reser PECER Reser +OVR AF ARLO BERR TxE RxNE STOPF ADD10 BTF ADDR SB +ERT OUT ved R ved +位 名称 访问 描述 复位值 +SMBus 警示位,该位可以由用户写 0 复位,或 +在PE变低时由硬件复位。 +在SMBus主机模式下: +0:无SMBus警示; +15 SMBALERT RW0 1:在引脚上产生了SMBus警示。 0 +在SMBus从机模式下: +0:没有收到SMBAlert响应地址头序列; +1:收到 SMBAlert 响应地址头序列直到 +SMBAlert变低。 +超时或Tlow错误标志位,该位可以由用户写0 +复位,或在PE变低时由硬件复位。 +0:无超时错误; +1:SCL处于低已达到25ms,或主机低电平累计 +14 TIMEOUT RW0 时钟扩招时间超过10ms,或从设备低电平累计 0 +时间超过25ms。 +注:在从模式下此位被置位,从设备会复位通 +讯,硬件会释放总线;在主模式下此位被置位, +硬件会发出停止条件。 +13 Reserved RO 保留。 0 +在接收时发生PEC错误标志位,该位可以由用 +户写0复位,或在PE变低时由硬件复位。 +12 PECERR RW0 0 +0:无PEC错误; +1:有PEC错误,接收到PEC后,返回NAK。 +过载、欠载标志位: +0:无过载、欠载事件; +1:有过载、欠载事件发生:当NOSTRETCH=1时, +11 OVR RW0 在接收模式中收到一个新的字节时,数据寄存 0 +器里的内容还未被读出,则新接收的字节将丢 +失;在发送模式时,没有新的数据写入数据寄 +存器,同样的字节将被发送两次。 +应答失败标志位,该位可以由用户写0复位, +或在PE变低时由硬件复位。 +10 AF RW0 0 +0:应答正常; +1:应答错误。 +9 ARLO RW0 仲裁丢失标志位,该位可以由用户写0复位, 0 +V2.4 284 + +# Page 288 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +或在PE变低时由硬件复位。 +0:仲裁正常; +1:检测到仲裁丢失,模块失去对总线的控制。 +总线出错标志位,该位可以由用户写0复位, +或在PE变低时由硬件复位。 +8 BERR RW0 0 +0:正常; +1:起始或停止条件出错。 +数据寄存器为空标志位,向数据寄存器写数据 +可以清除,或产生一个起始或停止位后,或当 +7 TxE RO PE为0后,由硬件自动清除。 0 +0:数据寄存器非空; +1:发送数据时,发送数据寄存器为空。 +数据寄存器非空标志位,对数据寄存器的读写 +操作将清除此位,或当PE为0后,由硬件清除 +6 RxNE RO 此位。 0 +0:正常; +1:接收数据时,数据寄存器不为空。 +5 Reserved RO 保留。 0 +停止事件标志位,用户读取状态寄存器1之后, +对控制寄存器1的写操作将会清除该位,或当 +PE为0后,由硬件清除此位。 +4 STOPF RO 0 +0:没有检测到停止事件; +1:在应答之后,从设备在总线上检测到停止事 +件。 +10位地址头序列发送标志位,用户读取状态寄 +存器1之后,对控制寄存器1的写操作将会清 +除该位,或当PE为0后,由硬件清除此位。 +3 ADD10 RO 0 +0:无; +1:在10位地址模式下,主设备已经将第一个 +地址字节发送出去。 +字节发送结束标志位,用户读取状态寄存器 1 +后,对数据寄存器的读写将清除此位;在传输 +中,发起一个起始或者停止事件后,或当PE为 +0后,由硬件清除此位。 +2 BTF RO 0:无; 0 +1:字节发送结束。当NOSTRETCH=0时:发送时, +当一个新数据被发送且数据寄存器还未被写 +入新数据;接收时,当接收一个新的字节但是 +数据寄存器还未被读取。 +地址被发送/地址匹配标志位,用户读取状态 +寄存器1后,对状态寄存器2的读操作将会清 +除此位,或当PE为0时,由硬件清除此位。 +1 ADDR RW0 主模式: 0 +0:地址发送没有结束; +1:地址发送结束:在10位地址模式下,当收 +到地址的第二个字节的ACK后改为被置位;在 +V2.4 285 + +# Page 289 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +7位地址模式下,当收到地址的ACK后被置位。 +从模式: +0:地址不匹配或没有收到地址; +1:收到的地址匹配。 +起始位发送标志位,读取状态寄存器1后写数 +据寄存器的操作将清除该位,或当PE为0时, +0 SB RO 硬件将会清除此位。 0 +0:未发送起始位; +1:已发送起始位。 +19.12.7 I2C 状态寄存器 2(I2Cx_STAR2)(x=1/2) +偏移地址:0x18 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SMBHO SMBDE GENCA Reser +PEC[7:0] DUALF TRA BUSY MSL +ST FAULT LL ved +位 名称 访问 描述 复位值 +包错误检查域,当PEC使能时(ENPEC置位), +[15:8] PEC[7:0] RO 0 +此域存放PEC的值。 +匹配检测标志位,在产生停止位或起始位时, +或在PE=0时,硬件会将该位清零。 +7 DUALF RO 0 +0:接收到的地址与OAR1中的内容相符; +1:接收到的地址与OAR2中的内容相符。 +SMBus 主机头标志位,在产生停止位或起始位 +时,或在PE=0时,硬件会将该位清零。 +6 SMBHOST RO 0:未接收到SMBus主机地址; 0 +1:当SMBTYPE=1且ENARP=1时,收到了SMBus +主机地址。 +SMBus 设备默认地址标志位,在产生停止位或 +起始位时,或在PE=0时,硬件会将该位清零。 +5 SMBDEFAULT RO 0 +0:未收到地址; +1:当ENARP=1,收到SMBus设备的默认地址。 +广播呼叫地址标志位,在产生停止位或起始位 +时,或者在PE=0时,硬件会将该位清零。 +4 GENCALL RO 0 +1:当ENGC=1时,收到广播呼叫的地址; +0:未收到广播呼叫地址。 +3 Reserved RO 保留。 0 +发送/接收标志位,在检测到停止事件 +(STOPF=1),重复的起始条件、总线仲裁丢失 +(ARLO=1)或PE=0时,硬件会将其清零。 +2 TRA RO 0 +0:接收到数据; +1:数据已发送。 +该位根据地址字节的R/W位来决定。 +1 BUSY RO 总线忙标志位,该位在检测到一个停止位时会 0 +V2.4 286 + +# Page 290 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +被清零。在接口被禁用时(PE=0),该信息仍 +被更新。 +0:总线空闲无通讯; +1:总线忙:SDA或SCL存在低电平。 +主从模式指示位,当接口处于主模式时 +(SB=1),硬件将该位置位;当总线检测到一 +0 MSL RO 0 +个停止位,仲裁丢失时,或PE=0时,硬件会清 +除该位。 +19.12.8 I2C 时钟寄存器(I2Cx_CKCFGR)(x=1/2) +偏移地址:0x1C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +F/S DUTY Reserved CCR[11:0] +位 名称 访问 描述 复位值 +主模式选择位。 +15 F/S RW 0:标准模式; 0 +1:快速模式。 +快速模式时的占空比: +14 DUTY RW 0:T /T = 2; 0 +低电平 高电平 +1:T /T = 16/9。 +低电平 高电平 +[13:12] Reserved RO 保留。 0 +[11:0] CCR[11:0] RW 时钟分频系数域,决定SCL时钟的频率波形。 0 +19.12.9 I2C 上升时间寄存器(I2Cx_RTR)(x=1/2) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TRISE[5:0] +位 名称 访问 描述 复位值 +[15:6] Reserved RO 保留。 0 +最大上升时间域。这个位设置主模式的SCL的 +上升时间。最大的上升沿时间等于TRISE-1个 +时钟周期。此位只能在PE清零下设置。比如如 +[5:0] TRISE[5:0] RW 000010b +果I2C模块的输入时钟周期为125ns,而TRISE +的值为 9,那么最大上升沿时间为(9-1) +*125ns,即1000ns。 +V2.4 287 + +# Page 291 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 20 章 串行外设接口(SPI/I2S) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +SPI支持以三线同步串行模式进行数据交互,加上片选线支持硬件切换主从模式,支持以单根数 +据线通讯。 +I2S 也是三线的同步串行接口通信协议,它支持四种音频标准,包括飞利浦 I2S 标准、MSB 对齐 +标准、LSB对齐标准和PCM标准。 +20.1 主要特征 +20.1.1 SPI 特征 + 支持全双工同步串行模式 + 支持单线半双工模式 + 支持主模式和从模式,多从模式 + 支持8位或16位数据结构 + 最高时钟频率支持到Fpclk的一半 + 数据顺序支持MSB或LSB在前 + 支持硬件或软件控制NSS引脚 + 收发支持硬件CRC校验 + 收发缓冲器支持DMA传输 + 支持修改时钟相位和极性 +20.1.2 I2S 特征 + 支持单工通信 + 支持主模式和从模式 + 支持16位、24位和32位数据格式 + 音频采样频率支持范围8kHz-562.2kHz + 支持时钟极性可编程 + 支持常用I2S协议:飞利浦标准、MSB对齐标准、LSB对齐标准和PCM标准 + 收发缓冲器支持DMA传输 + 支持主时钟向外部音频设备输出 +V2.4 288 + +# Page 292 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +20.2 SPI 功能描述 +20.2.1 概述 +图20-1 SPI结构框图 +Address and data bus +Read +Rx buffer +SPI_CTLR2 +MOSI +TXE RXNE ERR TXDM RXDM +0 0 SSOE +IE IE IE AEN AEN +Shift register +MISO +LSB first SPI_STATR +CRC +Tx buffer BSY OVR MODF ERR 0 0 TXE RXNE +Write +0 +Communication +control +1 +SCK Baud rate BR[2:0] +generator +LSB +SPE BR2 BR1 BR0 MSTR CPOL CPHA +FIRST +SPI_CTLR1 +Master control logic BIDI BIDI CRC CRC RX +DFF SSM SSI +MODE OE EN Next ONLY +NSS +由图20-1可以看出,与SPI相关的主要是MISO、MOSI、SCK和NSS四个引脚。其中MISO引脚在 +SPI模块工作在主模式下时,是数据输入引脚;工作在从模式下时,是数据输出引脚。MOSI引脚工作 +在主模式下时,是数据输出引脚;工作在从模式时,是数据输入引脚。SCK是时钟引脚,时钟信号一 +直由主机输出,从机接收时钟信号并同步数据收发。NSS引脚是片选引脚,有以下用法: +1) NSS由软件控制:此时SSM被置位,内部NSS信号由SSI决定输出高还是低,这种情况一般用于 +SPI主模式; +2) NSS 由硬件控制:在 NSS 输出使能时,即 SSOE 置位时,在 SPI 主机向外发送输出时会主动拉低 +NSS引脚,如果不能成功拉低NSS脚,说明主线上还有其他主设备正在通信,则会产生一个硬件 +错误;SSOE 不置位,则可以用于多主机模式,如果它被拉低则会强行进入从机模式,MSTR 位会 +被自动清除。 +可以通过 CPHA 和 CPOL 配置 SPI 的工作模式。CPHA 置位表示模块在时钟的第二个边沿进行数据 +采样,数据被锁存,CPHA 不置位表示 SPI 模块在时钟的第一个边沿进行采样,数据被锁存。CPOL 则 +表示无数据时时钟保持高电平还是低电平。具体见下图20-2。 +V2.4 289 + +# Page 293 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图20-2 SPI模式 +主机和设备需要设置为相同的SPI模式,在配置SPI模式前,需要清除SPE位。DEF位可以决定 +SP的单个数据长度是8位还是16位。LSBFIRST可以控制单个数据字是高位在前还是低位在前。 +20.2.2 主模式 +在SPI模块工作在主模式时,由SCK产生串行时钟。配置成主模式进行以下步骤: +配置控制寄存器的BR[2:0]域来确定时钟; +配置CPOL和CPHA位来确定SPI模式; +配置DEF确定数据字长; +配置LSBFIRST确定帧格式; +配置NSS引脚,比如置SSOE位让硬件去置NSS。也可以置SSM位并把SSI位置高; +置MSTR位和SPE位,需要保证NSS此时已经是高。 +需要发送数据时只需要向数据寄存器写要发送的数据就行了。SPI会从发送缓冲区并行地把数据 +送到移位寄存器,然后按照 LSBFIRST 的设置将数据从移位寄存器发出去,当数据已经到了移位寄存 +器时,TXE 标志会被置位,如果已经置位了 TXEIE,那么会产生中断。如果 TXE 标志位置位需要向数 +据寄存器里填数据,维持完整的数据流。 +当接收器接收数据时,当数据字的最后一个采样时钟沿到来时,数据从移位寄存器并行地转移到 +接收缓冲区,RXNE位被置位,如果之前置位了RXNEIE位,还会产生中断。此时应该尽快读取数据寄 +V2.4 290 + +# Page 294 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +存器取走数据。 +20.2.3 从模式 +当SPI模块工作在从模式时,SCK用于接收主机发来的时钟,自身的波特率设置无效。配置成从 +模式的步骤如下: +配置DEF位设置数据位长度; +配置CPOL和CPHA位匹配主机模式; +配置LSBFIRST匹配主机数据帧格式; +硬件管理模式下,NSS 管脚需要保持为低电平,如果设置 NSS 为软件管理(SSM 置位),那么请 +保持SSI不被置位; +清除MSTR位,置SPE位,开启SPI模式。 +在发送时,当SCK出现第一个从机接收采样沿时,从机开始发送。发送的过程就是发送缓冲区的 +数据移到发送移位寄存器,当发送缓冲区的数据移到了移位寄存器之后,会置位TXE标志,如果之前 +置位了TXEIE位,那么会产生中断。 +在接收时,最后一个时钟采样沿之后,RXNE位被置位,移位寄存器接收到的字节被转移到接收缓 +冲区,读数据寄存器的读操作可以获得接收缓冲区里的数据。如果在RXNE置位之前RXNEIE已经被置 +位,那么会产生中断。 +20.2.4 单工模式 +SPI接口可以工作在半双工模式,即主设备使用MOSI引脚,从设备使用MISO引脚进行通讯。使 +用半双工通讯时需要把BIDIMODE置位,使用BIDIOE控制传输方向。 +在正常全双工模式下将RXONLY位置位可以将SPI模块设置为仅仅接收的单工模式,在RXONLY置 +位之后会释放一个数据脚,主模式和从模式释放的引脚并不相同。也可以不理会接收的数据将SPI置 +成只发送的模式。 +20.2.5 CRC +SPI 模块使用 CRC 校验保证全双工通信的可靠性,数据收发分别使用单独的 CRC 计算器。CRC 计 +算的多项式由多项式寄存器决定,对于8位数据宽度和16位数据宽度,会分别使用不同的计算方法。 +设置 CRCEN 位会启用 CRC 校验,同时会使 CRC 计算器复位。在发送完最后一个数据字节后,置 +CRCNEXT 位会在当前字节发送结束后发送 TXCRCR 计算器的计算结果,同时最后接收到的接收移位寄 +存器的值如果与本地算出来的RXCRCR的计算值不相符,那么CRCERR位会被置位。使用CRC校验需要 +在配置 SPI 工作模式时设置多项式计算器并置 CRCEN 位,并在最后一个字或半字置 CRCNEXT 位发送 +CRC并进行接收CRC的校验。注意,收发双方的CRC计算多项式应该统一。 +20.2.6 DMA +SPI模块支持使用DMA加快数据通讯速度,可以使用DMA向发送缓冲区填写数据,或使用DMA从 +接收缓冲区及时取走数据。DMA会以RXNE和TXE为信号及时取走或发来数据。DMA也可以工作在单工 +或加CRC校验的模式。 +20.2.7 错误 + 主模式失效错误 +当SPI工作在NSS引脚硬件管理模式下,发生了外部拉低NSS引脚的操作;或在NSS引脚软件管 +理模式下,SSI位被清零;或 SPE位被清零,导致SPI被关闭;或MSTR位被清零,SPI进入从模式。 +如果ERRIE位已经被置位,还会产生中断。清除MODF位步骤:首先执行一次对R16_SPI1_STATR的读 +或写操作,然后写R16_SPI1_CTLR1。 +V2.4 291 + +# Page 295 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 溢出错误 +如果主机发送了数据,而从设备的接收缓冲区中还有未读取的数据,就会发生溢出错误,OVR位 +被置位,如果ERRIE被置位还会产生中断。发送溢出错误应该重新开始当前传输。读取数据寄存器再 +读取状态寄存器会消除此位。 + CRC错误 +当接收到的CRC校验字和RXCRCR的值不匹配时,会产生CRC校验错误,CRCERR位会被置位。 +20.2.8 中断 +SPI模块的中断支持五个中断源,其中发送缓冲区空、接收缓冲区非空这两个事件分别会置位TXE +和RXNE,在分别置位了TXEIE和RXNEIE位的情况下会产生中断。除此之外上面提到的三种错误也会 +产生中断,分别是MODF、OVR和CRCERR,在使能了ERRIE位之后,这三种错误也会产生错误中断。 +20.3 I2S 功能描述 +20.3.1 I2S 概述 +图20-3 I2S结构框图 +Address and data bus +Tx buffer +BYS OVRMODFCRC UDR CH TxE RxNE +ERR SIDE +16-bit +MOSI/SD +MISO Shift register LSB first +Communication +16-bit control +Rx buffer +NSS/WS +I2SCFG I2SSTD CK DATLEN CH +(1:0) (1:0) POL (1:0) LEN +I2S +I2SE +MOD +Master control logic +Bidi Bidi CRC CRC Rx +DFF SSM SSI +modeOE EN Next only +SPI LSB SPE BR2 BR1 BR0MSTRCPOLCPHA +First +Baud rate generator +CK +I2S Clock generator +I2S_CK +I2SMOD +MCK +MCKOEODD I2SDIV[7:0] I2SxCLK +V2.4 292 + +# Page 296 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +通过将寄存器 I2SCFGR的I2SMOD位置位,使能 I2S功能。此时,可以把 SPI模块用作 I2S音频 +接口。I2S与SPI共用3个引脚: +● SD:串行数据(映射至MOSI引脚),用来发送和接收2路时分复用通道的数据; +● WS:字选(映射至NSS引脚),主模式下作为数据控制信号输出,从模式下作为输入; +● CK:串行时钟(映射至SCK引脚),主模式下作为时钟信号输出,从模式下作为输入。 +在某些外部音频设备需要主时钟时,可以另有一个附加引脚输出时钟: +● MCK:主时钟(独立映射),在I2S配置为主模式,寄存器I2SPR的MCKOE位为1时,作为输出额 +外的时钟信号引脚使用。输出时钟信号的频率预先设置为256×Fs,其中Fs是音频信号的采样频率。 +设置成主模式时,I2S使用自身的时钟发生器来产生通信用的时钟信号。这个时钟发生器也是主 +时钟输出的时钟源。I2S模式下有2个额外的寄存器,一个是与时钟发生器配置相关的寄存器I2SPR, +另一个是I2S通用配置寄存器I2SCFGR(可设置音频标准、从/主模式、数据格式、数据包帧、时钟极 +性等参数)。在I2S模式下不使用寄存器CTLR1和所有的CRCR寄存器。同样,I2S模式下也不使用寄 +存器CTLR2的SSOE位,和寄存器STATR的MODF位和CRCERR位。I2S使用与SPI相同的寄存器DATAR +用作16位宽模式数据传输。 +20.3.2 支持的音频协议 +三线总线支持 2 个声道上音频数据的时分复用:左声道和右声道,但是只有一个 16 位寄存器用 +作发送或接收。因此,软件必须在对数据寄存器写入数据时,根据当前传输中的声道写入相应的数据; +同样,在读取寄存器数据时,通过检查寄存器STATR的CHSIDE位来判断接收到的数据属于哪个声道。 +左声道总是先于右声道发送数据(CHSIDE位在PCM协议下无意义)。有四种可用的数据和包帧组合。 +可以通过以下四种数据格式发送数据: +● 16位数据打包进16位帧 +● 16位数据打包进32位帧 +● 24位数据打包进32位帧 +● 32位数据打包进32位帧 +在使用16位数据扩展到32位帧时,前16位(MSB)是有意义的数据,后16位(LSB)被强制为 +0,该操作不需要软件干预,也不需要有DMA请求(仅需要一次读或写操作)。24位和32位数据帧需 +要CPU对寄存器DATAR进行2次读或写操作,在使用DMA时,需要2次DMA传输。对于24位数据, +扩展到32位后,最低8位由硬件置0。对于所有的数据格式和通讯标准,总是先发送最高位(MSB)。 +I2S接口支持四种音频标准,可以通过设置寄存器I2SCFGR的I2SSTD[1:0]位和PCMSYNC位来选择。 +20.3.2.1 I2S 飞利浦标准 +在此标准下,引脚WS用来指示正在发送的数据属于哪个声道。在发送第一位数据(MSB)前1个 +时钟周期,该引脚即为有效。发送方在时钟信号(CK)的下降沿改变数据,接收方在上升沿读取数据。 +WS信号也在时钟信号的下降沿变化。 +V2.4 293 + +# Page 297 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图20-4 飞利浦协议波形(16/32全精度,CPOL=0) +CK +WS +Transmission +Reception +May be 16-bit,32-bit +SD +MSB LSB MSB +Channel left Channle right +图20-5 飞利浦协议波形(24位帧,CPOL=0) +CK +Transmission +WS Reception +24-bit data 8-bit remaining +SD +MSB LSB +Channel left 32 -bit Channel right +此模式需要对寄存器 SPI_DATAR 进行 2 次读或写操作。在发送模式下:如果需要发送 0x8EAA33(24 +位): +First write to Data register Second write to Data register +0x8EAA 0x33XX +Only the 8 MSB are sent to complete the 24 bits +8 LSB bit have no meaning and could be +anything +在接收模式下:如果接收0x8EAA33: +First read from Data register Second read from Data register +0x8EAA 0x3300 +Only the 8MSB are right +The 8 LSB will always be 00 +V2.4 294 + +# Page 298 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图20-6 飞利浦协议标准波形(16位扩展至32位包帧,CPOL=0) +CK +WS Transmission Reception +16-bit data +16-bit remaining +0 forced +SD +MSB LSB +Channel left 32-bit Channel right +在I2S配置阶段,如果选择将16位数据扩展到32位声道帧,只需要访问一次寄存器DATAR用来 +扩展到 32 位的低 16 位被硬件置为 0x0000。如果待传输或接收的数据是 0x76A3(扩展到 32 位是 +0x76A30000),只需要操作一次 DATAR。在发送时需要将 MSB写入寄存器DATAR;标志位TXE为 1表 +示可以写入新的数据,如果允许了相应的中断,则可以产生中断。发送是由硬件完成的,即使还未发 +送出后16位的0x0000,也会设置TXE并产生相应的中断。接收时,每次收到高16位半字(MSB)后, +标志位 RXNE 置 1,如果允许了相应的中断,则可以产生中断。这样,在 2 次读和写之间有更多的时 +间,可以防止下溢或上溢的情况发生。 +20.3.2.2 MSB 对齐标准 +在此标准下,WS信号和第一个数据位,即最高位(MSB)同时产生。 +图20-7 MSB对齐16位或32位全精度(CPOL = 0) +CK +WS +Transmission Peception +May be 16-bit,32-bit +SD +MSB LSB MSB +Channel left Channel right +发送方在时钟信号的下降沿改变数据;接收方是在上升沿读取数据。 +V2.4 295 + +# Page 299 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图20-8 MSB对齐24位数据,CPOL = 0 +CK +Transmission Reception +WS +24-bit data 8-bit remaining +0 forced +SD MSB LSB +Channel left 32-bit Channel right +图20-9 MSB对齐16位数据扩展到32位包帧,CPOL = 0 +CK +Transmission Reception +WS +16-bit data 16-bit remaining +0 forced +SD MSB LSB +Channel left 32-bit Channel right +20.3.2.3 LSB 对齐标准 +此标准与MSB对齐标准类似(在16位或32位全精度帧格式下无区别)。 +图20-10 LSB对齐16或 32位全精度,CPOL = 0 +CK +WS +Transmission Peception +May be 16-bit,32-bit +SD +MSB LSB MSB +Channel left Channel right +V2.4 296 + +# Page 300 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图20-11 LSB对齐24位数据,CPOL = 0 +CK +WS Transmission Reception +8-bit data 24-bit remaining +0 forced +SD +MSB LSB +Channel left 32 -bit Channel right +在发送模式下如果要发送数据0x3478AE,需要通过软件或DMA对寄存器DATAR进行2次写操作。 +TEX='1 ' when the data register is written TEX='1 ' when the data register is written +for the first time for the second time +0xXX34 0x78AE +Only the lower 8 bits in the halfword have meaning, the higher 8 bits are forced to +be set to 0x00 +在接收模式下如果要接收数据 0x3478AE,需要在 2 个连续的 RXNE 事件发生时,分别对寄存器 +DATAR进行1次读操作。 +RXNE='1' when the data register is read out RXNE='1' when the data register is read out +for the first time for the second time +0xXX34 0x78AE +Only the lower 8 bits in the halfword have meaning, the higher 8 bits are forced to +be set to 0x00 +图20-12 LSB对齐16位数据扩展到32位包帧, CPOL = 0 +CK +Reception +WS Transmission +16-bit data Remaining 16-bit data +0 forced +SD +MSB LSB +Channel left 32-bit Channel right +在I2S配置阶段,如果选择将16位数据扩展到32声道帧,只需要访问一次寄存器DATAR。此时, +扩展到32位后的高半字(16位MSB)被硬件置为0x0000。 +如果待传输或接收的数据是0x76A3(扩展到32位是0x000076A3),只需要操作一次DATAR,在 +发送时,如果TXE为1,用户需要写入待发送的数据(即0x76A3)。用来扩展到32位的0x0000部分 +V2.4 297 + +# Page 301 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +由硬件首先发送出去,一旦有效数据开始从 SD 引脚送出,即发生下一次 TXE 事件。在接收时,一旦 +接收到有效数据(而不是0x0000部分),即发生RXNE事件。这样,在2次读和写之间有更多的时间, +可以防止下溢或上溢的情况发生。 +20.3.2.4 PCM 标准 +在PCM标准下,不存在声道选择的信息。PCM标准有2种可用的帧结构,短帧或长帧,可以通过 +设置寄存器I2SCFGR的PCMSYNC位来选择。 +图20-13 PCM标准波形(16位) +CK +WS +Short +frame +fixed to 1-3bit +WS +long +frame +16-bit +SD MSB LSB MSB +对于长帧,主模式下,用来同步的 WS 信号有效的时间固定为 13 位。对于短帧,用来同步的 WS +信号长度只有1位。 +图20-14 PCM标准波形(16位) +CK +WS +short +frame +fixed to 13-bit +WS +long +frame +16-bit +SD MSB LSB +无论哪种模式(主或从)、哪种同步方式(短帧或长帧),连续的2帧数据之间和2个同步信号 +之间的时间差,(即使是从模式)需要通过设置I2SCFGR寄存器的DATLEN位和CHLEN位来确定。 +20.3.3 时钟发生器 +I2S的比特率即确定了在I2S数据线上的数据流和I2S的时钟信号频率。I2S比特率 = 每个声道 +的比特数×声道数目×音频采样频率。 +对于一个具有左右声道和16位音频信号,I2S比特率计算如下: +I2S比特率 = 16 × 2 × Fs +V2.4 298 + +# Page 302 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +如果包长为32位,I2S比特率计算如下: +I2S比特率 = 32 × 2 × Fs +图20-15 音频采样频率定义 +16-bit or 32-bit left channel 16-bit or 32-bit right channel +16-bit or 32-bit +Fs +Sample point Fs: Audio sampling frequency Sample point +在主模式下,为了获得需要的音频频率,需要正确地对线性分频器进行设置。 +图20-16 I2S时钟发生器结构 +MCK +CK +0 +I2SxCLK 8-bit Linear 1 +Divider + Dividecr by 4 Dicv2 0 +Reshaping stage 1 +MCKOE +MCKOEODD I2SDIV[7:0] I2SMOD CHLEN +图中I2SxCLK的时钟源是系统时钟(即驱动HB时钟的HSI、HSE或PLL)。I2SxCLK可以来自 +SYSCLK,或PLL3 VCO(2xPLL3CLK)时钟,可以通过RCC_CFGR2寄存器的I2S2SRC和I2S3SRC位选 +择。音频的采样频率可以是96kHz、48kHz、44.1kHz、32kHz、22.05kHz、16kHz、11.025kHz或 +8kHz(或任何此范围内的数值)。为了获得需要的频率,需按照以下公式设置线性分频器: +当需要生成主时钟时(寄存器SPI_I2SPR的MCKOE位为1): +声道的帧长为16位时, Fs = I2SxCLK / [(16*2) * ((2*I2SDIV) + ODD)*8] +声道的帧长为32位时, Fs = I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)*4] +当关闭主时钟时(MCKOE位为’0’): +声道的帧长为16位时, Fs = I2SxCLK / [(16*2) * ((2*I2SDIV) + ODD)] +声道的帧长为32位时, Fs = I2SxCLK / [(32*2) * ((2*I2SDIV) + ODD)] +20.3.4 I2S 主模式 +设置I2S工作在主模式,串行时钟由引脚CK输出,字选信号由引脚WS产生。可以通过设置寄 +存器I2SPR的MCKOE位来选择输出或不输出主时钟(MCK)。 +20.3.4.1 配置流程 + 设置寄存器I2SPR的I2SDIV[7:0]定义与音频采样频率相符的串行时钟波特率。同时也要定义 +寄存器I2SPR的ODD位。 +V2.4 299 + +# Page 303 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 设置CKPOL位定义通信时钟在空闲时的电平状态。如果需要向外部的DAC/ADC音频器件提供主 +时钟MCK,需寄存器I2SPR的MCKOE位置为。 + 设置寄存器I2SCFGR的I2SMOD位为1激活I2S功能,设置I2SSTD[1:0]和PCMSYNC位选择所用 +的I2S标准,设置CHLEN选择每个声道的数据位数。还要设置寄存器SPI_I2SCFGR的I2SCFG[1:0] +选择I2S主模式和方向(发送端还是接收端)。 + 如果需要,可以通过设置寄存器CR2来打开所需的中断功能和DMA功能。 + 必须将寄存器I2SCFGR的I2SE位置为1。 + 引脚WS和CK需要配置为输出模式。如果寄存器SPI_I2SPR的MCKOE位为1,引脚MCK也要配 +置成输出模式。 +20.3.4.2 发送流程 +当写入1个半字(16位)的数据至发送缓存,发送流程开始。假设第一个写入发送缓存的数据 +对应的是左声道数据。当数据从发送缓存移到移位寄存器时,标志位TXE置1,这时,要把对应右 +声道的数据写入发送缓存。标志位CHSIDE提示了目前待传输的数据对应哪个声道。标志位CHSIDE +的值在TXE为1时更新,因此它在TXE为1时有意义。在先左声道后右声道的数据都传输完成后, +才能被认为是一个完整的数据帧。不可以只传输部分数据帧,如仅有左声道的数据。 +当发出第一位数据的同时,半字数据被并行地传送至16位移位寄存器,然后后面的位依次按高 +位在先的顺序从引脚MOSI/SD发出。每次数据从发送缓存移至移位寄存器时,标志位TXE置为1, +如果寄存器CR2的TXEIE位为1,则产生中断。 +为了保证连续的音频数据传输,建议在当前传输完成之前,对寄存器DATAR写入下一个要传输 +的数据。建议在要关闭I2S功能时,等待标志位TXE=1及BSY=0,再将I2SE位清’0’。 +20.3.4.3 接收流程 +接收流程的配置步骤除了第3点外,与发送流程的一致(参见前述的”发送流程”),需要通 +过配置I2SCFG[1:0]来选择主接收模式。无论何种数据和声道长度,音频数据总是以16位包的形式 +接收。即每次填满接收缓存后,标志位RXNE置1,如果寄存器CR2的RXNEIE位为1,则产生中断。 +根据配置的数据和声道长度,收到左声道或右声道的数据会需要1次或2次把数据传送到接收缓存 +的过程。对寄存器DATAR进行读操作即可清除RXNE标志位。每次接收以后即更新CHSIDE。它的值 +取决于I2S单元产生的WS信号。如果前一个接收到的数据还没有被读取,又接收到新数据,即发生 +上溢,标志位OVR被置为1,如果寄存器CR2的ERRIE位为1,则产生中断,表示发生了错误。若要 +关闭I2S功能,需要执行特别的操作,以保证I2S模块可以正常地完成传输周期而不会开始新的数 +据传输。操作过程与数据配置和通道长度、以及音频协议的模式相关: +● 16位数据扩展到32位通道长度(DATLEN=00并且CHLEN=1),使用LSB(低位)对齐模式 +(I2SSTD=10) a) 等待倒数第二个(n-1)RXNE=1; +b) 等待17个I2S时钟周期(使用软件延迟); +c) 关闭I2S(I2SE=0)。 +● 16位数据扩展到32位通道长度(DATLEN=00并且CHLEN=1),使用MSB(高位)对齐、I2S或 +PCM模式(分别为I2SSTD=00、I2SSTD=01或I2SSTD=11) +a) 等待最后一个RXNE=1; +b) 等待1个I2S时钟周期(使用软件延迟); +c) 关闭I2S(I2SE=0)。 +● 所有其它DATLEN和CHLEN的组合,I2SSTD选择的任意音频模式,使用下述方式关闭I2S: +a) 等待倒数第二个(n-1)RXNE=1; +b) 等待一个I2S时钟周期(使用软件延迟); +c) 关闭I2S(I2SE=0)。 +注: 在传输期间BSY标志始终为低。 +V2.4 300 + +# Page 304 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +20.3.5 I2S 从模式 +在从模式下,I2S可以设置成发送和接收模式。从模式的配置方式基本遵循和配置主模式一样 +的流程。在从模式下,不需要I2S接口提供时钟。时钟信号和WS信号都由外部主I2S设备提供,连 +接到相应的引脚上。因此用户无需配置时钟。 +配置步骤如下: + 设置寄存器I2SCFGR的I2SMOD位激活I2S功能;设置I2SSTD[1:0]来选择所用的I2S标准;设 +置DATLEN[1:0]选择数据的比特数;设置CHLEN选择每个声道的数据位数。设置寄存器I2SCFGR +的I2SCFG[1:0]选择I2S从模式的数据方向(发送端还是接收端)。 + 根据需要,设置寄存器CR2打开所需的中断功能和DMA功能。 + 必须设置寄存器I2SCFGR的I2SE位为1。 +20.3.5.1 发送流程 +当外部主设备发送时钟信号,并且当NSS_WS信号请求传输数据时,发送流程开始。必须先使能 +从设备,并且写入I2S数据寄存器之后,外部主设备才能开始通信。对于I2S的MSB对齐和LSB对 +齐模式,第一个写入数据寄存器的数据项对应左声道的数据。当开始通信时,数据从发送缓冲器传 +送到移位寄存器,然后标志位TXE置为1;这时,要把对应右声道的数据项写入I2S数据寄存器。 +标志位CHSIDE提示了目前待传输的数据对应哪个声道。与主模式的发送流程相比,在从模式中, +CHSIDE取决于来自外部主I2S的WS信号。这意味着从I2S在接收到主机生成的时钟信号之前,就 +要准备好第一个要发送的数据。WS信号为1表示先发送左声道。 +20.3.5.2 接收流程 +配置步骤除了第1点外,与发送流程一致。需要通过配置I2SCFG[1:0]来选择主接收模式。无 +论何种数据和声道长度,音频数据总是以16位包的形式接收,即每次填满接收缓存,标志位RXNE +置1,如果寄存器I2S_CTLR2的RXNEIE位为1,则产生中断。按照不同的数据和声道长度设置,收 +到左声道或右声道数据会需要1次或2次传输数据至接收缓冲器的过程。每次接收到数据(将要从 +DATAR读出)以后即更新CHSIDE,它对应I2S单元产生的WS信号。读取SPI_DATAR寄存器,将清除 +RXNE位。在还没有读出前一个接收到的数据,又接收到新数据时,即产生上溢,并设置标志位OVR +为1;如果寄存器I2S_CTLR2的ERRIE位为1,则产生中断,指示发生了错误。要关闭I2S功能时, +需要在接收到最后一次RXNE=1时将I2SE位清0。 +20.3.6 状态标志位 +有3个状态标志位供用户监控I2S总线的状态。 +20.3.6.1 状态标志位(BSY) +BSY标志由硬件设置与清除(写入此位无效果),该标志位指示I2S通信层的状态。该位为1 +时表明I2S通讯正在进行中,但有一个例外:主接收模式(I2SCFG=11)下,在接收期间BSY标志始 +终为低。在软件要关闭SPI模块之前,可以使用BSY标志检测传输是否结束,这样可以避免破坏最 +后一次传输,因此需要严格按照下述过程执行。当传输开始时, BSY标志被置为1,除非I2S模块 +处于主接收模式。当传输结束时或者当关闭I2S模块时,该标志位被清除。当通信是连续的时候在 +主发送模式时,整个传输期间, BSY标志始终为高;在从模式时,每个数据项传输之间, BSY标志 +在1个I2S时钟周期内变低。 +20.3.6.2 发送缓冲标志位(TXE) +该标志位为1表示发送缓冲器为空,可以对发送缓冲器写入新的待发送数据。在发送缓冲器中 +已有数据时,标志位清0。在I2S被关闭时(I2SE位为0),该标志位也为0。 +V2.4 301 + +# Page 305 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +20.3.6.3 接收缓存非空标志位(RXNE) +该标志位置1表示在接收缓存里有接收到的有效数据。在读取寄存器DATAR时,该位清0。 +20.3.6.4 声道标志位(CHSIDE) +在发送模式下,该标志位在TXE为高时刷新,指示从SD引脚上发送的数据所在的声道。如果在 +从发送模式下发生了下溢错误,该标志位的值无效,在重新开始通讯前需要把I2S关闭再打开。在 +接收模式下,该标志位在寄存器DATAR接收到数据时刷新,指示接收到的数据所在的声道。注意, +如果发生错误,该标志位无意义,需要将I2S关闭再打开。在PCM标准下,无论短帧格式还是长帧 +格式,这个标志位都没有意义。如果寄存器STATR的标志位OVR或UDR为1,且寄存器CR2的ERRIE +位为1,则会产生中断。(中断源已经被清除后)可以通过读寄存器STATR来清除中断标志。 +20.3.7 错误标志位 +20.3.7.1 下溢标志位(UDR) +在从发送模式下,如果数据传输的第一个时钟边沿到达时,新的数据仍然没有写入DATAR寄存 +器,该标志位会被置1。在寄存器I2SCFGR的I2SMOD位置1后,该标志位才有效。如果寄存器CR2 +的ERRIE位为1,就会产生中断。通过对寄存器STATR进行读操作来清除该标志位。 +20.3.7.2 上溢标志位(OVR) +如果还没有读出前一个接收到的数据时,又接收到新的数据,即产生上溢,该标志位置1,如 +果寄存器CTLR2的ERRIE位为1,则产生中断指示发生了错误。这时,接收缓存的内容,不会刷新 +为从发送设备送来的新数据。对寄存器DATAR的读操作返回最后一个正确接收到的数据。其他所有 +在上溢发生后由发送设备发出的16位数据都会丢失。通过先读寄存器DATAR再读寄存器STATR,来 +清除该标志位。 +20.3.8 I2S 中断 +I2S有4个中断源,其中发送缓冲区空,接收缓冲区非空这两个事件分别会置位TXE和RXNE, +在分别置位了TXEIE和RXNEIE位的情况下会产生中断。如果还没有读出前一个接收到的数据时,又 +接收到新的数据,即产生上溢,如果置位了ERRIE会产生上溢中断;在从发送模式下,如果数据传 +输的第一个时钟边沿到达时,新的数据仍然没有写入DATAR寄存器如果置位了ERRIE会产生下溢中 +断。 +20.3.9 DMA 功能 +DMA的工作方式在I2S模式除了CRC功能不可用以外,与在SPI模式完全相同。因为在I2S模 +式下没有数据传输保护系统。 +20.4 寄存器描述 +表20-1 SPI1相关寄存器列表 +名称 访问地址 描述 复位值 +R16_SPI1_CTLR1 0x40013000 SPI1控制寄存器1 0x0000 +R16_SPI1_CTLR2 0x40013004 SPI1控制寄存器2 0x0000 +R16_SPI1_STATR 0x40013008 SPI1状态寄存器 0x0002 +R16_SPI1_DATAR 0x4001300C SPI1数据寄存器 0x0000 +R16_SPI1_CRCR 0x40013010 SPI1多项式寄存器 0x0007 +R16_SPI1_RCRCR 0x40013014 SPI1接收CRC寄存器 0x0000 +V2.4 302 + +# Page 306 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_SPI1_TCRCR 0x40013018 SPI1发送CRC寄存器 0x0000 +R16_SPI1_I2S_CFGR 0x4001301C SPI1_I2S配置寄存器 0x0000 +R16_SPI1_HSCR 0x40013024 SPI1高速控制寄存器 0x0000 +表20-2 SPI2相关寄存器列表 +名称 访问地址 描述 复位值 +R16_SPI2_CTLR1 0x40003800 SPI2控制寄存器1 0x0000 +R16_SPI2_CTLR2 0x40003804 SPI2控制寄存器2 0x0000 +R16_SPI2_STATR 0x40003808 SPI2状态寄存器 0x0002 +R16_SPI2_DATAR 0x4000380C SPI2数据寄存器 0x0000 +R16_SPI2_CRCR 0x40003810 SPI2多项式寄存器 0x0007 +R16_SPI2_RCRCR 0x40003814 SPI2接收CRC寄存器 0x0000 +R16_SPI2_TCRCR 0x40003818 SPI2发送CRC寄存器 0x0000 +R16_SPI2_I2S_CFGR 0x4000381C SPI2_I2S配置寄存器 0x0000 +R16_SPI2_I2SPR 0x40003820 SPI2_I2S预分频寄存器 0x0000 +R16_SPI2_HSCR 0x40003824 SPI2高速控制寄存器 0x0000 +表20-3 SPI3相关寄存器列表 +名称 访问地址 描述 复位值 +R16_SPI3_CTLR1 0x40003C00 SPI3控制寄存器1 0x0000 +R16_SPI3_CTLR2 0x40003C04 SPI3控制寄存器2 0x0000 +R16_SPI3_STATR 0x40003C08 SPI3状态寄存器 0x0002 +R16_SPI3_DATAR 0x40003C0C SPI3数据寄存器 0x0000 +R16_SPI3_CRCR 0x40003C10 SPI3多项式寄存器 0x0007 +R16_SPI3_RCRCR 0x40003C14 SPI3接收CRC寄存器 0x0000 +R16_SPI3_TCRCR 0x40003C18 SPI3发送CRC寄存器 0x0000 +R16_SPI3_I2S_CFGR 0x40003C1C SPI3_I2S配置寄存器 0x0000 +R16_SPI3_I2SPR 0x40003C20 SPI3_I2S预分频寄存器 0x0000 +R16_SPI3_HSCR 0x40003C24 SPI3高速控制寄存器 0x0000 +20.4.1 SPI 控制寄存器 1(SPIx_CTLR1)(x=1/2/3) +偏移地址:0x00 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +BIDI BIDI CRC RX LSB +CRCEN DFF SSM SSI SPE BR[2:0] MSTR CPOL CPHA +MODE OE NEXT ONLY FIRST +位 名称 访问 描述 复位值 +单向数据模式使能位。 +15 BIDIMODE RW 0:选择双线双向模式; 0 +1:选择单线双向模式。 +单线输出使能位,和BIDIMODE配合使用。 +14 BIDIOE RW 0:禁止输出,仅接收; 0 +1:使能输出,仅发送。 +13 CRCEN RW 硬件CRC校验使能位,该位只能在SPE为0时 0 +V2.4 303 + +# Page 307 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +写入,该位只能在全双工模式下使用。 +0:禁止CRC计算; +1:启动CRC计算。 +在接下来的一次数据传输后,发送CRC寄存器 +的值。这位应该在向数据寄存器写入最后一个 +12 CRCNEXT RW 数据后立刻置位。 0 +0:继续发送数据寄存器的数据; +1:发送CRC校验结果。 +数据帧长度位,此位只能在SPE为0时写入。 +11 DFF RW 0:使用8位数据长度进行收发; 0 +1:使用16位数据长度进行收发。 +双线模式下只接收位,该位和 BIDIMODE 配合 +使用。置此位可以让设备只接收不发送。 +10 RXONLY RW 0 +0:全双工模式; +1:只接收,单工模式。 +片选引脚管理位,此位决定NSS引脚的电平由 +硬件还是软件控制。 +9 SSM RW 0 +0:硬件控制NSS引脚; +1:软件控制NSS引脚。 +片选引脚控制位,在SSM置位的情况下,此位 +决定NSS引脚的电平。 +8 SSI RW 0 +0:NSS为低电平; +1:NSS为高电平。 +帧格式控制位。不可以在通讯时修改此位。 +7 LSBFIRST RW 0:先发送MSB; 0 +1:先发送LSB。 +SPI使能位。 +6 SPE RW 0:禁用SPI; 0 +1:启用SPI。 +波特率设置域,在通讯时不可以修改此域。 +当HSRXEN位为0时,SCK频率为: +000:F /2; 001:F /4; +PCLK PCLK +010:F /8; 011:F /16; +PCLK PCLK +100:F /32; 101:F /64; +PCLK PCLK +110:F /128; 111:F /256。 +PCLK PCLK +当HSRXEN位为1时,SCK频率为: +[5:3] BR[2:0] RW 000b +000:F /2; 001:F /3; +PCLK PCLK +010:F /4; 011:F /5; +PCLK PCLK +100:F /6; 101:F /7; +PCLK PCLK +110:F /8; 111:F /9。 +PCLK PCLK +注:此位仅适用于批号倒数第六位不等于0的 +CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C系列芯片。 +主从设置位,在通讯时不可以修改此位。 +2 MSTR RW 0:配置为从设备; 0 +1:配置为主设备。 +V2.4 304 + +# Page 308 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +时钟极性选择位,在通讯时不可以修改此位。 +1 CPOL RW 0:空闲状态时,SCK保持低电平; 0 +1:空闲状态时,SCK保持高电平。 +时钟相位设置位,在通讯时不可以修改此位。 +0 CPHA RW 0:数据采样从第一个时钟沿开始; 0 +1:数据采样从第二个时钟沿开始。 +20.4.2 SPI 控制寄存器 2(SPIx_CTLR2)(x=1/2/3) +偏移地址:0x04 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RXNE TXDMA RXDMA +Reserved TXEIE ERRIE Reserved SSOE +IE EN EN +控制寄存器2 +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +发送缓冲区空中断使能位: +7 TXEIE RW 0:禁止TXE被置位时产生中断; 0 +1:允许TXE被置位时产生中断。 +接收缓冲区非空中断使能位: +6 RXNEIE RW 0:禁止RXNE被置位时产生中断; 0 +1:允许RXNE被置位时产生中断。 +错误中断使能位: +0:禁止在产生错误(CRCERR,OVR,MODF)时 +5 ERRIE RW 产生中断; 0 +1:允许在产生错误(CRCERR,OVR,MODF)时 +产生中断。 +[4:3] Reserved RO 保留。 0 +SS 输出使能。禁止 SS 输出可以工作在多主模 +式下。 +2 SSOE RW 0 +0:禁止主模式下的SS输出; +1:使能SS输出。 +发送缓冲区DMA使能位。 +1 TXDMAEN RW 0:禁用发送缓冲区DMA; 0 +1:启用发送缓冲区DMA。 +接收缓冲区DMA使能位。 +0 RXDMAEN RW 0:禁用接收缓冲区DMA; 0 +1:启用接收缓冲区DMA。 +20.4.3 SPI 状态寄存器(SPIx_STATR)(x=1/2/3) +偏移地址:0x08 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CRC CHSID +Reserved BSY OVR MODF UDR TXE RXNE +ERR E +V2.4 305 + +# Page 309 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +忙标志位,该位由硬件置位或复位。 +7 BSY RO 0:SPI不在通讯; 0 +1:SPI正在通讯,或发送缓冲区非空。 +溢出标志位,该位由硬件置位,软件复位。 +6 OVR RO 0:没有出现溢出错误; 0 +1:出现溢出错误。 +模式错误标志位,该位由硬件置位,软件复位。 +5 MODF RO 0:没有出现模式错误; 0 +1:出现了模式错误。 +CRC错误标志位,该位由硬件置位,软件复位。 +4 CRCERR RW0 0:收到的CRC值与RCRCR的值一致; 0 +1:收到的CRC值与RCRCR的值不一致。 +下溢标志位,该位由硬件置位,软件复位。 +3 UDR RO 0:未发生下溢; 0 +1:发生下溢。 +声道,该位由硬件置位,软件复位。 +2 CHSIDE RO 0:需要传输或接收左声道; 0 +1:需要传输或接收右声道。 +发送缓冲区为空标志位: +1 TXE RO 0:发送缓冲区非空; 1 +1:发送缓冲区为空。 +接收缓冲区非空标志位: +0:接收缓冲区为空; +0 RXNE RO 0 +1:接收缓冲区非空。 +注:读DATAR,自动清零。 +20.4.4 SPI 数据寄存器(SPIx_DATAR)(x=1/2/3) +偏移地址:0x0C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DR[15:0] +位 名称 访问 描述 复位值 +数据寄存器。数据寄存器用于存放接收到的数 +据或预存将要发送出去的数据,因此数据寄存 +器的读写实际上是对应操作不同的区域,其中 +读对应接收缓冲区,写对应发送缓冲区。数据 +[15:0] DR[15:0] RW 的接收和发送可以是 8 位或者 16 位的,需要 0 +在传输之前就确定使用多少位的数据。使用 8 +位进行数据传输时,只有数据寄存器的低8位 +被使用,接收时高8位强制为0。使用16位数 +据结构则会使全部16位数据寄存器被使用。 +V2.4 306 + +# Page 310 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +20.4.5 SPI 多项式寄存器(SPIx_CRCR)(x=1/2/3) +偏移地址:0x10 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CRCPOLY[15:0] +位 名称 访问 描述 复位值 +[15:0] CRCPOLY[15:0] RW CRC多项式。此域定义CRC计算用到的多项式。 0x0007 +20.4.6 SPI 接收 CRC 寄存器(SPIx_RCRCR)(x=1/2/3) +偏移地址:0x14 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RXCRC[15:0] +位 名称 访问 描述 复位值 +接收CRC值。存储着计算出来的接收到的字节 +的CRC校验的结果。对CRCEN置位会复位该寄 +存器。计算方法使用CRCPOLY用到的多项式。 +[15:0] RXCRC[15:0] RO 0 +8位模式下只有低8位参与计算,16位模式下 +全部 16 位都会参与计算。需要在 BSY 为 0 时 +去读取这个寄存器。 +20.4.7 发送 CRC 寄存器(SPIx_TCRCR)(x=1/2/3) +偏移地址:0x18 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TXCRC[15:0] +位 名称 访问 描述 复位值 +发送CRC值。存储着计算出来的已经发送出去 +的字节的CRC校验的结果。对CRCEN置位会复 +位该寄存器。计算方法使用CRCPOLY用到的多 +[15:0] TXCRC[15:0] RO 0 +项式。8位模式下只有低8位参与计算,16位 +模式下全部16位都会参与计算。需要在BSY为 +0时去读取这个寄存器。 +20.4.8 SPI_I2S 配置寄存器(SPIx_I2S_CFGR)(x=1/2/3) +偏移地址:0x1C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +I2S I2SCFG PCM Reser I2SSTD DATLEN +Reserved I2SE CKPOL CHLEN +MOD [1:0] SYNC ved [1:0] [1:0] +位 名称 访问 描述 复位值 +V2.4 307 + +# Page 311 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[15:12] Reserved RO 保留。 0 +I2S模式选择,该位只有在关闭了SPI或者I2S +时才能设置。 +11 I2SMOD RW 0 +0:选择SPI模式; +1:选择I2S模式。 +I2S使能,在SPI模式下不使用。 +10 I2SE RW 0:关闭I2S; 0 +1:I2S使能。 +I2S 模式选择,此该位只有在关闭了 I2S 时才 +能设置: +00:从设备发送; +[9:8] I2SCFG[1:0] RW 00b +01:从设备接收; +10:主设备发送; +11:主设备接受。 +PCM帧同步。该位只在I2SSTD = 11 (使用PCM +标准)时有意义。 +7 PCMSYNC RW 0 +0:短帧同步; +1:长帧同步。 +6 Reserved RO 保留 0 +I2S 标准选择,只有在关闭了 I2S 时才能设置 +该位。 +00:I2S飞利浦标准; +[5:4] I2SSTD[1:0] RW 00b +01:高字节对齐标准 (左对齐); +10:低字节对齐标准(右对齐); +11:PCM 标准。 +静止态时钟极性,为了正确操作,该位只有在 +关闭了I2S时才能设置。 +3 CKPOL RW 0 +0:I2S时钟静止态为低电平; +1:I2S时钟静止态为高电平。 +待传输数据长度,为了正确操作,该位只有在 +关闭了I2S时才能设置。 +00:16位数据长度; +[2:1] DATLEN[1:0] RW 00b +01:24位数据长度; +10:32位数据长度; +11:不允许。 +声道长度,只有在 DATLEN = 00 时该位的写 +操作才有意义,否则声道长度都由硬件固定为 +0 CHLEN RW 32位。。 0 +0:16位宽; +1:32位宽。 +20.4.9 SPI_I2S 预分频寄存器(SPIx_I2SPR)(x=2/3) +偏移地址:0x20 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved MCKOE ODD I2SDIV[7:0] +V2.4 308 + +# Page 312 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留 0 +主设备时钟输出使能,为了正确操作,该位只 0 +有在关闭了I2S时才能设置。仅在I2S主设备 +9 MCKOE RW 模式下使用该位。 +0:关闭主设备时钟输出; +1:主设备时钟输出使能。 +奇系数预分频,为了正确操作,该位只有在关 0 +闭了I2S时才能设置。仅在I2S主设备模式下 +8 ODD RW 使用该位。 +0:实际分频系数 = I2SDIV *2; +1:实际分频系数 = (I2SDIV * 2)+1。 +I2S 线性预分频。为了正确操作,该位只有在 0 +关闭了I2S时才能设置。仅在I2S主设备模式 +[7:0] I2SDIV[7:0] RW 下使用该位。禁止设置I2SDIV [7:0] = 0或 +者I2SDIV[7:0] = 1。 +参见20.3.3节。 +20.4.10 SPI 高速控制寄存器(SPIx_HSCR)(x=1/2/3) +偏移地址:0x24 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HSRXE Reser HSRX +Reserved +N2 ved EN +位 名称 访问 描述 复位值 +[15:3] Reserved RO 保留 0 +SPI高速读模式2 +该模式仅在开启HSRXEN且SPI PCLK大于等于 +120M 时使用,小于 120M 不建议使用此位。可 +以获得比仅开启HSRXEN更高的主机读速度。 +2 HSRXEN2 RW 0:关闭高速读模式2; 0 +1:使能高速读模式2。 +注:仅适用于 CH32F20x_D8、CH32F20x_D8C、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批 +号倒数第六位不为0的产品。 +1 Reserved RO 保留 0 +高速读模式使能位: +0:关闭高速读模式; +1:使能高速读模式。 +该 位 除 CH32F20x_D8 、 CH32F20x_D8C 、 +0 HSRXEN WO 0 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批 +号倒数第六位不为0的产品可读可写外,其他 +型号芯片均为只写。 +V2.4 309 + +# Page 313 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +对于CH32F20x_D6、CH32V20x_D6系列芯片所有 +版本支持该模式仅在时钟2分频(即CTLR1寄 +存器的BR = 000)时有效。 +对 于 CH32F20x_D8 、 CH32F20x_D8C 、 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C系 +列芯片批号倒数第五位小于2且批号倒数第六 +位为 0 的、CH32V20x_D8、CH32V20x_D8W、 +CH32F20x_D8W系列芯片批号倒数第五位小于2 +的,只支持该模式仅在时钟 2 分频(即 CTLR1 +寄存器的BR = 000)时有效,其他批次不受限 +制。 +V2.4 310 + +# Page 314 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 21 章 USB 全速设备控制器(USBD) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器系列部分产品。 +USBD模块是基于USB2.0全速设备技术规范,设计的USB全速、低速协议通讯控制器。内置硬件 +自动处理物理信号的反向不归零(NRZI)编码/解码、位填充。控制可驱动出 USB 总线多种状态、协 +议包收发,并提供自动应答进行流控保证应用程序处理时间等功能。 +21.1 主要特性 + 符合USB2.0全速设备技术规范 + 支持USB全速12Mbps、低速1.5Mbps模式 + 支持配置16个传输通道 + 支持端点地址范围0-15 + 支持控制、中断、批量、同步传输 + 支持批量/同步端点的双缓冲机制 + USB挂起、唤醒、恢复操作 + 硬件自动进行数据PID翻转、传输流控 + 帧锁定时钟脉冲生成 +注:USBD和CAN控制器在设计中共享了一个专用的512字节SRAM区域用于数据的发送和接收,因此 +同时使用USBD和CAN功能时,需要合理分配此共享区域,防止出现数据冲突。 +21.2 功能描述 +21.2.1 功能介绍 +USBD 模块为 USB主机(一般是 PC)和微控制器之间的数据通讯提供了一条符合 USB 规范的通信 +连接,使用时由应用程序和模块硬件配合完成。模块中包含一块共享的 512 字节专用 SRAM 区域作为 +USB收发数据缓冲区,由配置的端点数目和每个端点最大数据包长度决定实际使用范围。最多可用于 +16个单向或8个双向端点。 +USBD模块功能包括: + 物理信号编码/解码:根据USB规范实现令牌包、数据包、握手包的PID检测,包括位填充、CRC +的生成和校验、帧头同步识别等。 + 事务处理:判断正确传输和错误状态,提供各自标志状态及中断通知。 + 总线挂起/复位/唤醒状态识别通知。 + 自动数据包 PID:根据协议,对非同步端点、同步端点的收发数据包 PID 进行硬件翻转或锁定, +减少应用程序工作。 + 自动应答包PID:根据协议,完成一次USB事务后,对非同步端点会自动修改应答包状态来为应 +用程序提供足够的处理和准备时间,但不影响USB总线上的物理收发。 + 管理数据收发:定位端点配置及缓冲区描述区域,检测缓冲区边界防溢出。单缓冲/双缓冲区域 +管理、按端点类型中断上报优先级管理等。 + 提供通用类、端点类、缓冲区描述类寄存器配置。 +应用程序可以: + 获取基于USB协议的帧间隔时间点,总线状态:挂起、复位。 + 自定义端点数目、端点类型、端点大小。自定义传输数据缓冲区域。 + 获取当前或已挂起端点的服务进行处理。 + 获取如位填充、格式、CRC、协议、缺失ACK、缓冲区溢出/缓冲区未满等错误状态。 + 驱动模块进入低功耗模式。 +V2.4 311 + +# Page 315 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USBD模块提USB事件映射到3个不同的NVIC或PFIC请求线上(使用了3个中断号): +1) USB高优先级中断:仅能由同步和双缓冲批量传输的正确传输事件触发,目的是保证最大的传输 +速率。 +2) USB 低优先级中断:可由所有 USB 事件触发(正确传输,USB 复位等)。固件在处理中断前应当 +首先确定中断源。 +3) USB唤醒中断:由USB挂起模式的唤醒事件触发。 +21.2.2 功能配置 +1)GPIO端口 +一旦使能了USBD模块,作为UDP和UPM的GPIO口会自动连接到内部USB收发器,而断开其GPIO +外设的端口设置。所以推荐GPIO口配置为推挽方式输出低电平,防止在未开启USBD功能前,出现端 +口不确定状态或连接PC主机时,提前通知有USB设备接入。 +USBD模块内置USB设备模式的1.5K上拉电阻,无需外接上拉电阻。具体配置请参考配置扩展控 +制寄存器(EXTEN_CTR)说明。 +2)模块初始化 +首先,USB收发器相关的模拟部分需要标准的48MHz时钟作为基准时钟,此时钟来源于HB总线。 +应用程序需要先通过配置时钟管理逻辑的相应控制位(RCC_CFGR0寄存器)保证当前USB时钟是48MHz, +再使能USB接口时钟,使程序可以访问USBD模块的寄存器。 +其次,在模块强制复位时(USBD_CNTR寄存器上的FRES位默认为1),应用程序应该初始化所需 +要的寄存器和分组缓冲区描述表。包括:分组缓冲区描述表地址寄存器(USBD_BTABLE)、端点配置寄 +存器(USBD_EPRx)和分组缓冲区描述表寄存器。配置USBD_DADDR寄存器ADD[6:0]域为0(USB协议 +默认地址),置位EF位使能端点传输功能。 +最后,启用内部1.5K上拉电阻和设置速度模式(EXTEN_CTR寄存器),然后,清除USBD_CNTR寄 +存器上的 FRES位,撤销 USBD模块强制复位状态来使能 USBD模块,清除 USBD_ISTR寄存器的各种状 +态标志,以便在使能其他任何单元的操作之前清除未处理的假中断标志。开启USBD_CNTR寄存器中需 +要的中断控制位。 +3)USB复位 +USB复位包括:USBD模块强制复位和USB总线复位(协议复位)。两者皆会产生USBD_ISTR寄存 +器的 RST 标志。发生 USB 复位时,所有端点的通信都被禁止(USBD 模块不会响应任何包传输)。在 +USB复位后,USBD模块被使能,同时USB端点也需要被使能以便可以响应USB主机(USBD_DADDR寄存 +器的 EF 位为 1)。在 USB 设备的枚举阶段,主机将分配给设备一个唯一的地址,这个地址必须写入 +USBD_DADDR寄存器的ADD[6:0]位中。 +注:RST标志来源USBD模块强制复位控制位(FRES)的状态和USB总线复位信号起始。 +4)端点配置及缓冲区描述表 +每个端点配置寄存器可以配置一个双向端点单缓冲属性,也可以配置一个单向端点双缓冲属性。 +例如:配置双向端点单缓冲属性,端点配置寄存器3(USBD_EPRx),EA[3:0]为2,那么可以在USB传 +输上存在端点 2 上传通道和端点 2 下传通道(具体由描述符信息决定);配置单向端点双缓冲属性 +(只针对批量端点和同步端点),端点配置寄存器3(USBD_EPRx),EA[3:0]为2,端点类型(EPTYPE) +为同步或批量端点,EP_KIND位置1,那么可以在USB传输上存在端点2上传通道或端点2下传通道, +2选1,收发速度上与单缓冲相比更快,微控制器处理和USBD模块物理收发可以同步进行,降低等待 +时间。 +注:USBD模块内置冲突仲裁机制,使得微控制器和USBD模块对分组缓冲区的访问如同对一个双端口 +V2.4 312 + +# Page 316 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +SRAM的访问,即使微控制器连续访问缓冲区,也不会产生访问冲突。 +每个端点配置寄存器对应一组缓冲区描述类寄存器(描述表)及相应数据收发缓冲区域,他们都 +位于共享的 512 字节专用 SRAM 区域内(基地址 0x40006000)。其中,USBD_BTABLE 寄存器定义缓冲 +区描述表在 SRAM 区域内的起始地址,而数据收发缓冲区域可以位于整个专用 SRAM 区域内的任意位 +置,因为它们的地址和长度都定义在对应的缓冲区描述表中,注意分配冲突问题。 +注:CH32V20x_D6、CH32V20x_D8、CH32V20x_D8W、CH32F20x_D6、CH32F20x_D8W系列产品使用CAN时, +CAN过滤器表使用共享的512字节专用SRAM区域中的高128字节,USB使用低384字节。 +CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C、CH32F20x_D8、CH32F20x_D8C系列产品使用CAN1时, +CAN过滤器表使用共享的512字节专用SRAM区域中的高128字节,USB使用低384字节;同时使用 +CAN1&CAN2时,CAN过滤器表使用共享的512字节专用SRAM区域中的高256字节,USB使用低256字 +节。 +图21-1 缓冲区描述表结构 +... +... ... +双缓冲模式 +端点3发送缓冲区1 +3CH Reserved COUNT3_TX_1 +38H Reserved ADD3_TX_1 双缓冲模式 +EA=3 端点3发送缓冲区0 +34H Reserved COUNT3_TX_0 +0x4000 6400 +30H Reserved ADD3_TX_0 双缓冲模式 +端点2接收缓冲区1 +2CH Reserved COUNT0_RX_1 +28H Reserved ADD2_RX_1 +EA=2 双缓冲模式 +24H Reserved COUNT0_RX_0 端点2接收缓冲区0 +20H Reserved ADD2_RX_0 +1CH Reserved COUNT1_RX 单缓冲模式 +端点1接收缓冲区 +18H Reserved ADD1_RX +EA=1 +14H Reserved COUNT1_TX 单缓冲模式 +端点1发送缓冲区 +10H Reserved ADD1_TX +USBD_BTABLE 基址 0CH Reserved COUNT0_RX +单缓冲模式 +08H Reserved ADD0_RX 端点0接收缓冲区 +EA=0 +04H Reserved COUNT0_TX +单缓冲模式 +(00H) Reserved ADD0_TX 端点0发送缓冲区 +0x4000 6000 +偏移地址 +共享的专用SRAM 缓冲区描述表 数据包缓冲区 +(有效区域512字节) +不论接收或发送,分组缓冲区都是从底部开始使用的。USBD模块不会改变超出当前分配到的缓冲 +区区域以外的其他缓冲区的内容。如果缓冲区收到一个比自己大的数据分组,它只会接收最大为自身 +大小的数据,其他的丢掉,即发生了所谓的缓冲区溢出异常。 +1)端点初始化 +初始化端点的第一步是把适当的值写到 USBD_ADDRx_TX 或 USBD_ADDRx_RX 寄存器中,以便 USBD +模块能找到要传输的数据或准备好接收数据的缓冲区。USBD_EPRx 寄存器的 EPTYPE[1:0]位确定端点 +的基本类型,EP_KIND 位确定端点的特殊特性。作为发送方,需要设置 USBD_EPRx 寄存器的 STAT_TX +位来使能端点,并配置 COUNTx_TX 位决定发送长度。作为接收方,需要设置 STAT_RX 位来使能端点, +并且设置BL_SIZE和NUM_BLOCK位,确定接收缓冲区的大小,以检测缓冲区溢出的异常。对于非同步 +非双缓冲批量传输的单向端点,只需要设置一个传输方向上的寄存器。一旦端点被使能,应用程序就 +不 能 再 修 改 USBD_EPRx 寄 存 器 的 值 和 USBD_ADDRx_TX/USBD_ADDRx_RX 、 USBD_COUNTx_TX/ +USBD_COUNTx_RX寄存器所在的位置,因为这些值会被硬件实时修改。当数据传输完成时,CTR中断会 +产生,此时上述寄存器可以被访问,并重新使能新的传输。 +V2.4 313 + +# Page 317 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2)IN事务(进行数据发送) +当接收到 IN 令牌包时,如果接收到的地址和一个配置好的端点地址相符合,并且此时寄存器 +USBD_EPRx上的STAT_TX位表示可发送的话,USBD模块将会根据缓冲区描述表的内容及DTOG_TX位进 +行组包编码发出数据包。如果收到的令牌包所对应的端点是无效的,将根据 USBD_EPRx 寄存器上的 +STAT_TX位发送NAK或STALL握手包而不发送数据包。 +在接收到主机响应的 ACK 握手包后,USBD_EPRx 寄存器的值有以下更新:DTOG_TX 位被翻转, +STAT_TX位为‘10’(NAK状态),使端点无效,CTR_TX位被置位。应用程序需要通过USBD_ISTR寄 +存器的 EP_ID 和 DIR 位识别产生中断的 USB 端点。CTR_TX 事件的中断服务程序需要首先清除中断标 +志位,如果要继续发送数据(可以在任何需要发送数据时执行),需要准备好需要发送的数据缓冲区, +更新 COUNTx_TX 为下次需要传输的字节数,最后再设置 STAT_TX 位为‘11’(ACK,端点有效),再 +次使能数据传输。当 STAT_TX 位为‘10’时(NAK状态),任何发送到该端点的 IN 请求都会被 NAK, +USB主机会重发IN请求直到该端点确认请求有效。 +3)OUT事务和SETUP事务(进行数据接收) +USBD 模块对这两种事务的处理方式基本相同;当接收到一个 OUT 或 SETUP 包时,如果接收到的 +地址和一个配置好的端点地址相符合,并且此时寄存器 USBD_EPRx 上的 STAT_RX 位表示可接收的话, +USBD 模块根据 DTOG_RX 位判断接收数据是否 PID 匹配,如果匹配将访问缓冲区描述表,找到与该端 +点相关的ADDRx_RX和COUNTx_RX寄存器,将接收的数据包(先收到的为低字节)保存到ADDRx_RX定 +义的地址空间内并根据BL_SIZE和NUM_BLOCK的值检测接收是否溢出缓冲区。如果传输中没有任何错 +误发生,则发送ACK握手包到主机。即使发生CRC错误或其他类型的错误(位填充,帧错误等),数 +据还是会被保存到分组缓冲区中,至少会保存到发生错误的数据点,只是不会发送ACK握手包,并且 +USBD_ISTR寄存器的ERR位将会置位。在这种情况下,应用程序通常不需要干涉处理,USBD模块将从 +传输错误中自动恢复,并为下一次传输做好准备。如果收到的包所对应的端点没有准备好,USBD模块 +将根据USBD_EPRx寄存器的STAT_RX位发送NAK或STALL握手包,数据将不会被写入接收缓冲区。 +ADDRx_RX的值决定接收缓冲区的起始地址,COUNTx_RX决定接收缓冲区大小(期望有效数据长度 ++2 字节 CRC)。如果接收到的数据包长度超出了缓冲区的范围,超过范围的数据不会被写入缓冲区, +USBD模块将报告缓冲区发生溢出,并向主机发送STALL握手包,并置位分组缓冲区溢出标志PMAOVR。 +如果传输正确完成,USBD 模块将发送 ACK 握手包,并将实际接收数据包中的有效数据字节数写 +入 COUNTx_RX 寄存器中。USBD_EPRx 寄存器的值有以下更新:DTOG_RX 位翻转,STAT_RX 位为‘10’ +(NAK状态)使端点无效,CTR_RX位被置位。应用程序需要通过USBD_ISTR寄存器的EP_ID和DIR位 +识别产生中断的 USB 端点。CTR_RX 事件的中断服务程序首先要根据 SETUP 位确定传输的类型,同时 +清除中断标志位,然后读相关的缓冲区描述表表项指向的COUNTx_RX寄存器,获得此次传输的总字节 +数,处理接收数据。处理完后,应用程序需要将USBD_EPRx中的STAT_RX位置成‘11’(ACK状态), +使能下一次的传输。当STAT_RX位为‘10’时(NAK状态),任何一个发送到端点上的OUT请求都会 +被 NAK,SETUP请求除外(协议规定 SETUP请求必须以 ACK握手包接收)。PC主机将不断重发被 NAK +的OUT事务包,直到收到端点的ACK握手包。 +4)控制传输 +控制(SETUP)传输一定发生在端点 0 上,所以也称端点 0 位控制端点。控制传输由 3个阶段组 +成,首先是主机发送SETUP事务的SETUP阶段,然后是主机发送零个或多个数据(IN/OUT事务)的数 +据阶段,最后是状态阶段,由与数据阶段方向相反的数据事务构成。 +SETUP 事务非常类似于 OUT 事务的传输过程,所以控制端点在每次发生 CTR_RX 中断时,都必须 +检查USBD_EPRx寄存器的SETUP位,以识别是普通的OUT事务还是SETUP事务。当主机发送SETUP事 +务下来,USBD模块会固定回复ACK握手包接收下来,而忽略判断STAT_RX和DTOG_RX的内容。然后强 +制将 DTOG_RX和DTOG_TX设置为 DATA1状态,并设置 STAT_RX和 STAT_TX为‘10’(NAK),保证应 +V2.4 314 + +# Page 318 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +用程序可以根据 SETUP 事务中的相应数据决定后面的传输是 IN 还是 OUT。如果拒绝后续数据传输或 +出现错误,应用程序可以设置STAT_RX或STAT_TX为‘01’,应答STALL握手包。如果应用程序收到 +一个 SETUP 事务并处理时,此时 CTR_RX 仍然保持置位,又收到一个 SETUP 包,USBD 模块会丢掉此 +SETUP包,并不给于任何握手包应答,以此来模拟一个接收错误,迫使主机再次发送SETUP包,这样 +做是为了避免丢失紧随一次CTR_RX中断之后的又一个SETUP事务传输。 +在控制传输的状态阶段,如果执行的是由主机发送给设备的 OUT 事务,那么 STATUS_OUT 位 +(USBD_EPRx 寄存器中的 EP_KIND)应该被置位,只有这样,在状态阶段传输过程中收到了非零长度 +的数据分组,才会产生传输错误。在完成状态阶段传输后,应用程序应该清除 STATUS_OUT 位,并且 +将STAT_RX设为ACK表示已准备好接收一个新的命令请求,将STAT_TX则设为NAK,不接受任何数据 +上传的请求。 +21.2.3 双缓冲机制 +在USB协议标准里,对不同的数据传输方式进行了应用描述。其中,批量传输适用于USB主机和 +设备间进行大批量的数据传输,主机在帧时间内利用尽可能多的带宽执行批量传输。但这种传输需要 +保证数据的正确性和完整性,所以传输中包含令牌包、数据包、握手包的顺序进行。同步传输适用于 +对数据要求恒定速率传送,但对错误有一定容忍性,认为传输一般都可以成功,主机在每个帧时间内 +有固定的带宽来执行同步传输以此保证传输速率,所以传输中包含令牌包、数据包的顺序进行,没有 +握手包来确认传输状态和终止传输。 +21.2.3.1 单向双缓冲批量端点 +批量传输,在单缓冲方式下,当应用程序处理批量端点的前一次的数据传输时,又收到新的数据 +包,USBD模块将回应NAK握手包,使PC主机不断重发同样的数据包,直到应用程序重新设置ACK握 +手包。这样的重传占用了很多带宽,影响了批量传输的速率。因此对批量端点引入双缓冲机制来提高 +数据传输率。在双缓冲方式下,单向批量端点有2个数据缓冲区,即该端点的接收和发送两块数据缓 +冲区。数据翻转位(DTOG_RX 或 DTOG_TX)用来选择当前使用到两块缓冲区中的哪一块,使应用程序 +可以在 USBD 模块访问其中一块缓冲区的同时,对另一块缓冲区进行操作。例如,对一个双缓冲批量 +端点进行OUT事务传输时,USBD模块将来自PC主机的数据保存到一个缓冲区,同时应用程序可以对 +另一个缓冲区中的数据进行处理(对于IN事务来说,情况是一样的)。这样利用USBD模块的接收或 +发送数据的时间完成应用程序的数据处理,提高了USB收发效率。因为对于一个传输方向需要2个缓 +冲区,所以配置双向缓冲区的批量端点必须配置为单向端点,其USBD_EPRx寄存器只需设定STAT_RX +位(作为双缓冲批量接收端点)或STAT_TX位(作为双缓冲批量发送端点)。为尽可能利用双缓冲的 +优势,达到较高的传输速率,USBD模块处理双缓冲批量端点的流控与其他端点的稍有不同。它只在缓 +冲区发生访问冲突时才会设置端点为NAK状态,而不是在每次传输成功后都将端点设为NAK状态。 +USBD_EPRx 寄存器中的 DTOG_xx 位用来标识 USBD 模块和应用程序当前分别使用的存储缓存区, +以避免发生访问冲突。当配置为单向发送双缓冲区端点时,DTOG_TX标识USBD模块当前使用缓冲区, +而DTOG_RX标识应用程序当前使用缓冲区;当配置为单向接收双缓冲区端点时,DTOG_RX标识USBD模 +块当前使用缓冲区,而 DTOG_TX 标识应用程序当前使用缓冲区。我们命名 USBD 模块使用缓冲区标识 +为DTOG,应用程序使用缓冲区标识为SW_BUF。所以双缓冲单向批量端点标识定义如下: +表21-1 缓冲区标识 +缓冲区标识位 发送端点 接收端点 +DTOG DTOG_TX(USBD_EPRx寄存器bit6) DTOG_RX(USBD_EPRx寄存器bit14) +SW_BUF DTOG_RX(USBD_EPRx寄存器bit14) DTOG_TX(USBD_EPRx寄存器bit6) +表21-2 双缓冲批量端点缓冲区 +端点类型 DTOG SW_BUF USBD模块使用缓冲区 应用程序使用缓冲区 +IN端点 0 1 ADDRx_TX_0/COUNTx_TX_0 ADDRx_TX_1/COUNTx_TX_1 +V2.4 315 + +# Page 319 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1 0 ADDRx_TX_1/COUNTx_TX_1 ADDRx_TX_0/COUNTx_TX_0 +0 0 设置端点处于NAK状态 ADDRx_TX_0/COUNTx_TX_0 +1 1 设置端点处于NAK状态 ADDRx_TX_1/COUNTx_TX_1 +0 1 ADDRx_RX_0/COUNTx_RX_0 ADDRx_RX_1/COUNTx_RX_1 +1 0 ADDRx_RX_1/COUNTx_RX_1 ADDRx_RX_0/COUNTx_RX_0 +OUT端点 +0 0 设置端点处于NAK状态 ADDRx_RX_0/COUNTx_RX_0 +1 1 设置端点处于NAK状态 ADDRx_RX_1/COUNTx_RX_1 +应用程序配置一个双缓冲批量端点,需要设置USBD_EPRx寄存器的EPTYPE[1:0]为‘00’,EP_KIND +位为‘1’。根据传输开始时用到的缓冲区来初始化DTOG和SW_BUF位。每成功完成一次传输后,USBD +模块将根据双缓冲批量端点的流量控制操作,并且持续到EP_KIND变为无效为止。每次传输结束,根 +据端点的传输方向,CTR_RX位或CTR_TX位将会置位。与此同时,硬件将设置相应的DTOG_xx位(翻 +转),并实现缓冲区交换,如果没有发生USBD模块和应用程序的缓冲区访问冲突(即DTOG和SW_BUF +为相同的值,见表154),则保持STAT_xx位的状态值,否则将会被置为‘10’(NAK状态)。所以应 +用程序访问缓冲区之后,需要及时翻转SW_BUF位,以通知USB模块该块缓冲区已变为可用状态。 +21.2.3.2 同步端点 +同步传输一般用于传输音频流、压缩的视频流等对数据传输率有严格要求的数据。执行同步传输 +的端点即为同步端点。USB 主机会在每个帧时间内分配固定的带宽给同步端点进行 IN 事务或 OUT 事 +务传输,并且没有重传机制,无握手协议,同时传输的数据包PID固定为DATA0,不会出现DATA0和 +DATA1数据翻转机制(控制/批量/中断传输中出现)。 +因为同步传输中没有握手机制,USBD_EPRx寄存器的STAT_RX位和STAT_TX位分别只能设成‘00’ +(禁止传输)和‘11’(运行传输)两种状态。同步传输使用双缓冲机制来简化软件流程,它同样使 +用两个缓冲区,以确保在USB模块使用其中一块缓冲区时,应用程序可以访问另外一块缓冲区。不同 +于单向批量端点的双缓冲机制,同步端点由于在USB标准中传输有固定的时间间隔,及容错能力,所 +以 USBD 模块不判断与应用程序缓冲区冲突情况,只使用 DTOG 位来标识自身当前使用的缓冲区 +(USBD_EPRx寄存器中的DTOG_RX位用来标识接收同步端点,DTOG_TX位用来标识发送同步端点)。 +表21-3 同步端点缓冲区标识 +端点类型 DTOG USBD模块使用缓冲区 应用程序使用缓冲区 +0 ADDRx_TX_0/COUNTx_TX_0 ADDRx_TX_1/COUNTx_TX_1 +IN端点 +1 ADDRx_TX_1/COUNTx_TX_1 ADDRx_TX_0/COUNTx_TX_0 +0 ADDRx_RX_0/COUNTx_RX_0 ADDRx_RX_1/COUNTx_RX_1 +OUT端点 +1 ADDRx_RX_1/COUNTx_RX_1 ADDRx_RX_0/COUNTx_RX_0 +应用程序配置一个同步端点,需要设置USBD_EPRx寄存器的EPTYPE[1:0]为‘10’。根据传输开 +始时用到的缓冲区来初始化 DTOG 位。每成功完成一次传输后,根据端点的传输方向,CTR_RX 位或 +CTR_TX位将会置位。与此同时,硬件将设置相应的DTOG_xx位(翻转)实现缓冲区交换,但不会改变 +期望或发送的数据包PID(固定为DATA0)。STAT_RX或STAT_TX位不会发生变化。同步传输中,即使 +OUT 事务发生 CRC 错误或者缓冲区溢出,本次传输仍被看作是正确的,并且可以触发 CTR_RX 中断事 +件,但是,发生CRC错误时硬件会设置USB_ISTR寄存器的ERR位,提醒应用程序数据可能损坏。 +21.2.4 挂起/唤醒流程 +USB标准中定义了一种总线状态——总线挂起,如果USB总线在3ms内没有任何活动就进入挂起 +状态。在这种状态下USB总线上提供电流会降低(低速设备一般不超过500uA,高速或支持远程唤醒 +功能设备一般不超过2.5mA)。这种电流限制对于由总线供电的USB设备至关重要,而自供电的设备 +V2.4 316 + +# Page 320 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +则不需要严格遵守这样的电流消耗限制。 +正常工作状态下,USB 主机会以 1ms 间隔时间发送 SOF 包,所以如果 USBD 模块检测到 3 个连续 +的 SOF 包丢失事件即可判断主机发出了挂起请求,此时,它会置位 USBD_ISTR 寄存器的 SUSP位,如 +果使能了中断还会触发挂起中断。USBD模块会不断检测总线的挂起状态,并更新SUSP位(一直处于 +总线挂起状态下清除 SUSP 位标志仍然会由硬件再次置位)。所以当应用程序收到 USB 总线挂起事件 +后,需要执行以下流程: +将USBD_CNTR寄存器的FSUSP位置1,屏蔽硬件的挂起状态检测,防止不断触发挂起事件。 +消除或减少USBD模块以外其他模块的静态电流消耗。 +将USBD_CNTR寄存器的LPMODE位置1,让USBD模块处于低功耗运行状态,但仍可检测总线唤醒 +信号。 +可选择关闭外部振荡器和PLL,以停止设备的任何活动。 +处于挂起状态的USB设备或主机,将由“唤醒”序列唤醒。所谓的“唤醒”序列可以由USB主机 +发起唤醒挂起的USB设备,也可以由USB设备触发唤醒挂起的USB主机,但最终由USB主机结束“唤 +醒”序列。此外,作为挂起的USB设备,还需能够检测RST信号(总线复位)的功能,并将其当作一 +次正常的复位操作来执行。 +挂起的USBD模块收到唤醒信号后会触发一个WKUP中断事件(通道42),并将USBD_ISTR寄存器 +的WKUP位置1,自动清除LPMODE位。当应用程序收到USB唤醒事件后,需要执行以下流程: +清除USBD_CNTR寄存器的FSUSP位,重新开启USB总线的挂起状态检测功能; +可选择启动外部振荡器和PLL。 +查询USBD_FNR寄存器的RXDP和RXDM位判断是什么触发了唤醒事件,并执行相应软件操作。 +USBD 模块可以发出唤醒序列唤醒被挂起的 USB 主机。在这种情况下,先将 USBD_CNTR 寄存器的 +RESUME位置1,然后在1ms-15ms之间再把它清为0可以启动唤醒序列。RESUME位被清零后,唤醒过 +程将由主机PC完成(USB主机唤醒后会继续执行此序列以唤醒其他挂载的USB设备)。应用程序可以 +查询USBD_FNR寄存器的RXDP和RXDM位来判断唤醒是否完成。 +注:只有在USBD模块被设置为挂起状态时(设置USB_CNTR寄存器的FSUSP位为‘1’),才可以设 +置RESUME位。 +表21-4 USB总线状态 +RXDP RXDM 条件 USB总线状态 +0 0 >10ms 总线复位 +>1ms(全速设备) 唤醒序列开始 +0 1 +>3ms(低速设备) 挂起状态 +>3ms(全速设备) 挂起状态 +1 0 +>1ms(低速设备) 唤醒序列开始 +1 1 - 总线错误(或干扰) +21.3 寄存器描述 +USBD模块有以下3类寄存器: + 通用类寄存器:USBD模块控制、中断相关,基地址0x40005C40。 + 端点类寄存器:端点配置、收发状态相关,基地址0x40005C00。 + 缓冲区描述类寄存器:数据收发缓冲区相关,基地址0x40006000。 +表21-5 USBD通用类寄存器列表 +名称 访问地址 描述 复位值 +R16_USBD_CNTR 0x40005C40 USB控制寄存器 0x0003 +V2.4 317 + +# Page 321 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_USBD_ISTR 0x40005C44 USB中断状态寄存器 0x0000 +R16_USBD_FNR 0x40005C48 USB帧编号寄存器 0x0XXX +R16_USBD_DADDR 0x40005C4C USB设备地址寄存器 0x0000 +R16_USBD_BTABLE 0x40005C50 USB分组缓冲区描述表地址寄存器 0x0000 +表21-6 USBD端点类寄存器列表 +名称 访问地址 描述 复位值 +R16_USBD_EPR0 0x40005C00 USB端点配置寄存器0 0x0000 +R16_USBD_EPR1 0x40005C04 USB端点配置寄存器1 0x0000 +R16_USBD_EPR2 0x40005C08 USB端点配置寄存器2 0x0000 +R16_USBD_EPR3 0x40005C0C USB端点配置寄存器3 0x0000 +R16_USBD_EPR4 0x40005C10 USB端点配置寄存器4 0x0000 +R16_USBD_EPR5 0x40005C14 USB端点配置寄存器5 0x0000 +R16_USBD_EPR6 0x40005C18 USB端点配置寄存器6 0x0000 +R16_USBD_EPR7 0x40005C1C USB端点配置寄存器7 0x0000 +表21-7 USBD缓冲区描述类寄存器列表 +名称 访问地址 描述 复位值 +R16_USBD_ADDR0_TX 0x40006000+[USBD_BTABLE] 端点发送缓存区地址寄存器0 0x0000 +R16_USBD_COUNT0_TX 0x40006004+[USBD_BTABLE] 端点发送数据字节数寄存器0 0x0000 +R16_USBD_ADDR0_RX 0x40006008+[USBD_BTABLE] 端点接收缓存区地址寄存器0 0x0000 +R16_USBD_COUNT0_RX 0x4000600C+[USBD_BTABLE] 端点接收数据字节数寄存器0 0x0000 +R16_USBD_ADDR1_TX 0x40006010+[USBD_BTABLE] 端点发送缓存区地址寄存器1 0x0000 +R16_USBD_COUNT1_TX 0x40006014+[USBD_BTABLE] 端点发送数据字节数寄存器1 0x0000 +R16_USBD_ADDR1_RX 0x40006018+[USBD_BTABLE] 端点接收缓存区地址寄存器1 0x0000 +R16_USBD_COUNT1_RX 0x4000601C+[USBD_BTABLE] 端点接收数据字节数寄存器1 0x0000 +R16_USBD_ADDR2_TX 0x40006020+[USBD_BTABLE] 端点发送缓存区地址寄存器2 0x0000 +R16_USBD_COUNT2_TX 0x40006024+[USBD_BTABLE] 端点发送数据字节数寄存器2 0x0000 +R16_USBD_ADDR2_RX 0x40006028+[USBD_BTABLE] 端点接收缓存区地址寄存器2 0x0000 +R16_USBD_COUNT2_RX 0x4000602C+[USBD_BTABLE] 端点接收数据字节数寄存器2 0x0000 +R16_USBD_ADDR3_TX 0x40006030+[USBD_BTABLE] 端点发送缓存区地址寄存器3 0x0000 +R16_USBD_COUNT3_TX 0x40006034+[USBD_BTABLE] 端点发送数据字节数寄存器3 0x0000 +R16_USBD_ADDR3_RX 0x40006038+[USBD_BTABLE] 端点接收缓存区地址寄存器3 0x0000 +R16_USBD_COUNT3_RX 0x4000603C+[USBD_BTABLE] 端点接收数据字节数寄存器3 0x0000 +R16_USBD_ADDR4_TX 0x40006040+[USBD_BTABLE] 端点发送缓存区地址寄存器4 0x0000 +R16_USBD_COUNT4_TX 0x40006044+[USBD_BTABLE] 端点发送数据字节数寄存器4 0x0000 +R16_USBD_ADDR4_RX 0x40006048+[USBD_BTABLE] 端点接收缓存区地址寄存器4 0x0000 +R16_USBD_COUNT4_RX 0x4000604C+[USBD_BTABLE] 端点接收数据字节数寄存器4 0x0000 +R16_USBD_ADDR5_TX 0x40006050+[USBD_BTABLE] 端点发送缓存区地址寄存器5 0x0000 +R16_USBD_COUNT5_TX 0x40006054+[USBD_BTABLE] 端点发送数据字节数寄存器5 0x0000 +R16_USBD_ADDR5_RX 0x40006058+[USBD_BTABLE] 端点接收缓存区地址寄存器5 0x0000 +R16_USBD_COUNT5_RX 0x4000605C+[USBD_BTABLE] 端点接收数据字节数寄存器5 0x0000 +R16_USBD_ADDR6_TX 0x40006060+[USBD_BTABLE] 端点发送缓存区地址寄存器6 0x0000 +R16_USBD_COUNT6_TX 0x40006064+[USBD_BTABLE] 端点发送数据字节数寄存器6 0x0000 +V2.4 318 + +# Page 322 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_USBD_ADDR6_RX 0x40006068+[USBD_BTABLE] 端点接收缓存区地址寄存器6 0x0000 +R16_USBD_COUNT6_RX 0x4000606C+[USBD_BTABLE] 端点接收数据字节数寄存器6 0x0000 +R16_USBD_ADDR7_TX 0x40006070+[USBD_BTABLE] 端点发送缓存区地址寄存器7 0x0000 +R16_USBD_COUNT7_TX 0x40006074+[USBD_BTABLE] 端点发送数据字节数寄存器7 0x0000 +R16_USBD_ADDR7_RX 0x40006078+[USBD_BTABLE] 端点接收缓存区地址寄存器7 0x0000 +R16_USBD_COUNT7_RX 0x4000607C+[USBD_BTABLE] 端点接收数据字节数寄存器7 0x0000 +注:以上缓冲区描述类寄存器和端点配置寄存器使用相对应。例如:USB端点配置寄存器0对应端点 +发送缓存区地址寄存器0、端点发送数据字节数寄存器0、端点接收缓存区地址寄存器0、端点接收数 +据字节数寄存器0。 +21.3.1 USB 控制寄存器(USBD_CNTR) +偏移地址:0x40 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PMA MODE_ LP +CTRM ERRM WKUPM SUSPM RSTM SOFM ESOFM Reserved RESUME FSUSP PDWN FRES +OVRM 1WIRE MODE +位 名称 访问 描述 复位值 +正确传输中断使能位: +0:禁止正确传输(CTR)中断; +15 CTRM RW 0 +1:使能正确传输(CTR)中断,在中断寄存器的相应位 +被置1时产生中断。 +分组缓冲区溢出中断使能位: +0:禁止PMAOVR中断; +14 PMAOVRM RW 0 +1:使能PMAOVR中断,在中断寄存器的相应位被置1时 +产生中断。 +出错中断使能位: +0:禁止出错中断; +13 ERRM RW 0 +1:使能出错中断,在中断寄存器的相应位被置1时产 +生中断。 +唤醒中断使能位: +0:禁止唤醒中断; +12 WKUPM RW 0 +1:使能唤醒中断,在中断寄存器的相应位被置1时产 +生中断。 +挂起中断使能位: +0:禁止挂起(SUSP)中断; +11 SUSPM RW 0 +1:使能挂起(SUSP)中断,在中断寄存器的相应位被 +置1时产生中断。 +USB复位(总线复位或强制复位)中断使能位: +0:禁止USB复位中断; +10 RSTM RW 0 +1:使能 USB复位中断,在中断寄存器的相应位被置 1 +时产生中断。 +帧首(SOF)中断使能位: +0:禁止SOF中断; +9 SOFM RW 0 +1:使能SOF中断,在中断寄存器的相应位被置1时产 +生中断。 +V2.4 319 + +# Page 323 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +定时帧首丢失中断使能位: +0:禁止ESOF中断; +8 ESOFM RW 0 +1:使能 ESOF 中断,在中断寄存器的相应位被置 1 时 +产生中断。 +USB单线模式使能: +0:禁止USB单线模式; +[7] MODE_1WIRE RW 1:使能USB单线模式。 0 +注:仅适用于CH32F20x_D8批号倒数第六位不为0的 +产品。 +[6:5] Reserved RO 保留。 0 +唤醒请求控制位: +0:空闲状态; +1:输出唤醒信号。 +4 RESUME RW 0 +根据USB协议,如果此位在1ms到15ms内保持有效, +主机将对USBD模块实行唤醒操作。 +注:只有在FSUSP位为1时,才可以设置此位。 +屏蔽挂起检测控制位: +0:打开总线挂起状态检测; +1:屏蔽总线挂起状态检测。此时USB模拟收发器的时 +钟和静态功耗仍然保持。如果需要进入低功耗状态(总 +3 FSUSP RW 0 +线供电类的设备),需要先置位FSUSP再置位LPMODE。 +注:当USB总线上保持3ms没有数据通信(包括SOF) +时,SUSP中断会被触发,此时软件必需设置此位,否 +则会一直触发SUSP中断。 +低功耗模式控制位: +此模式用于在USB挂起状态下降低功耗。在此模式下, +除了外接上拉电阻的供电,其他的静态功耗都被关闭, +系统时钟将会停止或者降低到一定的频率来减少耗 +2 LPMODE RW 0 +电。USB总线上的活动(唤醒事件)将会清除此位(软 +件也可以清0)。 +0:非低功耗模式; +1:低功耗模式。 +断电模式(Power down) +此模式用于彻底关闭 USB 模块。当此位被置位时,不 +1 PDWN RW 能使用USB模块。 1 +0:退出断电模式 +1:进入断电模式 +强制USB复位控制位: +0:清除USB复位; +0 FRES RW 1:对 USBD 模块强制复位。USBD模块将一直保持在复 1 +位状态下直到软件清除此位。如果 USB 复位中断被使 +能,将产生复位中断。 +21.3.2 USB 中断状态寄存器(USBD_ISTR) +偏移地址:0x44 +V2.4 320 + +# Page 324 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CTR PMAOVR ERR WKUP SUSP RST SOF ESOF Reserved DIR EP_ID[3:0] +位 名称 访问 描述 复位值 +正确的传输状态指示。此位在端点正确完成一次数据 +15 CTR RO 传输后由硬件置位。应用程序可以通过 DIR 和 EP_ID 0 +位来识别是哪个端点完成了正确的数据传输。 +分组缓冲区溢出标志。 +此位在微控制器长时间没有响应一个访问 USB 分组缓 +冲区请求时由硬件置位。USBD 模块通常在以下情况时 +置位该位:在接收过程中一个 ACK 握手分组没有被发 +送,或在发送过程中发生了比特填充错误,在以上两种 +情况下主机都会要求数据重传。在正常的数据传输中 +14 PMAOVR RW0 0 +不会产生PMAOVR中断。由于失败的传输都将由主机发 +起重传,应用程序就可以在这个中断的服务程序中加 +速设备的其他操作,并准备重传。但这个中断不会在同 +步传输中产生(同步传输不支持重传)因此数据可能会 +丢失。 +此位可读,写0清除,写1无效。 +出错标志,下列错误发生时硬件会置位此位: +NANS:无应答。主机的应答超时。 +CRC:校验错误。USB的包中的CRC校验出错。 +BST:位填充错误。USB数据位中检测出位填充错误。 +FVIO:帧格式错误。收到非标准帧(如EOP出现在错误 +的时刻,错误的令牌等)。 +13 ERR RW0 0 +USB 应用程序通常可以忽略这些错误,因为 USBD 模块 +和主机在发生错误时都会启动重传机制。此位产生的 +中断可以用于应用程序的开发阶段,可以用来监测USB +总线的传输质量,标识用户可能发生的错误(连接线 +松,环境干扰严重,USB线损坏等)。 +此位可读,写0清除,写1无效。 +唤醒信号标志: +当USBD模块处于挂起状态时,如果检测到唤醒信号, +此位将由硬件置 1。此时 CTLR寄存器的 LP_MODE位将 +12 WKUP RW0 被清 0,FSUSP 位需要软件清 0 开启挂起检测。同时 0 +USB_WAKEUP 被激活,通知设备的其他部分(如唤醒单 +元)将开始唤醒过程。 +此位可读,写0清除,写1无效。 +总线挂起标志: +此位在USB线上超过3ms没有信号传输时由硬件置位。 +USB复位(总线复位或强制复位)撤销后,硬件立即使 +11 SUSP RW0 0 +能对挂起信号的检测,但在挂起模式下(FSUSP=1)硬 +件不会再检测挂起信号直到唤醒过程结束。 +此位可读,写0清除,写1无效。 +10 RST RW0 USB复位(总线复位或者强制复位)标志: 0 +V2.4 321 + +# Page 325 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +此位在USBD模块检测到USB总线复位信号边沿或强制 +复位状态时由硬件置位。此时USBD模块将复位内部协 +议状态机,并在中断使能的情况下触发复位中断来响 +应。USBD 模块的发送和接收部分将被禁止,直到此位 +被清除。所有的配置寄存器不会被复位,除非应用程序 +对他们清零。这用来保证在复位撤销后 USB 传输还可 +以立即正确执行。但设备的地址和端点寄存器会被USB +复位所复位。 +此位可读,写0清除,写1无效。 +帧首(SOF)标志: +此位在 USBD 模块检测到总线上的 SOF 包时由硬件置 +位。中断服务程序可以通过检测 SOF 事件来完成与主 +9 SOF RW0 0 +机的 1ms 同步,并正确读出寄存器在收到 SOF 时的更 +新内容(此功能在同步传输时非常有意义)。 +此位可读,写0清除,写1无效。 +定时帧首(ESOF)丢失标志: +此位在USBD模块未按时收到SOF包时由硬件置位。主 +机应该每毫秒都发送SOF包,但如果USBD模块没有收 +8 ESOF RW0 到,挂起定时器将触发此中断。如果连续发生3次ESOF 0 +中断,也就是连续3次未收到SOF包,将产生SUSP中 +断。 +此位可读,写0清除,写1无效。 +[7:5] Reserved RO 保留。 0 +事务数据传输方向。此位在完成数据传输产生中断后 +由硬件根据传输方向写入。 +如果DIR=0,相应端点的CTR_TX位被置位,标志一个 +IN事务(数据从 USBD模块传输到 PC主机)的传输完 +成。 +4 DIR RO 如果DIR=1,相应端点的CTR_RX位被置位,标志一个 0 +OUT事务(数据从PC主机传输到USBD模块)的传输完 +成。如果CTR_TX位同时也被置位,就标志同时存在挂 +起的OUT事务和IN事务。 +应用程序可以利用该信息访问 USBD_EPnR 位对应的操 +作,它表示挂起中断传输方向的信息。 +端点号。 +此位在USBD模块完成数据传输产生中断后由硬件根据 +请求中断的端点号写入。如果同时有多个端点的请求 +中断,硬件写入优先级最高的端点号。端点的优先级按 +以下方法定义:同步端点和双缓冲批量端点具有高优 +[3:0] EP_ID[3:0] RO 0 +先级,其他的端点为低优先级。如果多个同优先级的端 +点请求中断,则根据端点号来确定优先级,即端点0具 +有最高优先级,端点号越小,优先级越高。 +应用程序可以通过上述的优先级策略顺序处理端点的 +中断请求。 +21.3.3 USB 帧编号寄存器(USBD_FNR) +V2.4 322 + +# Page 326 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x48 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RXDP RXDM LCK LSOF[1:0] FN[10:0] +位 名称 访问 描述 复位值 +15 RXDP RO D+数据线电平状态。 0 +14 RXDM RO D-数据线电平状态。 0 +SOF包计数停止锁定位。 +USBD 模块在复位或唤醒序列结束后会检测 SOF 包,如 +13 LCK RO 果连续检测到至少 2 个 SOF 包,则硬件会置位此位。 0 +此位一旦锁定,帧计数器将停止计数,一直等到 USBD +模块复位或总线挂起时再恢复计数。 +帧首丢失标志位。 +[12:11] LSOF[1:0] RO 当ESOF事件发生时,硬件会将丢失的SOF包的数目写 X +入此域。如果再次收到SOF包,此域被清除。 +帧编号。 +此域为最新收到的SOF包中的11位帧编号。主机每发 +[10:0] FN[10:0] RO X +送一个帧,帧编号都会自加,这对于同步传输非常有意 +义。此域在发生SOF中断时更新。 +21.3.4 USB 设备地址寄存器(USBD_DADDR) +偏移地址:0x4C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved EF ADD[6:0] +位 名称 访问 描述 复位值 +[15:8] Reserved RO 保留。 0 +USB功能使能位。此位在需要使能USB设备功能时由应 +用程序置位。如果此位为0,USBD模块将停止工作,忽 +7 EF RW 略所有寄存器的设置,不响应任何USB通信。 0 +0:停止USB设备功能; +1:使能USB设备功能。 +USB设备地址。 +此域是 USB 主机在枚举过程中为 USB 设备分配的地址 +[6:0] ADD[6:0] RW 0 +值。该地址值和EA位必需和USB令牌包中的地址信息 +匹配,才能在指定的端点进行正确的USB传输。 +21.3.5 USB 分组缓冲区描述表地址寄存器(USBD_BTABLE) +偏移地址:0x50 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +BTABLE[15:3] Reserved +位 名称 访问 描述 复位值 +V2.4 323 + +# Page 327 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +缓冲表。 +此域是分组缓冲区描述表的基地址。分组缓冲区描述 +表用来指示每个端点的分组缓冲区地址和大小,按8字 +[15:3] BTABLE[15:3] RW 0 +节对齐(即最低3位为000)。每次传输开始时,USBD +模块读取相应端点所对应的分组缓冲区描述表获得缓 +冲区地址和大小信息。 +[2:0] Reserved RO 保留。 0 +21.3.6 USB 端点配置寄存器 x(USBD_EPRx)(x=0/1/2/3/4/5/6/7) +偏移地址:0x00-0x1C +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CTR DTOG STAT_RX EPT_YPE EP CTR DTOG STAT_TX +SETUP EA[3:0] +_RX _RX [1:0] [1:0] _KIND _TX _TX [1:0] +位 名称 访问 描述 复位值 +正确接收标志位(OUT/SETUP)。 +此位在正确接收到OUT或SETUP事务(发送ACK应答) +时由硬件置位。如果CTRM位已置位,相应的中断会产 +生,应用程序需要在处理完该事件后清除此位。收到的 +15 CTR_RX RW0 是 OUT 事务还是 SETUP 事务可以通过下面的 SETUP 位 0 +确定。 +此位可读,写0清除,写1无效。 +注:以NAK或STALL应答的事务或出错的传输此位不 +会置位。 +期望下次接收的数据包PID(OUT/SETUP),硬件设置: +0:期望DATA0; +1:期望DATA1。 +对于非同步端点,在接收正确的 PID 数据包后,USBD +模块发送ACK握手包,硬件自动翻转此位。 +对于控制端点,硬件在收到正确的 SETUP 包后置位 +(DATA1)。 +14 DTOG_RX RW1T 对于有双缓冲属性的端点,硬件除了自动翻转此位表 0 +示期望数据包 PID 外,还根据此位标识来支持双缓冲 +区的交换(请参考双缓冲机制中描述)。 +对于同步端点,硬件不判断数据包PID,仅通过此位标 +识支持双缓冲区的交换。 +此位可读,写0无效,写1翻转。 +注:应用程序可以对此位进行初值设定,或者翻转此位 +用于特殊用途。 +表示数据接收的状态位(OUT/SETUP事务中): +00:DISABLED,端点忽略所有的接收请求,不应答; +01:STALL,端点以STALL包响应接收请求; +[13:12] STAT_RX[1:0] RW1T 00b +10:NAK,端点以NAK包响应接收请求; +11:ACK,端点以ACK包响应接收请求。 +当一次正确的 OUT 或 SETUP 数据传输完成后 +V2.4 324 + +# Page 328 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +(CTR_RX=1),硬件会自动设置此位为NAK状态,使应 +用程序有足够的时间处理并响应下一个事务。 +对于双缓冲批量端点,由于使用特殊的传输流量控制 +策略,会根据使用的缓冲区状态控制传输状态(请参考 +双缓冲端点)。 +对于同步端点,由于端点状态只能是有效或禁用,因此 +硬件不会在正确的传输之后设置此位。 +如果将此域设为 STALL 或 NAK,USBD 模块响应的操作 +是未定义的。 +此域可读,位写0无效,写1翻转。 +注:应用程序可以对域位进行初值设定。 +SETUP事务传输完成标志位: +0:非SETUP事务; +11 SETUP RO 0 +1:是SETUP事务,并正确接收(发送ACK应答)。 +注意:硬件会在CTR_RX=0条件时,才可能修改此位。 +传输端点类型: +00:BULK,批量端点; +01:CONTROL,控制端点; +10:ISO,同步端点; +11:INTERRUPT,中断端点。 +只有控制端点才会有 SETUP 传输,其他类型的端点无 +视此类传输。SETUP传输不能以NAK或STALL包响应, +[10:9] EP_TYPE[1:0] RW 00b +如果控制端点在收到 SETUP 包时处于 NAK 状态,USBD +模块将不响应请求,就会出现接收错误。如果控制端点 +处于STALL状态,SETUP包会被正确接收,数据会被正 +确传输,并产生一个正确传输完成的中断。控制端点的 +OUT包按普通端点的方式处理。 +批量端点和中断端点的处理方式非常类似,仅在对 +EP_KIND位的处理上有差别。 +端点特殊类型控制位(配合EP_TYPE使用): +EPTYPE[1:0] EP_KIND +BULK DBL_BUF:开启双缓冲。 +STATUS_OUT:控制传输状态阶段数 +CONTROL +据包长度判断。 +ISO 未使用。 +INTERRUTP 未使用。 +8 EP_KIND RW 0 +DBL_BUF:设置此位使能批量端点的双缓冲功能。 +STATUS_OUT:设置此位表示 USB 设备期望主机发送控 +制传输中的状态阶段事务,此时,设备对于任何长度不 +为 0 的数据包都响应 STALL 握手包。(此功能仅用于 +控制端点,有利于提供对于协议层错误的检测。)如果 +STATUS_OUT 位被清除,处于状态阶段的 OUT事务可以 +包含任意长度的数据。 +正确发送标志位(IN): +7 CTR_TX RW0 0 +此位在正确的IN事务(收到ACK应答)完成时由硬件 +V2.4 325 + +# Page 329 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +置位。如果CTRM位已被置位,会产生相应的中断,应 +用程序需要在处理完该事件后清除此位。在IN分组结 +束时,如果主机响应NAK或STALL则此位不会被置位, +因为数据传输没有成功。 +此位可读,写0清除,写1无效。 +注:如果主机以NAK或STALL响应则此位不会置位。 +要发送的数据包PID(IN),硬件设置: +0:发送DATA0; +1:发送DATA1。 +对于非同步端点,在发送正确的 PID 数据包后,如果 +USBD模块收到主机的ACK握手包,硬件自动翻转此位。 +对于控制端点,硬件在收到正确的 SETUP 包后置位 +(DATA1)。 +6 DTOG_TX RW1T 对于有双缓冲属性的端点,硬件除了自动翻转此位表 0 +示发送数据包 PID 外,还根据此位标识来支持双缓冲 +区的交换(请参考双缓冲机制中描述)。 +对于同步端点,硬件强制发送数据包DATA0,并且通过 +此位标识支持双缓冲区的交换。 +此位可读,写0无效,写1翻转。 +注:应用程序可以对此位进行初值设定,或翻转此位用 +于特殊用途。 +表示发送数据的状态位(IN事务中): +00:DISABLED,端点忽略所有的发送请求,不应答; +01:STALL,端点以STALL包响应主机IN请求; +10:NAK,端点以NAK包响应主机IN请求; +11:ACK,端点可以发送数据。 +当正确完成一次IN事务数据传输完成后(CTR_TX=1), +硬件会自动设置此位为 NAK 状态,以保证应用程序有 +足够的时间处理并响应下一个事务传输。 +[5:4] STAT_TX[1:0] RW1T 对于双缓冲批量端点,由于使用特殊的传输流量控制 00b +策略,会根据使用的缓冲区状态控制传输状态(请参考 +双缓冲端点)。 +对于同步端点,由于端点状态只能是有效或禁用,因此 +硬件不会在正确的传输之后设置此位。 +如果将此域设为 STALL 或者 NAK,USBD 模块响应的操 +作是未定义的。 +此域可读,位写0无效,写1翻转。 +注:应用程序可以对域位进行初值设定。 +端点地址域(设置端点号): +[3:0] EA[3:0] RW 0 +应用程序要为此端点配置寄存器设置一个端点地址。 +21.3.7 端点发送缓存区地址寄存器 x(USBD_ADDRx_TX)(x=0/1/2/3/4/5/6/7) +偏移地址:[USBD_BTABLE] + x*16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDRx_TX[15:1] - +V2.4 326 + +# Page 330 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[15:1] ADDRx_TX[15:1] RW 待发送数据缓冲区起始地址(IN事务中)。 0 +0 - RZ 缓冲区的地址必须按2字节对齐,所以此位必须为0。 0 +21.3.8 端点发送数据字节数寄存器 x(USBD_COUNTx_TX)(x=0/1/2/3/4/5/6/7) +偏移地址:[USBD_BTABLE] + x*16 + 4 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved COUNTx_TX[9:0] +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留。 0 +[9:0] COUNTx_TX[9:0] RW 待发送数据长度字节数(IN事务中)。 0 +注:双缓冲区和同步IN端点有2个USBD_ADDRx_TX寄存器和2个USB_COUNTx_TX寄存器:分别为 +USBD_ADDRx_TX_1和USBD_ADDRx_TX_0,USB_COUNTx_TX_1和USB_COUNTx_TX_0,内容如下: +USBD_ADDRx_TX映射为USBD_ADDRx_TX_0 +USBD_ADDRx_RX映射为USBD_ADDRx_TX_1 +USBD_COUNTx_TX映射为USB_COUNTx_TX_0 +USBD_COUNTx_RX映射为USB_COUNTx_TX_1 +21.3.9 端点接收缓存区地址寄存器 x(USBD_ADDRx_RX)(x=0/1/2/3/4/5/6/7) +偏移地址:[USBD_BTABLE] + x*16 + 8 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ADDRx_RX[15:1] - +位 名称 访问 描述 复位值 +[15:1] ADDRx_RX[15:1] RW 待接收数据缓冲区起始地址(OUT或SETUP事务中)。 0 +0 - RZ 缓冲区的地址必须按2字节对齐,所以此位必须为0。 0 +21.3.10 端点接收数据字节数寄存器 x(USBD_COUNTx_RX)(x=0/1/2/3/4/5/6/7) +偏移地址:[USBD_BTABLE] + x*16 + 12 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +BLSIZE NUM_BLOCK[4:0] COUNTx_RX[9:0] +位 名称 访问 描述 复位值 +存储区块大小: +0:块大小2字节,配合NUM_BLOCK使用,可分配接收 +15 BL_SIZE RW 缓冲区范围2-62字节; 0 +1:块大小 32 字节,配合 NUM_BLOCK 使用,可分配接 +收缓冲区范围32-512字节。 +[14:10] NUM_BLOCK[4:0] RW 存储区块数目。 0 +[9:0] COUNTx_RX[9:0] RO 端点实际接收数据长度字节数(OUT或SETUP事务中)。 X +注:双缓冲区和同步IN端点有2个USBD_ADDRx_RX寄存器和2个USB_COUNTx_RX寄存器:分别为 +USBD_ADDRx_RX_1和USBD_ADDRx_RX_0,USB_COUNTx_RX_1和USB_COUNTx_RX_0,内容如下: +V2.4 327 + +# Page 331 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USBD_ADDRx_TX映射为USBD_ADDRx_RX_0 +USBD_ADDRx_RX映射为USBD_ADDRx_RX_1 +USBD_COUNTx_TX映射为USB_COUNTx_RX_0 +USBD_COUNTx_RX映射为USB_COUNTx_RX_1 +USBD_COUNTx_RX寄存器的高6位定义了接收分组缓冲区的大小,以便USBD模块可以检测缓冲区 +的溢出边界。缓冲区的大小可以依据设备枚举过程中的端点描述符中参数maxPacketSize表述。 +表20-8 缓冲区大小定义 +接收缓冲区限制大小 +NUM_BLOCK[4:0] +BLSIZE = 0 BLSIZE = 1 +00000 不允许使用 32字节 +00001 2字节 64字节 +00010 4字节 96字节 +00011 6字节 128字节 +… … … +01111 30字节 512字节 +10000 32字节 保留 +… … … +11110 60字节 保留 +11111 62字节 保留 +V2.4 328 + +# Page 332 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 22 章 USB 高速主机/设备控制器(USBHS) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器系列部分产品。 +22.1 USB 控制器简介 +内嵌USB2.0控制器和USB-PHY,具有主机控制器和USB设备控制器双重角色。当作为主机控制 +器时,它可支持低速、全速和高速的USB设备/HUB。当作为设备控制器时,可以灵活设置为低速、 +全速或高速模式以适应各种应用。 +USB控制器特性如下: + 支持USB Host主机功能和USB Device设备功能。 + 主机模式下支持下行端口连接高速/全速HUB。 + 设备模式下支持USB2.0高速480Mbps、全速12Mbps或低速1.5Mbps。 + 支持USB控制传输、批量传输、中断传输和同步/实时传输。 + 支持DMA直接访问各端点缓冲区的数据。 + 支持挂起,唤醒/远程唤醒。 + 端点0支持最大64字节的数据包,除设备端点0外,其他端点均支持最大1024字节的数据 +包,且均支持双缓冲。 +22.2 寄存器描述 +USB相关寄存器分为3个部分,部分寄存器是在主机和设备模式下进行复用的。 + USB全局寄存器 + USB设备控制寄存器 + USB主机控制寄存器 +22.2.1 全局寄存器描述 +表22-1 USBHS相关寄存器列表 +名称 访问地址 描述 复位值 +R8_USB_CTRL 0x40023400 USB控制寄存器 0x06 +R8_USB_INT_EN 0x40023402 USB中断使能寄存器 0x00 +R8_USB_DEV_AD 0x40023403 USB设备地址寄存器 0x00 +R16_USB_FRAME_NO 0x40023404 USB帧号寄存器 0x0000 +R8_USB_SUSPEND 0x40023406 USB挂起控制寄存器 0x00 +R8_USB_SPPED_TYPE 0x40023408 USB当前速度类型寄存器 0x00 +R8_USB_MIS_ST 0x40023409 USB杂项状态寄存器 0xX8 +R8_USB_INT_FG 0x4002340A USB中断标志寄存器 0x00 +R8_USB_INT_ST 0x4002340B USB中断状态寄存器 0xXX +R16_USB_RX_LEN 0x4002340C USB接收长度寄存器 0xXXXX +22.2.1.1 USB 控制寄存器(R8_USB_CTRL) +位 名称 访问 描述 复位值 +USB工作模式选择位: +7 RB_UC_HOST_MODE RW 0:设备模式(DEVICE); 0 +1:主机模式(HOST)。 +[6:5] RB_UC_SPEED_TYPE RW USB总线信号传输速率选择位: 00b +V2.4 329 + +# Page 333 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[1:0] 00:全速; +01:高速; +10:低速; +11:保留。 +设备模式下,USB设备使能和内部上拉电阻控 +制位: +4 RB_UC_DEV_PU_EN RW 0 +0:不启用; +1:使能USB设备传输并且启用内部上拉电阻。 +USB 传输完成中断标志未清零前自动暂停使 +能位: +0:不暂停; +3 RB_UC_INT_BUSY RW 0 +1:在中断标志 UIF_TRANSFER 未清零前自动 +暂停,设备模式下自动应答忙NAK,主机模式 +下自动暂停后续传输。 +USB协议处理器软件复位控制位: +0:不复位; +2 RB_UC_RST_SIE RW 1:强制复位USB协议处理器(SIE),需要软 1 +件清零。 +该位清除后,PB6/PB7自动切换为USBIO模式 +USB的FIFO和中断标志清零: +0:不清空; +1 RB_UC_CLR_ALL RW 1 +1:清空 USB 中断标志和 FIFO,需要软件清 +零。 +使能 USB 的 DMA,正常传输模式下该位必须 +设置为1: +0 RB_UC_DMA_EN RW 0 +0:关闭DMA; +1:使能DMA功能和DMA中断。 +22.2.1.2 USB 中断使能寄存器(R8_USB_INT_EN) +位 名称 访问 描述 复位值 +USB设备模式,接收到NAK中断: +7 RB_UIE_DEV_NAK RW 0:禁止相应中断; 0 +1:使能相应中断。 +同步传输开始发送/接收数据中断: +6 RB_UIE_ISO_ACT RW 0:禁止相应中断; 0 +1:使能相应中断。 +SETUP事务完成中断: +5 RB_UIE_SETUP_ACT RW 0:禁止相应中断; 0 +1:使能相应中断。 +FIFO溢出中断: +4 RB_UIE_FIFO_OV RW 0:禁止中断; 0 +1:使能中断。 +USB主机模式,SOF定时中断: +3 RB_UIE_SOF_ACT RW 0:禁止中断; 0 +1:使能中断。 +V2.4 330 + +# Page 334 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USB设备模式,使能后接收SOF包产生传输 +完成中断。 +USB总线挂起或唤醒事件中断: +2 RB_UIE_SUSPEND RW 0:禁止中断; 0 +1:使能中断。 +USB传输(不包括SETUP事务)完成中断: +1 RB_UIE_TRANSFER RW 0:禁止中断; 0 +1:使能中断。 +USB主机模式,USB设备连接或断开事件中 +断: +RB_UIE_DETECT RW 0 +0:禁止中断; +0 1:使能中断。 +USB设备模式,USB总线复位事件中断: +RB_UIE_BUS_RST RW 0:禁止中断; 0 +1:使能中断。 +22.2.1.3 USB 设备地址寄存器(R16_USB_DEV_AD) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +主机模式下是当前操作的 USB 设备的 +RB_MASK_USB_ADDR +[6:0] RW 地址或HUB地址; 0 +[6:0] +设备模式:该USB自身地址。 +22.2.1.4 USB 帧号寄存器(R16_USB_FRAME_NO) +位 名称 访问 描述 复位值 +帧号,主机模式下表示即将发送的 SOF +包的帧号,设备模式下表示当前接收到 +[15:0] USB_FRAME_NO[15:0] RO 0 +的SOF包的帧号。其中低11位为有效帧 +号,高3位为高速模式的微帧号。 +注:USB_FRAME_NO是16为寄存器,其中低11位表示SOF包帧号,高3为表示当前属于第几个微帧, +可在操作高速HUB下进行中断、同步/实时传输时使用。 +22.2.1.5 USB 挂起寄存器(R8_USB_SUSPEND) +位 名称 访问 描述 复位值 +[7:6] Reserved RO 保留。 0 +RB_USB_LINESTATE +[5:4] RO PHY的Linestate信号。 X +[1:0] +3 Reserved RO 保留。 0 +在挂起状态下,如果接收到主机的唤醒 +2 RB_USB_WAKEUP_ST RO X +信号,该位置1,直到退出挂起状态。 +[1:0] RB_USB_SYS_MOD[1:0] RW 主机模式下的测试模式。 0 +注:需要远程唤醒时,将RB_UH_REMOTE_WKUP位拉高再拉低即可。 +22.2.1.6 USB 速度类型寄存器(R8_USB_SPEED_TYPE) +位 名称 访问 描述 复位值 +V2.4 331 + +# Page 335 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[7:2] Reserved RO 保留。 0 +在主机模式下,表示当前连接的设备速 +度类型,在设备模式下,表示当前设备 +的速度类型; +RB_USB_SPEED_TYPE +[1:0] RO 00:全速; 00b +[1:0] +01:高速; +10:低速; +11:保留。 +注:区别于R8_USB_CTRL寄存器中的RB_UC_SPEED_TYPE,RB_UC_SPEED_TYPE表示期望处于的最高速 +度,假设在设备模式下,设置RB_UC_SPEED_TYPE为高速,当该设备连接在一个全速主机下,则实际 +的速度类型就是全速,通过查询 R8_USB_SPEED_TYPE 寄存器可以获知。在主机模式下,设置 +RB_UC_SPEED_TYPE 为高速,当连接一个全速设备时,则实际通讯速度就是全速,通过查询 +R8_USB_SPEED_TYPE寄存器可以获知。 +22.2.1.7 USB 杂项状态寄存器(R8_USB_MIS_ST) +位 名称 访问 描述 复位值 +USB主机模式下SOF包预示状态位: +0:无SOF包发送; +7 RB_UMS_SOF_PRES RO X +1:将要发送SOF包,此时如有其它USB +数据包将被自动延后。 +USB主机模式下SOF包传输状态位: +6 RB_UMS_SOF_ACT RO 0:发送完成或空闲; X +1:正在发出SOF包。 +USB协议处理器的空闲状态位: +5 RB_UMS_SIE_FREE RO 0:忙,正在进行USB传输; 1 +1:协议器空闲。 +USB接收FIFO数据就绪状态位: +4 RB_UMS_R_FIFO_RDY RO 0:接收FIFO为空; 0 +1:接收FIFO非空。 +USB总线复位状态位: +3 RB_UMS_BUS_RST RO 0:当前USB总线处于非复位态; X +1:当前USB总线处于复位态。 +USB挂起状态位: +0:USB总线处于非挂起态; +2 RB_UMS_SUSPEND RO 0 +1:USB总线处于挂起态,有一段时间没 +有USB活动。 +USB 主机模式下端口的 USB 设备连接状 +态位: +1 RB_UMS_DEV_ATTACH RO 0 +0:端口没有USB设备连接; +1:端口已经连接USB设备。 +USB主机模式下,SPLIT包发送允许位: +0 RB_UMS_SPLIT_CAN RO 0:禁止发送; 0 +1:允许发送SPLIT包。 +22.2.1.8 USB 中断标志寄存器(R8_USB_INT_FG) +V2.4 332 + +# Page 336 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +同步传输开始发送/接收数据中断标志 +位,写1清零: +0:无事件; +6 RB_UIF_ISO_ACT RO 1:开始发送/接收数据触发。 0 +注:对于接收如果接收CRC16错误,将 +不会产生UIF_TRANSFER,否则在事务完 +成后依然会产生UIF_TRANSFER。 +SETUP事务完成中断标志位,写1清零: +5 RB_UIF_SETUP_ACT RO 0:无事件; 1 +1:SETUP事务完成。 +USB FIFO溢出中断标志位,写1清零: +4 RB_UIF_FIFO_OV RW 0:无事件; 0 +1:FIFO溢出触发。 +USB 主机模式下 SOF 定时中断标志位, +写1清零: +3 RB_UIF_HST_SOF RW 0 +0:无事件; +1:SOF包传输完成触发。 +USB总线挂起或唤醒事件中断标志位,写 +1清零: +2 RB_UIF_SUSPEND RW 0 +0:无事件; +1:USB挂起事件或唤醒事件触发。 +USB传输完成中断标志位,写1清零: +1 RB_UIF_TRANSFER RW 0:无事件; 0 +1:一个USB传输完成触发。 +USB 主机模式下 USB 设备连接或断开事 +件中断标志位,写1清零: +RB_UIF_DETECT RW 0 +0:无事件; +1:检测到USB设备连接或断开触发。 +0 +USB 设备模式下 USB 总线复位事件中断 +标志位,写1清零: +RB_UIF_BUS_RST RW 0 +0:无事件; +1:USB总线复位事件触发。 +22.2.1.9 USB 中断状态寄存器(R8_USB_INT_ST) +位 名称 访问 描述 复位值 +USB 设备模式下,NAK 响应状态位,同 +RB_U_IS_NAK: +7 RB_UIS_IS_NAK RO 0 +0:无NAK响应; +1:当前USB传输过程中回应NAK。 +USB事务接收完成后,接收到的数据包 +的Toggle与设置的期望值 +6 RB_UIS_TOG_OK RO 0 +匹配状态位: +0:toggle不匹配; +V2.4 333 + +# Page 337 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:toggle匹配。 +设备模式下,当前 USB 传输事务的令牌 +[5:4] MASK_UIS_TOKEN[1:0] RO X +PID标识。 +设备模式下,当前 USB 传输事务的端点 +MASK_UIS_ENDP[3:0] RO X +号。 +[3:0] 主机模式下,当前 USB 传输事务的应答 +MASK_UIS_H_RES[3:0] RO PID标识,0000表示设备无应答或超时; X +其它值表示应答PID。 +注:MASK_UIS_TOKEN用于USB设备模式下标识当前USB传输事务的令牌PID:00表示OUT包;01表 +示SOF包;10表示IN包;11表示SETUP包。 +MASK_UIS_H_RES仅在主机模式下有效。在主机模式下,若主机发送OUT/SETUP令牌包时,则该 +PID是握手包ACK/NAK/STALL,或是设备无应答/超时。若主机发送IN令牌包,则该PID是数据包的 +PID(DATA0/DATA1)或握手包PID。 +22.2.1.10 USB 接收长度寄存器(R16_USB_RX_LEN) +位 名称 访问 描述 复位值 +R16_USB_RX_LEN +[15:0] RO 当前USB端点接收的数据字节数。 X +[15:0] +22.2.2 设备寄存器描述 +USBHS模块在USB设备模式下,提供了端点0-15共16组双向端点,除端点0之外的所有端点的 +最大数据包长度都是1024字节,端点0的最大数据包长度为64字节。 + 端点0是默认端点,支持控制传输,发送和接收共用一个64字节数据缓冲区。 + 端点1-15各自包括一个发送端点IN和一个接收端点OUT,发送和接收各有一个独立的数据缓冲 +区,支持批量传输、中断传输和实时/同步传输。 + 端点 0 具有独立的 DMA 地址,收发共用,端点 1~15 的发送和接收各有一个 DMA 地址。通过入 +R32_UEPn_BUF_MOD寄存器可以设置数据缓冲区的模式为双缓冲或单缓冲。若使用双缓冲区模式, +该端点只能使用单方向传输。 + 每组端点都具有收发控制寄存器 R8_UEPn_TX_CTRL、R8_UEPn_RX_CTRL 和发送长度寄存器 +R16_UEPn_T_LEN 和 R32_UEPn_*_DMA(n=0~15),用于配置该端点的同步触发位、对 OUT 事务和 +IN事务的响应以及发送数据的长度等。 +作为 USB 设备所必要的 USB 总线上拉电阻可以由软件随时设置是否启用,当 USB 控制寄存器 +R8_USB_CTRL 中的 RB_UC_DEV_PU_EN 置 1 时,控制器根据 RB_UC_SPEED_TYPE 的速度设置,在内部为 +USB总线的DP/DM引脚连接上拉电阻,并启用USB设备功能。 +当检测到USB总线复位、USB总线挂起或唤醒事件,或当USB成功处理完数据发送或数据接收后, +USB协议处理器都将设置相应的中断标志,如果中断使能打开,还会产生相应的中断请求。应用程序 +可以直接查询或在 USB 中断服务程序中查询并分析中断标志寄存器 R8_USB_INT_FG,根据 +RB_UIF_BUS_RST和RB_UIF_SUSPEND进行相应的处理;并且,如果RB_UIF_TRANSFER有效,那么还需 +要继续分析 USB 中断状态寄存器 R8_USB_INT_ST,根据当前端点号 MASK_UIS_ENDP 和当前事务令牌 +PID 标识 MASK_UIS_TOKEN 进行相应的处理。如果事先设定了各个端点的 OUT 事务的同步触发位 +RB_UEP_R_TOG,那么可以通过RB_U_TOG_OK或RB_UIS_TOG_OK判断当前所接收到的数据包的同步触发 +位是否与该端点的同步触发位匹配,如果数据同步,则数据有效;如果数据不同步,则数据应该被丢 +弃。每次处理完USB发送或接收中断后,都应该正确修改相应端点的同步触发位,用于下次所发送的 +数据包或下次所接收的数据包是否同步检测;另外,设置RB_UEP_T_TOG_AUTO或RB_UEP_R_TOG_AUTO +可以实现在发送成功或接收成功后自动修改相应的同步触发位(翻转或自减)。 +各个端点准备发送的数据在各自的缓冲区中,准备发送的数据长度是独立设定在R16_UEPn_T_LEN +V2.4 334 + +# Page 338 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +中;各个端点接收到的数据在各自的缓冲区中,但是接收到的数据长度都在 USB 接收长度寄存器 +R16_USB_RX_LEN中,可以在USB接收中断时根据当前端点号区分。 +表22-2 设备相关寄存器列表 +名称 访问地址 描述 复位值 +R32_UEP_CONFIG 0x40023410 端点使能配置寄存器 0x00000000 +R32_UEP_TYPE 0x40023414 端点类型配置寄存器 0x00000000 +R32_UEP_BUF_MOD 0x40023418 端点缓冲区模式寄存器 0x00000000 +R32_UEP0_DMA 0x4002341C 端点0缓冲区的起始地址 0xXXXXXXXX +R32_UEP1_RX_DMA 0x40023420 端点1接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP2_RX_DMA 0x40023424 端点2接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP3_RX_DMA 0x40023428 端点3接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP4_RX_DMA 0x4002342C 端点4接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP5_RX_DMA 0x40023430 端点5接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP6_RX_DMA 0x40023434 端点6接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP7_RX_DMA 0x40023438 端点7接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP8_RX_DMA 0x4002343C 端点8接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP9_RX_DMA 0x40023440 端点9接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP10_RX_DMA 0x40023444 端点10接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP11_RX_DMA 0x40023448 端点11接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP12_RX_DMA 0x4002344C 端点12接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP13_RX_DMA 0x40023450 端点13接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP14_RX_DMA 0x40023454 端点14接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP15_RX_DMA 0x40023458 端点15接收缓冲区的起始地址 0xXXXXXXXX +R32_UEP1_TX_DMA 0x4002345C 端点1发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP2_TX_DMA 0x40023460 端点2发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP3_TX_DMA 0x40023464 端点3发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP4_TX_DMA 0x40023468 端点4发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP5_TX_DMA 0x4002346C 端点5发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP6_TX_DMA 0x40023470 端点6发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP7_TX_DMA 0x40023474 端点7发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP8_TX_DMA 0x40023478 端点8发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP9_TX_DMA 0x4002347C 端点9发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP10_TX_DMA 0x40023480 端点10发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP11_TX_DMA 0x40023484 端点11发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP12_TX_DMA 0x40023488 端点12发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP13_TX_DMA 0x4002348C 端点13发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP14_TX_DMA 0x40023490 端点14发送缓冲区的起始地址 0xXXXXXXXX +R32_UEP15_TX_DMA 0x40023494 端点15发送缓冲区的起始地址 0xXXXXXXXX +R16_UEP0_MAX_LEN 0x40023498 端点0最大长度包寄存器 0xXXXX +R16_UEP1_MAX_LEN 0x4002349C 端点1最大长度包寄存器 0xXXXX +R16_UEP2_MAX_LEN 0x400234A0 端点2最大长度包寄存器 0xXXXX +R16_UEP3_MAX_LEN 0x400234A4 端点3最大长度包寄存器 0xXXXX +R16_UEP4_MAX_LEN 0x400234A8 端点4最大长度包寄存器 0xXXXX +R16_UEP5_MAX_LEN 0x400234AC 端点5最大长度包寄存器 0xXXXX +V2.4 335 + +# Page 339 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R16_UEP6_MAX_LEN 0x400234B0 端点6最大长度包寄存器 0xXXXX +R16_UEP7_MAX_LEN 0x400234B4 端点7最大长度包寄存器 0xXXXX +R16_UEP8_MAX_LEN 0x400234B8 端点8最大长度包寄存器 0xXXXX +R16_UEP9_MAX_LEN 0x400234BC 端点9最大长度包寄存器 0xXXXX +R16_UEP10_MAX_LEN 0x400234C0 端点10最大长度包寄存器 0xXXXX +R16_UEP11_MAX_LEN 0x400234C4 端点11最大长度包寄存器 0xXXXX +R16_UEP12_MAX_LEN 0x400234C8 端点12最大长度包寄存器 0xXXXX +R16_UEP13_MAX_LEN 0x400234CC 端点13最大长度包寄存器 0xXXXX +R16_UEP14_MAX_LEN 0x400234D0 端点14最大长度包寄存器 0xXXXX +R16_UEP15_MAX_LEN 0x400234D4 端点15最大长度包寄存器 0xXXXX +R16_UEP0_T_LEN 0x400234D8 端点0发送长度寄存器 0xXXXX +R8_UEP0_TX_CTRL 0x400234DA 端点0发送控制寄存器 0x00 +R8_UEP0_RX_CTRL 0x400234DB 端点0接收控制寄存器 0x00 +R16_UEP1_T_LEN 0x400234DC 端点1发送长度寄存器 0xXXXX +R8_UEP1_TX_CTRL 0x400234DE 端点1发送控制寄存器 0x00 +R8_UEP1_RX_CTRL 0x400234DF 端点1接收控制寄存器 0x00 +R16_UEP2_T_LEN 0x400234E0 端点2发送长度寄存器 0xXXXX +R8_UEP2_TX_CTRL 0x400234E2 端点2发送控制寄存器 0x00 +R8_UEP2_RX_CTRL 0x400234E3 端点2接收控制寄存器 0x00 +R16_UEP3_T_LEN 0x400234E4 端点3发送长度寄存器 0xXXXX +R8_UEP3_TX_CTRL 0x400234E6 端点3发送控制寄存器 0x00 +R8_UEP3_RX_CTRL 0x400234E7 端点3接收控制寄存器 0x00 +R16_UEP4_T_LEN 0x400234E8 端点4发送长度寄存器 0xXXXX +R8_UEP4_TX_CTRL 0x400234EA 端点4发送控制寄存器 0x00 +R8_UEP4_RX_CTRL 0x400234EB 端点4接收控制寄存器 0x00 +R16_UEP5_T_LEN 0x400234EC 端点5发送长度寄存器 0xXXXX +R8_UEP5_TX_CTRL 0x400234EE 端点5发送控制寄存器 0x00 +R8_UEP5_RX_CTRL 0x400234EF 端点5接收控制寄存器 0x00 +R16_UEP6_T_LEN 0x400234F0 端点6发送长度寄存器 0xXXXX +R8_UEP6_TX_CTRL 0x400234F2 端点6发送控制寄存器 0x00 +R8_UEP6_RX_CTRL 0x400234F3 端点6接收控制寄存器 0x00 +R16_UEP7_T_LEN 0x400234F4 端点7发送长度寄存器 0xXXXX +R8_UEP7_TX_CTRL 0x400234F6 端点7发送控制寄存器 0x00 +R8_UEP7_RX_CTRL 0x400234F7 端点7接收控制寄存器 0x00 +R16_UEP8_T_LEN 0x400234F8 端点8发送长度寄存器 0xXXXX +R8_UEP8_TX_CTRL 0x400234FA 端点8发送控制寄存器 0x00 +R8_UEP8_RX_CTRL 0x400234FB 端点8接收控制寄存器 0x00 +R16_UEP9_T_LEN 0x400234FC 端点9发送长度寄存器 0xXXXX +R8_UEP9_TX_CTRL 0x400234FE 端点9发送控制寄存器 0x00 +R8_UEP9_RX_CTRL 0x400234FF 端点9接收控制寄存器 0x00 +R16_UEP10_T_LEN 0x40023500 端点10发送长度寄存器 0xXXXX +R8_UEP10_TX_CTRL 0x40023502 端点10发送控制寄存器 0x00 +R8_UEP10_RX_CTRL 0x40023503 端点10接收控制寄存器 0x00 +R16_UEP11_T_LEN 0x40023504 端点11发送长度寄存器 0xXXXX +R8_UEP11_TX_CTRL 0x40023506 端点11发送控制寄存器 0x00 +V2.4 336 + +# Page 340 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R8_UEP11_RX_CTRL 0x40023507 端点11接收控制寄存器 0x00 +R16_UEP12_T_LEN 0x40023508 端点12发送长度寄存器 0xXXXX +R8_UEP12_TX_CTRL 0x4002350A 端点12发送控制寄存器 0x00 +R8_UEP12_RX_CTRL 0x4002350B 端点12接收控制寄存器 0x00 +R16_UEP13_T_LEN 0x4002350C 端点13发送长度寄存器 0xXXXX +R8_UEP13_TX_CTRL 0x4002350E 端点13发送控制寄存器 0x00 +R8_UEP13_RX_CTRL 0x4002350F 端点13接收控制寄存器 0x00 +R16_UEP14_T_LEN 0x40023510 端点14发送长度寄存器 0xXXXX +R8_UEP14_TX_CTRL 0x40023512 端点14发送控制寄存器 0x00 +R8_UEP14_RX_CTRL 0x40023513 端点14接收控制寄存器 0x00 +R16_UEP15_T_LEN 0x40023514 端点15发送长度寄存器 0xXXXX +R8_UEP15_TX_CTRL 0x40023516 端点15发送控制寄存器 0x00 +R8_UEP15_RX_CTRL 0x40023517 端点15接收控制寄存器 0x00 +22.2.2.1 USB 端点配置寄存器(R32_UEP_CONFIG) +位 名称 访问 描述 复位值 +端点1-15接收使能: +[31:17] RB_UEP_R_EN RW 0:禁止; 0 +1:使能。 +16 Reserved RO 保留。 0 +端点1-15发送使能: +[15:1] RB_UEP_T_EN RW 0:禁止; 0 +1:使能。 +0 Reserved RO 保留。 0 +注:端点0的收发使能信号始终有效。 +22.2.2.2 USB 端点类型控制寄存器(R32_UEP_TYPE) +位 名称 访问 描述 复位值 +端点1-15,OUT方向传输类型: +[31:17] RB_UEP_R_TYPE RW 0:非同步传输; 0 +1:同步传输。 +16 Reserved RO 保留。 0 +端点1-15,IN方向传输类型: +[15:1] RB_UEP_T_TYPE RW 0:非同步传输; 0 +1:同步传输。 +0 Reserved RO 保留。 0 +22.2.2.3 USB 端点缓冲区模式控制寄存器(R32_UEP_BUF_MOD) +位 名称 访问 描述 复位值 +[31:16] RB_UEP_ISO_BUF_MOD RW 同步端点缓冲区模式控制位,1有效。 0 +[15:0] RB_UEP_BUF_MOD RW 端点缓冲区模式控制位。 0 +注:当RB_UEP_ISO_BUF_MOD为1时,对于同步IN端点,在接收到SOF包后,硬件会有以下操作:将 +EPx_R_TOG内容加载到EPx_T_TOG中;将EPx_MAX_LEN值加载到EPx_T_LEN中;将UEPn_RX_DMA值加 +载到UEPn_TX_DMA中。 +当RB_UEP_ISO_BUF_MOD为1时,对于同步OUT端点,在接收到SOF包后,硬件会有以下操作: +V2.4 337 + +# Page 341 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +将EPx_T_TOG内容加载到EPx_R_TOG中;将UEPn_TX_DMA的值加载到UEPn_RX_DMA中。 +表21-3 端点n缓冲区模式(n=1-15) +UEPn_RX_EN UEPn_TX_EN UEPn_BUF_MOD 描述:以UEPn_DMA为起始地址由低向高排列 +0 0 x 端点被禁用,未用到UEPn_*_DMA缓冲区。 +1 0 0 接收(OUT)缓冲区首地址为UEPn_RX_DMA +RB_UEPn_RX_TOG[0]=0,使用缓冲区UEPn_RX_DMA +1 0 1 +RB_UEPn_RX_TOG[0]=1,使用缓冲区UEPn_TX_DMA +0 1 0 发送(IN)缓冲区首地址为UEPn_TX_DMA。 +RB_UEPn_TX_TOG[0]=0,使用缓冲区UEPn_TX_DMA +0 1 1 +RB_UEPn_TX_TOG[0]=1,使用缓冲区UEPn_RX_DMA +22.2.2.4 端点 n 缓冲区起始地址(R32_UEP0_DMA) +位 名称 访问 描述 复位值 +端点0缓冲区起始地址。 +[31:0] R32_UEPn_DMA[31:0] RW X +地址必须4字节对齐。 +22.2.2.5 USB 端点 n 发送缓冲区起始地址(R32_UEPn_TX_DMA)(n=1-15) +位 名称 访问 描述 复位值 +R32_UEPn_TX_DMA[31: 端点n发送缓冲区起始地址。 +[31:0] RW X +0] 地址必须4字节对齐。 +22.2.2.6 USB 端点 n 接收缓冲区起始地址(R32_UEPn_RX_DMA)(n=1-15) +位 名称 访问 描述 复位值 +R32_UEPn_RX_DMA[31: 端点n接收缓冲区起始地址。 +[31:0] RW X +0] 地址必须4字节对齐。 +22.2.2.7 端点 n 最大长度包寄存器(R16_UEPn_MAX_LEN)(n=0-15) +位 名称 访问 描述 复位值 +[15:11] Reserved RO 保留。 0 +[10:0] UEPn_MAX_LEN[10:0] RW 端点n接收数据的最大包长度。 X +注:这个最大包长度决定了端点可接收数据最大长度,超出此长度的数据会被丢弃,不会写入缓冲区。 +22.2.2.8 端点 n 发送长度寄存器(R16_UEPn_T_LEN)(n=0-15) +位 名称 访问 描述 复位值 +设置USB端点n准备发送的数据字节数, +[10:0] UEPn_T_LEN[10:0] RW X +对于控制端点(0),低7位有效。 +22.2.2.9 端点 n 发送控制寄存器(R8_UEPn_TX_CTRL)(n=0-15) +位 名称 访问 描述 复位值 +[7:6] Reserved RO 保留。 0 +同步触发位自动翻转使能控制位,软件 +可修改: +5 RB_UEP_T_TOG_AUTO RW 0 +0:不自动翻转,可以手动切换; +1:对于非同步端点,数据发送成功后自 +V2.4 338 + +# Page 342 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +动翻转MASK_UEP_T_TOG [0],对于同步 +端点,数据发送成功后MASK_UEP_T_TOG +自动减1。 +注:端点0此位为保留位。 +USB端点n的发送器(处理IN事务)准 +备的同步触发位: +00:发送DATA0; +[4:3] MASK_UEP_T_TOG[1:0] RW 00b +01:发送DATA1; +10:发送DATA2; +11:发送MDATA。 +2 Reserved RO 保留 0 +端点n的发送器对IN事务的响应控制: +00:数据就绪并期望ACK; +[1:0] MASK_UEP_T_RES[1:0] RW 01:保留; 00b +10:应答NAK或忙; +11:应答STALL或错误。 +22.2.2.10 端点 n 接收控制寄存器(R8_UEPn_RX_CTRL)(n=0-15) +位 名称 访问 描述 复位值 +[7:6] Reserved RO 保留 0 +同步触发位自动翻转使能控制位: +0:不自动翻转,可以手动切换; +5 RB_UEP_R_TOG_AUTO RO 1 : 数 据 接 收 成 功 后 自 动 翻 转 0 +MASK_UEP_R_TOG[0]。 +注:端点0此位为保留位。 +USB 端点 n 的接收器(处理 OUT 事务) +准备的同步触发位: +00:期望DATA0; +[4:3] MASK_UEP_R_TOG[1:0] RW 01:期望DATA1; 00b +10:期望DATA2; +11:期望MDATA。 +对于实时/同步传输无效。 +2 Reserved RO 保留。 0 +端点n的接收器对OUT事务的响应控制: +00:数据就绪并期望ACK; +01:应答NYET; +[1:0] MASK_UEP_R_RES[1:0] RW 00b +10:应答NAK或忙; +11:应答STALL或错误; +对于实时/同步传输无效。 +22.2.3 USB 主机寄存器 +在USB主机模式下,芯片提供了一组双向主机端点,包括一个发送端点OUT和一个接收端点IN, +一个数据包的最大长度是1024字节(同步传输),支持控制传输、中断传输、批量传输和实时/同步 +传输。 +主机端点发起的每一个USB事务,在处理结束后总是自动设置RB_UIF_TRANSFER中断标志。应用 +程序可以直接查询或在USB中断服务程序中查询并分析中断标志寄存器R8_USB_INT_FG,根据各中断 +V2.4 339 + +# Page 343 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +标志分别进行相应的处理;并且,如果RB_UIF_TRANSFER有效,那么还需要继续分析USB中断状态寄 +存器R8_USB_INT_ST,根据当前USB传输事务的应答PID标识MASK_UIS_H_RES进行相应的处理。 +如果事先设定了主机接收端点的 IN 事务的同步触发位(RB_UH_R_TOG),那么可以通过 +RB_U_TOG_OK或RB_UIS_TOG_OK判断当前所接收到的数据包的同步触发位是否与主机接收端点的同步 +触发位匹配,如果数据同步,则数据有效;如果数据不同步,则数据应该被丢弃。每次处理完USB发 +送或接收中断后,都应该正确修改相应主机端点的同步触发位,用于同步下次所发送的数据包和检测 +下次所接收的数据包是否同步;另外,通过设置RB_UH_T_AUTO_TOG和RB_UH_R_AUTO_TOG可以实现在 +发送成功或接收成功后自动翻转相应的同步触发位。 +USB 主机令牌设置寄存器 R8_UH_EP_PID 用于设置被操作的目标设备的端点号和本次 USB 传输事 +务的令牌PID包标识。SETUP令牌和OUT令牌所对应的数据由主机发送端点提供,准备发送的数据在 +R16_UH_TX_DMA缓冲区中,准备发送的数据长度设置在R16_UH_TX_LEN中;IN令牌所对应数据由目标 +设备返回给主机接收端点,接收到数据存放 R16_UH_RX_DMA 缓冲区中,接收到的数据长度存放在 +R16_USB_RX_LEN中。 +表22-3 主机相关寄存器列表 +名称 访问地址 描述 复位值 +R8_UHOST_CTRL 0x40023401 USB主机控制寄存器 0x00 +R32_UH_CONFIG 0x40023410 USB主机端点配置寄存器 0x00000000 +R32_UH_EP_TYPE 0x40023414 USB主机端点类型寄存器 0x00000000 +R32_UH_RX_DMA 0x40023424 USB主机接收缓冲区起始地址 0x0000XXXX +R32_UH_TX_DMA 0x40023464 USB主机发送缓冲区起始地址 0x0000XXXX +R16_UH_RX_MAX_LEN 0x400234A0 USB主机接收最大长度包寄存器 0xXXXX +R8_UH_EP_PID 0x400234E0 USB主机令牌设置寄存器 0x00 +R8_UH_RX_CTRL 0x400234E3 USB主机接收端点控制寄存器 0x00 +R16_UH_TX_LEN 0x400234E4 USB主机发送长度寄存器 0xXXXX +R8_UH_TX_CTRL 0x400234E6 USB主机发送端点控制寄存器 0x00 +R16_UH_SPLIT_DATA 0x400234E8 USB主机发送SPLIT包的数据 0xXXXX +22.2.3.1 USB 主机控制寄存器(R8_UHOST_CTRL) +位 名称 访问 描述 复位值 +自动产生SOF包使能控制位: +0:不产生SOF包; +7 RB_UH_SOF_EN RW 1:主机自动发生SOF包。 0 +该位在从连接状态变为断开状态时由硬 +件自动清零。 +6 RB_UH_SOF_FREE RO 总线空闲。 0 +5 Reserved RO 保留。 0 +USB-PHY的处于挂起状态,内部USB-PLL +4 RB_UH_PHY_SUSPENDM RW 0 +将被关闭,低有效。 +3 RB_UH_REMOTE_WKUP RW 远程唤醒。 0 +主机模式下,表示主机唤醒设备,软件 +2 RB_UH_TX_BUS_RESUME RW 拉高 50ns 后,硬件自动发送 30ms 的唤 0 +醒信号。 +RB_UH_TX_BUS_SUSPEN USB 主机发送挂起信号,需由软件拉高 +1 RW 0 +D 10ms。 +0 RB_UH_TX_BUS_RST RW USB主机发送总线复位信号,需由软件拉 0 +V2.4 340 + +# Page 344 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +高10ms。 +注:复位的时间由RB_UH_TX_BUS_RST的高电平持续时间决定(建议至少10ms,10ms后直接查询速度 +类型)。如果主机唤醒设备, bUH_TX_BUS_RESUME 拉高之后,硬件自动发送30ms的唤醒信号(K), +bUH_TX_BUS_RESUME需要手动清除,以免影响下一次主机挂起(bUH_TX_BUS_RESUME高电平至少维持 +50ns)。 +22.2.3.2 USB 主机端点配置控制寄存器(R32_UH_CONFIG) +位 名称 访问 描述 复位值 +[31:19] Reserved RO 保留。 0 +主机接收使能: +18 RB_UH_EP_RX_EN RW 0:禁止; 0 +1:使能。 +[17:4] Reserved RO 保留。 0 +主机发送使能: +3 RB_UH_EP_TX_EN RW 0:禁止; 0 +1:使能。 +[2:0] Reserved RO 保留。 0 +22.2.3.3 USB 主机端点类型寄存器(R32_UH_EP_TYPE) +位 名称 访问 描述 复位值 +[31:19] Reserved RO 保留。 0 +主机接收端点类型: +18 RB_UH_EP_RX_TYPE RW 0:非同步传输; 0 +1:同步传输。 +[17:4] Reserved RO 保留。 0 +主机发送端点类型: +3 RB_UH_EP_TX_TYPE RW 0:非同步传输; 0 +1:同步传输。 +[2:0] Reserved RO 保留。 0 +22.2.3.4 USB 主机接收缓冲区起始地址(R32_UH_RX_DMA) +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +主机端点数据接收缓冲区起始地址,最 +[16:0] R16_UH_RX_DMA[16:0] RW X +低2位固定为0(4字节对齐)。 +22.2.3.5 USB 主机发送缓冲区起始地址(R32_UH_TX_DMA) +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +主机端点数据发送缓冲区起始地址(不 +[16:0] R16_UH_TX_DMA[16:0] RW X +需要4字节对齐)。 +22.2.3.6 USB 主机接收最大长度包寄存器(R16_UH_RX_MAX_LEN) +位 名称 访问 描述 复位值 +V2.4 341 + +# Page 345 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[15:11] Reserved RO 保留。 0 +[10:0] UH_RX_MAX_LEN[10:0] RW 主机端点接收数据的最大包长度。 X +注:这个最大包大小决定了端点可接收数据最大长度,超出此长度的数据会被丢弃。 +22.2.3.7 USB 主机令牌设置寄存器(R8_UH_EP_PID) +位 名称 访问 描述 复位值 +[7:4] MASK_UH_TOKEN[3:0] RW 设置本次USB传输事务的令牌PID标识。 0 +[3:0] MASK_UH_ENDP[3:0] RW 设置本次被操作的目标设备的端点号。 0 +22.2.3.8 USB 主机接收端点控制寄存器(R8_UH_RX_CTRL) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +0:期望数据包(IN); +6 RB_UH_R_DATA_NO RW 1:不期待数据包,用于主机模式下的操 0 +作高速HUB。 +同步触发位自动翻转使能控制位: +0:不自动翻转,可以手动切换。 +1:对于非同步传输,数据接收成功后自 +5 RB_UH_R_AUTO_TOG RW 0 +动翻转相应MASK_UH_R_TOG[0];对于同 +步传输,数据接收成功后MASK_UH_R_TOG +会自动减1。 +主机接收器(处理IN事务)期望的同步 +触发位, +00:期望DATA0; +[4:3] MASK_UH_R_TOG[1:0] RW 00b +01:期望DATA1; +10:期望DATA2; +11:期望MDATA。 +0:接收数据成功后发送应答; +2 RB_UH_R_RES_NO RW 1:无应答,用于实现非端点 0 的实时/ 0 +同步传输。此时忽略MASK_UEP_R_RES。 +主机接收器对IN事务的响应控制位: +[1:0] MASK_UH_R_RES[1:0] RW 00:应答ACK; 00b +对于实时/同步传输无效。 +22.2.3.9 USB 主机发送长度寄存器(R16_UH_TX_LEN) +位 名称 访问 描述 复位值 +[15:11] Reserved RO 保留 0 +设置 USB 主机发送端点准备发送的数据 +[10:0] R16_UH_TX_LEN[10:0] RW X +字节。 +22.2.3.10 USB 主机发送端点控制寄存器(R8_UH_TX_CTRL) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +0:发送数据包(OUT/SETUP); +6 RB_UH_T_DATA_NO RW 0 +1:不发送数据包(PING/SPLIT)。 +V2.4 342 + +# Page 346 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +同步触发位自动翻转使能控制位,可软 +件修改: +5 RB_UH_T_AUTO_TOG RW 0:不自动翻转,可以手动切换; 0 +1:对于非同步传输,数据发送成功后自 +动翻转MASK_UH_T_TOG[0]。 +USB主机发送器(处理SETUP/OUT事务) +准备的同步触发位 +00表示发送DATA0; +[4:3] MASK_UH_T_TOG[1:0] RW 00b +01表示发送DATA1; +10表示发送DATA2; +11表示发送MDATA。 +0:发送数据成功后期待应答; +2 RB_UH_T_RES_NO RW 1:无应答,用于实现非端点 0 的实时/ 0 +同步传输。此时忽略MASK_UEP_T_RES。 +USB 主机发送器对 SETUP/OUT 事务的响 +应控制位 +00:期望应答ACK; +[1:0] MASK_UH_T_RES[1:0] RW 01:期望应答NYET; 00b +10:期望应答NAK或忙; +11:期望应答STALL或错误。 +对于实时/同步传输无效。 +22.2.3.11 USB 主机发送 SPLIT 包的数据(R16_UH_SPLIT_DATA) +位 名称 访问 描述 复位值 +[15:12] Reserved RO 保留。 0 +主机端点发送 SPLIT 包的数据内容,低 +[11:0] UH_SPLIT_DATA[11:0] RW 0x0XXX +12位有效,高4位固定为0。 +V2.4 343 + +# Page 347 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 23 章 USB 全速主机/设备控制器(USBFS/OTG_FS) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器系列部分产品。 +23.1 USB 控制器简介 +芯片内嵌USB控制器及收发器,特性如下: + 双重角色设备控制器,支持USB Host主机功能和USB Device设备功能。 + 遵循On-The-GoSupplement to the USB2.0规范,主机和设备模式均支持USB2.0全速12Mbps +或低速1.5Mbps。 + 支持软件HNP和SRP协议。 + 支持USB控制传输、批量传输、中断传输、同步/实时传输。 + 支持最大64字节的数据包,内置FIFO,支持中断和DMA。 +23.2 寄存器描述 +USB相关寄存器分为3个部分,部分寄存器是在主机和设备模式下进行复用的。 + USB全局寄存器 + USB设备控制寄存器 + USB主机控制寄存器 +23.2.1 全局寄存器描述 +表23-1 USBFS相关寄存器列表 +名称 访问地址 描述 复位值 +R8_USB_CTRL 0x50000000 USB控制寄存器 0x06 +R8_USB_INT_EN 0x50000002 USB中断使能寄存器 0x00 +R8_USB_DEV_AD 0x50000003 USB设备地址寄存器 0x00 +R8_USB_MIS_ST 0x50000005 USB杂项状态寄存器 0xXX +R8_USB_INT_FG 0x50000006 USB中断标志寄存器 0x20 +R8_USB_INT_ST 0x50000007 USB中断状态寄存器 0xXX +R16_USB_RX_LEN 0x50000008 USB接收长度寄存器 0x0XXX +R32_USB_OTG_CR 0x50000054 USB OTG控制寄存器 0x00000000 +R32_USB_OTG_SR 0x50000058 USB OTG状态寄存器 0x0000000X +23.2.1.1 USB 控制寄存器(R8_USB_CTRL) +位 名称 访问 描述 复位值 +USB工作模式选择位: +7 RB_UC_HOST_MODE RW 0:设备模式(DEVICE); 0 +1:主机模式(HOST)。 +USB总线信号传输速率选择位: +6 RB_UC_LOW_SPEED RW 0:12Mbps; 0 +1:1.5Mbps。 +USB设备模式下,USB设备使能和内部上拉 +5 RB_UC_DEV_PU_EN RW 电阻控制位,为1则使能USB设备传输并 0 +且启用内部上拉电阻。 +[5:4] MASK_UC_SYS_CTRL RW 见下表配置USB系统。 0 +V2.4 344 + +# Page 348 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USB 传输完成中断标志未清零前自动暂停 +使能位: +0:不暂停; +3 RB_UC_INT_BUSY RW 0 +1:在中断标志UIF_TRANSFER 未清零前自 +动暂停,设备模式下自动应答忙 NAK,主 +机模式下自动暂停后续传输。 +USB协议处理器软件复位控制位: +0:不复位; +2 RB_UC_RST_SIE RW 1 +1:强制复位 USB协议处理器(SIE),需 +要软件清零。 +USB的FIFO和中断标志清零: +1 RB_UC_CLR_ALL RW 0:不清; 1 +1:强制清空和清零。 +USB的DMA和DMA中断控制位: +0 RB_UC_DMA_EN RW 0:关闭DMA; 0 +1:使能DMA功能和DMA中断。 +由RB_UC_HOST_MODE和MASK_UC_SYS_CTRL组成USB系统控制组合: +表23-2 USB系统控制组合 +RB_UC_HOST_MODE MASK_UC_SYS_CTRL USB系统控制描述 +0 00 禁止USB设备功能,关闭内部上拉电阻。 +0 01 使能USB设备功能,关闭内部上拉电阻,需加外部上拉。 +使能 USB 设备功能,启用内部 1.5K 上拉电阻。该上拉 +0 1x +电阻优先于下拉电阻,也可用于GPIO模式。 +1 00 USB主机模式,正常工作状态。 +1 01 USB主机模式,强制DP/DM输出SE0状态。 +1 10 USB主机模式,强制DP/DM输出J状态。 +1 11 USB主机模式,强制DP/DM输出K状态/唤醒。 +23.2.1.2 USB 中断使能寄存器(R8_USB_INT_EN) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +USB设备模式,接收到NAK中断: +6 RB_UIE_DEV_NAK RW 0:禁止中断; 0 +1:使能中断。 +USB单线模式使能: +0:禁止USB单线模式; +1:使能USB单线模式。 +[5] RB_U_1WIRE_MODE RW 注 : 仅 适 用 于 CH32F20x_D8C 、 0 +CH32V30x_D8 、 CH32V30x_D8C 、 +CH32V31x_D8C批号倒数第六位不为0的 +产品。 +FIFO溢出中断: +4 RB_UIE_FIFO_OV RW 0:禁止中断; 0 +1:使能中断。 +V2.4 345 + +# Page 349 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USB主机模式,SOF定时中断: +3 RB_UIE_HST_SOF RW 0:禁止中断; 0 +1:使能中断。 +USB总线挂起或唤醒事件中断: +2 RB_UIE_SUSPEND RW 0:禁止中断; 0 +1:使能中断。 +USB传输完成中断: +1 RB_UIE_TRANSFER RW 0:禁止中断; 0 +1:使能中断。 +USB主机模式,USB设备连接或断开事件 +中断: +RB_UIE_DETECT RW 0 +0:禁止中断; +0 1:使能中断。 +USB设备模式,USB总线复位事件中断: +RB_UIE_BUS_RST RW 0:禁止中断; 0 +1:使能中断。 +23.2.1.3 USB 设备地址寄存器(R8_USB_DEV_AD) +位 名称 访问 描述 复位值 +7 RB_UDA_GP_BIT RW USB通用标志位,用户自定义。 0 +主机模式:当前操作的USB设备地址; +[6:0] MASK_USB_ADDR RW 0 +设备模式:该USB自身地址。 +23.2.1.4 USB 杂项状态寄存器(R8_USB_MIS_ST) +位 名称 访问 描述 复位值 +USB主机模式下SOF包预示状态位: +0:无SOF包发送; +7 RB_UMS_SOF_PRES RO x +1:将要发送SOF包,此时如有其它USB +数据包将被自动延后。 +USB主机模式下SOF包传输状态位: +6 RB_UMS_SOF_ACT RO 0:发送完成或者空闲; x +1:正在发出SOF包。 +USB协议处理器的空闲状态位: +5 RB_UMS_SIE_FREE RO 0:忙,正在进行USB传输; 1 +1:协议器空闲。 +USB接收FIFO数据就绪状态位: +4 RB_UMS_R_FIFO_RDY RO 0:接收FIFO为空; 0 +1:接收FIFO非空。 +USB总线复位状态位: +3 RB_UMS_BUS_RST RO 0:当前USB总线处于非复位态; x +1:当前USB总线处于复位态。 +USB挂起状态位: +0:USB总线处于非挂起态; +2 RB_UMS_SUSPEND RO 0 +1:USB总线处于挂起态,有一段时间没 +有USB活动。 +V2.4 346 + +# Page 350 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +USB 主机模式下,设备刚连入 USB 端口 +时DM引脚的电平状态,用于判断速度: +1 RB_UMS_DM_LEVEL RO 0 +0:低电平/全速; +1:高电平/低速。 +USB 主机模式下端口的 USB 设备连接状 +态位: +0 RB_UMS_DEV_ATTACH RO 0 +0:端口没有USB设备连接; +1:端口已经连接USB设备。 +23.2.1.5 USB 中断标志寄存器(R8_USB_INT_FG) +位 名称 访问 描述 复位值 +USB设备模式下,NAK响应状态位: +7 RB_U_IS_NAK RO 0:无NAK响应; 0 +1:当前USB传输过程中回应NAK。 +当前 USB 传输 DATA0/1 同步标志匹配状 +态位: +6 RB_U_TOG_OK RO 0 +0:不同步; +1:同步。 +USB协议处理器空闲状态位: +5 RB_U_SIE_FREE RO 0:忙,正在进行USB传输; 1 +1:USB空闲。 +USB FIFO溢出中断标志位,写1清零: +4 RB_UIF_FIFO_OV RW 0:无事件; 0 +1:FIFO溢出触发。 +USB 主机模式下 SOF 定时中断标志位, +写1清零: +3 RB_UIF_HST_SOF RW 0 +0:无事件; +1:SOF包传输完成触发。 +USB总线挂起或唤醒事件中断标志位,写 +1清零: +2 RB_UIF_SUSPEND RW 0 +0:无事件; +1:USB挂起事件或唤醒事件触发。 +USB传输完成中断标志位,写1清零: +1 RB_UIF_TRANSFER RW 0:无事件; 0 +1:一个USB传输完成触发。 +USB 主机模式下 USB 设备连接或断开事 +件中断标志位,写1清零: +RB_UIF_DETECT RW 0 +0:无事件; +1:检测到USB设备连接或断开触发。 +0 +USB 设备模式下 USB 总线复位事件中断 +标志位,写1清零: +RB_UIF_BUS_RST RW 0 +0:无事件; +1:USB总线复位事件触发。 +23.2.1.6 USB 中断状态寄存器(R8_USB_INT_ST) +V2.4 347 + +# Page 351 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +USB 设备模式下,NAK 响应状态位,同 +RB_U_IS_NAK: +7 RB_UIS_IS_NAK RO 0 +0:无NAK响应; +1:当前USB传输过程中回应NAK。 +当前 USB 传输 DATA0/1 同步标志匹配状 +态位,同RB_U_TOG_OK: +6 RB_UIS_TOG_OK RO 0 +0:不同步; +1:同步。 +设备模式下,当前 USB 传输事务的令牌 +[5:4] MASK_UIS_TOKEN RO x +PID标识。 +设备模式下,当前 USB 传输事务的端点 +MASK_UIS_ENDP RO x +号。 +[3:0] 主机模式下,当前 USB 传输事务的应答 +MASK_UIS_H_RES RO PID标识,0000表示设备无应答或超时; x +其它值表示应答PID。 +MASK_UIS_TOKEN 用于 USB设备模式下标识当前 USB传输事务的令牌 PID:00表示 OUT包;01保 +留;10表示IN包;11表示SETUP包。 +MASK_UIS_H_RES 仅在主机模式下有效。在主机模式下,若主机发送 OUT/SETUP 令牌包时,则该 +PID 是握手包 ACK/NAK/STALL,或是设备无应答/超时。若主机发送 IN 令牌包,则该 PID是数据包的 +PID(DATA0/DATA1)或握手包PID。 +23.2.1.7 USB 接收长度寄存器(R16_USB_RX_LEN) +位 名称 访问 描述 复位值 +[15:10] Reserved RO 保留 0 +[9:0] R16_USB_RX_LEN RO 当前USB端点接收的数据字节数 x +23.2.1.8 USB OTG 控制寄存器(R32_USB_OTG_CR) +位 名称 访问 描述 复位值 +[31:6] Reserved RO 保留 0 +OTG会话有效阈值电压设置 +5 RB_CR_SESS_VTH RW 0:SESS_VLD电平为0.8V; 0 +1:SESS_VLD电平为1.4V。 +OTG VBUS阈值电压设置 +4 RB_CR_VBUS_VTH RW 0:VBUS_VLD电平为4.8V; 0 +1:VBUS_VLD电平为4.4V。 +OTG功能使能 +3 RB_CR_OTG_EN RW 0:禁止; 0 +1:使能。 +USB_OTG_ID引脚上拉使能 +2 RB_CR_IDPU RW 0:禁止; 0 +1:使能。 +OTG VBUS充电使能 +1 RB_CR_CHARGE_VBUS RW 0 +0:禁止; +V2.4 348 + +# Page 352 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:使能。 +OTG VBUS放电使能 +0 RB_CR_DISCHAR_VBUS RW 0:禁止; 0 +1:使能。 +注:此寄存器仅适用于CH32V305、CH32V307、CH32F205和CH32F207。 +23.2.1.9 USB OTG 状态寄存器(R32_USB_OTG_SR) +位 名称 访问 描述 复位值 +[31:4] Reserved RO 保留 0 +OTG ID标志: +3 RB_SR_ID_DIG RO 0:A设备; 0 +1:B设备。 +OTG 会话结束有效标志 +2 RB_SR_SESS_END RO 0:无效; 0 +1:有效。 +OTG 会话有效标志 +1 RB_SR_SESS_VLD RO 0:无效,会话有效电平小于阈值电压; 0 +1:有效,会话有效电平大于阈值电压。 +OTG VBUS输入电平 +0 RB_SR_VBUS_VLD RO 0:VBUS电压小于阈值电压; X +1:VBUS电压大于阈值电压。 +注:此寄存器仅适用于CH32V305、CH32V307、CH32F205和CH32F207。 +23.2.2 设备寄存器描述 +USB OTG模块在USB设备模式下,提供了端点号0-7共8组双向端点配置寄存器,可映射端点号 +8-15的配置,除3号端点外所有端点最大包长度为64字节,3号端点的最大数据包长度都是1023字 +节(同步传输)。 + 端点0是默认端点,支持控制传输,发送和接收共用一个64字节数据缓冲区 + 端点1-15,可配置独立的64字节发送和接收缓冲区或者双64字节数据缓冲区,支持批量传输、 +中断传输和实时/同步传输。 +每组端点都具有一个控制寄存器R8_UEPn_CTRL和发送长度寄存器R16_UEPn_T_LEN,用于设定该 +端点的同步触发位、对OUT事务和IN事务的响应以及发送数据的长度等。 +USB OTG模块主机和设备的角色由OTG_FS_ID引脚状态决定,当OTG_FS_ID引脚悬空,其内置的 +上拉电阻会使得USB OTG状态寄存器R32_USB_OTG_SR的RB_SR_ID_DIG位置1,此时控制器应初始化 +为B设备。当OTG_FS_ID引脚接地,此时USB OTG状态寄存器R32_USB_OTG_SR的RB_SR_ID_DIG位为 +0,控制器应初始化为A设备。 +B 设备在开始会话根据 OTG 状态寄存器 R32_USB_OTG_SR 的 RB_SR_SESS_VLD 来确保 VBUS 的电平 +低于V ,若该位为0,则可开始新的会话。若该位为1,则可将OTG控制寄存器R32_USB_OTG_CR +SESS_VLD,min +的RB_CR_DISCHAR_VBUS位置1进行放电,使得VBUS小于会话阈值电平。 +作为B类设备时,需从VBUS取电,则外部需一个转换电路,如图23-1所示。 +V2.4 349 + +# Page 353 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图23-1 OTG B类设备连接图 +VDD +5V to VDD +转换电路 +CH32V205xx/CH32V207xx +CH32F205xx/CH32F207xx +VBUS +DM +OSC_IN +DP +GND +OSC_OUT +V2.4 350 +口接B-orciMBSU PA9 +PA11 +PA12 +作为 USB 设备所必要的 USB 总线上拉电阻可以由软件随时设置是否启用,当 USB 控制寄存器 +R8_USB_CTRL中的RB_UC_DEV_PU_EN置1时,控制器根据RB_UD_LOW_SPEED的速度设置,在内部为USB +总线的DP/DM引脚连接上拉电阻,并启用USB设备功能。 +当检测到USB总线复位、USB总线挂起或唤醒事件,或当USB成功处理完数据发送或数据接收后, +USB协议处理器都将设置相应的中断标志,如果中断使能打开,还会产生相应的中断请求。应用程序 +可以直接查询或在 USB 中断服务程序中查询并分析中断标志寄存器 R8_USB_INT_FG,根据 +RB_UIF_BUS_RST和RB_UIF_SUSPEND进行相应的处理;并且,如果RB_UIF_TRANSFER有效,那么还需 +要继续分析 USB 中断状态寄存器 R8_USB_INT_ST,根据当前端点号 MASK_UIS_ENDP 和当前事务令牌 +PID 标识 MASK_UIS_TOKEN 进行相应的处理。如果事先设定了各个端点的 OUT 事务的同步触发位 +RB_UEP_R_TOG,那么可以通过RB_U_TOG_OK或RB_UIS_TOG_OK判断当前所接收到的数据包的同步触发 +位是否与该端点的同步触发位匹配,如果数据同步,则数据有效;如果数据不同步,则数据应该被丢 +弃。每次处理完USB发送或接收中断后,都应该正确修改相应端点的同步触发位,用于下次所发送的 +数据包或下次所接收的数据包是否同步检测;另外,设置RB_UEP_T_AUTO_TOG或RB_UEP_R_AUTO_TOG +可以实现在发送成功或接收成功后自动翻转相应的同步触发位。 +各个端点准备发送的数据在各自的缓冲区中,准备发送的数据长度是独立设定在R8_UEPn_T_LEN +中;各个端点接收到的数据在各自的缓冲区中,但是接收到的数据长度都在 USB 接收长度寄存器 +R8_USB_RX_LEN中,可以在USB接收中断时根据当前端点号区分。 +表23-3 设备相关寄存器列表 +名称 访问地址 描述 复位值 +R8_UDEV_CTRL 0x50000001 USB设备物理端口控制寄存器 0xX0 +端点1(9)/4(8/12)模式控制寄 +R8_UEP4_1_MOD 0x5000000C 0x00 +存器 +端点2(10)/3(11)模式控制寄存 +R8_UEP2_3_MOD 0x5000000D 0x00 +器 +端点5(13)/6(14)模式控制寄存 +R8_UEP5_6_MOD 0x5000000E 0x00 +器 +R8_UEP7_MOD 0x5000000F 端点7(15)模式控制寄存器 0x00 + +# Page 354 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_UEP0_DMA 0x50000010 端点0缓冲区起始地址 0xXXXXXXXX +R32_UEP1_DMA 0x50000014 端点1(9)缓冲区起始地址 0xXXXXXXXX +R32_UEP2_DMA 0x50000018 端点2(10)缓冲区起始地址 0xXXXXXXXX +R32_UEP3_DMA 0x5000001C 端点3(11)缓冲区起始地址 0xXXXXXXXX +R32_UEP4_DMA 0x50000020 端点4(8/12)缓冲区起始地址 0xXXXXXXXX +R32_UEP5_DMA 0x50000024 端点5(13)缓冲区起始地址 0xXXXXXXXX +R32_UEP6_DMA 0x50000028 端点6(14)缓冲区起始地址 0xXXXXXXXX +R32_UEP7_DMA 0x5000002C 端点7(15)缓冲区起始地址 0xXXXXXXXX +R8_UEP0_T_LEN 0x50000030 端点0发送长度寄存器 0xXX +R8_UEP0_TX_CTRL 0x50000032 端点0发送控制寄存器 0x00 +R8_UEP0_RX_CTRL 0x50000033 端点0接收控制寄存器 0x00 +R8_UEP1_T_LEN 0x50000034 端点1(9)发送长度寄存器 0xXX +R8_UEP1_TX_CTRL 0x50000036 端点1(9)发送控制寄存器 0x00 +R8_UEP1_RX_CTRL 0x50000037 端点1(9)接收控制寄存器 0x00 +R8_UEP2_T_LEN 0x50000038 端点2(10)发送长度寄存器 0xXX +R8_UEP2_TX_CTRL 0x5000003A 端点2(10)发送控制寄存器 0x00 +R8_UEP2_RX_CTRL 0x5000003B 端点2(10)接收控制寄存器 0x00 +R8_UEP3_T_LEN 0x5000003C 端点3(11)发送长度寄存器 0xXX +R8_UEP3_TX_CTRL 0x500003E 端点3(11)发送控制寄存器 0x00 +R8_UEP3_RX_CTRL 0x500003F 端点3(11)接收控制寄存器 0x00 +R8_UEP4_T_LEN 0x50000040 端点4(8/12)发送长度寄存器 0xXX +R8_UEP4_TX_CTRL 0x50000042 端点4(8/12)发送控制寄存器 0x00 +R8_UEP4_RX_CTRL 0x50000043 端点4(8/12)接收控制寄存器 0x00 +R8_UEP5_T_LEN 0x50000044 端点5(13)发送长度寄存器 0xXX +R8_UEP5_TX_CTRL 0x50000046 端点5(13)发送控制寄存器 0x00 +R8_UEP5_RX_CTRL 0x50000047 端点5(13)接收控制寄存器 0x00 +R8_UEP6_T_LEN 0x50000048 端点6(14)发送长度寄存器 0xXX +R8_UEP6_TX_CTRL 0x5000004A 端点6(14)发送控制寄存器 0x00 +R8_UEP6_RX_CTRL 0x5000004B 端点6(14)接收控制寄存器 0x00 +R8_UEP7_T_LEN 0x5000004C 端点7(15)发送长度寄存器 0xXX +R8_UEP7_TX_CTRL 0x5000004E 端点7(15)发送控制寄存器 0x00 +R8_UEP7_RX_CTRL 0x5000004F 端点7(15)接收控制寄存器 0x00 +23.2.2.1 USB 设备物理端口控制寄存器(R8_UDEV_CTRL) +位 名称 访问 描述 复位值 +USB 设备端口 UD+/UD-引脚内部下拉电 +阻控制位: +7 RB_UD_PD_DIS RW 0:使能内部下拉; 1 +1:禁用内部下拉。 +可用于GPIO模式提供下拉电阻。 +6 Reserved RO 保留。 0 +当前UD+引脚状态: +5 RB_UD_DP_PIN RO 0:低电平; x +1:高电平。 +4 RB_UD_DM_PIN RO 当前UD-引脚状态: x +V2.4 351 + +# Page 355 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:低电平; +1:高电平。 +3 Reserved RO 保留。 0 +USB设备物理端口低速模式使能位: +2 RB_UD_LOW_SPEED RW 0:选择12Mbps全速模式; 0 +1:选择1.5Mbps低速模式。 +1 RB_UD_GP_BIT RW USB设备模式通用标志位,用户自定义。 0 +USB设备物理端口使能位: +0 RB_UD_PORT_EN RW 0:禁用物理端口; 0 +1:使能物理端口。 +23.2.2.2 端点 1(9)/4(8/12)模式控制寄存器(R8_UEP4_1_MOD) +位 名称 访问 描述 复位值 +0:禁止端点1(9)接收; +7 RB_UEP1_RX_EN RW 0 +1:使能端点1(9)接收(OUT)。 +0:禁止端点1(9)发送; +6 RB_UEP1_TX_EN RW 0 +1:使能端点1(9)发送(IN)。 +5 Reserved RO 保留。 0 +4 RB_UEP1_BUF_MOD RW 端点1(9)数据缓冲区模式控制位。 0 +0:禁止端点4(8/12)接收; +3 RB_UEP4_RX_EN RW 0 +1:使能端点4(8/12)接收(OUT)。 +0:禁止端点4(8/12)发送; +2 RB_UEP4_TX_EN RW 0 +1:使能端点4(8/12)发送(IN)。 +1 Reserved RO 保留。 0 +0 RB_UEP4_BUF_MOD RW 端点4(8/12)数据缓冲区模式控制位。 0 +注:端点1配置选项映射端点9,端点4配置选项映射端点8和12。 +23.2.2.3 端点 2(10)/3(11)模式控制寄存器(R8_UEP2_3_MOD) +位 名称 访问 描述 复位值 +0:禁止端点3(11)接收; +7 RB_UEP3_RX_EN RW 0 +1:使能端点3(11)接收(OUT)。 +0:禁止端点3(11)发送; +6 RB_UEP3_TX_EN RW 0 +1:使能端点3(11)发送(IN)。 +5 Reserved RO 保留。 0 +4 RB_UEP3_BUF_MOD RW 端点3(11)数据缓冲区模式控制位。 0 +0:禁止端点2(10)接收; +3 RB_UEP2_RX_EN RW 0 +1:使能端点2(10)接收(OUT)。 +0:禁止端点2(10)发送; +2 RB_UEP2_TX_EN RW 0 +1:使能端点2(10)发送(IN)。 +1 Reserved RO 保留。 0 +0 RB_UEP2_BUF_MOD RW 端点2(10)数据缓冲区模式控制位。 0 +注:端点2配置选项映射端点10,端点3配置选项映射端点11。 +23.2.2.4 端点 5(13)/6(14)模式控制寄存器(R8_UEP5_6_MOD) +位 名称 访问 描述 复位值 +V2.4 352 + +# Page 356 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:禁止端点6(14)接收; +7 RB_UEP6_RX_EN RW 0 +1:使能端点6(14)接收(OUT)。 +0:禁止端点6(14)发送; +6 RB_UEP6_TX_EN RW 0 +1:使能端点6(14)发送(IN)。 +5 Reserved RO 保留。 0 +4 RB_UEP6_BUF_MOD RW 端点6(14)数据缓冲区模式控制位。 0 +0:禁止端点5(13)接收; +3 RB_UEP5_RX_EN RW 0 +1:使能端点5(13)接收(OUT)。 +0:禁止端点5(13)发送; +2 RB_UEP5_TX_EN RW 0 +1:使能端点5(13)发送(IN)。 +1 Reserved RO 保留。 0 +0 RB_UEP5_BUF_MOD RW 端点5(13)数据缓冲区模式控制位。 0 +注:端点5配置选项映射端点13,端点6配置选项映射端点14。 +23.2.2.5 端点 7(15)模式控制寄存器(R8_UEP7_MOD) +位 名称 访问 描述 复位值 +[7:4] Reserved RO 保留。 0 +0:禁止端点7(15)接收; +3 RB_UEP7_RX_EN RW 0 +1:使能端点7(15)接收(OUT)。 +0:禁止端点7(15)发送; +2 RB_UEP7_TX_EN RW 0 +1:使能端点7(15)发送(IN)。 +1 Reserved RO 保留。 0 +0 RB_UEP7_BUF_MOD RW 端点7(15)数据缓冲区模式控制位。 0 +注:端点7配置选项映射端点15。 +由 RB_UEPn_RX_EN 和RB_UEPn_TX_EN以及RB_UEPn_BUF_MOD 组合分别配置 USB端点 1-15的数据 +缓冲区模式,具体参考表 23-4。其中,在双 64 字节缓冲区模式下,USB 数据传输时将根据 +RB_UEP_*_TOG=0 选择前 64 字节缓冲区,根据 RB_UEP_*_TOG=1 选择后 64 字节缓冲区,设置 +RB_UEP_*_AUTO_TOG=1 可 实 现 自 动 切 换 。 需 要 注 意 的 是 : 在 同 步 传 输 时 , +(RB_UEPn_RX_EN,RB_UEPn_TX_EN,RB_UEPn_BUF_MOD)仅为(1,0,0)或(0,1,0)时,端点3支持最大 +1023字节。 +表23-4 端点n缓冲区模式(n=1-7) +RB_UEPn_ RB_UEPn_ RB_UEPn_ +描述:以R16_UEPn_DMA为起始地址由低向高排列 +RX_EN TX_EN BUF_MOD +0 0 X 端点被禁用,未用到R16_UEPn_DMA缓冲区。 +1 0 0 单64字节接收缓冲区(OUT)。 +1 0 1 双64字节接收缓冲区(OUT),由RB_UEP_R_TOG选择。 +0 1 0 单64字节发送缓冲区(IN)。 +0 1 1 双64字节发送缓冲区(IN),由RB_UEP_T_TOG选择。 +1 1 0 单64字节接收缓冲区(OUT),单64字节发送缓冲区(IN)。 +双64字节接收缓冲区(OUT),通过RB_UEP_R_TOG选择, +双64字节发送缓冲区(IN),通过RB_UEP_T_TOG选择。 +1 1 1 全部256字节排列如下: +UEPn_DMA+0地址:RB_UEP_R_TOG=0时端点接收地址; +UEPn_DMA+64地址:RB_UEP_R_TOG=1时端点接收地址; +V2.4 353 + +# Page 357 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +UEPn_DMA+128地址:RB_UEP_T_TOG=0时端点发送地址; +UEPn_DMA+192地址:RB_UEP_T_TOG=1时端点发送地址。 +注:表21-4的配置选择支持n=1-7,端点8-15配置映射端点1-7配置。 +23.2.2.6 端点 n 缓冲区起始地址(R32_UEPn_DMA)(n=0-7) +位 名称 访问 描述 复位值 +端点n缓冲区起始地址。 +[31:0] R32_UEPn_DMA RW x +地址必须4字节对齐。 +注:1.接收数据的缓冲区的长度 >= min(可能收到的最大数据包长度 + 2字节,64字节)。 +2.端点DMA配置支持0-7端点,可映射配置端点8-15端点。 +23.2.2.7 端点 n 发送长度寄存器(R16_UEPn_T_LEN)(n=0-7) +位 名称 访问 描述 复位值 +[9:0] R8_UEP3_T_LEN RW 设置USB端点3准备发送的数据字节数。 x +设置 USB 端点 n 准备发送的数据字节数 +[7:0] R8_UEPn_T_LEN RW x +n=0,1,2,4,5,6,7。 +注1.端点发送长度配置支持0-7端点,可映射配置8-15端点的发送。 +2.主机发送支持最大1023字节(针对同步端点) +23.2.2.8 端点 n 控制寄存器(R8_UEPn_TX_CTRL)(n=0-7) +位 名称 访问 描述 复位值 +[7:4] Reserved RO 保留。 0 +同步触发位自动翻转使能控制位: +0:不自动翻转,可以手动切换; +3 RB_UEP_T_AUTO_TOG RW 1:数据发送成功后自动翻转相应的同步 0 +触发位。 +注:端点0此位保留。 +USB端点n的发送器(处理IN事务)准 +备的同步触发位: +2 RB_UEP_T_TOG RW 0 +0:发送DATA0; +1:发送DATA1。 +端点n的发送器对IN事务的响应控制: +00:DATA0/DATA1数据就绪并期望ACK; +01:应答 DATA0/DATA1 并期望无响应, +[1:0] MASK_UEP_T_RES RW 00b +用于非端点0的实时/同步传输; +10:应答NAK或忙; +11:应答STALL或错误。 +注:端点配置支持0-7端点,可映射配置端点8-15端点。 +23.2.2.9 端点 n 控制寄存器(R8_UEPn_RX_CTRL)(n=0-7) +位 名称 访问 描述 复位值 +[7:4] Reserved RO 保留。 0 +同步触发位自动翻转使能控制位: +3 RB_UEP_R_AUTO_TOG RW 0:不自动翻转,可以手动切换; 0 +1:数据接收成功后自动翻转相应的同步 +V2.4 354 + +# Page 358 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +触发位。 +注:端点0此位保留。 +USB 端点 n 的接收器(处理 OUT 事务) +期望的同步触发位: +2 MASK_UEP_R_TOG RW 0 +0:期望DATA0; +1:期望DATA1。 +端点n的接收器对OUT事务的响应控制: +00:应答ACK; +01:超时/无响应,用于非端点0的实时 +[1:0] MASK_UEP_R_RES RW 00b +/同步传输; +10:应答NAK或忙; +11:应答STALL或错误。 +注:端点配置支持0-7端点,可映射配置端点8-15端点。 +23.2.3 USB 主机寄存器 +在USB OTG主机模式下,芯片提供了一组双向主机端点,包括一个发送端点OUT和一个接收端点 +IN,一个数据包的最大长度是1023字节,支持控制传输、中断传输、批量传输和实时/同步传输。 +在USB OTG主机模式下,若控制器不能为VUBS提供5V电源,则需外接电荷泵,若应用板能提供5V +电源则可采用模拟开关控制VBUS的打开和关断,如图23-2所示。 +图23-2 OTG 的A类设备连接 +5V +VDD +5V to VDD +转换电路 +CH32V205xx/CH32V207xx +CH32F205xx/CH32F207xx +5V_in +EN +GPIO 模拟开关 +5V_out +VBUS +DM +OSC_IN +DP +ID +GND +OSC_OUT +V2.4 355 +口接A-orciMBSU PA9 +PA11 +PA12 +PA10 +主机端点发起的每一个USB事务,在处理结束后总是自动设置RB_UIF_TRANSFER中断标志。应用 +程序可以直接查询或在USB中断服务程序中查询并分析中断标志寄存器R8_USB_INT_FG,根据各中断 +标志分别进行相应的处理;并且,如果RB_UIF_TRANSFER有效,那么还需要继续分析USB中断状态寄 +存器R8_USB_INT_ST,根据当前USB传输事务的应答PID标识MASK_UIS_H_RES进行相应的处理。 +如果事先设定了主机接收端点的 IN 事务的同步触发位(RB_UH_R_TOG),那么可以通过 +RB_U_TOG_OK或RB_UIS_TOG_OK判断当前所接收到的数据包的同步触发位是否与主机接收端点的同步 +触发位匹配,如果数据同步,则数据有效;如果数据不同步,则数据应该被丢弃。每次处理完USB发 + +# Page 359 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +送或接收中断后,都应该正确修改相应主机端点的同步触发位,用于同步下次所发送的数据包和检测 +下次所接收的数据包是否同步;另外,通过设置 RB_UH_T_AUTO_TOG 和 RB_UH_R_AUTO_TOG 可以实现 +在发送成功或接收成功后自动翻转相应的同步触发位。 +USB主机令牌设置寄存器R8_UH_EP_PID用于设置被操作的目标设备的端点号和本次USB传输事 +务的令牌PID包标识。SETUP令牌和OUT令牌所对应的数据由主机发送端点提供,准备发送的数据 +在R16_UH_TX_DMA缓冲区中,准备发送的数据长度设置在R16_UH_TX_LEN中;IN令牌所对应数据由 +目标设备返回给主机接收端点,接收到数据存放R16_UH_RX_DMA缓冲区中,接收到的数据长度存放 +在R16_USB_RX_LEN中,主机端点可接收的最大包长度需要提前写入到R16_UH_RX_MAX_LEN寄存器 +中。 +表23-5 主机相关寄存器列表 +名称 访问地址 描述 复位值 +R8_UHOST_CTRL 0x50000001 USB主机物理端口控制寄存器 0xX0 +R32_UH_EP_MOD 0x5000000D USB主机端点模式控制寄存器 0x00 +R16_UH_RX_DMA 0x50000018 USB主机接收缓冲区起始地址 X +R16_UH_TX_DMA 0x5000001C USB主机发送缓冲区起始地址 X +R16_UH_SETUP 0x50000036 USB主机辅助设置寄存器 0x00 +R8_UH_EP_PID 0x50000038 USB主机令牌设置寄存器 0x00 +R8_UH_RX_CTRL 0x5000003B USB主机接收端点控制寄存器 0x00 +R16_UH_TX_LEN 0x5000003C USB主机发送长度寄存器 X +R8_UH_TX_CTRL 0x5000003E USB主机发送端点控制寄存器 0x00 +23.2.3.1 USB 主机物理端口控制寄存器(R8_UHOST_CTRL) +位 名称 访问 描述 复位值 +USB 主机端口 UD+/UD-引脚内部下拉电 +阻控制位: +7 RB_UH_PD_DIS RW 0:使能内部下拉; 1 +1:禁用内部下拉。 +可用于GPIO模式提供下拉电阻。 +6 Reserved RO 保留。 0 +当前UD+引脚状态: +5 RB_UH_DP_PIN RO 0:低电平; x +1:高电平。 +当前UD-引脚状态: +4 RB_UH_DM_PIN RO 0:低电平; x +1:高电平。 +3 Reserved RO 保留。 0 +USB主机端口低速模式使能位: +2 RB_UH_LOW_SPEED RW 0:选择12Mbps全速模式; 0 +1:选择1.5Mbps低速模式。 +USB主机模式总线复位控制位: +1 RB_UH_BUS_RST RW 0:结束输出; 0 +1:强制输出USB总线复位。 +USB主机端口使能位: +0 RB_UH_PORT_EN RW 0:禁用主机端口; 0 +1:使能主机端口。 +V2.4 356 + +# Page 360 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +当USB设备断开连接时,该位自动清0。 +23.2.3.2 USB 主机端点模式控制寄存器(R32_UH_EP_MOD) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +主机发送端点发送(SETUP/OUT)使能位: +6 RB_UH_EP_TX_EN RW 0:禁止端点发送; 0 +1:使能端点发送。 +5 Reserved RO 保留。 0 +主机发送端点发送数据缓冲区模式控制 +4 RB_UH_EP_TBUF_MOD RW 0 +位。 +主机接收端点接收(IN)使能位: +3 RB_UH_EP_RX_EN RW 0:禁止端点接收; 0 +1:使能端点接收。 +[2:1] Reserved RO 保留。 0 +USB 主机接收端点接收数据缓冲区模式 +0 RB_UH_EP_RBUF_MOD RW 0 +控制位。 +由RB_UH_EP_TX_EN和RB_UH_EP_TBUF_MOD组合控制主机发送端点数据缓冲区模式,参考下表。 +表23-6 主机发送缓冲区模式 +RB_UH_EP_TX_EN RB_UH_EP_TBUF_MOD 描述:以R16_UH_TX_DMA为起始地址 +0 X 端点被禁用,未用到R16_UH_TX_DMA缓冲区。 +1 0 单64字节发送缓冲区(SETUP/OUT)。 +双64字节发送缓冲区,通过RB_UH_T_TOG选择: +1 1 当RB_UH_T_TOG=0时选择前64字节缓冲区; +当RB_UH_T_TOG=1时选择后64字节缓冲区。 +由RB_UH_EP_RX_EN和RB_UH_EP_RBUF_MOD组合控制主机接收端点数据缓冲区模式,参考下表。 +表23-7 主机接收缓冲区模式 +RB_UH_EP_RX_EN RB_UH_EP_RBUF_MOD 结构描述:以R16_UH_TX_DMA为起始地址 +0 X 端点被禁用,未用到R16_UH_RX_DMA缓冲区。 +1 0 单64字节接收缓冲区(IN)。 +双64字节接收缓冲区,通过RB_UH_R_TOG选择: +1 1 当RB_UH_R_TOG=0时选择前64字节缓冲区; +当RB_UH_R_TOG=1时选择后64字节缓冲区。 +USB主机接收缓冲区起始地址(R16_UH_RX_DMA) +位 名称 访问 描述 复位值 +主机端点数据接收缓冲区起始地址。 +[15:0] R16_UH_RX_DMA RW x +低15位有效,地址必须4字节对齐。 +USB主机发送缓冲区起始地址(R16_UH_TX_DMA) +位 名称 访问 描述 复位值 +[15:0] R16_UH_TX_DMA RW 主机端点数据发送缓冲区起始地址。 x +V2.4 357 + +# Page 361 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +低15位有效,地址必须4字节对齐。 +23.2.3.3 USB 主机辅助设置寄存器(R16_UH_SETUP) +位 名称 访问 描述 复位值 +[15:11] Reserved RO 保留。 0 +低速前导包PRE PID使能位: +0:禁用低速前导包; +10 RB_UH_PRE_PID_EN RW 0 +1:使能,用于通过外部HUB与低速USB +设备通讯。 +[9:3] Reserved RO 保留。 0 +自动产生SOF包使能位: +2 RB_UH_SOF_EN RW 0:关闭自动SOF功能; 0 +1:主机自动产生SOF包。 +[1:0] Reserved RO 保留。 0 +23.2.3.4 USB 主机令牌设置寄存器(R8_UH_EP_PID) +位 名称 访问 描述 复位值 +[7:4] MASK_UH_TOKEN RW 设置本次USB传输事务的令牌PID标识。 0 +[3:0] MASK_UH_ENDP RW 设置本次被操作的目标设备的端点号。 0 +23.2.3.5 USB 主机接收端点控制寄存器(R8_UH_RX_CTRL) +位 名称 访问 描述 复位值 +[7:4] Reserved RO 保留。 0 +同步触发位自动翻转使能控制位: +0:手动控制同步触发位(RB_UH_R_TOG); +3 RB_UH_R_AUTO_TOG RW 0 +1:数据接收成功后自动翻转相应的期待 +同步触发位(RB_UH_R_TOG)。 +主机接收器(处理IN事务)准备的同步 +触发位: +2 RB_UH_R_TOG RW 0:应答ACK; 0 +1:无响应,用于非 0 端点的实时/同步 +传输。 +1 Reserved RO 保留。 0 +主机接收器对IN事务的响应控制位: +0:应答ACK; +0 RB_UH_R_RES RO 0 +1:无响应,用于非 0 端点的实时/同步 +传输。 +23.2.3.6 USB 主机发送长度寄存器(R16_UH_TX_LEN) +位 名称 访问 描述 复位值 +设置 USB 主机发送端点准备发送的数据 +[15:0] R16_UH_TX_LEN RW x +字节数。 +23.2.3.7 USB 主机发送端点控制寄存器(R8_UH_TX_CTRL) +V2.4 358 + +# Page 362 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +[7:4] Reserved RO 保留。 0 +同步触发位自动翻转使能控制位: +0:手动控制同步触发位(RB_UH_T_TOG); +3 RB_UH_T_AUTO_TOG RO 0 +1:数据发送成功后自动翻转相应的同步 +触发位(RB_UH_T_TOG)。 +USB主机发送器(处理SETUP/OUT事务) +准备的同步触发位: +2 RB_UH_T_TOG RW 0 +0:表示发送DATA0; +1:表示发送DATA1。 +1 Reserved RO 保留。 0 +USB 主机发送器对 SETUP/OUT 事务的响 +应控制位: +0 RB_UH_T_RES RW 0:期望应答ACK; 0 +1:期望无响应,用于非 0 端点的实时/ +同步传输。 +V2.4 359 + +# Page 363 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 24 章 控制器局域网(CAN) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器系列部分产品。 +控制器局域网是一种用于串行数据通信的高性能通信协议。CAN控制器提供了一个完整的CAN协 +议实现方案,支持 CAN协议 2.0A 和 2.0B。CAN控制器可以用来构建强大的局域网来实现安全的分布 +式实时控制,以较小的CPU负荷来处理大量的数据报文,在工业和汽车领域有着广泛的应用。 +24.1 主要特性 + 兼容CAN规范2.0A和2.0B + 可编程的传输速率,最高可达1Mbit/s + 支持时间触发通信功能,避免低优先级消息阻塞 + 支持三个发送邮箱,发送报文优先级可由报文标识符或发送请求的次序决定,并可记录发送报 +文SOF时刻的时间戳 + 支持三级邮箱深度的2个接收FIFO,28个报文过滤器组可供配置,大容量产品CAN1和CAN2共 +用28个过滤器,每个过滤器组可配置成32或16位模式,屏蔽位或标识符列表模式,能够尽量减少 +软件对报文筛选的干预,FIFO溢出处理方式灵活,并可记录接收报文SOF时刻的时间戳 + 占用4个中断向量,每个中断源可以独立配置 +24.2 CAN 控制器工作模式 +CAN控制器可以对寄存器CAN_CTLR中的SLEEP或INRQ位进行操作,实现在初始化模式、睡眠模 +式和正常模式3个工作模式下切换。 +24.2.1 初始化模式 +在复位后,CAN默认工作在睡眠模式以减低功耗,此时禁止报文收发,TX引脚的内部上拉电阻使 +能,TX引脚输出隐性位。对寄存器CAN_CTLR中的INRQ位置1,请求CAN控制器进入初始化模式,当 +寄存器 CAN_STATR的INAK位自动置 1则成功进入初始化状态。同样对寄存器CAN_CTLR中的 INRQ位 +清零,请求 CAN控制器退出初始化模式,当寄存器CAN_STATR的 INAK位自动清 0则成功退出初始化 +状态。 +对过滤器组进行初始化,可以在非初始化模式下进行,不过必须对寄存器CAN_FCTLR的FINIT位 +进行置1,此时禁止接收报文。 +24.2.2 睡眠模式 +对寄存器 CAN_CTLR 中的 SLEEP 位置 1,请求 CAN 控制器进入睡眠模式,当寄存器 CAN_STATR 的 +SLAK位自动置1则CAN成功进入睡眠模式,此时CAN控制器的时钟停止,但邮箱寄存器仍可访问。 +由睡眠模式进入初始化模式,必须对CAN_CTLR的SLEEP位清0,INRQ位置1,当寄存器CAN_STATR的 +INAK位自动置1则切换为初始化状态完成。 +由睡眠模式进入正常模式,必须对CAN_CTLR的SLEEP位清0,当寄存器CAN_STATR的SLAK位自 +动清0则进入正常模式。 +V2.4 360 + +# Page 364 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图24-1 CAN工作模式切换 +Normal mode +SLAK=0 +INAK=0 +INRQ=0 +Sleep mode INRQ=1 +SLEEP=0 +Reset Query INAK=1 +SLAK=1 +Synchronous +INAK=0 +Initialization mode +SLAK=0 +INAK=1 +24.3 CAN 控制器测试模式 +在初始化模式下,对寄存器CAN_BTIMR的SILM和LBKM位进行操作,可以选择一种测试模式,然 +后通过对寄存器CAN_CTLR的INRQ位清零,退出初始化模式,进入测试模式。测试模式分为静默模式、 +环回模式和静默环回模式三种。 +24.3.1 静默模式 +对寄存器CAN_BTIMR的SILM位置1,可选择进入静默模式。该模式下,CAN控制器可以接收,不 +能对外发送报文,对外总是处于隐性位,可以避免对总线产生影响,但是报文能够被所在节点的控制 +器所接收。通常静默模式被用于CAN总线的状态分析。 +24.3.2 环回模式 +对寄存器CAN_BTIMR的LBKM位置1,可选择进入环回模式。该模式下,CAN控制器可以对外发送 +报文,不能接收外部报文,但是发送报文能够被所在节点的控制器所接收,接收过滤机制有效。通常 +环回模式被用于CAN控制器的收发测试。 +24.3.3 静默环回模式 +对寄存器CAN_BTIMR的SILM和LBKM位置1,可选择进入静默环回模式。该模式通常用于CAN控 +制器封闭自测试,在该模式下,对CAN总线无影响,RX引脚与总线断开,TX引脚置隐性位。 +V2.4 361 + +# Page 365 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图24-2 CAN总线的三种测试模式 +Silent mode Loopback mode Silent loopback mode +CAN CAN CAN +Send Receive Send Receive Send Receive +=1 =1 +CANTX CANRX CANTX CANRX CANTX CANRX +24.4 MCU 处于调试模式下 CAN 控制器的工作状态 +当MCU进入调试模式后,内核处于暂停状态,但可以通过调试模块中配置位来决定CAN控制器是 +处于正常运行或停止状态。 +24.5 CAN 控制器功能描述 +24.5.1 发送处理流程 +发送处理流程如下:如果三个发送邮箱中有空置的邮箱,应用层软件仅对空置邮箱的寄存器具有 +写入权限,对寄存器 CAN_TXMIRx、CAN_TXMDTRx、CAN_TXMDLRx 和 CAN_TXMDHRx 进行操作,可以设置 +报文标识符、报文长度、时间戳和报文数据等。在数据准备好之后,对寄存器CAN_TXMIRx的TXRQ位 +置1请求发送,邮箱进入挂号状态,并进行优先级排队;一旦成为最高优先级邮箱,则变为预定发送 +状态,等待CAN总线空闲;当CAN总线空闲时,预定发送邮箱的报文立刻进入发送状态;报文发送完 +毕后,邮箱重新成为空置邮箱,并且寄存器CAN_TSTATR的RQCP和TXOK位置1,来指示发送成功;若 +发送时仲裁失败,寄存器CAN_TSTATR的ALST位置1,若发送错误,则TERR位置1。 +24.5.2 发送优先级 +发送优先级可以由标识符或发送请求先后次序决定,寄存器CAN_CTLR的TXFP位置1按发送请求 +先后次序发送,按发送请求先后次序主要应用于分段发送;TXFP 位清 0 按标识符优先级决定发送次 +序,标识符越小则优先级越高,同标识符的情况下,则低编号的邮箱有更高优先级。 +24.5.3 发送中止处理 +若对寄存器CAN_TSTATR的ABRQ位置1,则可以中止发送请求。当邮箱状态为挂号或预定发送状 +态时,发送请求直接中止;当邮箱处于发送状态时,中止请求可能会成功(停止发送),也有可能会 +失败(发送完成),结果可由寄存器CAN_TSTATR的TXOK位来查询。 +24.5.4 基于时间触发模式 +传统的CAN通信总线繁忙时,容易造成低优先级的消息长时间阻塞,甚至无法满足其时限的要求。 +为了解决该瓶颈,推出了基于时间触发模式的相关协议,此类协议在工业上有一定规模的应用,基于 +时间触发模式的功能即为配合此类协议的应用。 +在时间触发模式下有两种模式可供选择,使用该模式需关闭自动重传功能,通过配置CAN_TTCTLR +寄存器的MODE位来选择默认模式和增强模式。对寄存器CAN_CTLR的TTCM和NART位置1,使能时间 +触发模式并禁止自动重传,CAN_TTCTLR 寄存器的 MODE 位默认为 0,此时工作在默认模式,内部定时 +器被激活用来产生发送和接收邮箱的时间戳,定时器在CAN位时间累加,内部定时器在接收和发送的 +V2.4 362 + +# Page 366 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +帧起始位的采样点位置被采样并产生时间戳。若使用增强模式,需要将配置CAN_TTCTLR寄存器的MODE +位为1,来开启增强模式,使用该模式,在整个CAN网络中,必须存在三个或三个以上的节点,其中 +一个节点发送时间基准,其他节点收到该基准节点的时间戳后,通过向 CAN_TTCTLR寄存器的TIMRST +位写1复位内部计数器,将内部计数器进行同步,这样除了发送时间基准的节点之外,其余CAN节点 +实现了时间同步,之后将待发送的数据写入发送邮箱,依次配置各节点的时间触发计数值(CAN_TTCNT +寄存器的TIMCNT)和内部计数器计数终值(CAN_TTCTLR寄存器TIMCMV),时间触发计数值和内部计 +数器计数终值由CAN节点的个数、CAN通信速率和一帧数据位数决定,配置完成后,各节点等待内部 +计数器计数到时间触发计数值后,触发发送动作。 +24.5.5 接收处理流程 +CAN总线报文的接收,由控制器硬件来完成,无需MCU的干涉,减轻了MCU的处理负荷。所接收 +到的报文,根据寄存器 CAN_FAFIFOR 的设置,分别被存储到两个具有 3 级邮箱深度的 FIFO中,应用 +层如需获取报文,只能通过接收FIFO邮箱来读取有效接收报文。 +初始时,接收 FIFO为空,接收 FIFO寄存器 CAN_RFIFOx的 FMR[1:0]值为二进制 00b,接到一个 +有效接收报文后,变为挂号 1 状态,控制器自动把接收 FIFO 寄存器 CAN_RFIFOx 的 FMR[1:0]设置二 +进制 01b;若此时读取邮箱数据寄存器 CAN_RXMDLRx 和 CAN_RXMDHRx,通过对接收 FIFO 寄存器 +CAN_RFIFOx的RFOM位置1来释放邮箱,接收FIFO状态又变为空;如果在挂号1状态时不释放邮箱, +下一个有效接收报文被接到后,接收FIFO状态切换为挂号2状态,此时接收FIFO寄存器CAN_RFIFOx +的FMR[1:0]自动置二进制10b;若读取邮箱数据寄存器并释放邮箱,则状态回到挂号1;如果在挂号 +2 状态不释放邮箱,则接收 FIFO 进入挂号 3 状态;同样在挂号 3 状态下读取报文并释放邮箱,则返 +回挂号2状态;若在挂号3状态不释放邮箱,则在接收到下一个有效报文时,必然导致报文丢失情况 +出现。 +图24-3 接收FIFO状态切换图 +Valid message Valid message Valid message Valid message +Empty received Registered received Registered received Registered received Overflow +1 2 3 +FMP=00b FMP=11b +FMP=01b FMP=10b FMP=11b +FOVR=0 Release Mailbox FOVR=0 Release Mailbox FOVR=0 Release Mailbox FOVR=0 Release Mailbox FOVR=1 +RFOM=1 RFOM=1 RFOM=1 RFOM=1 +Valid message +received +上文中的报文丢失情况,即接收FIFO为满,报文溢出导致报文丢失,接收FIFO寄存器CAN_RFIFOx +的 FOVR位会硬件自动置 1,以供溢出查询。寄存器CAN_CTLR的 RFLM位置 1,则接收 FIFO锁定功能 +启用,丢弃的报文为新接收报文;寄存器CAN_CTLR的RFLM位清0,则接收FIFO锁定功能停用,接收 +FIFO的三个原报文中,最后接收的报文会被新报文覆盖。 +当寄存器CAN_INTENR相关位置位,可以使接收FIFO状态切换时产生中断,以便更高效的处理接 +收报文,详见24.6节CAN中断。 +24.5.6 接收报文标识符过滤 +模块中有着多达 28 个过滤器组,通过设置过滤器组,每个 CAN 节点都可以接收到符合过滤规则 +的报文,不符合过滤规则的报文被硬件丢弃,无需软件干涉。 +每个过滤器组由 2个 32位寄存器 CAN_FxR0和 CAN_FxR1组成。过滤器组的位宽都可以通过设置 +寄存器 CAN_FSCFGR的各个位独立配置成 1个 32位过滤器或两个 16位过滤器。每个过滤器组可通过 +设置寄存器 CAN_FMCFGR 的各个位配置为屏蔽位或标识符列表模式,各个过滤器组可以通过设置寄存 +器CAN_FWR的各个位选择启用或禁用。设置寄存器CAN_FAFIFOR的各个位可以把选择通过过滤器的报 +文存放到哪个接收FIFO。 +如下表 24-1 所示,屏蔽位模式下,两个寄存器分别为标识符寄存器和屏蔽寄存器,两者需要配 +V2.4 363 + +# Page 367 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +合使用,标识符寄存器每一位指示相应的位期望值为显性或隐性,屏蔽寄存器每一位指示相应位是否 +需要对应标识符寄存器位期望值一致。 +表24-1 32位屏蔽位模式 +标识符寄存 +CAN_FxR1[31:24] CAN_FxR1[23:16] CAN_FxR1[15:8] CAN_FxR1[7:0] +器 +屏蔽位寄存 +CAN_FxR2[31:24] CAN_FxR2[23:16] CAN_FxR2[15:8] CAN_FxR2[7:0] +器 +映射 STID[10:3] STID[2:0] EXID[17:13] EXID[12:5] EXID[4:0] IDE RTR 0 +标识符列表模式下,两个寄存器都被用作标识符寄存器,接收报文标识符必须与其中一个寄存器 +保持一致才能通过筛选。 +表24-2 32位标识符列表模式 +标识符寄存 +CAN_FxR1[31:24] CAN_FxR1[23:16] CAN_FxR1[15:8] CAN_FxR1[7:0] +器 +屏蔽位寄存 +CAN_FxR2[31:24] CAN_FxR2[23:16] CAN_FxR2[15:8] CAN_FxR2[7:0] +器 +映射 STID[10:3] STID[2:0] EXID[17:13] EXID[12:5] EXID[4:0] IDE RTR 0 +在 16 位模式下,寄存器组被拆分成四个寄存器,屏蔽位模式每组过滤器的屏蔽位模式可以有 2 +个过滤器,每个过滤器里各包含一个16位标识符寄存器和16位屏蔽寄存器;标识符列表模式下四个 +寄存器都用作标识符寄存器。 +表24-3 16位屏蔽位模式 +标识符寄存器n CAN_FxR1[15:8] CAN_FxR1[7:0] +屏蔽位寄存器n CAN_FxR1[31:24] CAN_FxR1[23:16] +标识符寄存器n+1 CAN_FxR2[15:8] CAN_FxR2[7:0] +屏蔽位寄存器n+1 CAN_FxR2[31:24] CAN_FxR2[23:16] +映射 STID[10:3] STID[2:0] RTR IDE EXID[17:15] +表24-4 16位标识符列表模式 +标识符寄存器n CAN_FxR1[15:8] CAN_FxR1[7:0] +屏蔽位寄存器n CAN_FxR1[31:24] CAN_FxR1[23:16] +标识符寄存器n+1 CAN_FxR2[15:8] CAN_FxR2[7:0] +屏蔽位寄存器n+1 CAN_FxR2[31:24] CAN_FxR2[23:16] +映射 STID[10:3] STID[2:0] RTR IDE EXID[17:15] +报文进入 FIFO 邮箱中,会被应用程序读取并存放,通常应用程序根据报文标识符来区分报文数 +据。CAN控制器对接收FIFO中通过不同过滤器筛选的报文,提供了过滤器编号,编号被存放在寄存器 +CAN_RXMDTRx的FMI[7:0]中,编号时不考虑过滤器组是否启用。编号规则详见图24-4的示例。 +当出现某个报文能通过多个过滤器的过滤,则接收邮箱中存放的过滤器编号根据过滤器优先级规 +则来决定存放哪个过滤器的编号,过滤器优先级规则如下: + 所有32位的过滤器优先级均高于16位的过滤器 + 对于同样宽度的过滤器,标识符列表的过滤器优先级高于屏蔽位模式的过滤器 + 宽度和模式都一致的过滤器,编号小的过滤器优先级更高 +如图24-5所示:在接收报文时,先把标识符与32位标识符列表模式过滤器进行匹配筛选,没有 +匹配再与32位屏蔽位模式过滤器进行匹配筛选,没有匹配则继续与16位标识符列表模式过滤器进行 +V2.4 364 + +# Page 368 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +匹配筛选,没有匹配最后与16位屏蔽位模式过滤器进行匹配筛选,最后如果都没有匹配则丢弃报文, +出现匹配则报文存入接收FIFO的邮箱,标识符编号存入寄存器CAN_RXMDTRx的FMI中。 +图24-4 过滤器编号的示例 +Filter group Filter Filter group Filter +FIFO0 FIFO1 +number number number number +0 +0 32-bit shield mode 0 1 16-bit list mode 1 +2 +3 +1 +2 16-bit list mode 2 4 16-bit shield mode 4 +3 5 +4 +3 32-bit list mode 5 6 32-bit list mode 6 +6 7 +Disabled 16-bit +5 shield Mode 7 8 9 32-bit shield mode 8 +7 32-bit shield mode 9 11 Disabled 16-bit 9 +shield Mode 10 +8 32-bit list mode 10 12 32-bit list mode 11 +11 12 +10 16-bit shield mode 12 13 32-bit list mode 13 +13 14 +图24-5 过滤器过滤示例 +Messages received +identifier Control Data +List filter 0 +List filter 1 +32-bit List filter 7 Passed the screening +filter List filter 8 Save +Shield filter 2 messages +Shield filter 11 Save the +number to +FMI. +List filter 3 +List filter 4 +16-bit List filter 5 +filter List filter 6 +Shield filter 9 +Shield filter 10 +No match, discard message +24.5.7 出错处理 +CAN控制器依靠状态错误寄存器CAN_ERRSR,对于总线上的出错管理。状态错误寄存器CAN_ERRSR +里的TEC和REC,分别代表发送和接收错误计数值,根据随着收发错误的增加而增加,收发成功而减 +V2.4 365 + +# Page 369 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +小,可以根据它们的值来判断CAN总线的稳定性。 +当状态错误寄存器CAN_ERRSR里的TEC和REC小于128时,当前CAN节点处于错误主动状态,可 +以正常参与总线通信,并且在侦测到错误的时候发出主动错误标志。 +当状态错误寄存器CAN_ERRSR里的TEC和REC大于127时,当前CAN节点处于错误被动状态,并 +且在侦测到错误的时候不允许发出主动错误标志,只能发出被动错误标志。 +当状态错误寄存器CAN_ERRSR里的TEC大于255时,当前CAN节点进入离线状态。 +当总线监测到 128 次出现 11 个连续的隐性位时,恢复到错误主动状态,该恢复方式受主控制寄 +存器 CAN_CTLR里的 ABOM位影响。若 ABOM置 1,则硬件自动退出离线状态。若 ABOM为 0,则需要软 +件操作INRQ位进入初始化模式,随后退出初始化,才能退出离线状态。 +图24-6 CAN错误状态切换图 +When TEC or REC>127 +Error active Error passive +status state +When TEC or REC<128 +When TEC> +When the bus +255 +appears 128 times, +11 recessive bits +Offline +status +24.5.8 位时序 +按照CAN总线的标准,将每一位时间分为四段:分别为同步段、传播时间段、相位缓冲段1和相 +位缓冲段2。这些段由最小时间单元Tq组成。CAN控制器通过采样来监测CAN总线变化,通过帧起始 +位的边沿进行同步 +CAN控制器把上述四段重新划分为三段,分别为: + 同步段(SS):也就是CAN标准里的同步段,固定为1个最小时间单元,正常情况下所期望的 +位跳变发生在本时间段内。 + 时间段1(BS1):包含CAN标准里的传播时间段和相位缓冲段1,可以被设置为包含1到16最 +小时间单元,可以被自动延长,用于补偿CAN总线上不同节点频率精度误差带来的相位正向漂移。 +该时间段结束为采样点位置。 + 时间段2(BS2):也就是CAN标准里的相位缓冲段2,可以被设置为1到8个最小时间单元, +可以被自动缩短,以补偿CAN总线上不同节点频率精度误差带来的相位负向漂移。 +重新同步跳转宽度(SJW),是每位中可以延长和缩小的最小时间单元数量上限,范围可设置为1 +到4个最小时间单元。 +上述参数都可以在CAN总线时序寄存器CAN_BTIMR里配置。 +V2.4 366 + +# Page 370 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图24-7 跳变出现在BS1中 +Before adjustment: +SS BS1 BS2 SS +After adjustment: +SS BS1 BS2 SS +如图24-7,SJW为2,总线电平跳变在时间段1被检测到,则需要延长时间段1的长度,最大延 +长SJW,从而延迟采样点的位置。 +图24-8 跳变出现在BS2中 +Before adjustment: +BS2 SS BS1 BS2 +After adjustment: +BS2 SS BS1 BS2 SS +如图24-8,SJW为2,总线电平跳变在时间段2被检测到,则需要缩小时间段2的长度,最大缩 +小SJW,从而提前采样点的位置。 +CAN波特率计算公式为: +( ) +tpclk1 +这里tpclk1为PCBA1N时bp钟s周=期,BRP[9:0]、TS1[3:0]、TS2[2:0]为CANx_BTIMR寄存器对应位。 +TS1[3:0]+1+TS2[2:0]+1+1 ×BRP[9:0] +24.6 CAN 中断 +CAN 控制器有四个中断向量,分别为发送中断、FIFO_0 中断、FIFO_1 中断、错误及状态变化中 +断。 +设置CAN中断允许寄存器CAN_INTENR,可以允许或禁用各个中断源。 +发送中断由发送邮箱变空事件产生,中断产生后,查询寄存器 CAN_TSTATR 的 RQCP0、RQCP1 和 +RQCP2位来判断是哪个邮箱变空事件产生。 +FIFO0中断由接收新报文、接收邮箱变满和溢出事件产生,中断产生后,查询寄存器CAN_RFIFO0 +的FMP0、FULL0和FOVER0位来判断是哪个邮箱变空事件产生。 +FIFO1中断由接收新报文、接收邮箱变满和溢出事件产生,中断产生后,查询寄存器CAN_RFIFO1 +的FMP1、FULL1和FOVER1位来判断是哪个邮箱变空事件产生。 +V2.4 367 + +# Page 371 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +错误及状态变化中断由出错、唤醒和睡眠事件产生。 +图24-9 CAN中断逻辑图 +R32_CAN_INTENR +Send interrupt +RQCP0 TMEIE +R32_CAN_TSTART RQCP1 +RQCP2 +FMPIE0 +FMP0 +FIFO0 interrupts +FFIE0 +R32_CAN_RFIF00 FULL0 +FOVIE0 +FOVR0 +FMPIE1 +FMP1 +FIFO1 interrupts +FFIE1 +R32_CAN_RFIF01 FULL1 +FOVIE1 +FOVR1 +ERRIE +EWGIE +EWGF +EPVIE +EPVF +R32_CAN_ERRSR ERRI +BOFIE +BOFF R32_CAN_STATR +LECIE Status change +1≤LEC≤6 error interrupt +WKUIE +WKUI +R32_CAN_STATR +SLKIE +SLAKI +24.7 寄存器描述 +CAN 控制器相关的寄存器必须用 32 位字的方式来操作。为了避免当前节点对整个 CAN 总线的影 +响,所以应用软件只能在初始化模式下修改位时序寄存器CAN_BTIMR。 +表24-5 CAN1相关寄存器列表 +名称 访问地址 描述 复位值 +R32_CAN1_CTLR 0x40006400 CAN1主控制寄存器 0x00010002 +R32_CAN1_STATR 0x40006404 CAN1主状态寄存器 0x00000X02 +R32_CAN1_TSTATR 0x40006408 CAN1发送状态寄存器 0x1C000000 +R32_CAN1_RFIFO0 0x4000640C CAN1接收FIFO0控制和状态寄存器 0x00000000 +R32_CAN1_RFIFO1 0x40006410 CAN1接收FIFO1控制和状态寄存器 0x00000000 +R32_CAN1_INTENR 0x40006414 CAN1中断使能寄存器 0x00000000 +V2.4 368 + +# Page 372 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_CAN1_ERRSR 0x40006418 CAN1错误状态寄存器 0x00000000 +R32_CAN1_BTIMR 0x4000641C CAN1位时序寄存器 0x01230000 +R32_CAN1_TTCTLR 0x40006420 CAN1时间触发控制寄存器 0x0000FFFF +R32_CAN1_TTCNT 0x40006424 CAN1时间触发计数值寄存器 0x00000000 +表24-6 CAN2相关寄存器列表 +名称 访问地址 描述 复位值 +R32_CAN2_CTLR 0x40006800 CAN2主控制寄存器 0x00010002 +R32_CAN2_STATR 0x40006804 CAN2主状态寄存器 0x00000X02 +R32_CAN2_TSTATR 0x40006808 CAN2发送状态寄存器 0x1C000000 +R32_CAN2_RFIFO0 0x4000680C CAN2接收FIFO0控制和状态寄存器 0x00000000 +R32_CAN2_RFIFO1 0x40006810 CAN2接收FIFO1控制和状态寄存器 0x00000000 +R32_CAN2_INTENR 0x40006814 CAN2中断使能寄存器 0x00000000 +R32_CAN2_ERRSR 0x40006818 CAN2错误状态寄存器 0x00000000 +R32_CAN2_BTIMR 0x4000681C CAN2位时序寄存器 0x01230000 +R32_CAN2_TTCTLR 0x40006820 CAN2时间触发控制寄存器 0x0000FFFF +R32_CAN2_TTCNT 0x40006824 CAN2时间触发计数值寄存器 0x00000000 +表24-7 CAN1邮箱相关寄存器列表 +复位 +名称 访问地址 描述 +值 +R32_CAN1_TXMIR0 0x40006580 CAN1发送邮箱0标识符寄存器 X +R32_CAN1_TXMDTR0 0x40006584 CAN1发送邮箱0数据长度和时间戳寄存器 X +R32_CAN1_TXMDLR0 0x40006588 CAN1发送邮箱0低字节数据寄存器 X +R32_CAN1_TXMDHR0 0x4000658C CAN1发送邮箱0高字节数据寄存器 X +R32_CAN1_TXMIR1 0x40006590 CAN1发送邮箱1标识符寄存器 X +R32_CAN1_TXMDTR1 0x40006594 CAN1发送邮箱1数据长度和时间戳寄存器 X +R32_CAN1_TXMDLR1 0x40006598 CAN1发送邮箱1低字节数据寄存器 X +R32_CAN1_TXMDHR1 0x4000659C CAN1发送邮箱1高字节数据寄存器 X +R32_CAN1_TXMIR2 0x400065A0 CAN1发送邮箱2标识符寄存器 X +R32_CAN1_TXMDTR2 0x400065A4 CAN1发送邮箱2数据长度和时间戳寄存器 X +R32_CAN1_TXMDLR2 0x400065A8 CAN1发送邮箱2低字节数据寄存器 X +R32_CAN1_TXMDHR2 0x400065AC CAN1发送邮箱2高字节数据寄存器 X +R32_CAN1_RXMIR0 0x400065B0 CAN1接收FIFO0邮箱标识符寄存器 X +CAN1 接收 FIFO0 邮箱数据长度和时间戳寄存 +R32_CAN1_RXMDTR0 0x400065B4 X +器 +R32_CAN1_RXMDLR0 0x400065B8 CAN1接收FIFO0邮箱低字节数据寄存器 X +R32_CAN1_RXMDHR0 0x400065BC CAN1接收FIFO0邮箱高字节数据寄存器 X +R32_CAN1_RXMIR1 0x400065C0 CAN1接收FIFO1邮箱标识符寄存器 X +CAN1 接收 FIFO1 邮箱数据长度和时间戳寄存 +R32_CAN1_RXMDTR1 0x400065C4 X +器 +R32_CAN1_RXMDLR1 0x400065C8 CAN1接收FIFO1邮箱低字节数据寄存器 X +R32_CAN1_RXMDHR1 0x400065CC CAN1接收FIFO1邮箱高字节数据寄存器 X +V2.4 369 + +# Page 373 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表24-8 CAN2邮箱相关寄存器列表 +复位 +名称 访问地址 描述 +值 +R32_CAN2_TXMIR0 0x40006980 CAN2发送邮箱0标识符寄存器 X +R32_CAN2_TXMDTR0 0x40006984 CAN2发送邮箱0数据长度和时间戳寄存器 X +R32_CAN2_TXMDLR0 0x40006988 CAN2发送邮箱0低字节数据寄存器 X +R32_CAN2_TXMDHR0 0x4000698C CAN2发送邮箱0高字节数据寄存器 X +R32_CAN2_TXMIR1 0x40006990 CAN2发送邮箱1标识符寄存器 X +R32_CAN2_TXMDTR1 0x40006994 CAN2发送邮箱1数据长度和时间戳寄存器 X +R32_CAN2_TXMDLR1 0x40006998 CAN2发送邮箱1低字节数据寄存器 X +R32_CAN2_TXMDHR1 0x4000699C CAN2发送邮箱1高字节数据寄存器 X +R32_CAN2_TXMIR2 0x400069A0 CAN2发送邮箱2标识符寄存器 X +R32_CAN2_TXMDTR2 0x400069A4 CAN2发送邮箱2数据长度和时间戳寄存器 X +R32_CAN2_TXMDLR2 0x400069A8 CAN2发送邮箱2低字节数据寄存器 X +R32_CAN2_TXMDHR2 0x400069AC CAN2发送邮箱2高字节数据寄存器 X +R32_CAN2_RXMIR0 0x400069B0 CAN2接收FIFO0邮箱标识符寄存器 X +CAN2 接收 FIFO0 邮箱数据长度和时间戳寄存 +R32_CAN2_RXMDTR0 0x400069B4 X +器 +R32_CAN2_RXMDLR0 0x400069B8 CAN2接收FIFO0邮箱低字节数据寄存器 X +R32_CAN2_RXMDHR0 0x400069BC CAN2接收FIFO0邮箱高字节数据寄存器 X +R32_CAN2_RXMIR1 0x400069C0 CAN2接收FIFO1邮箱标识符寄存器 X +CAN2 接收 FIFO1 邮箱数据长度和时间戳寄存 +R32_CAN2_RXMDTR1 0x400069C4 X +器 +R32_CAN2_RXMDLR1 0x400069C8 CAN2接收FIFO1邮箱低字节数据寄存器 X +R32_CAN2_RXMDHR1 0x400069CC CAN2接收FIFO1邮箱高字节数据寄存器 X +表24-9 CAN1过滤器相关寄存器列表 +名称 访问地址 描述 复位值 +R32_CAN1_FCTLR 0x40006600 CAN1过滤器主控制寄存器 0x2A1C0E01 +R32_CAN1_FMCFGR 0x40006604 CAN1过滤器模式寄存器 0x00000000 +R32_CAN1_FSCFGR 0x4000660C CAN1过滤器位宽寄存器 0x00000000 +R32_CAN1_FAFIFOR 0x40006614 CAN1过滤器FIFO关联寄存器 0x00000000 +R32_CAN1_FWR 0x4000661C CAN1过滤器激活寄存器 0x00000000 +R32_CAN1_F0R1 0x40006640 CAN1过滤器组0寄存器1 X +R32_CAN1_F0R2 0x40006644 CAN1过滤器组0寄存器2 X +R32_CAN1_F1R1 0x40006648 CAN1过滤器组1寄存器1 X +R32_CAN1_F1R2 0x4000664C CAN1过滤器组1寄存器2 X +R32_CAN1_F2R1 0x40006650 CAN1过滤器组2寄存器1 X +R32_CAN1_F2R2 0x40006654 CAN1过滤器组2寄存器2 X +R32_CAN1_F3R1 0x40006658 CAN1过滤器组3寄存器1 X +R32_CAN1_F3R2 0x4000665C CAN1过滤器组3寄存器2 X +R32_CAN1_F4R1 0x40006660 CAN1过滤器组4寄存器1 X +R32_CAN1_F4R2 0x40006664 CAN1过滤器组4寄存器2 X +R32_CAN1_F5R1 0x40006668 CAN1过滤器组5寄存器1 X +V2.4 370 + +# Page 374 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_CAN1_F5R2 0x4000666C CAN1过滤器组5寄存器2 X +R32_CAN1_F6R1 0x40006670 CAN1过滤器组6寄存器1 X +R32_CAN1_F6R2 0x40006674 CAN1过滤器组6寄存器2 X +R32_CAN1_F7R1 0x40006678 CAN1过滤器组7寄存器1 X +R32_CAN1_F7R2 0x4000667C CAN1过滤器组7寄存器2 X +R32_CAN1_F8R1 0x40006680 CAN1过滤器组8寄存器1 X +R32_CAN1_F8R2 0x40006684 CAN1过滤器组8寄存器2 X +R32_CAN1_F9R1 0x40006688 CAN1过滤器组9寄存器1 X +R32_CAN1_F9R2 0x4000668C CAN1过滤器组9寄存器2 X +R32_CAN1_F10R1 0x40006690 CAN1过滤器组10寄存器1 X +R32_CAN1_F10R2 0x40006694 CAN1过滤器组10寄存器2 X +R32_CAN1_F11R1 0x40006698 CAN1过滤器组11寄存器1 X +R32_CAN1_F11R2 0x4000669C CAN1过滤器组11寄存器2 X +R32_CAN1_F12R1 0x400066A0 CAN1过滤器组12寄存器1 X +R32_CAN1_F12R2 0x400066A4 CAN1过滤器组12寄存器2 X +R32_CAN1_F13R1 0x400066A8 CAN1过滤器组13寄存器1 X +R32_CAN1_F13R2 0x400066AC CAN1过滤器组13寄存器2 X +R32_CAN1_F14R1 0x400066B0 CAN1过滤器组14寄存器1 X +R32_CAN1_F14R2 0x400066B4 CAN1过滤器组14寄存器2 X +R32_CAN1_F15R1 0x400066B8 CAN1过滤器组15寄存器1 X +R32_CAN1_F15R2 0x400066BC CAN1过滤器组15寄存器2 X +R32_CAN1_F16R1 0x400066C0 CAN1过滤器组16寄存器1 X +R32_CAN1_F16R2 0x400066C4 CAN1过滤器组16寄存器2 X +R32_CAN1_F17R1 0x400066C8 CAN1过滤器组17寄存器1 X +R32_CAN1_F17R2 0x400066CC CAN1过滤器组17寄存器2 X +R32_CAN1_F18R1 0x400066D0 CAN1过滤器组18寄存器1 X +R32_CAN1_F18R2 0x400066D4 CAN1过滤器组18寄存器2 X +R32_CAN1_F19R1 0x400066D8 CAN1过滤器组19寄存器1 X +R32_CAN1_F19R2 0x400066DC CAN1过滤器组19寄存器2 X +R32_CAN1_F20R1 0x400066E0 CAN1过滤器组20寄存器1 X +R32_CAN1_F20R2 0x400066E4 CAN1过滤器组20寄存器2 X +R32_CAN1_F21R1 0x400066E8 CAN1过滤器组21寄存器1 X +R32_CAN1_F21R2 0x400066EC CAN1过滤器组21寄存器2 X +R32_CAN1_F22R1 0x400066F0 CAN1过滤器组22寄存器1 X +R32_CAN1_F22R2 0x400066F4 CAN1过滤器组22寄存器2 X +R32_CAN1_F23R1 0x400066F8 CAN1过滤器组23寄存器1 X +R32_CAN1_F23R2 0x400066FC CAN1过滤器组23寄存器2 X +R32_CAN1_F24R1 0x40006700 CAN1过滤器组24寄存器1 X +R32_CAN1_F24R2 0x40006704 CAN1过滤器组24寄存器2 X +R32_CAN1_F25R1 0x40006708 CAN1过滤器组25寄存器1 X +R32_CAN1_F25R2 0x4000670C CAN1过滤器组25寄存器2 X +R32_CAN1_F26R1 0x40006710 CAN1过滤器组26寄存器1 X +R32_CAN1_F26R2 0x40006714 CAN1过滤器组26寄存器2 X +R32_CAN1_F27R1 0x40006718 CAN1过滤器组27寄存器1 X +R32_CAN1_F27R2 0x4000671C CAN1过滤器组27寄存器2 X +V2.4 371 + +# Page 375 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +24.7.1 CANx 主控制寄存器(CANx_CTLR)(x=1/2) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved DBF +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RST Reserved TTCM ABOM AWUM NART RFLM TXFP SLEEP INRQ +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +调试是否禁止CAN总线工作: +0:调试时,CAN控制器正常工作; +16 DBF RW 1 +1:调试时,CAN的收发被禁止,但是接收FIFO +的控制和读写操作一切正常。 +CAN控制器软件复位请求,该位写0无效: +0:CAN控制器正常状态; +15 RST RW1Z 0 +1:对CAN控制器进行复位,复位后控制器进 +入睡眠模式,然后硬件自动清0。 +[14:8] Reserved RO 保留 0 +是否允许时间触发模式: +0:禁止时间触发模式; +7 TTCM RW 0 +1:使能时间触发模式。 +时间触发模式主要是配合TTCAN协议使用。 +离线自动退出控制: +0:需要软件操作寄存器CAN_CTLR的INRQ位 +置1然后清0,当检测到128次连续11个隐 +6 ABOM RW 0 +性位后,退出离线状态; +1:硬件检测到 128 次连续 11 个隐性位,自 +动退出离线状态。 +CAN控制器自动唤醒使能: +0:需要软件操作寄存器 CAN_CTLR 的 SLEEP +5 AWUM RW 位清0,唤醒CAN控制器; 0 +1:当检测到报文时,硬件自动唤醒,寄存器 +CAN_STATR的SLEEP和SLAK位自动清0。 +报文自动重传功能禁止: +4 NART RW 0:CAN控制器一直重传至发送成功为止; 0 +1:无论发送成功与否,报文只能被发送一次。 +接收FIFO报文锁定模式使能: +0:当接收 FIFO 溢出时,已接收邮箱报文未 +读出,邮箱未释放时,新接收到的报文会覆 +3 RFLM RW 0 +盖原有报文; +1:当接收FIFO溢出时,已接收邮箱报文未读 +出,邮箱未释放时,新接收到的报文被丢弃。 +2 TXFP RW 发送邮箱优先级方式选择: 0 +V2.4 372 + +# Page 376 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:优先级由报文标识符来决定; +1:优先级由发送请求的先后顺序决定。 +睡眠模式请求位: +0:软件清0后,控制器退出睡眠模式; +1:置1请求CAN控制器进入睡眠模式,当前 +1 SLEEP RW 1 +活动完成后,控制器进入睡眠模式,若AWUM +位置1,则在接收到报文时,控制器把SLEEP +位清0。 +初始化模式请求位: +0:置0请求CAN控制器退出初始化模式,进 +入正常模式,硬件对寄存器 CAN_STATR 的 +0 INRQ RW INAK位清0; 0 +1:置1请求CAN控制器进入初始化模式,当 +前活动完成后,控制器进入初始化模式,硬 +件对寄存器CAN_STATR的INAK位置1。 +24.7.2 CANx 主状态寄存器(CANx_STATR)(x=1/2) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RX SAMP RXM TXM Reserved SLAKI WKUI ERRI SLAK INAK +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +11 RX RO CAN控制器接收引脚RX当前实际电平。 x +CAN 控制器接收引脚 RX 上一个接收位的电 +10 SAMP RO x +平。 +接收模式查询位: +9 RXM RO 0:当前CAN控制器非接收模式; 0 +1:当前CAN控制器为接收模式。 +发送模式查询位: +8 TXM RO 0:当前CAN控制器非发送模式; 0 +1:当前CAN控制器为发送模式。 +[7:5] Reserved RO 保留 0 +睡眠中断使能时,即寄存器 CAN_INTENR 的 +SLKIE 位置 1 时,中断产生标志位,写 1 清 +4 SLAKI RW1Z 0,写0无效。 0 +0:退出睡眠模式时,硬件清0也可软件清0; +1:进入睡眠模式时,中断产生,硬件置1。 +唤醒中断标志位。当寄存器 CAN_INTENR 的 +WKUI位置1时,若 CAN控制器处于睡眠模式 +3 WKUI RW1Z 0 +时,检测到SOF位,则硬件置1。软件置1清 +0,置0无效。 +V2.4 373 + +# Page 377 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +出错中断状态标志位。当寄存器 CAN_INTENR +2 ERRI RW1Z 的 ERRIE 位置 1 时,产生错误及状态变化中 0 +断。该位软件置1清0,置0无效。 +睡眠模式指示位。 +1 SLAK RO 0:CAN控制器不在睡眠模式; 1 +1:CAN控制器正处于睡眠模式。 +初始化模式指示位。 +0 INAK RO 0:CAN控制器工作在非初始化模式; 0 +1:CAN控制器正在初始化模式。 +24.7.3 CANx 发送状态寄存器(CANx_TSTATR)(x=1/2) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +LOW2 LOW1 LOW0 TME2 TME1 TME0 CODE[1:0] ABRQ2 Reserved TERR2 ALST2 TXOK2 RQCP2 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ABRQ1 Reserved TERR1 ALST1 TXOK1 RQCP1 ABRQ0 Reserved TERR0 ALST0 TXOK0 RQCP0 +位 名称 访问 描述 复位值 +发送邮箱2的最低优先级标志位: +31 LOW2 RO 0:表示发送邮箱2的优先级非最低; 0 +1:表示发送邮箱2的优先级最低。 +发送邮箱1的最低优先级标志位: +30 LOW1 RO 0:表示发送邮箱1的优先级非最低; 0 +1:表示发送邮箱1的优先级最低。 +发送邮箱0的最低优先级标志位: +29 LOW0 RO 0:表示发送邮箱0的优先级非最低; 0 +1:表示发送邮箱0的优先级最低。 +发送邮箱2的空标志位: +28 TME2 RO 0:表示发送邮箱2有等待发送报文; 1 +1:表示发送邮箱2无等待发送报文。 +发送邮箱1的空标志位: +27 TME1 RO 0:表示发送邮箱1有等待发送报文; 1 +1:表示发送邮箱1无等待发送报文。 +发送邮箱0的空标志位: +26 TME0 RO 0:表示发送邮箱0有等待发送报文; 1 +1:表示发送邮箱0无等待发送报文。 +邮箱编号: +当有 1 个以上邮箱为空时,表示下一个为空 +[25:24] CODE[1:0] RO 0 +的邮箱号;当邮箱全空时,表示优先级最低 +的邮箱号。 +发送邮箱2的发送中止请求。软件置1,可以 +23 ABRQ2 RW1 中止邮箱 2 的发送请求,发送报文被清除时 0 +硬件清0,若邮箱2清空,软件置1无效。 +[22:20] Reserved RO 保留。 0 +V2.4 374 + +# Page 378 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +发送邮箱 2 发送失败标志位,当发送邮箱 2 +19 TERR2 RW1Z 发送失败,该位自动置1。软件置1清0,软 0 +件写0无效。 +发送邮箱 2 仲裁失败标志位,当发送邮箱 2 +18 ALST2 RW1Z 仲裁优先级低导致发送失败,该位自动置1。 0 +软件置1清0,软件写0无效。 +发送邮箱2发送成功标志位: +0:上次发送失败; +17 TXOK2 RW1Z 0 +1:上次发送成功。 +软件置1清0,软件写0无效。 +发送邮箱 2 请求完成标志位,当发送邮箱 2 +16 RQCP2 RW1Z 的发送或中止请求完成时,该位自动置1。软 0 +件置1清0,软件写0无效。 +发送邮箱1的发送中止请求。软件置1,可以 +15 ABRQ1 RW1Z 中止邮箱 1 的发送请求,发送报文被清除时 0 +硬件清0。软件写0无效。 +[14:12] Reserved RO 保留。 0 +发送邮箱 1 发送失败标志位,当发送邮箱 1 +11 TERR1 RW1Z 发送失败,该位自动置1。软件置1清0,软 0 +件写0无效。 +发送邮箱 1 仲裁失败标志位,当发送邮箱 1 +10 ALST1 RW1Z 0 +仲裁优先级低导致发送失败,该位自动置1。 +发送邮箱1发送成功标志位: +0:上次发送失败; +9 TXOK1 RW1Z 0 +1:上次发送成功。 +软件置1清0,软件写0无效。 +发送邮箱 1 请求完成标志位,当发送邮箱 1 +8 RQCP1 RW1Z 的发送或中止请求完成时,该位自动置1。 0 +软件置1清0,软件写0无效。 +发送邮箱0的发送中止请求。软件置1,可以 +7 ABRQ0 RW1Z 中止邮箱 0 的发送请求,发送报文被清除时 0 +硬件清0。软件写0无效。 +[6:4] Reserved RO 保留 0 +发送邮箱 0 发送失败标志位,当发送邮箱 0 +3 TERR0 RW1Z 发送失败,该位自动置1。软件置1清0,软 0 +件写0无效。 +发送邮箱 0 仲裁失败标志位,当发送邮箱 0 +2 ALST0 RW1Z 仲裁优先级低导致发送失败,该位自动置1。 0 +软件置1清0,软件写0无效。 +发送邮箱0发送成功标志位: +0:上次发送失败; +1 TXOK0 RW1Z 0 +1:上次发送成功。 +软件置1清0,软件写0无效。 +发送邮箱 0 请求完成标志位,当发送邮箱 0 +0 RQCP0 RW1Z 的发送或中止请求完成时,该位自动置1。软 0 +件置1清0,软件写0无效。 +V2.4 375 + +# Page 379 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +24.7.4 CANx 接收 FIFO 0 状态寄存器(CANx_RFIFO0)(x=1/2) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser +Reserved RFOM0 FOVR0 FULL0 FMP0[1:0] +ved +位 名称 访问 描述 复位值 +[31:6] Reserved RO 保留。 0 +软件对该位置1,则释放接收FIFO_0的当前 +5 RFOM0 RW1Z 邮箱报文,释放完后自动清 0,软件写 0 无 0 +效。 +接收 FIFO_0 溢出标志位。当 FIFO_0 中有三 +4 FOVR0 RW1Z 个报文时,又接到新报文,硬件置1。该位需 0 +要软件置1清0,软件写0无效。 +接收 FIFO_0 满标志位。当 FIFO_0 中有三个 +3 FULL0 RW1Z 报文时,硬件置1。该位需要软件置1清0, 0 +软件写0无效。 +2 Reserved RO 保留。 0 +[1:0] FMP0[1:0] RO 接收FIFO_0报文数目。 0 +24.7.5 CANx 接收 FIFO 1 状态寄存器(CANx_RFIFO1)(x=1/2) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser +Reserved RFOM1 FOVR1 FULL1 FMP1[1:0] +ved +位 名称 访问 描述 复位值 +[31:6] Reserved RO 保留。 0 +软件对该位置1,则释放接收FIFO_1的当前 +5 RFOM1 RW1Z 邮箱报文,释放完后自动清 0,软件写 0 无 0 +效。 +接收 FIFO_1 溢出标志位。当 FIFO_1 中有三 +4 FOVR1 RW1Z 个报文时,又接到新报文,硬件置1。该位需 0 +要软件置1清0,软件写0无效。 +接收 FIFO_1 满标志位。当 FIFO_1 中有三个 +3 FULL1 RW1Z 报文时,硬件置1。该位需要软件置1清0, 0 +软件写0无效。 +2 Reserved RF 保留。 0 +V2.4 376 + +# Page 380 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[1:0] FMP1[1:0] RO 接收FIFO_1报文数目。 0 +24.7.6 CANx 中断使能寄存器(CANx_INTENR)(x=1/2) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved SLKIE WKUIE +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser FOV FMP FOV FMP +ERRIE Reserved LECIE BOFIE EPVIE EWGIE FFIE1 FFIE0 TMEIE +ved IE1 IE1 IE0 IE0 +位 名称 访问 描述 复位值 +[31:18] Reserved RO 保留。 0 +睡眠中断使能位: +17 SLKIE RW 0:进入睡眠状态时,不产生中断; 0 +1:进入睡眠状态时,产生中断。 +唤醒中断使能位: +16 WKUIE RW 0:当CAN控制器被唤醒时,不产生中断; 0 +1:当CAN控制器被唤醒时,产生中断。 +错误中断使能位,CAN错误中断总使能位: +15 ERRIE RW 0:当CAN控制器产生错误时,不产生中断; 0 +1:当CAN控制器产生错误时,产生中断。 +[14:12] Reserved RF 保留。 0 +上次错误号中断使能位: +0:检测到错误时,硬件更新LEC[2:0],不更 +11 LECIE RW 新ERRI位,不触发错误中断; 0 +1:检测到错误时,硬件更新LEC[2:0],更新 +ERRI位为1,触发错误中断。 +离线中断使能位: +0:进入离线状态时,不更新 ERRI 位,不触 +10 BOFIE RW 发错误中断; 0 +1:进入离线状态时,更新ERRI位为1,触发 +错误中断。 +错误被动中断使能位: +0:进入错误被动状态时,不更新 ERRI 位, +9 EPVIE RW 不触发错误中断; 0 +1:进入错误被动状态时,更新ERRI位为1, +触发错误中断。 +错误警告中断使能位: +0:出错次数达到警告阈值时,不更新 ERRI +8 EWGIE RW 位,不触发错误中断; 0 +1:出错次数达到警告阈值时,更新 ERRI 位 +为1,触发错误中断。 +7 Reserved RF 保留。 0 +6 FOVIE1 RW 接收FIFO_1溢出中断使能位: 0 +V2.4 377 + +# Page 381 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:当FIFO_1溢出,不触发FIFO_1中断; +1:当FIFO_1溢出,触发FIFO_1中断。 +接收FIFO_1满中断使能位: +5 FFIE1 RW 0:当FIFO_1为满,不触发FIFO_1中断; 0 +1:当FIFO_1为满,触发FIFO_1中断。 +接收FIFO_1消息挂号中断使能位: +0:当FIFO_1更新FMP位,且不为0,不触发 +4 FMPIE1 RW FIFO_1中断; 0 +1:当 FIFO_1 更新 FMP 位,且不为 0,触发 +FIFO_1中断。 +接收FIFO_0溢出中断使能位: +3 FOVIE0 RW 0:当FIFO_0溢出,不触发FIFO_0中断; 0 +1:当FIFO_0溢出,触发FIFO_0中断。 +接收FIFO_0满中断使能位: +2 FFIE0 RW 0:当FIFO_0为满,不触发FIFO_0中断; 0 +1:当FIFO_0为满,触发FIFO_0中断。 +接收FIFO_0消息挂号中断使能位: +0:当FIFO_0更新FMP位,且不为0,不触发 +1 FMPIE0 RW FIFO_0中断; 0 +1:当 FIFO_0 更新 FMP 位,且不为 0,触发 +FIFO_0中断。 +发送邮箱空中断: +0 TMEIE RW 0:当发送邮箱为空时,不产生中断; 0 +1:当发送邮箱为空时,产生中断。 +24.7.7 CANx 错误状态寄存器(CANx_ERRSR)(x=1/2) +偏移地址:0x18 +2 +31 30 29 28 27 26 25 24 23 22 21 19 18 17 16 +0 +REC[7:0] TEC[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved LEC[2:0] Reserved BOFF EPVF EWGF +位 名称 访问 描述 复位值 +接收错误计数器: +当 CAN 接收出错时,根据出错条件,该计数 +[31:24] REC[7:0] RO 器加 1 或 8;接收成功后,该计数器减 1 或 0 +设为120(错误计数值大于127)。计数器值 +超过127时,CAN进入错误被动状态。 +发送错误计数器: +当 CAN 发送出错时,根据出错条件,该计数 +[23:16] TEC[7:0] RO 器加 1 或 8;发送成功后,该计数器减 1 或 0 +设为120(错误计数值大于127)。计数器值 +超过127时,CAN进入错误被动状态。 +V2.4 378 + +# Page 382 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[15:7] Reserved RO 保留。 0 +上次错误代号: +检测到 CAN 总线上发送错误时,控制器根据 +出错情况设置,当正确收发报文时,置000b。 +000:无错误; +001:位填充错误; +010:FORM格式错误; +[6:4] LEC{2:0} RW 011:ACK确认错误; 000b +100:隐性位错误; +101:显性位错误; +110:CRC错误; +111:软件设置。 +通常应用软件读取到错误时,把代号设置为 +111b,可以检测到代号更新。 +3 Reserved RO 保留。 0 +离线状态标志位: +2 BOFF RO 当 CAN 控制器进入离线状态时,硬件自动置 0 +1;退出离线状态时,硬件自动清0。 +错误被动标志位: +1 EPVF RO 当收发错误计数器达到错误被动阈值时,即 0 +大于127时,硬件置1。 +错误警告标志位: +0 EWGF RO 当收发错误计数器达到警告阈值时,即大于 0 +等于96时,硬件置1。 +24.7.8 CANx 位时序寄存器(CANx_BTIMR)(x=1/2) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +SILM LBKM Reserved SJW[1:0] Reserved TS2[2:0] TS1[3:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved BRP[9:0] +位 名称 访问 描述 复位值 +静默模式设置位: +31 SILM RW 0:退出静默模式; 0 +1:进入静默模式。 +环回模式设置位: +30 LBKM RW 0:退出环回模式; 0 +1:进入环回模式。 +[29:26] Reserved RO 保留。 0 +定义了重新同步跳转宽度设置值: +实现重新同步时,位中可以延长和缩小的最 +[25:24] SJW[1:0] RW 01b +小 时 间 单 元 数 量 上 限 , 实 际 值 为 +(SJW[1:0]+1),范围可设置为 1 到 4 个最 +V2.4 379 + +# Page 383 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +小时间单元。 +23 Reserved RO 保留。 0 +时间段2设置值: +[22:20] TS2[2:0] RW 定义了时间段 2 占用了多少个最小时间单 010b +元,实际值为(TS2[2:0]+1)。 +时间段1设置值: +[19:16] TS1[3:0] RW 定义了时间段 1 占用了多少个最小时间单 0011b +元,实际值为(TS1[3:0]+1)。 +[15:10] Reserved RO 保留。 0 +最小时间单元长度设置值 +Tq =(BRP[9:0]+1)×t +pclk +[9:0] BRP[9:0] RW 注:CAN波特率计算公式为: 0 +CANbps=PCLK1/((TSI[3:0]+1+TS2[2:0]+1+1 +)*(BPR[9:0]+1)) +24.7.9 CANx 时间触发控制寄存器(CANx_TTCTLR)(x=1/2) +偏移地址:0x20 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIMRS +Reserved MODE +T +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TIMCMV[15:0] +位 名称 访问 描述 复位值 +[31:18] Reserved RO 保留。 0 +时间触发模式选择位: +17 MODE RW 0:默认模式; 0 +1:增强模式。 +内部计数器复位控制位: +16 TIMRST WZ 0 +写1复位内部计数器,硬件自动清0 +[15:0] TIMCMV[15:0] RW 内部计数器计数终值。 0xFFFF +24.7.10 CANx 时间触发计数值寄存器(CANx_TTCNT)(x=1/2) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TIMCNT[15:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +[15:0] TIMCNT[15:0] RW 时间触发计数值。 0 +V2.4 380 + +# Page 384 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +24.7.11 CANx 发送邮箱标识符寄存器(CANx_TXMIRy)(x=1/2,y=0/1/2) +偏移地址:0x180,0x190,0x1A0 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +STID[10:0]/EXID[28:18] EXID[17:13] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXID[12:0] IDE RTR TXRQ +位 名称 访问 描述 复位值 +STID[10:0] +[31:21] RW 标准标识符或扩展标识符的高11位。 x +/EXID[28:18] +[20:3] EXID[17:0] RW 扩展标识符的低18位。 x +标识符选择标志位: +2 IDE RW 0:选用标准标识符; x +1:选用扩展标识符。 +远程帧(也称遥控帧)选择标志位: +1 RTR RW 0:当前为数据帧; x +1:当前为远程帧。 +数据发送请求标志位: +0 TXRQ RW 软件置 1 时,请求发送邮箱里的数据,发送 0 +完毕邮箱为空时,硬件清0。 +24.7.12 CANx 发送邮箱数据长度和时间戳寄存器(CANx_TXMDTRy)(x=1/2, +y=0/1/2) +偏移地址:0x184,0x194,0x1A4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIME[15:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TGT Reserved DLC[3:0] +位 名称 访问 描述 复位值 +[31:16] TIME[15:0] RW 用于发送报文SOF时刻的16位定时器值。 x +[15:9] Reserved RO 保留。 0 +报文时间戳发送选择标志位。该位在TTCM置 +1,并报文长度为8时有效。 +8 TGT RW 0:不发送时间戳; x +1:发送时间戳,值为TIME[15:0]的即时值, +替换了8字节报文的最后两个字节。 +[7:4] Reserved RO 保留。 0 +数据帧的数据长度或远程帧请求数据长度 +[3:0] DLC[3:0] RW 0 +数据长度可设置范围为0到8。 +24.7.13 CANx 发送邮箱低字节数据寄存器(CANx_TXMDLRy)(x=1/2,y=0/1/2) +偏移地址:0x188,0x198,0x1A8 +V2.4 381 + +# Page 385 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DATA3[7:0] DATA2[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA1[7:0] DATA0[7:0] +位 名称 访问 描述 复位值 +[31:24] DATA3[7:0] RW 发送数据字节3的内容。 x +[23:16] DATA2[7:0] RW 发送数据字节2的内容。 x +[15:8] DATA1[7:0] RW 发送数据字节1的内容。 x +[7:0] DATA0[7:0] RW 发送数据字节0的内容。 x +24.7.14 CANx 发送邮箱高字节数据寄存器(CANx_TXMDHRy)(x=1/2,y=0/1/2) +偏移地址:0x18C,0x19C,0x1AC +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DATA7[7:0] DATA6[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA5[7:0] DATA4[7:0] +位 名称 访问 描述 复位值 +[31:24] DATA7[7:0] RW 发送数据字节7的内容。 x +[23:16] DATA6[7:0] RW 发送数据字节6的内容。 x +[15:8] DATA5[7:0] RW 发送数据字节5的内容。 x +[7:0] DATA4[7:0] RW 发送数据字节4的内容。 x +24.7.15 CANx 接收邮箱标识符寄存器(CANx_RXMIRy)(x=1/2,y=0/1) +偏移地址:0x1B0,0x1C0 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +STID[10:0]/EXID[28:18] EXID[17:13] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +EXID[12:0] IDE RTR TXRQ +位 名称 访问 描述 复位值 +STID[10:0] +[31:21] RO 标准标识符或扩展标识符的高11位。 x +/EXIDH[28:18] +[20:3] EXIDL[17:0] RO 扩展标识符的低18位。 x +标识符选择标志位。 +2 IDE RO 0:选用标准标识符; x +1:选用扩展标识符。 +远程帧(也称遥控帧)选择标志位。 +1 RTR RO x +0:当前为数据帧; +V2.4 382 + +# Page 386 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:当前为远程帧。 +0 Reserved RO 保留。 x +24.7.16 CANx 接收邮箱数据长度和时间戳寄存器(CANx_RXMDTRy)(x=1/2,y=0/1) +偏移地址:0x1B4,0x1C4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIME[15:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FMI[7:0] Reserved DLC[3:0] +位 名称 访问 描述 复位值 +[31:16] TIME[15:0] RO 用于接收报文SOF时刻的16位定时器值。 x +[15:8] FMI[7:0] RO 报文所匹配的过滤器编号。 x +[7:4] Reserved RO 保留。 0 +接收报文数据长度。 +[3:0] DLC[3:0] RO x +数据帧长度0到8,远程帧为0。 +24.7.17 CANx 接收邮箱低字节数据寄存器(CANx_RXMDLRy)(x=1/2,y=0/1) +偏移地址:0x1B8,0x1C8 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DATA3[7:0] DATA2[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA1[7:0] DATA0[7:0] +位 名称 访问 描述 复位值 +[31:24] DATA3[7:0] RO 接收报文的数据字节3。 x +[23:16] DATA2[7:0] RO 接收报文的数据字节2。 x +[15:8] DATA1[7:0] RO 接收报文的数据字节1。 x +[7:0] DATA0[7:0] RO 接收报文的数据字节0。 x +24.7.18 CANx 接收邮箱高字节数据寄存器(CANx_RXMDHRy)(x=1/2,y=0/1) +偏移地址:0x1BC,0x1CC +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DATA7[7:0] DATA6[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATA5[7:0] DATA4[7:0] +位 名称 访问 描述 复位值 +[31:24] DATA7[7:0] RO 接收报文的数据字节7。 x +[23:16] DATA6[7:0] RO 接收报文的数据字节6。 x +[15:8] DATA5[7:0] RO 接收报文的数据字节5。 x +V2.4 383 + +# Page 387 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[7:0] DATA4[7:0] RO 接收报文的数据字节4。 x +24.7.19 CANx 过滤器主控制寄存器(CANx_FCTLR)(x=1/2) +偏移地址:0x200 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved CAN2SB[5:0] Reserved FINIT +位 名称 访问 描述 复位值 +[31:14] Reserved RO 保留。 0 +[13:8] CAN2SB[5:0] RW CAN2过滤器开始组(取值范围1-27)。 01110b +[7:1] Reserved RO 保留。 0 +过滤器初始化模式使能标志位。 +0 FINIT RW 0:过滤器组为正常模式; 1 +1:过滤器组为初始化模式。 +24.7.20 CANx 过滤器模式寄存器(CANx_FMCFGR)(x=1/2) +偏移地址:0x204 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved FBM27 FBM26 FBM25 FBM24 FBM23 FBM22 FBM21 FBM20 FBM19 FBM18 FBM17 FBM16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FBM15 FBM14 FBM13 FBM12 FBM11 FBM10 FBM9 FBM8 FBM7 FBM6 FBM5 FBM4 FBM3 FBM2 FBM1 FBM0 +位 名称 访问 描述 复位值 +[31:28] Reserved RO 保留。 0 +过滤器组x的工作模式控制位,FINIT为1才 +能写入。 +[27:0] FBMx RW 0 +0:过滤器组x的寄存器为屏蔽位模式; +1:过滤器组x的寄存器为标识符列表模式。 +注:CAN1使用bit[13:0],CAN2使用bit[27:14]。 +24.7.21 CANx 过滤器位宽寄存器(CANx_FSCFGR)(x=1/2) +偏移地址:0x20C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved FSC27 FSC26 FSC25 FSC24 FSC23 FSC22 FSC21 FSC20 FSC19 FSC18 FSC17 FSC16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FSC15 FSC14 FSC13 FSC12 FSC11 FSC10 FSC9 FSC8 FSC7 FSC6 FSC5 FSC4 FSC3 FSC2 FSC1 FSC0 +位 名称 访问 描述 复位值 +[31:28] Reserved RO 保留。 0 +V2.4 384 + +# Page 388 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +过滤器组 x 的位宽控制位,FINIT 为 1 才能写 +入。 +[27:0] FSCx RW 0 +0:过滤器组x的寄存器为2个16位; +1:过滤器组x的寄存器为单个32位。 +注:CAN1使用bit[13:0],CAN2使用bit[27:14]。 +24.7.22 CANx 过滤器 FIFO 关联寄存器(CANx_FAFIFOR)(x=1/2) +偏移地址:0x214 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved FFA27 FFA26 FFA25 FFA24 FFA23 FFA22 FFA21 FFA20 FFA19 FFA18 FFA17 FFA16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FFA15 FFA14 FFA13 FFA12 FFA11 FFA10 FFA9 FFA8 FFA7 FFA6 FFA5 FFA4 FFA3 FFA2 FFA1 FFA0 +位 名称 访问 描述 复位值 +[31:28] Reserved RO 保留。 0 +过滤器组 x的关联 FIFO控制位,FINIT 为 1 +才能写入。 +[27:0] FFAx RW 0 +0:过滤器组x被关联到FIFO_0; +1:过滤器组x被关联到FIFO_1。 +注:CAN1使用bit[13:0],CAN2使用bit[27:14]。 +24.7.23 CANx 过滤器激活寄存器(CANx_FWR)(x=1/2) +偏移地址:0x21C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT +Reserved +27 26 25 24 23 22 21 20 19 18 17 16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT FACT +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +位 名称 访问 描述 复位值 +[31:28] Reserved RO 保留。 0 +过滤器组x的激活控制位。 +[27:0] FACTx RW 0:过滤器组x禁用; 0 +1:过滤器组x激活。 +注:CAN1使用bit[13:0],CAN2使用bit[27:14]。 +24.7.24 CANx 过滤器组的过滤寄存器(CANx_FiRy)(x=1,i=0-27,y=1/2) +偏移地址:0x240-0x31C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +FB31 FB30 FB29 FB28 FB27 FB26 FB25 FB24 FB23 FB22 FB21 FB20 FB19 FB18 FB17 FB16 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +V2.4 385 + +# Page 389 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +FB15 FB14 FB13 FB12 FB11 FB10 FB9 FB8 FB7 FB6 FB5 FB4 FB3 FB2 FB1 FB0 +位 名称 访问 描述 复位值 +过滤器组中寄存器的标志位,FINIT为1才能 +写入。 +标识符模式下: +0:相应位期望电平为显性位; +[31:0] FB WO 1:相应位期望电平为隐性位。 0 +屏蔽位模式下: +0:不需要和对应的标识符寄存器位一致; +1:必须和对应的标识符寄存器位一致。 +V2.4 386 + +# Page 390 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 25 章 数字图像接口(DVP) +本章模块描述适用于CH32F20x、CH32V30x和CH32V31x微控制器系列部分产品。 +数字图像接口(DVP),它支持使用 DVP 接口时序来获取图像数据流,支持按原始的行、帧格式 +组织的图像数据,如YUV、RGB等,也支持如JPEG格式的压缩图像数据,能够接收外部8位、10位、 +12位的摄像头模块输出的高速并行数据流。 +25.1 主要特性 + 可配置8/10/12位数据宽度模式 + 支持YUV、RGB格式数据 + 支持JPEG压缩格式数据 + 内置FIFO,支持DMA传输 + 支持双缓冲接收 + 支持裁剪功能 + 支持连续模式和快照模式 +25.2 功能描述 +25.2.1 与传感器相连 +图25-1 DVP接口连接 +VSYNC +HSYNC +PCLK +Sensor Controller +DO~D11 +SCL +SDA +XCLK + PLCK(Pixel clk):像素时钟,每个时钟对应一个像素数据(非压缩数据)。外部DVP接口传 +感器输出的PCLK时钟最大支持96MHz。 + HSYNC(horizonal synchronization):行同步信号。 + VSYNC(vertical synchronization):帧同步信号。 + DATA:像素数据或压缩数据,位宽支持8/10/12位。 + XCLK:Sensor的参考时钟,可以由微控制器提供或外部提供,一般使用晶振。 + I2C接口:用来配置sensor的寄存器,可通过控制的普通GPIO口模拟I2C时序通讯,亦可使用 +硬件I2C接口操作。 +表25-1 DVP引脚 +名称 信号类型描述 +PLCK 像素时钟输入 +DATA[11:0] 像素数据输入 +VSYNC 帧同步信号输入 +HSYNC 行同步信号输入 +V2.4 387 + +# Page 391 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +25.2.2 工作时序 +一般使用的DVP接口传感器模块输出的数字信号数据流和图像大小存在一定的关系,下面以一 +个图像数据举例。 +如图25-2所示,传感器内部是一个3576*1145大小完整的图像尺寸,经过内部缩放处理,最终 +从接口输出的图像数据大小为1920*1080,图像刷新率为25。 +图25-2 时序描述 +3576 +1920 +1145 +1080 +1 frame cycle +VSYNC +25 frame cy cles = 1 second +1 row cycle +3576 +1920 +HSYNC 1656 +1145 row cycles = 1 frame cycle +1920 PCLK cycles 1656 PCLK cycles +1 PCLK +cycle +PCLK +1 row cycle = 3576 PCLKs +25*1145 row periods = 1 second +PCLK是一个像素传输的时间,所以HSYNC是PCLK的3576倍,在3576个像素中,只有1920个 +像素是有效的,剩下的1656个像素点时间内Sensor不传输数据。VSYNC是帧同步信号,所以VSYNC +时间是PCLK的3576*1145倍,同样,只有在1920*1080个有效像素时间内,Sensor在传输数据。 +如果传感器传输的是JPEG压缩后的数据,可能无需使用HSYNC信号。 +DVP接口信号和图像数据的关系具体以选用的传感器数据手册说明为主。 +25.2.3 RGB/YUV/JPEG 压缩数据格式说明 + RGB +三原色:红色、绿色、蓝色 + YUV +亮度信号Y,色度信号U和V、Pb和Pr、Cb和Cr。 + JPEG(Joint Photographic Experts Group) +有损失压缩,但损失的部分是人视觉不易察觉的部分,利用人眼对计算机色彩中高频信息部分 +不敏感的特点。去除视觉上多余信息(空间冗余度),去除数据本身的多余信息(结构冗余度)。 +V2.4 388 + +# Page 392 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +25.3 数字图像接口的应用 +25.3.1 数字图像接口配置说明 +1) DVP 的数据接收中,每一帧数据由 BUF0 和 BUF1 交替存储,从 BUF0 开始。对于 RGB 和 YUV 数据 +流,硬件在每次帧信号从无效电平变为有效电平时会复位选择 BUF0 开始,存满一行数据将会切 +换的 BUF1,实现交替存储;对于 JPEG 压缩数据,硬件会根据设置的 DMA 接收长度设置 BUF0 和 +BUF1的切换阈值。 +2) 当数据总线宽度为10位或者12位时,每接收一个数据时,系统将自动对数据进行无符号扩展到 +16位再进行存储。 +3) R16_DVP_ROW_NUM和R16_DVP_COL_NUM寄存器必须与传感器实际输出的图像大小匹配。 +4) 在视频流RGB模式下,R16_DVP_COL_NUM表示一行数据的有效PCLK周期数,R16_DVP_ROW_NUM表 +示一帧图像数据内包含的行数;在图像JPEG模式下,R16_DVP_COL_NUM用于配置DMA长度,此模 +式下,R16_DVP_ROW_NUM寄存器不起作用。 +25.3.2 数字图像接口应用说明 +在使用数字图像接口接收图像数据时,须正确配置DVP相关的控制寄存器,使其与图像传感器的 +模式相匹配,具体操作步骤如下: +1) 通过R8_DVP_CR1寄存器清除RB_DVP_ALL_CLR和RB_DVP_RCV_CLR字段。 +2) 通过 R8_DVP_CR0 寄存器配置图像模式、数据位宽、PCLK 极性、HSYNC 极性和 VSYNC 极性,使其 +与SENSOR的输出相匹配。 +3) 根据配置后的图像传感器输出的有效图像像素,配置R16_DVP_ROW_NUM和R16_DVP_COL_NUM寄存 +器,使其与SENSOR的输出相匹配,在图像JPEG模式下,只需配置R16_DVP_COL_NUM寄存器。 +4) 通过R32_DVP_DMA_BUF0/1寄存器配置DMA接收地址。 +5) 若使用快照模式,需通过R8_DVP_CR1寄存器,配置RB_DVP_CM字段,开启快照模式。 +6) 若使用裁剪模式,需通过 R8_DVP_CR1 寄存器,配置 RB_DVP_CROP 和 RB_DVP_FCRC 字段,开启裁 +剪功能和控制帧捕获率,同时通过配置 R16_DVP_HOFFCNT、R16_DVP_VST、R16_DVP_CAPCNT 和 +R16_DVP_VLINE设置裁剪图像的尺寸。 +7) 根据需求,通过 R8_DVP_IER 寄存器使能相应中断,通过中断控制器 NVIC 或 PFIC 配置中断优先 +级以及使能DVP中断。 +8) 通过R8_DVP_CR1寄存器使能DMA,通过R8_DVP_CR0寄存器使能DVP接口。 +9) 等待相关接收中断的产生,及时处理接收数据。 +25.3.3 捕获模式说明 +DVP接口支持两种捕获模式:快照(单帧)模式和连续模式。 +25.3.3.1 快照模式 +在该模式下,只捕获单帧(R8_DVP_CR1寄存器中RB_DVP_CM置1),当使能DVP接口后,等待 +系统检测帧起始,之后开始进行图像数据采样,在接收完整一帧数据后,将会关闭DVP接口 +(R8_DVP_CR0寄存器的RB_DVP_ENABLE字段清0)。快照模式下的单帧捕获波形如图25-3所 +示。 +V2.4 389 + +# Page 393 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图25-3 快照模式下的单帧捕获波形 +Frame 1 is captured Frame 2 is not captured +25.3.3.2 连续模式 +在该模式下(R8_DVP_CR1寄存器中RB_DVP_CM清0),当使能DVP接口后,在R8_DVP_CR0寄存 +器的RB_DVP_ENABLE字段清0前,会持续采样每帧数据。连续模式下的帧捕获波形如图25-4所示。 +图25-4 连续模式下帧捕获波形 +Frame 1 is captured Frame 2 is captured +25.3.4 裁剪功能说明 +DVP可以使用裁剪功能从接收到的图像中截取一个矩形窗口,该矩形窗口起始坐标(矩形左上 +角X坐标R16_DVP_HOFFCNT,Y坐标R16_DVP_VST)和窗口大小(R16_DVP_CAPCNT表示水平尺寸、 +R16_DVP_VLINE表示垂直尺寸)可配置。裁剪窗口的坐标和大小如图25-5所示。裁剪窗口数据捕获 +波形如图25-6所示。 +图25-5 裁剪窗口的坐标和大小 +V2.4 390 + +# Page 394 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图25-6 裁剪窗口数据捕获波形 +HSYNC +VSYNC +HOFFCNT +CAPCNT +Data that is not captured at this stage +Data captured at this stage +25.4 寄存器描述 +表25-2 DVP相关寄存器列表 +名称 访问地址 描述 复位值 +R8_DVP_CR0 0x50050000 DVP控制寄存器0 0x00 +R8_DVP_CR1 0x50050001 DVP控制寄存器1 0x06 +R8_DVP_IER 0x50050002 DVP中断使能寄存器 0x00 +R16_DVP_ROW_NUM 0x50050004 图像行数配置寄存器 0x0000 +R16_DVP_COL_NUM 0x50050006 图像列数配置寄存器 0x0000 +R32_DVP_DMA_BUF0 0x50050008 DVP DMA地址0寄存器 0x00000000 +R32_DVP_DMA_BUF1 0x5005000C DVP DMA地址1寄存器 0x00000000 +R8_DVP_IFR 0x50050010 DVP中断标志寄存器 0x00 +R8_DVP_STATUS 0x50050011 DVP接收FIFO状态寄存器 0x00 +R16_DVP_ROW_CNT 0x50050014 DVP行计数器寄存器 0x0000 +R16_DVP_HOFFCNT 0x50050018 窗口开始的水平方向位移寄存器 0x0000 +R16_DVP_VST 0x5005001A 窗口开始的行数寄存器 0x0000 +R16_DVP_CAPCNT 0x5005001C 捕获计数寄存器 0x0000 +R16_DVP_VLINE 0x5005001E 垂直行计数寄存器 0x0000 +R32_DVP_DR 0x50050020 数据寄存器 0x00000000 +25.4.1 DVP 配置寄存器(R8_DVP_CR0) +偏移地址:0x00 +位 名称 访问 描述 复位值 +JPEG模式使能: +6 RB_DVP_JPEG RW 0:原始数据格式; 0 +1:JPEG压缩格式。 +DVP数据位宽配置: +[5:4] RB_DVP_MSK_DAT_MOD[1:0] RW 00:8位模式; 00b +01:10位模式; +V2.4 391 + +# Page 395 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1x:12位模式。 +PCLK极性配置: +3 RB_DVP_P_POLAR RW 0:在PCLK上升沿采样数据; 0 +1:在PCLK下降沿采样数据。 +HSYNC极性配置: +2 RB_DVP_H_POLAR RW 0:HSYNC高电平数据有效; 0 +1:HSYNC低电平数据有效。 +VSYNC极性配置: +1 RB_DVP_V_POLAR RW 0:VSYNC低电平数据有效; 0 +1:VSYNC高电平数据有效。 +DVP功能使能: +0 RB_DVP_ENABLE RW 0:禁用DVP; 0 +1:使能DVP。 +25.4.2 DVP 配置寄存器(R8_DVP_CR1) +偏移地址:0x01 +位 名称 访问 描述 复位值 +DVP帧捕获率控制: +00:捕获所有帧; +[7:6] RB_DVP_FCRC[1:0] RW 01:每隔一帧捕获一次; 00b +10:每隔三帧捕获一次。 +11:保留 +裁剪功能控制: +5 RB_DVP_CROP RW 0:捕获完整图像; 0 +1:仅捕获剪裁寄存器所指定的窗口中的数据。 +捕获模式: +4 RB_DVP_CM RW 0:连续模式; 0 +1:快照模式。 +缓冲地址标志位。硬件控制翻转,软件置1翻 +转该位,写0无效。 +3 RB_DVP_BUF_TOG RWT 0 +0:数据存储在接收地址0; +1:数据存储在接收地址1。 +接收逻辑复位控制: +2 RB_DVP_RCV_CLR RW 0:取消复位操作; 1 +1:复位接收逻辑电路。 +标志与FIFO清除控制,由软件写1或写0: +1 RB_DVP_ALL_CLR RW 0:取消复位操作; 1 +1:复位标志与FIFO。 +DMA使能控制位: +0 RB_DVP_DMA_ENABLE RW 0:禁用DMA; 0 +1:使能DMA。 +V2.4 392 + +# Page 396 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +25.4.3 DVP 中断使能寄存器(R8_DVP_IER) +偏移地址:0x02 +位 名称 访问 描述 复位值 +[7:5] Reserved RO 保留。 0 +帧结束中断使能。(在VSYNC从有效电平变为 +无效电平时产生中断。) +4 RB_DVP_IE_STP_FRM RW 0 +0:禁止帧结束中断; +1:使能帧结束中断。 +接收FIFO溢出中断使能: +3 RB_DVP_IE_FIFO_OV RW 0:禁止FIFO溢出中断; 0 +1:使能FIFO溢出中断。 +帧接收完成中断使能。(计数器达到 +ROW/COL_NUM 配置值时产生中断,表示最后一 +2 RB_DVP_IE_FRM_DONE RW 个数据已写入RAM) 0 +0:禁止帧接收完成中断; +1:使能帧接收完成中断。 +行结束中断使能。(计数器达到COL_NUM配置 +值时产生中断) +1 RB_DVP_IE_ROW_DONE RW 0 +0:禁止行结束中断; +1:使能行结束中断。 +新一帧开始中断使能。(在VSYNC从无效电平 +变为有效电平时产生中断,表示新的一帧开 +0 RB_DVP_IE_STR_FRM RW 始,数据即将到来。) 0 +0:禁止新一帧开始中断; +1:使能新一帧开始中断。 +25.4.4 DVP 图像有效行数配置寄存器(R16_DVP_ROW_NUM) +偏移地址:0x04 +位 名称 访问 描述 复位值 +在RGB模式下,表示一帧图像数据内包含的行 +[15:0] RB_DVP_ROW_NUM[15:0] RW 0 +数。在JPEG模式下,该寄存器无实际意义。 +25.4.5 DVP 图像有效列配置寄存器(16_DVP_COL_NUM) +偏移地址:0x06 +位 名称 访问 描述 复位值 +在RGB模式下,表示一行数据内包含的PCLK周 +[15:0] RB_DVP_COL_NUM[15:0] RW 期数。在 JPEG 模式下,用于配置 DMA 接收长 0 +度。 +25.4.6 DVP DMA 接收地址 0 寄存器(R32_DVP_DMA_BUF0) +偏移地址:0x08 +位 名称 访问 描述 复位值 +[31:0] RB_DVP_DMA_BUF0[31:0] RW DMA接收地址0。 0 +25.4.7 DVP DMA 接收地址 1 寄存器(R32_DVP_DMA_BUF1) +V2.4 393 + +# Page 397 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x0C +位 名称 访问 描述 复位值 +[31:0] RB_DVP_DMA_BUF1[31:0] RW DMA接收地址1。 0 +25.4.8 DVP 中断标志寄存器(R8_DVP_IFR) +偏移地址:0x10 +位 名称 访问 描述 复位值 +[7:5] Reserved RO 保留。 0 +4 RB_DVP_IF_STP_FRM RW 帧结束中断标志,高有效,写0清除。 0 +3 RB_DVP_IF_FIFO_OV RW 接收FIFO溢出中断标志,高有效,写0清除。 0 +2 RB_DVP_IF_FRM_DONE RW 帧接收完成中断标志,高有效,写0清除。 0 +1 RB_DVP_IF_ROW_DONE RW 行结束中断标志,高有效,写0清除。 0 +0 RB_DVP_IF_STR_FRM RW 帧开始中断标志,高有效,写0清除。 0 +25.4.9 DVP 接收 FIFO 状态寄存器(R8_DVP_STATUS) +偏移地址:0x11 +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +[6:4] RB_DVP_FIFO_CNT[2:0] RO FIFO计数器。 0 +3 Reserved RO 保留。 0 +FIFO溢出状态: +2 RB_DVP_FIFO_OV RO 0:FIFO未溢出; 0 +1:FIFO溢出。 +FIFO满状态: +1 RB_DVP_FIFO_FULL RO 0:FIFO未满; 0 +1:缓存已满。 +FIFO就绪状态: +0 RB_DVP_FIFO_RDY RO 0:FIFO中无数据; 0 +1:FIFO中有数据。 +25.4.10 DVP 接收图像行数寄存器(R16_DVP_ROW_CNT) +偏移地址:0x14 +位 名称 访问 描述 复位值 +实际接收中,一帧图像数据包含的行数,此寄 +[15:0] RB_DVP_ROW_CNT[15:0] RO 存器在帧结束时更新。 0 +在JPEG格式下,该寄存器的值没有意义。 +25.4.11 DVP 窗口开始的水平方向位移寄存器(R16_DVP_HOFFCNT) +偏移地址:0x18 +位 名称 访问 描述 复位值 +窗口行内,每行在捕获数据前需要空出PCLK周 +[15:0] RB_DVP_HOFFCNT[15:0] RW 0 +期数。低14位有效。 +V2.4 394 + +# Page 398 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +25.4.12 DVP 窗口开始的行数寄存器(R16_DVP_VST) +偏移地址:0x1A +位 名称 访问 描述 复位值 +图像开始捕获的行数,此行之前的数据不捕 +[15:0] RB_DVP_VST[15:0] RW 0 +获。低13位有效。 +25.4.13 DVP 捕获计数寄存器(R16_DVP_CAPCNT) +偏移地址:0x1C +位 名称 访问 描述 复位值 +裁剪窗口内需要捕获的PCLK周期数。低14位 +[15:0] RB_DVP_CAPCNT[15:0] RW 0 +有效。 +25.4.14 DVP 垂直行计数寄存器(R16_DVP_VLINE) +偏移地址:0x1E +位 名称 访问 描述 复位值 +[15:0] RB_DVP_VLINE[15:0] RW 裁剪窗口内需要捕获的行数。低14位有效。 0 +25.4.15 DVP 数据寄存器(R32_DVP_DR) +偏移地址:0x20 +位 名称 访问 描述 复位值 +DVP 接口每次接收 4 字节数据,才会触发一次 +[31:0] RB_DVP_DR[31:0] RO DMA请求,4字节深度的FIFO可为DMA传输留 0 +有充足的时间。可有效防止出现DMA溢出情况。 +V2.4 395 + +# Page 399 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 26 章 可变静态存储控制器(FSMC) +本章模块描述适用于CH32F20x和CH32V30x微控制器系列部分产品。 +可变静态存储控制器(FSMC),支持多种静态存储器类型以及丰富的存储操作方法,可根据系统 +应用需要,对不同类型大容量静态存储器进行扩展。 +26.1 主要特性 + 支持操作SRAM、ROM、NOR FLASH和PSRAM + 支持操作NAND FLASH,并且内置硬件ECC,最多可检测8KByte数据 + 支持对同步器件操作,如PSRAM + 支持8bit或16bit数据总线宽度 + 时序信号可软件编程 +26.2 功能描述 +26.2.1 模块结构 +FSMC主要包括HB总线接口、NOR存储控制器、NAND存储控制器和外部设备接口。 +图26-1 FSMC模块框图 +26.2.2 外部设备地址映射 +FSMC根据地址线将存储块分为固定大小16MByte的两个存储块,见图26-2。 +V2.4 396 + +# Page 400 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-2 FSMC存储块 +Address Memory block Supported storage types +6000 0000h +Block 1 +NOR/PSRAM +1x16MB +60FF FFFFh +7000 0000h +Block 2 +NAND flash +1x16MB +70FF FFFFh +26.2.2.1 NOR/PSRAM 地址映射 +表26-1 外部存储器地址 +最大访问存储器空间 +数据宽度 配连接到存储器的地址线 +(bit) +HADDR[23:0]与FSMC_A[23:0]对应相 +8bit 16MBx8=128Mbit +连 +HADDR[23:1]与FSMC_A[22:0]对应相 +16bit 16MB/2x16=128Mbit +连,HADDR[0]未接 +注:100脚芯片,支持FSMC,并且仅支持地址和数据线复用模式。 +NOR FLASH和PSRAM支持非对齐访问。对于异步模式,每次操作需要准确的地址;对于同步模式, +只需发出一次地址信号,之后批量的数据通过CLK顺序进行。对于支持非对齐批量访问的NOR FLASH, +可以将存储器的非对齐访问模式设置为和 HB 相同的模式,若不能设置,则禁用非对齐访问模式,并 +把非对齐的访问请求分开成两个连续的访问操作。 +26.2.2.2 NAND 地址映射 +NAND FLASH映像和时序寄存器,见表26-2。 +表26-2 存储器映像和时序寄存器 +起始地址 结束地址 FSMC存储块 存储空间 时序寄存器 +0x78000000 0x78FFFFFF 属性 FSMC_PATT2(0x6C) +块2-NAND FLASH +0x70000000 0x70FFFFFF 通用 FSMC_PMEM2(0x68) +通用和属性空间可以在低 256KB 划分为地址区(第二个 128KB 区域)、命令区(第二个 64KB 区 +域)和数据区(前64KB区域),见表26-3。 +软件通过操作这3个区域访问NAND FLASH的具体流程: + 向NAND FLASH发送读写等操作命令:软件可以操作命令区任何地址发送命令; + 向NAND FLASH发送将要操作的地址:软件可以操作地址区任何地址发送命令; +V2.4 397 + +# Page 401 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 从NAND FLASH读写数据:软件可以操作数据区任何地址写入或读出数据。 +表26-3 NAND存储块选择 +区域名称 HADDR[17:16] 地址范围 +地址区 1X 0x020000-0x03FFFF +命令区 01 0x010000-0x01FFFF +数据区 00 0x000000-0x00FFFF +26.2.3 NOR/PSRAM 控制器 +FSMC 支持 8bit、16bit 和 32bit 异步操作 SRAM 和 ROM,支持异步模式和突发模式操作 PSRAM, +支持异步模式和突发模式操作 NOR FLASH。所有控制器的输出信号在内部时钟 HCLK 的上升沿改变, +对于同步写模式(PSRAM)下,输出的数据在存储器时钟(CLK)的下降沿改变,具体参照同步传输和 +异步传输时序图。存储器的读写参数可软件配置,见表26-4。 +表26-4 软件可控的NOR/PSRAM读写参数 +参数 读写方式 参数取值范围 +地址建立时间 异步 1<< T <<16 (HB HCLK) +地址保持时间 异步 1<< T <<16 (HB HCLK) +数据建立时间 异步 2<< T <<256 (HB HCLK) +总线恢复时间 异步或同步读 1<< T <<16 (HB HCLK) +时钟分频因子 同步 2<< T <<16 (HB HCLK) +数据产生时间 同步 2<< T <<17 (Memory CLK) +26.2.3.1 外部存储器复用接口信号 +NOR FLASH和PSRAM接口,见表26-5、表26-6。 +表26-5 复用NOR FLASH接口 +FSMC引脚 方向 描述 +CLK 输出 时钟线(仅用于同步突发模式) +A[23:16] 输出 地址线 +AD[15:0] 输入/输出 16bit地址/数据线(复用) +NE[1] 输出 片选线 +NOE 输出 输出使能 +NWE 输出 写使能 +NL(NADV) 输出 锁存使能 +NWAIT 输入 等待信号线(仅用于NOR FLASH) +表26-6 复用PSRAM接口 +FSMC引脚 方向 描述 +CLK 输出 时钟线(仅用于同步突发模式) +A[23:16] 输出 地址线 +AD[15:0] 输入/输出 16bit地址/数据线(复用) +NE[1] 输出 片选线 +NOE 输出 输出使能 +NWE 输出 写使能 +NL(NADV) 输出 锁存使能 +NWAIT 输入 等待信号线 +V2.4 398 + +# Page 402 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +NBL[1] 输出 高字节使能(NUB) +NBL[0] 输出 低字节使能(NLB) +注:前缀“N”的信号,表示低电平有效。 +26.2.3.2 支持的存储器以及操作方式 +支持的存储器以及操作方式见表26-7。 +表26-7 支持存储器和操作方式 +存储器 模式 HB数据宽度 存储器宽度 描述 +异步读 8 16 +异步读 16 16 +异步写 16 16 +NOR FLASH 异步读 32 16 分成2次FSMC访问 +异步写 32 16 分成2次FSMC访问 +同步读 16 16 +同步读 32 16 分成2次FSMC访问 +异步读 8 16 +异步写 8 16 使用字节信NBL[1:0] +异步读 16 16 +异步写 16 16 +异步读 32 16 分成2次FSMC访问 +PSRAM +异步写 32 16 分成2次FSMC访问 +同步读 16 16 +同步读 32 16 分成2次FSMC访问 +同步写 8 16 使用字节信NBL[1:0] +同步写 16/32 16 +异步读 8/16/32 8/16 使用字节信NBL[1:0] +SRAM和ROM +异步写 8/16/32 8/16 使用字节信NBL[1:0] +26.2.3.3 NOR/PSRAM 异步传输地址/数据复用的时序图 +对于异步静态存储器(NOR FLASH和PSRAM)操作需注意如下: + 当启用扩展模式时,可混合使用模式A、B、C和D对存储器的读写操作。 +V2.4 399 + +# Page 403 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-3 模式1读操作(复用) +Memory operation cycle +A[23:16] +NBL[1:0] +NADV +NEx +NOE +NWE +High level +AD[15:0] The data bus is driven by +Lower 16-bit address +1HCLK external memory +(ADDSET+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK 2 HCLK +(ADDHLD+1) HCLK +HCLK +Data sampling +Data storage +图26-4 模式1写操作(复用) +Memory operation cycle +A[23:16] +NBL[1:0] +NADV +NEX +NOE +1HCLK +NWE +AD[15:0] Lower 16-bit address The data bus is driven by FSMC +(ADDSET+1) (ADDHLD+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK HCLK HCLK +注:在写操作的最后一个HCLK周期可以保证NWE上升沿后地址和数据的保持时间,因为存在这个HCLK +V2.4 400 + +# Page 404 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +周期,DATAST的数值必须大于0(DATAST > 0)。 +表26-8 模式1 FSMC_BCR1位域 +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x0 +[18:16] Reserved 0x0 +15 ASYNCWAIT 如果存储器支持该功能则为1,否则为0 +14 EXTMOD 0x0 +13 WAITEN 0x0 +12 WREN 根据需要设置 +11 WAITCFG 该位不起作用 +10 Reserved 0x0 +9 WAITPOL 当bit15为1时,有意义 +8 BURSTEN 0x0 +7 Reserved 0x1 +6 FACCEN 该位不起作用 +[5:4] MWID 根据需要设置 +[3:2] MTYP 根据需要设置,不包含0x2(NOR FLASH) +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-9 模式1 FSMC_BTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 该位不起作用 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。写操作为(DATAST+1 HCLK), +[15:8] DATAST +读操作为(DATAST+3 HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +[3:0] ADDSET 地址建立时间。(ADDSET+1 HCLK)。 +V2.4 401 + +# Page 405 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-5 模式A读操作(复用) +Memory operation cycle +A[23:16] +NBL[1:0] +NADV +NEx +NOE +NWE +High level +AD[15:0] Lower 16-bit address The data bus is driven by +1HCLK external memory +(ADDSET+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK 2 HCLK +(ADDHLD+1) HCLK +HCLK Data sampling +Data storage +图26-6 模式A写操作(复用) +Memory operation cycle +A[23:16] +NBL[1:0] +NADV +NEX +NOE +1HCLK +NWE +AD[15:0] Lower 16-bit address The data bus is driven by FSMC +(ADDSET+1) (ADDHLD+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK HCLK HCLK +V2.4 402 + +# Page 406 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表26-10 模式A FSMC_BCR1位域 +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x0 +[18:16] Reserved 0x0 +15 ASYNCWAIT 如果存储器支持该功能则为1,否则为0 +14 EXTMOD 0x1 +13 WAITEN 0x0 +12 WREN 根据需要设置 +11 WAITCFG 该位不起作用 +10 Reserved 0x0 +9 WAITPOL 当bit15为1时,有意义 +8 BURSTEN 0x0 +7 Reserved 0x1 +6 FACCEN 该位不起作用 +[5:4] MWID 根据需要设置 +[3:2] MTYP 根据需要设置,不包含0x2(NOR FLASH) +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-11 模式A FSMC_BTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x0 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTYRN 0x0 +数据建立时间。读操作为(DATAST+3 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 该位不起作用 +地址建立时间。读操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +表26-12 模式A FSMC_BWTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x0 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。写操作为(DATAST+1 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +[3:0] ADDSET 地址建立时间。写操作为(ADDSET+1 +V2.4 403 + +# Page 407 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +HCLK)。 +图26-7 模式B读操作(复用) +Memory operation cycle +A[23:16] +NADV +NEx +NOE +NWE High level +AD[15:0] Lower 16-bit address The data bus is driven by +external memory +1HCLK +(ADDSET+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK 2 HCLK +(ADDHLD+1) HCLK +HCLK +Data samplingData storage +V2.4 404 + +# Page 408 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-8 模式B写操作(复用) +Memory operation cycle +A[23:16] +NADV +NEx +NOE +1HCLK +NWE +AD[15:0] Lower 16-bit address The data bus is driven by FSMC +(ADDSET+1) ADDHLD (DATAST+2) (BUSTURN+1) +HCLK HCLK HCLK HCLK +表26-13 模式B FSMC_BCR1位域 +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x0 +[18:16] Reserved 0x0 +15 ASYNCWAIT 如果存储器支持该功能则为1,否则为0 +14 EXTMOD 0x1 +13 WAITEN 0x0 +12 WREN 根据需要设置 +11 WAITCFG 该位不起作用 +10 Reserved 0x0 +9 WAITPOL 当bit15为1时,有意义。 +8 BURSTEN 0x0 +7 Reserved 0x1 +6 FACCEN 0x1 +[5:4] MWID 根据需要设置 +[3:2] MTYP 0x2(NOR FLASH) +1 MUXEN 0x1 +0 MBKEN 0x1 +V2.4 405 + +# Page 409 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表26-14 模式B FSMC_BTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x1 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。读操作为(DATAST+3 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +地址建立时间。读操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +表26-15 模式B FSMC_BWTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x1 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。写操作为(DATAST+1 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +地址建立时间。写操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +V2.4 406 + +# Page 410 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-9 模式C读操作(复用) +Memory operation cycle +A[23:16] +NBL[1:0] +NADV +NEx +NOE +NWE High level +AD[15:0] Lower 16-bit address The data bus is driven by +external memory +1HCLK +(ADDSET+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK 2 HCLK +(ADDHLD+1) HCLK +HCLK Data samplingData storage +图26-10 模式C写操作(复用) +Memory operation cycle +A[23:16] +NADV +NEX +NOE +1HCLK +NWE +AD[15:0] Lower 16-bit address The data bus is driven by FSMC +(ADDSET+1) ADDHLD (DATAST+2) (BUSTURN+1) +HCLK HCLK HCLK HCLK +表26-16 模式C FSMC_BCR1位域 +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x0 +[18:16] Reserved 0x0 +V2.4 407 + +# Page 411 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 ASYNCWAIT 如果存储器支持该功能则为1,否则为0 +14 EXTMOD 0x1 +13 WAITEN 0x0 +12 WREN 根据需要设置 +11 WAITCFG 该位不起作用 +10 Reserved 0x0 +9 WAITPOL 当bit15为1时,有意义。 +8 BURSTEN 0x0 +7 Reserved 0x1 +6 FACCEN 0x1 +[5:4] MWID 根据需要设置 +[3:2] MTYP 0x2(NOR FLASH) +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-17 模式C FSMC_BTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x2 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。读操作为(DATAST+3 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +地址建立时间。读操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +表26-18 模式C FSMC_BWTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x2 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。写操作为(DATAST+1 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK) +地址建立时间。写操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +V2.4 408 + +# Page 412 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-11 模式D读操作(复用) +Memory operation cycle +A[23:16] +NADV +NEx +NOE +NWE +High level +AD[15:0] Lower 16-bit address The data bus is driven by +external memory +1HCLK +(ADDSET+1) (DATAST+1) (BUSTURN+1) +HCLK HCLK 2 HCLK +(ADDHLD+1) HCLK +HCLK +Data sampling Data storage +V2.4 409 + +# Page 413 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-12 模式D写操作(复用) +Memory operation cycle +A[23:16] +NADV +NEX +NOE +1HCLK +NWE +AD[15:0] Lower 16-bit address The data bus is driven by FSMC +(ADDSET+1) ADDHLD (DATAST+2) (BUSTURN+1) +HCLK HCLK HCLK HCLK +表26-19 模式D FSMC_BCR1位域 +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x0 +[18:16] Reserved 0x0 +15 ASYNCWAIT 如果存储器支持该功能则为1,否则为0 +14 EXTMOD 0x1 +13 WAITEN 0x0 +12 WREN 根据需要设置 +11 WAITCFG 该位不起作用 +10 Reserved 0x0 +9 WAITPOL 当bit15为1时,有意义。 +8 BURSTEN 0x0 +7 Reserved 0x1 +6 FACCEN 根据需要设置 +[5:4] MWID 根据需要设置 +[3:2] MTYP 根据需要设置 +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-20 模式D FSMC_BTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +V2.4 410 + +# Page 414 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[29:28] ACCMOD 0x3 +[27:24] DATLAT 该位不起作用 +[23:20] CLKDIV 该位不起作用 +[19:16] BUSTURN 0x0 +数据建立时间。读操作为(DATAST+3 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK)。 +地址建立时间。读操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +表26-21 模式D FSMC_BWTR1位域 +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x3 +[27:24] DATLAT 0x0 +[23:20] CLKDIV 0x0 +[19:16] BUSTYRN 0x0 +数据建立时间。写操作为(DATAST+1 +[15:8] DATAST +HCLK)。该位最小为1。 +[7:4] ADDHLD 地址保持时间。(ADDHLD+1 HCLK)。 +地址建立时间。写操作为(ADDSET+1 +[3:0] ADDSET +HCLK)。 +26.2.3.4 NOR/PSRAM 同步传输地址/数据复用的时序图 +数据延迟与NOR FLASH的延时需注意,DATALAT数值必须与NOR FLASH配置寄存器中的定义一致。 +NADV 信号为低时的时钟周期不计算在延迟参数中。FSMC 的 DATLAT 参数可以为 DATALAT+2 或为 +DATALAT+3,对于特别的存储器会在数据保持时间阶段产生 NWAIT 信号,DATLAT 需要设置为最小值, +对于另外一些存储器不会在数据保持时间阶段产生 NWAIT 信号,FSMC 和存储器的数据保持时间必须 +设置一致。 +对于单次批量传输需注意,存储器配置位同步批量模式,若传输16bit数据,FSMC会执行1次长 +度为1的批量传输,若传输32bit数据,FSMC分为2次16bit传输,执行1次长度为2的批量传输。 +NOR FLASH同步批量模式访问时,在保持时间(DATLAT+1 CLK)之后,若检测NWAIT信号为低电 +平时,在NWAIT变成高电平之前FSMC需要插入等待周期,当NWAIT变为高电平时,FSMC认为数据有 +效。在NWAIT信号控制的等待状态插入期间,控制器会持续向存储器发送时钟脉冲、保持片选信号和 +输出有效信号,同时忽略无效的数据信号。在批量传输模式下,NOR FLASH 的 NWAIT 信号通过配置 +WAITCFG位选择两种时序配置。 +V2.4 411 + +# Page 415 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-13 同步总线复用读操作(复用) +表26-22 FSMC_BCR1位域(同步读模式) +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 该位不起作用 +[18:16] Reserved 0x0 +15 ASYNCWAIT 0x0 +14 EXTMOD 0x0 +13 WAITEN 0x0 +12 WREN 该位不起作用 +11 WAITCFG 根据需要设置 +10 Reserved 0x0 +9 WAITPOL 根据需要设置 +8 BURSTEN 0x1 +7 Reserved 0x1 +6 FACCEN 根据需要设置 +V2.4 412 + +# Page 416 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[5:4] MWID 根据需要设置 +[3:2] MTYP 0x1或0x2 +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-23 FSMC_BTR1位域(同步读模式) +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x0 +[27:24] DATLAT 数据保持时间 +0x0 – 保留 +[23:20] CLKDIV +0x1 - CLK=2 HCLK +[19:16] BUSTURN 该位不起作用 +[15:8] DATAST 该位不起作用 +[7:4] ADDHLD 该位不起作用 +[3:0] ADDSET 该位不起作用 +图26-14 同步总线复用写操作(复用) +V2.4 413 + +# Page 417 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表26-24 FSMC_BCR1位域(同步写模式) +Bitx 名称 配置值 +[31:20] Reserved 0x000 +19 CBURSTRW 0x1 +[18:16] Reserved 0x0 +15 ASYNCWAIT 0x0 +14 EXTMOD 0x0 +13 WAITEN 如果存储器支持该功能则为1,否则为0 +12 WREN 0x1 +11 WAITCFG 0x0 +10 Reserved 0x0 +9 WAITPOL 根据需要设置 +8 BURSTEN 该位不起作用 +7 Reserved 0x1 +6 FACCEN 根据需要设置 +[5:4] MWID 根据需要设置 +[3:2] MTYP 0x1 +1 MUXEN 0x1 +0 MBKEN 0x1 +表26-25 FSMC_BTR1位域(同步写模式) +Bitx 名称 配置值 +[31:30] Reserved 0x0 +[29:28] ACCMOD 0x0 +[27:24] DATLAT 数据保持时间 +0x0 – 保留 +[23:20] CLKDIV +0x1 - CLK=2 HCLK +[19:16] BUSTURN 该位不起作用 +[15:8] DATAST 该位不起作用 +[7:4] ADDHLD 该位不起作用 +[3:0] ADDSET 该位不起作用 +26.2.4 NAND FLASH 控制器 +FSMC支持8bit、16bit操作NAND FLASH,FSMC 可以根据需要产生多个地址周期,理论上FSMC +对NAND FLASH的容量没有限制。NAND FLASH的读写参数可软件配置,见表26-26。 +表26-26 软件可控的NAND读写参数 +参数 功能 读写方式 参数取值范围 +发出命令之前建立地址的 1<< T <<256 (HB +存储器建立时间 读/写 +时间 HCLK) +1<< T <<256 (HB +存储器等待时间 发出命令的最短持续时间 读/写 +HCLK) +在发送命令结束后保持地 +1<< T <<255 (HB +存储器保持时间 址的时间,写操作时也是数 读/写 +HCLK) +据的保持时间 +V2.4 414 + +# Page 418 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +存储器数据总线 启动写操作之后数据总线 0<< T <<255 (HB +写 +高阻时间 持续为高阻态时间 HCLK) +26.2.4.1 外部存储器接口信号 +8bit和16bit NAND FLASH接口,见表26-27、表26-28。 +表26-27 8bit NAND FLASH +FSMC引脚 方向 描述 +A[17] 输出 地址锁存允许信号(ALE) +A[16] 输出 命令锁存允许信号(CLE) +D[7:0] 输入/输出 8bit双向地址/数据复用总线 +NCE[2] 输出 片选线 +NOE 输出 输出使能 +NWE 输出 写使能 +NWAIT 输入 等待信号线 +表26-28 16bit NAND FLASH +FSMC引脚 方向 描述 +A[17] 输出 地址锁存允许信号(ALE) +A[16] 输出 命令锁存允许信号(CLE) +D[15:0] 输入/输出 16bit双向地址/数据复用总线 +NCE[2] 输出 片选线 +NOE 输出 输出使能 +NWE 输出 写使能 +NWAIT 输入 等待信号线 +26.2.4.2 支持的存储器以及操作方式 +支持的存储器以及操作方式见表26-29。 +表26-29 支持存储器和操作方式 +存储器 模式 HB数据宽度 存储器宽度 描述 +异步读 8 8 +异步写 8 8 +异步读 16 8 分成2次FSMC访问 +8bit NAND +异步写 16 8 分成2次FSMC访问 +异步读 32 8 分成4次FSMC访问 +异步写 32 8 分成4次FSMC访问 +异步读 8 16 +异步读 16 16 +16bit NAND 异步写 16 16 +异步读 32 16 分成2次FSMC访问 +异步写 32 16 分成2次FSMC访问 +26.2.4.3 NAND FLASH 时序图(包括预等待功能) +NAND FLASH操作时序控制,涉及FSMC_PMEM2和FSMC_PATT2时序寄存器,每一个寄存器包含4个 +参数。MEMHOLD、MEMWAIT和ATTSET三个参数对应操作NAND FLASH的三个阶段的HCLK周期数,MEMHIZ +V2.4 415 + +# Page 419 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +参数对应FSMC开始驱动数据总线的时机。NAND FLASH控制器通用存储空间访问时序,见图26-15。 +图26-15 NAND FLASH控制器通用存储空间的访问时序 +HCLK +A[23:0] +NCEx +NREG, +NIOW,NIOR High level +MEMxSET+1 MEMxWAIT+1 MEMxHOLD+1 +NWE, +NOE +MEMxHIZ+1 +WR DATA +RD DATA Valid +26.2.4.4 NAND FLASH 操作流程 +NAND FLASH的命令锁存使能信号(CLE)和地址锁存使能信号(ALE)分别由FSMC地址线A16和 +A17 驱动,故在对 NAND FLASH 操作发送命令或地址时,需要对存储空间的特定地址执行写操作。对 +NAND FLASH的读操作过程如下: +1) 根据即将操作的NAND FLASH特性,配置FSMC_PCR2、FSMC_PMEM2和FSMC_PATT2寄存器的PWID、 +PTYP、PWAITEN和PBKEN。 +2) 在通用存储空间写入命令字节,在NWE为低电平期间,CLE输出高电平,此时该命令字节被NAND +FLASH识别为一个命令,并锁存该命令,随后的页读操作不需要重复发送该命令。 +3) 之后通过向存储器空间写入4个字节,作为读操作的起始地址。在NWE为低电平期间,ALE输出 +高电平,此时4个字节被NAND FLASH识别为读操作的起始地址。在操作属性存储空间时,可以 +使FSMC产生不同的时序,实现某些NAND FLASH预等待功能。 +4) FSMC控制器开始新的操作前需要等待NAND FLASH的R/NB信号变为高电平,在等待期间FSMC控 +制器需要保持NCE信号为低电平。 +5) FSMC控制器可以通过操作通用存储空间,可以从NAND FLASH逐字节的读出存储页。 +26.2.4.5 NAND FLASH 预等待功能 +某些特殊的NAND FLASH需要在输入最后一个地址字节后,R/NB信号变为低电平,见图26-16。 +图中(1)为 CPU写字节命令 0x00到 0x70010000;图中(2)为 CPU写 NAND FLASH 的地址 A7-A0至 +0x70020000;图中(3)为CPU写NAND FLASH的地址A15-A8至0x70020000;图中(4)为CPU写NAND +FLASH的地址A23-A16至0x70020000;图中(5)为CPU写NAND FLASH的地址A31-A24至0x70020000; +V2.4 416 + +# Page 420 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图26-16 操作特殊型NAND FLASH +NCE must be kept low +NCE +CLE +ALE +NWE +NOE High level +tR +I/O[7:0] 0x00 A7-A0 A15-A8 A23-A16 A31-A24 +tWB +R/NB +(1) (2) (3) (4) (5) +使用该功能时,通过配置FSMC_PMEM2寄存器的MEMHOLD位来保证tWB的时序,之后对NAND FLASH +的读写操作,FSMC控制器都会在NEW信号的上升沿至下一次操作之间插入(MEMHOLD+1)HCLK保持延 +时。为了解决该问题,这里使用属性空间配置ATTHOLD数值使之符合tWB的时序,同时需要保持MEMHOLD +为最小值。此时,只有在写入NAND FLASH地址的最后一个字节时,FSMC控制器需要写入属性存储空 +间,其余NAND FLASH的读写操作使用通用存储空间。 +26.2.4.6 NAND FLASH ECC 功能 +FSMC的NAND FLASH控制器包含1个纠错码计算硬件模块,可有效减少CPU在处理纠错码时的软 +件工作量。ECC模块在读写NAND FLASH时,支持每256、512、1024、2048、4096或8192个字节中, +矫正1个bit错误并且检测出2个bit错误。页大小对应ECC结果有效位,见表26-30。在ECC计算 +电路使能后,ECC模块监测NAND FLASH的数据总线和读/写信号(NCE和NWE)。ECC使用时需注意如 +下: + 在访问NAND FLASH时,出现在D[15:0]总线上的数据被锁存并用于ECC计算。 + 当规定数目的字节已经被写入NAND FLASH或从NAND FLASH读出后,软件从FSMC_ECCR2寄 +存器读出ECC值。若需再次计算ECC,先将ECCEN清0,再写1重新使能ECC计算。 +表26-30 页大小对应ECC结果有效位 +ECCPS[2:0] 页大小(字节) ECC有效位 +000 256 ECC[21:0] +001 512 ECC[23:0] +010 1024 ECC[25:0] +011 2048 ECC[27:0] +100 4096 ECC[29:0] +101 8192 ECC[31:0] +V2.4 417 + +# Page 421 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +26.3 寄存器描述 +表26-31 FSMC相关寄存器列表 +名称 访问地址 描述 复位值 +SRAM/NOR-Flash 片选控制寄存器 +R32_FSMC_BCR1 0xA0000000 0x000030DX +1 +SRAM/NOR-Flash 片选时序寄存器 +R32_FSMC_BTR1 0xA0000004 0x0FFFFFFF +1 +R32_FSMC_PCR2 0xA0000060 NAND-Flash控制寄存器2 0x00000018 +R32_FSMC_SR2 0xA0000064 FIFO状态和中断寄存器2 0x00000040 +R32_FSMC_PMEM2 0xA0000068 通用存储空间时序寄存器2 0xFCFCFCFC +R32_FSMC_PATT2 0xA000006C 属性存储空间时序寄存器2 0xFCFCFCFC +R32_FSMC_ECCR2 0xA0000074 ECC结果寄存器2 0x00000000 +R32_FSMC_BWTR1 0xA0000104 SRAM/NOR-Flash写时序寄存器1 0x0FFFFFFF +26.3.1 SRAM/NOR-Flash 片选控制寄存器 1(FSMC_BCR1) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CBURS +Reserved Reserved +TRW +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ASYNC EXTM WAIT WAIT Reser WAIT BURST Reser FACC +WREN MWID[1:0] MTYP[1:0] MUXEN MBKEN +WAIT OD EN CFG ved POL EN ved EN +位 名称 访问 描述 复位值 +[31:20] Reserved RO 保留。 0 +批量写使能: +19 CBURSTRW RW 0:写操作处于异步模式; 0 +1:写操作处于同步模式。 +[18:16] Reserved RO 保留。 0 +异步传输期间的等待信号: +15 ASYNCWAIT RW 0:禁用异步传输期间等待信号; 0 +1:启用异步传输期间等待信号。 +扩展模式使能: +14 EXTMOD RW 0:不允许写使用FSMC_BWTR寄存器; 0 +1:允许写使用FSMC_BWTR寄存器。 +等待使能。当闪存存储器处于批量传输模式 +时,该位控制是否根据 NWAIT 信号插入等待 +13 WAITEN RW 信号。 1 +0:禁用NWAIT信号; +1:使用NWAIT信号。 +写操作使能: +12 WREN RW 1 +0:禁止FSMC对存储器进行写操作; +V2.4 418 + +# Page 422 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:允许FSMC对存储器进行写操作。 +等待时序配置: +0:NWAIT信号在等待状态前的一个数据周期 +11 WAITCFG RW 0 +有效; +1:NWAIT信号在等待状态期间有效。 +10 Reserved RO 保留。 0 +等待信号极性: +9 WAITPOL RW 0:NWAIT等待信号为低有效; 0 +1:NWAIT等待信号为高有效。 +批量模式使能: +8 BURSTEN RW 0:不使能批量模式; 0 +1:使能批量模式。 +7 Reserved RO 保留。 1 +NOR FLASH访问使能: +6 FACCEN RW 0:禁止对NOR FLASH访问; 1 +1:允许对NOR FLASH访问。 +数据总线宽度: +00:8位; +[5:4] MWID[1:0] RW 01:16位; 01b +10:保留; +11:保留。 +储存器类型: +00:SRAM、ROM; +[3:2] MTYP[1:0] RW 01:PSRAM; xxb +10:NOR FLASH; +11:保留。 +地址/数据复用使能: +1 MUXEN RW 0:地址/数据不复用; x +1:地址/数据复用。 +存储器块使能: +0 MBKEN RW 0:禁用对应的存储器块; x +1:启用对应的存储器块。 +26.3.2 SRAM/NOR-Flash 片选时序寄存器 1(FSMC_BTR1) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved ACCMOD[1:0] DATLAT[3:0] CLKDIV[3:0] BUSTURN[3:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATAST[7:0] ADDHLD[3:0] ADDSET[3:0] +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +异步访问模式: +[29:28] ACCMOD[1:0] RW 00b +00:模式A; +V2.4 419 + +# Page 423 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +01:模式B; +10:模式C; +11:模式D。 +数据保持时间。用于同步批量模式(仅适用 +于NOR FLASH)。 +0000:第一个数据保持时间为2个CLK时钟 +…… +[27:24] DATLAT[3:0] RW 1111b +1110:第一个数据保持时间为 16 个 CLK 时 +钟; +1111:第一个数据保持时间为 17 个 CLK 时 +钟。 +时钟分频比(CLK信号)。访问异步NOR FLASH、 +SRAM和ROM时,该参数不起作用。 +0000:保留; +[23:20] CLKDIV[3:0] RW 0001:1个CLK周期=2个HCLK周期; 1111b +…… +1110:1个CLK周期=15个HCLK周期; +1111:1个CLK周期=16个HCLK周期。 +总线恢复时间。(仅适用于NOR FLASH) +0000:总线恢复时间=1个HCLK周期; +[19:16] BUSTURN[3:0] RW …… 1111b +1110:总线恢复时间=15个HCLK周期; +1111:总线恢复时间=16个HCLK周期。 +数据保持时间。 +00000000:保留。 +00000001:数据保持时间=2个HCLK周期; +…… +11111110:数据保持时间=255个HCLK周期; +11111111:数据保持时间=256个HCLK周期。 +[15:8] DATAST[7:0] RW 0xFF +对于每一种存储器类型和访问方式的数据保 +持时间,请参考对应的图表(见图 26-3 至图 +26-12)。 +例如:模式1和模式A,读操作时DATAST=1: +数据保持时间=DATAST+3=4 个 HCLK 时钟周 +期。 +地址保持时间。(仅适用于异步操作) +0000:地址保持时间=1个HCLK周期; +[7:4] ADDHLD[3:0] RW …… 1111b +1110:地址保持时间=15个HCLK周期; +1111:地址保持时间=16个HCLK周期。 +地址建立时间。(仅适用于异步操作) +0000:地址建立时间=1个HCLK周期; +…… +[3:0] ADDSET[3:0] RW 1111b +1110:地址建立时间=15个HCLK周期; +1111:地址建立时间=16个HCLK周期。 +对于每一种存储器类型和访问方式的数据保 +V2.4 420 + +# Page 424 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +持时间,请参考对应的图表(见图 26-3 至图 +26-12)。 +例如:模式1和模式A,读操作时DATAST=1: +数据保持时间=DATAST+3=4 个 HCLK 时钟周 +期。 +26.3.3 NAND-Flash 控制寄存器 2(FSMC_PCR2) +偏移地址:0x60 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved ECCPS[2:0] TAR[3] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PWAI Reser +TAR[2:0] TCLR[3:0] Reserved ECCEN PWID[1:0] PTYP PBKEN +TEN ved +位 名称 访问 描述 复位值 +[31:20] Reserved RO 保留。 0 +ECC页面大小: +000:256Byte; +001:512Byte; +010:1024Byte; +[19:17] ECCPS[2:0] RW 000b +011:2048Byte; +100:4096Byte; +101:8192Byte; +111:保留。 +ALE至RE的延迟: +0000:1个HCLK周期; +[16:13] TAR[3:0] RW …… 0000b +1110:15个HCLK周期; +1111:16个HCLK周期。 +CLE至RE的延迟: +0000:1个HCLK周期; +[12:9] TCLR[3:0] RW …… 0000b +1110:15个HCLK周期; +1111:16个HCLK周期。 +[8:7] Reserved RO 保留。 0 +ECC使能: +6 ECCEN RW 0:禁用ECC; 0 +1:使能ECC。 +数据总线宽度: +00:8位; +[5:4] PWID[1:0] RW 01:16位; 01b +10:保留; +11:保留。 +3 PTYP RW 存储器类: 1 +V2.4 421 + +# Page 425 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:保留; +1:NAND闪存。 +NAND存储器使能: +2 PBKEN RW 0:禁用对应的存储器块; 0 +1:使能对应的存储器块。 +等待功能使能: +1 PWAITEN RW 0:禁用; 0 +1:使能。 +0 Reserved RO 保留。 0 +26.3.4 FIFO 状态和中断寄存器 2(FSMC_SR2) +偏移地址:0x64 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved FEMPT Reserved +位 名称 访问 描述 复位值 +[31:7] Reserved RO 保留。 0 +FIFO空标志。 +6 FEMPT RO 0:FIFO不空; 1 +1:FIFO空。 +[5:0] Reserved RO 保留。 0 +26.3.5 通用存储空间时序寄存器 2(FSMC_PMEM2) +偏移地址:0x68 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +MEMHIZx[7:0] MEMHOLDx[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MEMWAITx[7:0] MEMSETx[7:0] +位 名称 访问 描述 复位值 +通用空间数据总线的高阻时间: +00000000:NAND FLASH为0个HCLK周期; +[31:24] MEMHIZx[7:0] RW …… 0xFC +11111110:NAND FLASH为254个HCLK周期; +11111111:NAND FLASH为255个HCLK周期。 +通用空间保持时间: +00000000:保留; +00000001:1个HCLK周期; +[23:16] MEMHOLDx[7:0] RW 0xFC +…… +11111110:254个HCLK周期; +11111111:255个HCLK周期。 +V2.4 422 + +# Page 426 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +通用空间等待时间。(需要加上由 NWAIT 信 +号变低引入的等待周期) +00000000:保留; +[15:8] MEMWAITx[7:0] RW 00000001:2个HCLK周期; 0xFC +…… +11111110:255个HCLK周期; +11111111:256个HCLK周期。 +通用空间建立时间: +00000000:NAND FLASH 2个HCLK周期; +[7:0] MEMSETx[7:0] RW …… 0xFC +11111110:NAND FLASH 256个HCLK周期; +11111111:NAND FLASH 257个HCLK周期。 +26.3.6 属性存储空间时序寄存器 2(FSMC_PATT2) +偏移地址:0x6C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ATTHIZx[7:0] ATTHOLDx[7:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ATTWAITx[7:0] ATTSETx[7:0] +位 名称 访问 描述 复位值 +属性空间数据总线的高阻时间: +00000000:0个HCLK周期; +[31:24] ATTHIZx[7:0] RW …… 0xFC +11111110:254个HCLK周期; +11111111:255个HCLK周期。 +属性空间保持时间: +00000000:保留; +00000001:1个HCLK周期; +[23:16] ATTHOLDx[7:0] RW 0xFC +…… +11111110:254个HCLK周期; +11111111:255个HCLK周期。 +属性空间等待时间。(需要加上由 NWAIT 信 +号变低引入的等待周期) +00000000:1个HCLK周期; +[15:8] ATTWAITx[7:0] RW 00000001:2个HCLK周期; 0xFC +…… +11111110:255个HCLK周期; +11111111:256个HCLK周期。 +属性空间建立时间。 +00000000:1个HCLK周期; +[7:0] ATTSETx[7:0] RW …… 0xFC +11111110:255个HCLK周期; +11111111:256个HCLK周期。 +V2.4 423 + +# Page 427 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +26.3.7 ECC 结果寄存器 2(FSMC_ECCR2) +偏移地址:0x74 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ECC[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ECC[15:0] +位 名称 访问 描述 复位值 +[31:0] ECC[31:0] RO ECC计算结果。 0 +26.3.8 SRAM/NOR-Flash 写时序寄存器 1(FSMC_BWTR1) +偏移地址:0x104 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +ACCMOD +Reserved Reserved BUSTYRN[3:0] +[1:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATAST[7:0] ADDHLD[3:0] ADDSET[3:0] +位 名称 访问 描述 复位值 +[31:30] Reserved RO 保留。 0 +访问模式。(该位在EXTMOD为1时有效) +00:访问模式A; +[29:28] ACCMOD[1:0] RW 01:访问模式B; 00b +10:访问模式C; +11:访问模式D。 +[27:20] Reserved RO 保留。 0 +总线恢复时间。 +0000:1个HCLK周期; +0001:2个HCLK周期; +[19:16] BUSTYRN[3:0] RW 1111b +…… +1110:15个HCLK周期; +1111:16个HCLK周期。 +数据保持时间: +00000000:保留; +00000001:2个HCLK周期; +[15:8] DATAST[7:0] RW 0xFF +…… +11111110:255个HCLK周期; +11111111:256个HCLK周期。 +地址保持时间: +0000:保留; +[7:4] ADDHLD[3:0] RW 1111b +0001:2个HCLK周期; +…… +V2.4 424 + +# Page 428 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1110:15个HCLK周期; +1111:16个HCLK周期。 +地址建立时间: +0000:1个HCLK周期; +0001:2个HCLK周期; +[3:0] ADDSET[3:0] RW 1111b +…… +1110:15个HCLK周期; +1111:16个HCLK周期。 +V2.4 425 + +# Page 429 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 27 章 以太网收发器(ETH) +本章模块描述适用于CH32V30x、CH32V31x和CH32F20x微控制器系列部分产品。 +本章提到的“以太网收发器”是一个专有名词,意为微控制器内部的以太网(Ethernet)数据链 +路层收发器,通讯速率最高为千兆位每秒(1Gbps),是一个通讯外设。本章提到的“MAC”指的是以 +太网收发器在数据链路层的角色名称,是以太网收发器的组成部分。 +以太网收发器(Ethernet Transceiver MAC)是微控制器一个重要的高速通讯部件,它允许微控 +制器以千兆位(Gigabit)的连接速度接入以太网,实现极快的数据沟通。 +27.1 关于 CH32F207、CH32V307、CH32V317 产品 +27.1.1 主要特征 +CH32V307、CH32F207芯片的MAC支持MII/RMII/RGMII接口且内置一个10Mbps PHY;CH32V317芯 +片支持以太网控制器MAC和内置10Mbps/100Mbps PHY。 +以太网MAC通过SMI接口控制PHY,接口的时序由MAC自动实现,无需用户通过软件生成。RGMII +接口支持发送时钟相位翻转和相对数据延迟,最大延迟4纳秒。 +以太网MAC支持标准IEEE802.3协议的以太网,支持魔法帧和特定唤醒帧。以太网收发器搭配的 +DMA控制器以描述符的形式进行数据的收发管理和内存搬运,描述符的数量由用户根据沟通密集程度 +自行确定,DMA 控制器能以 32 位宽的速度向描述符指定的内存空间写入接收到的数据或从取出将发 +送的数据。此外,以太网收发器的MAC还支持IEEE1588精确时间协议。 +27.1.1.1 MAC 特征 + 支持MII/RMII/RGMII接口 + RGMII支持发送时钟延迟和翻转 + 支持全双工与半双工,支持10M/100M/1000Mbps的数据传输速率 + 支持自动插入帧头序列和SFD + 支持自动插入和校验CRC + 支持自动计算和校验IP/ICMP/TCP/UDP协议数据包的检验和 + 支持发送帧长控制 + 支持发送间隙调节 + 支持VLAN帧 + 支持帧接收地址的完美地址过滤、HASH过滤 + 支持帧发送地址过滤 + 支持多播广播帧接收控制 + 支持混杂模式 + 支持SMI管理接口(RGMII与MII各一套) + 支持魔法帧和自定义的唤醒帧唤醒微控制器 + 支持专门的以太网唤醒中断入口 + 支持链路层的数据回环 + CH32V307、CH32F207芯片应用可选以太网控制器MAC + 内置10Mbps PHY或外置1Gbps PHY + CH32V317芯片应用为以太网控制器MAC + 内置10Mbps/100Mbps PHY +27.1.1.2 DMA 特征 + 32位宽的MAC专享DMA + 最大程度减小CPU的操作 + 支持以字节对齐方式访问RAM +V2.4 426 + +# Page 430 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 以描述符的方式管理收发缓冲区 + 接收发送的一部分状态反馈在描述符中 + 可以动态修改非正在使用的描述符和缓冲区 + 支持手动停止或启动 + 支持链式或环式的形式连接描述符 + 支持收发完成中断等多种中断源 +27.1.1.3 MMC 模块特征 + 支持手动复位、停止或冻结 + 多个支持发送和接收的多种计数模式的计数器 + 支持多种中断 +27.1.1.4 PTP 模块特征 + 支持IEEE 1588协议 + 支持自动在收发时保存当前的时刻 + 自带一个32位的秒计时器和一个32位有符号的亚秒计时器 + 支持以精调和粗调两种方式调节时间 + 支持一个中断源 + 支持PPS输出 +27.1.1.5 内部 10M 物理层特征 + 支持10BASE-T + 通过SMI接口管理 + 支持MDIX自动翻转 + 支持MDI接口的差分对p/n极性翻转 + 支持手动复位 + 支持物理层的数据回环 + 支持半双工、全双工 +27.1.1.6 内部 10M/100M 物理层特征(仅 CH32V317) + 支持10BASE-T和100BASE-TX及自动协商 + 支持Auto-MDIX交换TX/RX,自动识别正负信号线 + 支持RMII接口模式 + 支持支持WOL网络唤醒 + 支持中断功能 + 支持半双工、全双工 + 两种网络状态LED +27.1.2 概述 +以太网收发器工作在 OSI 七层模型中的数据链路层和物理层。如果需要实现大于 10Mbps 的数据 +传输速率,需要外接百兆或千兆物理层芯片(PHY)实现物理连接。为了能在广泛使用的以太网中建 +立 IP、TCP 和 UDP等协议的通讯,用户还需要用软件实现 TCP/IP协议栈。以太网收发器由媒体访问 +控制层(MAC)、搭配的DMA及二者的控制寄存器及十兆物理层组成。 +V2.4 427 + +# Page 431 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-1 以太网收发器在OSI模型和TCP/IP模型中的位置 +Application Layer +Representation Several application +Application Layer +Layer protocols +Session Layer +Several transport +Transport Layer Transport Layer +protocols +Network protocols +Network Layer Network Layer +and other ancillary +Ethernet +protocols +Transceiver +Data Link Layer Data Link Layer +Low-level LAN and +WAN technologies +Physical Layer Physical Layer PHY +OSI model TCP/IP protocol family +以太网收发器的 MAC 按照 IEEE802.3 协议的规范设计,搭配 32 位宽的 DMA,保证数据能快速地 +从网线上转发到微控制器的内存中。以太网收发器拥有强大完整的DMA控制寄存器、MAC控制寄存器 +和模式控制寄存器,微控制器的 CPU 通过 HB 总线操作以太网收发器的寄存器。以太网收发器通过 +RGMII 接口和千兆以太网物理层连接,如果只需要百兆以太网的速度,则可以通过 MII 或 RMII 接口 +和百兆以太网物理层连接。以太网收发器的MII、RMII和RGMII接口的管脚是复用的,具体参看27.1.3 +节。以太网收发器通过 SMI 接口管理以太网物理层。使用以太网收发器时,HB 总线的时钟不能低于 +50MHz。 +图27-2 以太网收发器的结构框图 +MII +DMA Operation Media access +HB control & mode Control RMII +status register MAC 802.3 +registers +RGMII +Checksum PTP +offload IEEE1588 +125MHz +External PHY +PMT MMC +MDC +MAC +control MDIO +registers +RAM Ethernet +DMA +MDI +Magnetics +PHY +此外,以太网收发器还支持IEEE1588精确时间协议(PTP),为微控制器系统或片外提供精确的 +时间数据。 +27.1.3 以太网收发器使用引脚的分布和配置 +微控制器支持三种MII接口,即标准MII、RMII和RGMII。MII/RMII接口专用于十兆和百兆以太 +网物理层,RGMII接口可用于十兆、百兆和千兆以太网。下表显示了标准MII,RMII和RGMII接口及 +内部物理层在封装引脚上的分布。 +V2.4 428 + +# Page 432 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表27-1 微控制器的媒体独立接口、内置物理层的介质相关接口 +及其他相关的引脚分布和需要进行的配置 +RGMII的 MII/RMII的 +引脚 RGMII MII RMII +引脚配置 引脚配置 +PA2 TXCLK MDIO 推挽复用输出 +PC1 RXCTL 浮空输入 MDC 推挽复用输出 +PC0 RXCLK 浮空输入 +PA1 RXD3 浮空输入 RX_CLK REF_CLK 浮空输入 +PA7 TXD0 推挽复用输出 RX_DV CRS_DV 浮空输入 +PC4 TXD1 推挽复用输出 RXD0 RXD0 浮空输入 +PC5 TXD2 推挽复用输出 RXD1 RXD1 浮空输入 +PB0 TXD3 推挽复用输出 RXD2 浮空输入 +PB1 125MHz_IN 浮空输入 RXD3 浮空输入 +PB10 RXER 浮空输入 +PC3 RXD1 浮空输入 TX_CLK 浮空输入 +PB11 TX_EN TX_EN 推挽复用输出 +PB12 MDC 推挽复用输出 TXD0 TXD0 推挽复用输出 +PB13 MDIO 推挽复用输出 TXD1 TXD1 推挽复用输出 +PC2 RXD0 浮空输入 TXD2 推挽复用输出 +PB8 TXD3 推挽复用输出 +PA0 RXD2 浮空输入 CRS 浮空输入 +PA3 TXCTL 推挽复用输出 COL 浮空输入 +PB5 PPS_OUT(推挽复用输出) +PC6 10BASE-T_RX_p(无需IO配置) +PC7 10BASE-T_RX_n(无需IO配置) +PC8 10BASE-T_TX_p(无需IO配置) +PC9 10BASE-T_TX_n(无需IO配置) +27.1.4 物理层(PHY)管理和数据交互 +以太网收发器的 MAC 通过站点管理接口(SMI 接口)对 PHY 进行管理,使用媒体独立接口(MII +接口)与 PHY 进行数据交互。微控制器支持的 MII 接口包括标准 MII(一般就写为 MII)、精简 MII +(RMII)和精简的千兆MII(RGMII)。微控制器在MII/RMII模式下和RGMII模式下使用不同管脚引 +出SMI接口。 +27.1.4.1 SMI 接口 +SMI接口是一种串行通讯接口,使用MDC(时钟线)和MDIO(数据线)两线来访问PHY的寄存器 +实现对PHY的管理,最多可以管理32个PHY芯片。其中MDC是时钟线,空闲时保持低,MDIO是数据 +线。SMI的读写操作和帧的组成都是由MAC主导的,用户只需要写入地址和数据。相关的寄存器分别 +为MII地址寄存器(R32_ETH_MACMIIAR)和MII数据寄存器(R32_ETH_MACMIIDR)。 +27.1.4.1.1 帧格式 +SMI接口管理帧的格式如下表27-2所示。 +V2.4 429 + +# Page 433 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表27-2 SMI帧格式 +Preamble STR OP PHY ADR REG ADR T DATA P +32个 +读 01 10 PPPPP RRRRR Z0 DDDDDDDDDDDDDDDD Z +“1” +32个 +写 01 01 PPPPP RRRRR 10 DDDDDDDDDDDDDDDD Z +“1” +管理帧各域的定义如下: +1) Preamble:先导符,由32个“1”组成,用于MAC和PHY同步; +2) STR:起始符,固定为“01”; +3) OP:操作符,读为“10”,写为“01”; +4) PHY ADR:物理层地址,5位; +5) REG ADR:寄存器地址,5位; +6) T:转换符,两位,用来切换MAC和PHY对MDIO线的控制权。在读操作时,MAC保持对MDIO线的 +高阻,PHY对第一位保持高阻,对第二位下拉,并获取MDIO的控制权;在写操作时,MAC对MDIO +线先置高再下拉,PHY对MDIO保持高阻状态,MAC保持对MDIO的控制权; +7) DATA:数据域,16位,MAC对PHY读写的数据,MSB在前; +8) P:MAC和PHY都对MDIO保持高阻状态,但PHY的上拉电阻会把MDIO拉高。 +27.1.4.1.2 读写时序 +写PHY寄存器操作如下: +当用户设置了MII写位(ETH_MACMIIAR:MW)和忙位(ETH_MACMIIAR:MB),SMI接口会向PHY发 +送PHY地址和寄存器地址,然后发送数据(ETH_MACMIIDR)。在SMI接口发送数据的过程中,不能修 +改MII地址寄存器和MII数据寄存器的值;在此过程中,忙位保持为高,对MII地址寄存器或MII数 +据寄存器的写操作将被忽视,并且不对整个传输造成影响。当完成写操作时,SMI 接口将清除忙位, +用户可以根据忙位判断写操作结束。如图27-3的写部分。 +读PHY寄存器操作如下: +当用户把以太网MAC的MII地址寄存器(ETH_MACMIIAR)的MII忙位置位,而保持MII写位复位 +时,SMI接口则发送PHY地址和寄存器地址,执行读PHY寄存器的操作。在整个传输过程中,用户不 +能修改MII地址寄存器和MII数据寄存器的内容。在传输过程中,忙位保持为高,对MII地址寄存器 +或MII数据寄存器的写操作将被忽视,并且不影响整个传输的正确完成。在读操作完成后,SMI接口 +将清除忙位,并把从PHY读回的数据写入MII数据寄存器。如图27-3的读部分。 +图27-3 SMI接口读写时速图 +MDC +MDIO 32 1's 0 1 0 1 A4 A3 A2 A1 A0 R4 R3 R2 R1 R0 D15D14 D1 D0 +Start +OP Turn +Preamble of code PHY address Register address around data +frame +Write +Data to PHY +Read +Data to PHY Data to PHY +27.1.4.1.3 SMI时钟 +V2.4 430 + +# Page 434 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +一般来说SMI时钟需要保持在一个固定的范围,以保证实际上SMI的时钟需要被PHY接收。具体 +参考用户选用的PHY芯片的手册。 +SMI时钟频率通过MII地址寄存器(ETH_MACMIIAR)的CR域从HB时钟分频得到。下表显示和SMI +时钟和HB时钟的分频关系。默认选择42分频。 +表27-3 SMI时钟和HB时钟的分频关系 +适合搭配的HB时钟的范围 SMI时钟 +0000b 60MHz以上 HB时钟/42 +0010b 20-35MHz HB时钟/16 +0011b 35-60MHz HB时钟/26 +其它值 无意义 +27.1.4.2 MII/RMII 接口 +27.1.4.2.1 概述 +媒体独立接口(MII)是MAC和PHY进行数据沟通的接口,根据速度和引线数量区分,有标准MII、 +RMII、GMII、RGMII和SGMII等。媒体独立接口一般是有接收、发送各一组,每组由时钟线、若干数 +据线和辅助线组成。支持的MII接口为:标准MII/RMII支持十兆和百兆物理层,RGMII支持十兆、百 +兆和千兆物理层。由于市场上常用的物理层一般是10M/100M自动协商物理层、10M/100M/1000M自动 +协商物理层,所以用户在使用 10M/100M 自动协商物理层时应该使用标准 MII/RMII 接口,在使用 +10M/100M/1000M物理层时应该使用RGMII接口。 +一般情况下,媒体独立接口发送方向(TX开头)的时钟和数据是由MAC发出的,接收方向(RX开 +头)的时钟和数据是由PHY发出的,但是RMII的时钟是公用的。同方向的引脚走线应注意等长布线, +具体布线要点参看用户选用的物理层芯片的Layout手册或本手册27.1.4.2.2章节。 +27.1.4.2.2 引脚 +MII接口的引脚和功能如下: +表27-4 MII接口的引脚和功能 +引脚 功能 +TXC 发送时钟(2.5MHz或25MHz) +TXEN 发送数据使能 +TXD0 +TXD1 +发送数据线[0:3] +TXD2 +TXD3 +RXC 接收时钟(2.5MHz或25MHz) +RXDV 指示接收数据有效 +RXER 接收数据错误 +RXD0 +RXD1 +接收数据线[0:3] +RXD2 +RXD3 +COL 冲突检测 +CRS 载波检测 +图27-4显示了使用MII接口的定义时,MAC和PHY如何连接。 +V2.4 431 + +# Page 435 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-4 以太网收发器使用MII接口,MAC和PHY如何接线 +TX_CLK +TXD[3:0] +TX_EN +RX_CLK +RXD[3:0] +MAC RX_DV External +PHY +RX_ER +COL +CRS +MDC +MDIO +RMII接口的引脚和功能如下: +表27-5 RMII接口的引脚和功能 +引脚 功能 +CLK_REF 收发时钟(50MHz) +TXEN 发送数据使能 +TXD0 +发送数据线[0:1] +TXD1 +CRSDV 接收数据有效 +RXD0 +接收数据线[0:1] +RXD1 +使用RMII接口时,收发时钟共用同一根线传输,时钟频率固定为50MHz。当RMII使用在10Mbps +的速率时,RX和 TX每隔10个周期采样一个数据,数据线需要将数据保留 10个周期;MAC和PHY需 +要使用同一个时钟源。可以将 MAC的 MCO输出接到PHY的外部时钟源输入引脚上。图 27-5显示了使 +用RMII接口时,MAC和PHY如何接线。 +图27-5 使用RMII接口,MAC和PHY的接线示意图 +TXD[1:0] +TX_EN +RXD[1:0] +External +MAC RXDV +PHY +MDC +MDIO +REF_CLK +Clock source +注:以太网收发器需要从RXC引脚输入外界提供的REF_CLK 50MHz时钟频率。 +27.1.4.2.3 时序 +RMII和MII的时序的区别在于: + RMII的时钟固定为50MHz,而MII的收发时钟随着实际连接速度的不同而工作在2.5MHz或25MHz; + RMII收发共用同一个时钟线; +V2.4 432 + +# Page 436 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + RMII是两位数据线,而MII是四位数据线。 +如图27-6 显示了RMII和MII的时序。 +图27-6 MII和RMII的时序图 +MII_TX_ CLK +MII_TX_ EN +MII_TXD[3: 0] +RMII_ REF_CLK +RMII_TX_ EN +RMII_TXD[1: 0] +27.1.4.3 RGMII 接口 +27.1.4.3.1引脚 +RGMII的引脚和功能如下表 +表27-6 RGMII的引脚和功能 +引脚 功能 +TXC 发送时钟 +TXCTL 发送数据控制 +TXD0 +TXD1 +发送数据线[0:3] +TXD2 +TXD3 +RXC 接收时钟 +RXCTL 接收数据控制 +RXD0 +RXD1 +接收数据线[0:3] +RXD2 +RXD3 +注:1.TXCTL/RXCTL在本微控制器的以太网收发器中用作收发数据有效信号来使用; +2.RGMII有独立的SMI接口。 +27.1.4.3.2时序 +RGMII工作在十兆和百兆速率的模式下,时序和MII类似;工作在千兆时,RGMII的时钟为125MHz, +采用双边沿采样的方式。RGMII不支持半双工。 +由于 RGMII 使用双边沿采样且工作在 125MHz 的时钟频率下,因此电路设计人员应注意信号完整 +性问题。 +RGMII的接收方接收到的时钟应相对数据滞后90°以保证正确采样。以太网收发器设计了发送时 +钟延迟输出和相位翻转的功能。 +V2.4 433 + +# Page 437 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-7 RGMII的时序示意图 +27.1.4.4 内部 10M、100M 物理层使用时的注意事项 +27.1.4.4.1 内部 10M物理层使用时的注意事项(仅适用于 CH32F207、CH32V307) +在置位扩展寄存器的内部物理层使能位时,所有的MII相关的配置都将被无视,对SMI接口的读 +写将直接映射到内部物理层,且忽略SMI接口写入的物理层地址。用户可以对内部物理层的寄存器进 +行访问以获取物理层连接状态,详见27.1.8.5章节。 +27.1.4.4.2 内部 10/100M物理层使用时的注意事项(仅适用于 CH32V317) +内部10/100M物理层由Control register(地址0x00)和Auto-Negotiation Advertisement(地 +址0x04)寄存器进行配置,相关配置位已默认开启,相关寄存器请参考《CH182DS2》手册。 +10/100M以太网收发器使用RMII接口,MAC和内部PHY接线如下图所示: +PE7 RSTB +PE8 TXEN +PE9 CRSDV +PE10 TXD1 +PE11 TXD0 +MAC Internal +PE12 TXC PHY +PE13 RXD1 +PE14 RXD0 +PE15 MDC +PD8 MDI0 +10/100M以太网收发器使用RMII接口相关的引脚分布和需要进行的配置,如下表所示(以下引脚 +仅用于EHT): +引脚 RMII RMII的引脚配置 +PE7 RSTB 推挽复用输出 +PE8 TXEN 推挽复用输出 +PE9 CRSDV 浮空输入 +PE10 TXD1 推挽复用输出 +PE11 TXD0 推挽复用输出 +PE12 TXC 推挽复用输出 +PE13 RXD1 浮空输入 +PE14 RXD0 浮空输入 +V2.4 434 + +# Page 438 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +PE15 MDC 推挽复用输出 +PD8 MDIO 推挽复用输出/浮空输入 +27.1.4.5 时钟产生和输出 +27.1.4.5.1 外设时钟源配置 +图27-8 以太网外设时钟树 +60MHz +XTI to MCO ETH-PHY +PREDIV2 PLL3MUL +OSC_IN 3-25MHz /1,/2,… /8,/9,… PLL3CLK +OSC_OUT HSE OSC /15,/16 /16,/20 +MII/RMII interface +MII_TXC +MACTXCLK +MII__RMII_SEL in AFIO_MAPR +MII_RXC MACRXCLK +to Ethernet +MAC +GTXC +GTXC +RGMIION +GRXC +GRXC +ETH1G_EN +EXT_125M +ETH1G_125M +PLL2VCO +PLL3VCO +ETH1G_SRC RGMII interface +内部10M以太网物理层的时钟由PLL3提供,且必须为60MHz。使用内部物理层时,需要把扩展寄 +存器的第2位置位,置位后,MII/RMII/RGMII相关的设置均无效。 +在使用MII时,收发时钟都由外部的物理层提供,为2.5MHz或25MHz。在使用RMII时,REF_CLK +是唯一的时钟,从RXC引脚输入微控制器,固定为50MHz,使用RMII时需要将AFIO重映射寄存器中 +的第23位置位。 +在使用 RGMII 时,MAC 需要频率为 125MHz 的时钟,由内部 PLL2/PLL3 的 VCO 产生(VCO 输出是 +PLL 输出频率的两倍)或外部输入,通过 EXT_125M 引脚输入 125MHz 时钟。RGMII 的发送时钟由 MAC +产生,接收时钟由PHY产生。开启RGMII需要在扩展寄存器中将第3位置位,并在RCC的第二个配置 +寄存器中将第22位置位,同时在[21:20]中选择合适的125MHz时钟源,详见官网EVT例程。 +27.1.4.5.2 MCO输出 +已知MCO支持HSE、HSI、系统主频、PLLCLK/2、PLL2CLK、PLL3CLK、PLL3CLK/2和XTI这八种时 +钟的输出,用户可以利用 MCO 输出应用中所需要的频率,比如常见物理层芯片所需要的 25MHz 时钟, +并以此节省一颗晶体。MCO的输出频率不应大于100MHz。 +27.1.5 IEEE802.3 和 IEEE1588 +IEEE802.3协议及其补充协议组成目前以太网的官方标准,它详细定义了目前使用的以太网的方 +方面面。我们可以认为以太网处于OSI模型中的物理层和数据链路层的一部分。本节在应用的角度上 +讨论IEEE802.3协议中用户需要用到的部分,即帧格式和MAC地址相关的内容。同时,微控制器的以 +太网收发器还支持IEEE1588精确时间协议,本文还将讨论IEEE1588的部分内容。 +V2.4 435 + +# Page 439 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +IEEE802.3协议构建的以太网模型中,数据传输单元是以太网帧。以太网帧在不同的介质上以不 +同的速率传输时有不同的编码形式,接收后经过物理层解码,通过 MII 接口发给 MAC,MAC 校验和过 +滤通过后,由TCP/IP协议栈提取出应用信息发给不同的应用进程。 +27.1.5.1 帧格式 +以太网帧的帧格式如表27-7所示。 +表27-7 普通以太网帧格式 +前同步码 SFD 目标地址 源地址 长度或类型 数据域 CRC +46-1500 +7 Bytes 1Byte 6 Bytes 6 Bytes 2 Bytes 4 Bytes +Bytes +总长度:64至1518字节加上8字节的物理层首部(前同步码和SFD) +前同步码:56位(7字节)交替的低电平和高电平跳跃,值固定,用十六进制表示即为0xAA-0xAA- +0xAA-0xAA-0xAA-0xAA-0xAA。此域用来进行时钟同步。该域由硬件自动添加/去除,用户不需要理会。 +SFD:帧首定界符,8 位(1 字节),值为 10101011b,SFD 用来提醒接收方这是最后一次进行时 +钟同步的机会,其后为目标地址。该字节由硬件自动添加/去除,用户不需要理会。 +目标地址:发送这个帧的设备希望接收这个帧的设备地址,这里指的是硬件地址,又称MAC地址, +由IEEE为生产商分配,全球唯一,6字节48位。本公司(WCH)的微控制器的MAC地址出厂时已烧录 +在芯片内部。地址的发送遵循低有效位在前的原则。 +源地址:发送这个帧的设备的硬件地址。源地址必须为单播地址。 +长度或类型:2字节,以太网一般用作类型,IEEE802.3标准中也用作长度,以1536(即0x0600) +分界,1536 以上表示协议,表示数据部分是根据何种上层协议组织起来的,例如 0x0806 表示 ARP, +0x0800表示IPv4,0x86dd表示IPv6;1536以下表示数据长度。 +数据域:最小 46 字节,最大 1500 字节。当数据域不足 46 字节需要加填充增至 46 字节,超过 +1500字节请另组一帧。数据域中装载着需要实际发送的数据。 +CRC:循环冗余校验,此处用的是CRC32校验。 +27.1.5.2 帧发送 +以太网收发器发送数据帧的时候,其专有的 DMA 控制器从发送描述符(trans descript 在 +27.1.4.1.1 节)指定的 RAM 中取出要发送的数据通过专用数据总线压进 MAC。FIFO 的填充程度会返 +回到 DMA 控制器中,当要发送的数据全部发送完,DMA 控制器会向 MAC 发送一个数据开始信号,MAC +会启动发送;从FIFO中读取数据,向MII接口(RMII/RGMII)发送先导、SFD,发送实际数据;在DMA +控制器向MAC发送数据结束信号后,MAC加上自动计算的CRC。 +MAC会按照配置自动设备发送帧的类型,并为其中的检验和域计算校验和,并取代原来校验和域 +的值。此功能可以关闭。 +MAC会自动向填充后面加上CRC32校验,也可以设置成不加上CRC校验位。按照IEEE802.3协议 +的规定,数据域长度不低于46字节,当MAC检测到将要发送的数据域短于46字节时,会自动在数字 +域后加上填充,如果选择自动填充,则必然会加上 CRC32 校验,无视寄存器配置。MAC 采用的 CRC32 +检验公式如下: +( ) +在使能了IEE"E# 158#8$(PTP#)" 功能##的情%况$下,%#MAC在%%发送以%&太网'帧时(,将保) 存当*前时#间戳在描述符 +G ! =! +! +! +! +! +! +! +! +! +! +! +! +! +!+1 +中,但同时会覆盖掉部分信息,用户可以在接收中断中及时读取时间戳并补全描述符。 +27.1.5.3 帧接收 +以太网收发器在接收以太网帧的时候,以太网帧从MII、RMII或RGMII进入到MAC,在MAC中首 +先进入到FIFO,然后被DMA转发到RAM中的缓冲区。MAC会对以太网帧进行过滤和检查,过滤包括完 +V2.4 436 + +# Page 440 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +美地址过滤和HASH过滤,检查则一般是对帧进行帧长度,IP/ICMP/TCP/UDP的检验和CRC检查,未通 +过过滤或检查的帧会被描述符标记出来或被丢弃,超过长度的包可能会被掐断。 +在使能了IEEE 1588(PTP)功能的情况下,接收帧时,MAC会保存当前时间戳在描述符中,但同 +时会覆盖掉部分信息,用户可以在接收中断中及时读取时间戳并补全描述符。 +27.1.5.4 帧过滤 +使用 MAC帧过滤器可以对接收的帧的目标 MAC地址和源 MAC地址进行完美过滤或 HASH过滤,并 +可以设置使不通过过滤的帧被丢弃、被接收、或是被在接收描述符中标记出来。此功能请详细阅读MAC +帧过滤寄存器(R32_ETH_MACFFR)的描述。MAC内置了四个 MAC 地址寄存器,其中 MAC地址寄存器 0 +被默认用作存储自身的MAC地址,其余三个MAC地址寄存器可以被用作完美过滤,与接收到帧的源地 +址或目标地址对比。在置位 R32_ETH_MACFFR:RA 后,所有接收到的帧都将会被收到,但相应的状态 +会在之后描述符的第一个字的状态域中被标记出来,如果置位R32_ETH_MACFFR:PM会有类似的效果, +但是状态不会被标记。在置位R32_ETH_MACFFR:DAIF/SAIF后,会有结果翻转的效果,原来通过过滤 +的将会被丢弃或标记,未通过过滤的反而会被转给RAM中的缓冲区。 +27.1.5.4.1 单播过滤 +MAC通过HPF位和HU位来确定单播帧进行HASH过滤还是完美地址过滤。 +27.1.5.4.2 多播过滤 +MAC通过HPF位和HM位来确定多播帧进行HASH过滤还是完美地址过滤。当PAM位置位后,所有 +的多播包都能通过过滤器。 +27.1.5.4.3 广播过滤 +通过置位BFD位,MAC可以阻断所有的广播包。 +27.1.5.4.4 源地址过滤选择 +通过设置 MAC 地址寄存器中的 AE 位,可以启用该 MAC 地址寄存器,而设置 SA 位可以决定将该 +MAC地址寄存器作为源地址样本还是目标地址样本来进行对比。 +27.1.5.4.5 小结 +对目标地址和源地址的过滤设置分别如表27-8和表27-9。 +表27-8 R32_ETH_MACFFR各个位的设置对接收到帧的目的MAC地址的接受程度 +帧类型 PM HPF HU DAIF HM PAM 效果 +1 - - - - - 通过 +广播帧 +0 - - - - - 不通过(BFD置位) +1 - - - - - 所有帧通过 +0 - 0 0 - - 完美滤波匹配时通过 +0 - 0 1 - - 完美滤波匹配时不通过 +单播帧 0 0 1 0 - - HASH滤波匹配时通过 +0 0 1 1 - - HASH滤波匹配时不通过 +0 1 1 0 - - 完美滤波或HASH滤波匹配时通过 +0 1 1 1 - - 完美滤波或HASH滤波匹配时不通过 +1 - - - - - 通过 +- - - - - 1 通过 +多播帧 +0 - - 0 0 0 完美滤波匹配时通过 +0 0 - 0 1 0 HASH滤波匹配时通过 +V2.4 437 + +# Page 441 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0 1 - 0 1 0 完美滤波或HASH滤波匹配时通过 +0 - - 1 0 0 完美滤波匹配时不通过 +0 0 - 1 1 0 HASH滤波匹配时不通过 +0 1 - 1 1 0 完美滤波或HASH滤波匹配时不通过 +表27-9 R32_ETH_MACFFR各个位的设置对接收到帧的源MAC地址的接受程度 +帧类型 RA SAIF SAF 效果 +1 - - 所有帧通过 +0 0 0 完美过滤器匹配时通过,标记但不丢弃未通过的帧 +单播帧 0 1 0 完美过滤器匹配时不通过,标记但不丢弃未通过的帧 +0 0 1 完美过滤器匹配时通过,丢弃未通过的帧 +0 1 1 完美过滤器匹配时不通过,丢弃未通过的帧 +注:“-”表示不关心该位的设置。 +27.1.5.5 MMC +管理计数器(MMC)的作用主要是对各种指示帧接收发送状态和 MAC 运转状态进行计数。它可以 +产生设置并产生中断。一般情况下,我们可以通过接收“好”帧计数器(MMCRGUFCR)获取当前接收到 +的完好的帧的数量,通过发送“好”帧计数器(MMCTGFCR)来获取成功发送出去的帧的数量,通过接 +收 CRC 校验错误的帧计数器(MMCRFCECR)查看有无接收 CRC 错误的帧,一般情况下,如果数据时正 +确的但是CRC错误,可以认为RGMII线layout方面有问题。 +用户需要明晰一个概念:什么样的帧是“好”的帧。正常情况下,只要一个帧启动发送,它的帧 +长符合要求(开启了自动填充),并且开启了自动计算CRC,那么它就会是一个“好”帧。而一个帧 +被接收到,只要它CRC正确,帧长在以太网帧长度范围内,帧长和长度域的值一致(如果长度类型域 +表示的是长度),或没有发生不对齐,那么就会被认为是一个“好”的接收帧。 +27.1.5.6 PMT +27.1.5.6.1 概述 +PMT(power management)部分的功能主要是通过以太网使微控制器从低功耗模式唤醒。千兆以 +太网控制器支持两种帧使系统唤醒,即魔法帧和(远程)唤醒帧。当以太网收到这两种帧时,由于微 +控制器处于低功耗模式,因此并不一定会产生接收中断,即使其合法,但是如果其通过MAC的魔法帧 +和唤醒帧识别,就会产生PMT中断,PMT中断是和以太网中断独立的中断,通过查询PMT控制和状态 +寄存器就能查出是哪种以太网帧产生了中断。 +27.1.5.6.2 魔法帧 +AMD公司定义的魔法帧(magic package,也有称幻数据包)是常用的一种唤醒微控制器的以太网 +帧,它有固定而特殊的帧格式,即通过帧过滤能让目标网卡接收到,可以封装成广播帧,帧中有连续 +6个字节的全高(OXFF),之后紧跟16次重复的目标网卡的MAC地址。这个组合可以存在于帧的任何 +位置,因此魔法帧可以封装成Mac帧或IP包甚至UDP包。以下是魔法帧的格式。 +xx xx xx xx xx xx xx xx(之前的数据无限制,甚至可以没有之前的数据)—ff ff ff ff ff +ff 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 +02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 +01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 e4 01 02 02 84 c2 +e4 01 02 02 84 c2 e4 01 02 02 xx xx xx xx xx xx(有的网卡要求魔法帧最后附带上密码)。 +27.1.5.6.3 唤醒帧 +由于魔法帧的格式存在限制,(远程)唤醒帧的格式可以由用户自行定义。只要是通过远程唤醒 +V2.4 438 + +# Page 442 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +帧过滤寄存器(ETH_MACRWUFFR)组的以太网帧都被认为是唤醒帧,用户通过设置远程唤醒帧过滤寄 +存器组来定义满足自己需要的唤醒帧。需要注意的是,远程唤醒帧过滤寄存器组只有一个地址入口, +用户可以通过连续的八次写操作向其中写数据,再通过连续的八次读数据即可读出原来写进远程唤醒 +帧过滤寄存器组的数据。 +远程唤醒帧过滤寄存器组的结构如下表: +表27-10 远程唤醒帧过滤寄存器组的结构 +过滤寄存器0 过滤寄存器0的字节掩码 +过滤寄存器1 过滤寄存器1的字节掩码 +过滤寄存器2 过滤寄存器2的字节掩码 +过滤寄存器3 过滤寄存器3的字节掩码 +过滤器 过滤器 过滤器 过滤器 +过滤寄存器4 保留 保留 保留 保留 +3命令 2命令 1命令 0命令 +过滤寄存器5 过滤器3偏移 过滤器2偏移 过滤器1偏移 过滤器0偏移 +过滤寄存器6 过滤器1 CRC-16 过滤器0 CRC-16 +过滤寄存器7 过滤器3 CRC-16 过滤器2 CRC-16 +由上表可以看出,过滤寄存器的字节掩码、命令、偏移、过滤器这四个域共同作用能确定一个帧 +是否是远程唤醒帧,实际上可以设置四种不同的满足要求的帧。 +32位的字节掩码最高位必须为0,bit[30:0]是对应由偏移域定义的开头的31字节数据,此中若 +有bit置1,则表明对应字节参与CRC-16校验,且最多有31个字节参与计算; +4位命令域的最高位表示对什么样的帧起作用,1为只对多播地址有效,0为只对单播地址有效; +命令域的第2位和第1位保留,第0位为使能位,置高表示启用这组过滤器; +偏移域表示从帧头开始偏移多少个字节开始计算 CRC16 的值,最小填 12,如若偏移域为 12,则 +为从开头第13个字节开始计算CRC16的值(参数模型使用CRC-16-IBM,参数默认)。 +过滤器则存放了用户期望计算出的CRC结果的值,MAC会将自己计算出的CRC16的值与这个域之 +中的值进行比对,如果一致,则认定为(远程)唤醒帧,如果使能了唤醒帧中断和PMT中断,则还会 +产生PMT中断。 +另外,根据 PMT 控制状态寄存器的位定义,如果置位了 GU 位,那么通过帧过滤的单播帧也会被 +认为是唤醒帧。 +27.1.5.7 IEEE1588 PTP +27.1.5.7.1 PTP原理和实现 +IEEE1588 标准定义了一套获取时间的精确协议,它的目标是实现 10 微秒误差之内的时间同步。 +原本NTP协议已经可以实现200微秒的级别的时间同步,但实际上这个级别还无法满足工业自动化领 +域的时间同步需求,于是网络精密时钟同步委员会起草了PTP协议,并在2002年底被IEEE标准委员 +会通过,作为IEEE1588标准。 +PTP协议的实现需要主机和从机都能精确记录MAC接收和发送以太网帧的时间,这需要主机和从 +机都有一套自己的高精度时间计数器。随后,支持PTP的主从机通过一套流程进行对时,从机可以以 +此得到自己和主机的时间差并进行修正。下图显示了主从机对时的流程: +V2.4 439 + +# Page 443 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-9 IEEE1588 PTP协议同步报文时序图 +分步描述: + 主机向从机发送syn消息,从机接收到此消息,记录下接收到syn消息时的本地时间t2; + 主机向从机发送follow_up消息,包含主机发送syn消息时的主机时间t1; + 从机向主机发送delay_req消息,从机记录下发送时间t3; + 主机向从机发送delay_resq消息,包含delay_req消息的接收时间t4; +实际使用中,主机是每隔两秒对外发一次syn消息的,而每隔一个syn消息都可以认为是上个 +syn消息的follow_up消息,他们都会附带上一次syn消息的发送时间。从机经过这个过程可以得 +知主机网络到从机网络延迟时间Tdelay,然后算出主机时间和从机时间的时间偏移。 +(t2-t1) + (t4-t3) +Tdelay = +2 +任一主机发出的时间减去偏移即是主机的时间。 +PTP的同步流程一般通过UDP协议实现,当然用户也可以自定协议实现。PTP高度依赖内网的延 +迟稳定性。 +27.1.5.7.2 本地时间更新与校正 +为了实现PTP的主机,设备本地是需要有一个高精度的时间计数器的,起码要精确到纳秒级。微 +控制器的千兆以太网计数器的PTP模块拥有一个32位以秒为单位的计数器,和一个31位的亚秒计数 +器,当亚秒计数器溢出时会引起秒计数器自增,因此本地时间的分辨率可以做到0.46纳秒左右。 +本地时间的更新方式分为两种,即粗调和精调。粗调方式的更新时机是由外部决定的,在需要进 +行时间更新时,将时间戳控制寄存器的时间更新位(PTPTSCR:TSSTU)置位,微控制器的 PTP 模块会 +将秒计数器和亚秒计数器减去或加上时间戳更新寄存器(TSHUR、TSLUR)的值。粗调是一种较为简单 +且方便的时间更新机制,但是精确较差。 +精调的时间更新方式是更常用的。其更新流程如下: +V2.4 440 + +# Page 444 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-10 使用精调方式更新时间的流程 +Addend register +Addend update ++ +Accumulator register +Constant value +Increment Subsecond +register ++ +Subsecond register +Increment Second register +Second register +使用精调模式的方式需要对系统主频和精调的流程有较清晰的了解。与粗调方式不同,精调方式 +更新事件的时机是累加器(32位,寄存器列表中未列出。图中的Accumlator register)溢出,累加 +器在每个系统主频时钟周期都会自增加数寄存器(PTPTSAR,图中的Addend register)的值,一旦溢 +出就会产生时间更新事件,即亚秒自增寄存器(PTPSSIR,图中的Constant Value)的值会加到亚秒 +计数器(Subsecond register),完成时间更新。在亚秒计数器溢出时,秒计数器会自增。而实际上, +亚秒计数器自增一位的时间为1/(2^31)=0.46566128730…纳秒,用户需要自行保证累加器溢出花费 +的时间刚好等于亚秒自增寄存器的值乘以亚秒计数器自增一位的时间。 +本地时间的校正较为简单,将时间戳控制寄存器的时间校正位(PTPTSCR:TSSTI)置位,则秒计数 +器和亚秒计数器的值会被时间戳更新计数器(TSHUR、TSLUR)的值替代。 +27.1.6 DMA 操作 +27.1.6.1 概述 +在以太网收发器中,数据从MII接口进入FIFO,然后被DMA转入RAM中。即使是最大的普通以太 +网帧,数据部分达到最大的 1500 字节,也只需要几十微秒左右就能接收发送完毕,即使算上 MAC 的 +接收检测,DMA 转移时间和帧间隔时间,CPU 也需要在一百微秒内就要处理一个帧。以太网收发器的 +优势是速度快和吞吐量大,为了维持这个优势,必须把以太网帧接受发送过程中,需要CPU进行的干 +预尽可能得减少,这里就要使用以太网收发器专用DMA。 +以太网使用的DMA是32位的,它通过两种数据结构接受CPU的管理:传统的控制和状态寄存器, +接收和发送描述符。由于DMA是 32位宽的,所以要求收发描述符队列在 RAM中的基地址是 4字节对 +齐的。收发缓冲区则没有对齐要求。 +27.1.6.2 DMA 描述符(DMA Desciptor) +用户使用传统外设主要是通过写寄存器的控制位实现,并且以读取状态寄存器的方式来获取外设 +的状态和返回信息。这些寄存器是独立于内核,SRAM和非易失性存储器之外的空间,是实际存在的, +可以称之为“硬件寄存器”。传统的通讯外设,比如USART或SPI,都有一个数据寄存器来暂存收发 +的数据,有一组DMA将收到的所有数据统一保存到特定的地址空间。 +而以太网收发器以其极高的数据传输速度、极大的数据吞吐量和独特的数据帧组织形式,使得它 +的操作不同于传统的通讯收发器。以太网收发器尽可能密集地接收大量的数据,它必须将收到的数据 +流以帧为单位存到单独的内存空间,自行完成接收和发送操作,使CPU能以最少的操作就能读取并处 +理掉这些数据,释放出对应的内存空间,并保证DMA控制器和CPU不会就内存的使用权限起冲突。内 +V2.4 441 + +# Page 445 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +存中被开辟用来暂存以太网帧的缓冲区单个大小一般设置为以太网帧的最大包长,IEEE802.3规定为 +1518个字节(包括源止硬件地址、长度或类型域和CRC32校验域共18个字节);以太网帧收发缓冲 +区的数量根据实际交互的频度和微控制器内存资源由用户自行确定。 +以太网帧的缓冲区以类似队列的形式组织起来,在接收方向,以太网帧通过MAC被DMA写入内存 +而入队,被 CPU 读取而出队;在发送方向,以太网帧被 CPU 写入内存而入队,被 DMA 读取压入发送 +FIFO而出队。队列的深度即为缓冲区的个数。和普通的通讯外设不同,以太网帧的缓冲区的起始地址 +和数量并不是固化在某个寄存器中,而是由一类特殊的数据结构管理,这类数据结构存储在内存中, +单个此类数据结构单元管理一个缓冲区,里面保存着缓冲区的起始地址、长度、DMA控制器调用此缓 +冲区时需要进行的设置、DMA发送完成回写的发送状态以及下一个此类数据结构的地址。这种数据结 +构起到传统通讯外设控制寄存器、状态寄存器的作用,但是实际位置又在内存中,所以可以称之为“软 +件寄存器”,正式名称为“DMA描述符”。 +DMA 描述符分发送和接收两种,每种的格式固定。DMA 描述符的存储结构分为两种,一种是链表 +形式,即每个描述符的第四个字为下一个描述符的地址,DMA控制器会直接从TDes3/RDes3读取下一 +个描述符;另一种是环式结构,所有的描述符必须紧密排列,DMA控制从当前描述符结束的位置取下 +一个描述符,当DMA控制器检测到TDes4/RDes4的TER/RER位置位时,即从描述符列表开头的位置取 +下一个描述符。描述符数组的地址必须4字节对齐,单个描述符的大小为16字节。 +图27-11分别描述了环式结构和链式结构的一种缓冲区分配方案,供用户分配空间时参考。 +Ring structure Chain structure +0x2000_8000 +D 0 e x2 s 0 c 0 r 0 ip _ t 0 o 0 r 0 0 0 Buffer 1 0 0 x x 2 2 0 0 0 0 0 0 _ _ 8 8 4 4 0 0 0 0 0 D x e 2 s 0 c 0 r 0 i _ p 0 t 0 o 0 r 0 0 Buffer 1 0 0 x x 2 2 0 0 0 0 0 0 _ _ 0 0 0 8 1 0 0 0 +Buffer 2 +0x2000_0010 0x2000_8800 0x2000_0010 +0x2000_8800 +0x2000_0010 Buffer 1 +0x2000_8C00 +Descriptor 1 0x2000_8C00 +Buffer 2 +0x2000_0020 0x2000_9000 +0x2000_0800 0x2000_0810 +0x2000_0020 0x2000_9000 Buffer 1 +Descriptor 2 Buffer 1 0x2000_9400 Descriptor 1 0x2000_1000 +0x2000_9400 +Buffer 2 0x2000_0810 +0x2000_0030 0x2000_9800 +0x2000_1010 +0x2000_0010 Buffer 1 +0x2000_1800 +0x2000_0000+0x10*n 0x2000_8000+0x0400*n Descriptor 2 +Buffer 1 +Descriptor n 0x2000_8000+0x0400*(n+1) 0x2000_0020 +0x2000_8000+0x0400*(n+1) +0x2000_0000+0x10*(n+1) Buffer 2 +0x2000_8000+0x0400*(n+2) +Next descriptor +27.1.6.2.1 发送 DMA描述符 +表27-11表明了发送描述符的结构。 +表27-11 发送描述符的结构 +31 0 +OWM CTRL TTSE 保 控制 保留 TTSS 状态 +TDes0 +(31) (30:26) (25) 留 (23:20) (19:18) (17) (16:0) +保留 缓冲区2字节计数 保留 缓冲区1字节计数 +TDes1 +(31:29) (28:16) (15:13) (12:0) +TDes2 缓冲区1地址/时间戳低位 +TDes3 缓冲区2地址/下一个描述符的地址/时间戳高位 +V2.4 442 + +# Page 446 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +由上表可以看出发送描述符由四个32位字组成,分别是TDes0、TDes1、TDes2和TDes3,其中 +TDes0用作控制和返回发送状态,TDes1用以指示发送长度,TDes2用以表示发送缓冲区的位置或返 +回发送时间戳的低位,TDes3用以表示用于第二个发送缓冲区的地址(TCH未置位时)或下一描述符 +的地址(TCH置位时),时间戳使能时,发送后返回IEEE1588时间戳高位。各32位字的描述如 +下。 +表27-12 TDes0的各位定义 +31 30 29 28 27 26 25 24 23:22 21 19 19:18 17 16 +OWN IC LS FS DC DP TTE Res CIC TER TCH Res TSS IHE +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ES JT FF IPE LCA NC LCO EC VF CC ED UF DB +位 名称 描述 +描述符归属位。此位指示此描述符被谁占用。 +0:此描述符归CPU所有,CPU可以修改此描述符的值; +1:此描述符归DMA所有,CPU无权限修改此描述符。 +31 OWN 此位为0时,在CPU完成对描述符和缓冲区的操作后,由 +CPU 置 1;此位为 1时,在 DMA 完成对描述符和缓冲区的 +操作后,由DMA自动写0。以此完成用户软件和硬件对描 +述符和收发缓冲区的操作交接。 +发送完成中断使能位。置此位后,在发送完当前帧之后, +30 IC +发送中断位标志位(ETH_DMASR:TS)将被置位。 +末段指示位。此位被置位表示此描述符指示的缓冲区里包 +29 LS +含帧的结束部分。 +首段指示位。此位被置位表示此描述符指示的缓冲区里包 +28 FS +含帧的开头部分。 +禁止自动CRC计算位。置此位后,DMA控制器不会计算以 +太网帧的CRC32检验值,也不会有值附加到帧末尾。此位 +27 DC +只有在FS位被置位时有效。另外,DP位的设置优先级高 +于此位。 +禁止自动填充位。置此位后,DMA控制器不会为不足64字 +节的以太网帧添加自动填充。当此位为0时,DMA会自动 +26 DP +为不足 64 字节的以太网帧添加填充和 CRC 校验值,忽视 +DC是否被置位。 +时间戳发送使能位。在ETH_PTPTSCR:TSE置位的前提下, +25 TTE 置此位后 DMA 控制器将在当面描述符指示的以太网帧打 +开IEEE1588时间戳功能。该位仅在FS被置位时有效。 +24 Reserved 未使用。 +校验和和插入控制域。 +00:禁止插入校验和; +01:仅使能IP报头校验和的计算和插入; +23:22 CIC +10:保留; +11:使能IP报头校验和和有效负载检验和的计算和插入, +使能计算伪报头检验和; +21 TER 发送描述符结束标志设置位。用户对此位置位指示DMA控 +V2.4 443 + +# Page 447 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +制器,当前发送描述符已经是发送描述符数组的最后一个 +描述符。DMA控制器下次会读取发送描述符数组最前面的 +一个描述符。 +下一描述符地址有效指示位。该位置位表示第二个地址是 +下一个描述符的地址而不是下一个缓冲区的地址。此位置 +20 TCH +位时,TBS2域的值不起作用。该位只在FS位置位时有效。 +TER位的优先级高于此位。 +19:18 Reserved 未使用。 +发送时间戳捕获状态位。DMA控制器置此位表示,发送时 +17 TSS +间戳已经捕获到,并存放到TDes2和TDes3中。 +IP报头错误状态位。DMA控制器会根据接收到的数据检查 +IP报头:对于IPv4,DMA控制器会检查报头长度域是否正 +16 IHE +确;对于IPv6,DMA控制器会检查报头是否为40个字节。 +另外,IP协议类型必须和以太网帧中类型/长度域一致。 +错误汇总位。如果发送帧时遇到错误,DMA控制器会置此 +位。在下列位有一位被置位时,ES位就会被置位: +UF[TDES0:1]数据下溢错误位; +15 ES IPE[TDES0:12]IP数据错误位; +FF[TDES0:13]帧清空位; +JT[TDES0:14]啰嗦超时位(Jabber timeout); +IHE[TDES0:16]IP报头错误位。 +啰嗦超时位(Jabber timeout)。此位被置位时表示MAC +14 JT 发送端发生了啰嗦超时错误。该位只有在 JD 位 +(ETH_MACCR:22)没有被置位时才会被置位。 +帧清空位。此位被置位表示由于CPU发出命令,DMA控制 +13 FF +器把帧从FIFO清空。 +IP 包头错误指示位。MAC 会把接收到 TCP/UDP/ICMP 包的 +12 IPE IPv4或IPv6包头中的包总长度和实际包长度做对比,若 +不一致就会置此位。 +载波丢失指示位。此位置位表示帧在发送时发生了载波丢 +11 LCA 失,即CSR信号存在无效状态。该位只在半工模式下起作 +用。 +无载波指示位。该位表示帧在发送时物理层的载波侦听信 +10 NC +号无效。该位只在半工模式下起作用。 +迟到冲突指示位。该位表示帧在发送完前导符之后出现冲 +9 LCO +突。该位只在半工模式下起作用。 +冲突过多指示位。该位表示帧发送时出现了 16 位以上的 +8 EC 冲突。如果 MACCR 的 RD 位置位,该位表示只发送了一次 +冲突。该位只在半工模式下起作用。 +7 VF VLAN位。在发送VLAN帧时,此位会被置位。 +冲突计数器域。此域表示帧在发送时发生了多少次冲突。 +6:3 CC +EC置位时无效。该域只在半工模式下起作用。 +顺延过多指示位。此位置位表示在 MACCR 的 DC 置位时, +2 EC 发送帧因为顺延超过24288位而导致发送失败。该位只在 +半工模式下起作用。 +1 UF UF数据下溢错误位。当DMA控制器发送时从指定的RAM取 +V2.4 444 + +# Page 448 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +数据发现缓冲区为空时,发送进入暂停状态,并置该位和 +DMASR寄存器的相关位。 +顺延指示位。此位置位表示发送过程由于载波占用而失 +0 DB +败。该位只在半工模式下起作用。 +表27-13 TDes1的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved TBS2 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TBS1 +位 名称 描述 +31:29 Reserved 未使用。 +28:16 TBS2 发送缓冲区2的大小。 +15:13 Reserved 未使用。 +12:0 TBS1 发送缓冲区1的大小。 +表27-14 TDes2的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TBAD1/TTSL +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TBAD1/TTSL +位 名称 描述 +TDes2 全部 32 位作为一整个单元用来存放发送缓冲区 1 +的地址。在启用IEEE1588模式中,在完成发送之后,TDes2 +31:0 TBAD1/TTSL +也用来存放 MAC 返回的时间戳,同时 MAC 会把 OWN 位 +(TDes0:31)清零。此域存放时间戳的低32位。 +表27-15 TDes3的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 20 17 16 +TDAD2/TTSH +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TDAD2/TTSH +位 名称 描述 +此域用来存放下一个描述符的地址,在TCH未置位时,此 +域存放发送缓冲区 2 的地址。在启用 IEEE1588 模式中, +31:0 TDAD2/TTSH +在完成发送之后,TDes3用来存放 MAC返回的时间戳,同 +时MAC会把OWN位(TDes0:31)清零。此域存放时间戳的 +V2.4 445 + +# Page 449 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +高32位。 +27.1.6.2.2 接收 DMA描述符 +表27-16 接收描述符的结构 +31 0 +OWM +状态 +RDes0 (31 +(30:0) +) +控制 保留 RER 缓冲区1字节计 +缓冲区2字节计数 保留 +RDes1 (31 (30:29 (15:14 数 +(28:16) 13 +) ) ) (12:0) +RDes2 缓冲区1地址、时间戳低位 +RDes3 缓冲区2地址、下一个描述符的地址、时间戳高位 +由上图可以看出接收描述符也是由四个32位字组成的,其中第一个32位字主要是返回接收时的 +状态,第二个32位字包含了接收的数据长度,第三个32位字定义了接收缓冲区的地址或者返回时间 +戳的低位,第四个32位字做第二个缓冲区的地址(RCH未置位),下一缓冲区的地址(RCH置位)或 +返回时间戳的高位。 +接收描述符各字的各位意义如下: +表27-17 RDes0的各位定义 +31 30 29:16 +OWN AFM FL +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +ES DE SAF LE OE VLAN FS LS IPHCE LCO PT RWT RE DE CE PCE +位 名称 描述 +描述符归属位。此位指示此描述符被谁占用。 +0:此描述符归CPU所有,CPU可以修改此描述符的值; +1:此描述符归DMA所有,CPU无权限修改此描述符。 +31 OWN 此位为 0 时,在 CPU 完成对描述符和缓冲区的操作 +后,由CPU置1;此位为1时,在DMA完成对描述符和缓 +冲区的操作后,由DMA自动写0。以此完成用户软件和硬 +件对描述符和收发缓冲区的操作交接。 +目标地址未通过标志位。如果接收的帧未通过MAC的目标 +30 AFM +地址过滤器,那么此标志位会被置位。 +帧长域。此域在 ES 位[RDes0:15]为 0 时有效。在 LS 位 +[RDes0:8]为 1 时,此域指示了 DMA 控制器接收到的帧的 +29:16 FL +长度,包括CRC;在LS位为0时,此域表示目前为止DMA +控制器发往内存的累计长度,单位都是字节。 +错误汇总位。当MAC检测到以下任一错误时,会置位此位: +15 ES CE[RDes0:1]:CRC错误; +RE[RDes0:3]:接收错误; +V2.4 446 + +# Page 450 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +RWT[RDes0:4]:看门狗超时; +IPHCE[RDes0:7]:巨型帧(注意,报IPHCE时需要分辨到 +底是巨形帧还是由IP头错误); +OE[RDes0:11]:溢出错误; +DE[RDes0:14]:描述符错误。 +描述符错误位。该位被置位表示由于描述符指示的缓冲区 +14 DE 装不上当前帧而被切断,DMA又不占用下一描述符。该位 +只在LS位[RDes0:8]被置位时才有效。 +源地址过滤未通过标志位。此位被置位表示帧没有通过 +13 SAF +MAC的源地址过滤器。 +长度错误位。此位被置位表示实际收到的帧长度和以太网 +12 LE 类型/长度域中指示的长度不符合。此位只在FT[RDes0:5] +被置位时有效。 +溢出错误位。此位被置位表示由于接收 FIFO 溢出,接收 +11 OE +到的帧被破坏。 +10 VLAN VLAN标签位。该位被置位表示接收到的是VLAN帧。 +首描述符指示位。该位置位表示这个描述符包含帧的开 +9 FS +头。 +尾描述符指示位。该位置位表示这个描述符包含帧的结 +8 LS +尾。 +IP报头校验和错误标志位。该位置位表示IPv4或者IPv6 +报头存在错误,具体原因可能是: +1、以太网帧类型/长度域指示的协议与实际的 IP 版本不 +7 IPHCE +一致; +2、IP报头校验和不对; +3、IP报头指示的长度不对。 +迟到冲突指示位。该位置位表示产生了迟到冲突。该位只 +6 LCO +在半双工模式下起作用。 +帧类型指示位。此位为1时表示接收到的帧为以太网类型 +封装的帧(RFC 894)。此位为 0 时表示接收到的帧为 +5 FT IEEE802.3 类型封装的帧(RFC1042)。当帧长度小于 14 +字节时,此位无效。 +注:FT具有的特殊含义参考表27-18 +接收看门狗超时标志位。该位置位表示在接收当前帧时, +4 RWT +看门狗超时,当前帧被截断。 +接收错误标志位。该位置位表示在接收帧的过程中,RX_DV +3 RE +有效时,RX_ERR信号有效。 +Dribble比特错误位。该位置位表示MAC接收到的帧的长 +2 DE +度不是8bit的整数倍,可能有漏掉周期的现象。 +CRC错误。该位置位表示接收到的帧存在CRC校验错误。 +1 CE +该位只在LS位[RDes0:8]置位时有效。 +负载校验和错误。该位置位表示 MAC 接收到的 +0 PCE +TCP/UDP/ICMP包与其校验和域标示的值不符。 +可以看出 MAC 的接收流程中做了校验检验机制。实际上在以太网帧层(数据链路层)、网络层 +(IPv4/IPv6)和运输层(TCP/UDP/SCTP)都有对本层数据长度进行说明,对数据内容正确性采取某种 +V2.4 447 + +# Page 451 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +手段的校验。RDes0的第0、5和7位都提到了对数据的校验检验,下表进行归纳。 +表27-18 RDes0:7/5/0的值和接收到的帧状态的关系 +RDes0:5 RDes0:7 RDes0:0 +IP报头校 负载校 +帧类型 +验和错误 验和错 帧状态 +指示位 +标志位 误 +(FT) +(IPHCE) (PCE) +1 0 0 IP类型帧,未检测到IP报头和负载校验和错误 +1 0 1 IP类型帧,负载校验和错误 +1 1 0 IP类型帧,IP报头校验和错误 +1 1 1 IP类型帧,IP报头校验和错误,负载校验和错误 +0 0 0 IEEE802.3类型封装帧(RFC1042) +IP类型帧,未检测到IP报头校验和错误,因负载校验不受 +0 0 1 +支持而未检测 +0 1 1 不是IP类型帧(例如ARP帧) +0 1 0 保留 +表27-19 RDes1的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DIC Reserved RBS2 +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RER RCH Res RBS1 +位 名称 描述 +31 DIC 关闭接收完成中断设置位。 +30:29 Reserved 未使用。 +28:16 RBS2 接收缓冲区2大小。 +末端接收描述符标志。指示当前描述符是最后一个描述 +15 RER 符。DMA 控制器会回到描述符对列基地址寄存器 +(ETH_DMARDLAR)去取下一个描述符。 +下一接收描述符地址有效位。该位置位表示最后一个 32 +14 RCH 位字中是下一个接收描述符的地址,否则则是第2个缓冲 +区的地址。 +13 Reserved 未使用。 +12:0 RBS1 接收缓冲区1大小。 +表27-20 RDes2的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RBAD1/RTSL +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RBAD1/RTSL +V2.4 448 + +# Page 452 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 描述 +RDes2 全部 32 位作为一整个单元用来存放接收缓冲区的 +地址。在启用IEEE1588模式中,在完成接收之后,RDes2 +31:0 RBAD/RTSL +也用来存放 MAC 返回的时间戳,同时 MAC 会把 OWN 位 +[RDes0:31]清零。 +表27-21 RDes3的各位定义 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RDAD2/RTSH +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RDAD2/RTSH +位 名称 描述 +RCR 置位时用来存放下一个缓冲区的地址,否则用来存在 +第二个缓冲区的地址。在启用IEEE1588模式中,在完成接 +31:0 RDAD/RTSH +收之后,RDes3 用来存放 MAC 返回的时间戳,同时 MAC 会 +把OWN位[RDes0:31]清零。此域存放时间戳的高32位。 +27.1.6.3 数据缓存对齐 +由于收发缓冲区和收发描述符都是由 DMA 控制器调用,并实质存在于 RAM 空间的,而 DMA 是 32 +位的,因此设置收发描述符队列都需要保证它们的起始地址在4字节对齐的位置,但是设置缓冲区没 +有这个强制要求。 +为了提高效率,一个以太网帧由一个缓冲区接收完毕是最恰当的,如将缓冲区设为1518个字节 +可以容纳下最大的以太网普通帧,包括源止地址域、长度类型域、数据填充域和CRC校验域。需要 +注意的是,带标签的VLAN帧的最大帧长比一般的以太网帧长4个字节,即1522个字节,如果用户 +想做到4字节对齐,一个缓冲区可以为1524字节。 +27.1.6.4 DMA 收发配置 +接收和发送的数据由DMA负责自动转存和推送,但是如果遇到致命错误,DMA会停止运转,并更 +新DMA状态寄存器。用户用需要初始化DMA后手动启动DMA才能继续运转。 +27.1.6.4.1 发送 DMA配置 +DMA控制器建立运转机制的步骤如下: +1) 设置发送缓冲区队列,将要发送的内容填入发送缓冲区。设置发送描述符队列,填好发送描述符 +的各域各位,并将OWN置位,将发送描述符的管理权交付给DMA控制器;将描述符初始地址注册 +到DMATDLAR寄存器中; +2) 置位ST位(DMAOMR:13),开启DMA; +3) 在运行模式下,DMA描述符会自动读取发送描述符的内容,根据其指示的地址和长度把数据推送 +到发送 FIFO。结束后 DMA 会按照链式结构读取紧接着的下一个发送描述符进行下一次发送。当 +DMA 控制器检测到 OWM 位未置位导致无权访问发送描述符或者其他正常的错误,就会终止传输, +并将TBUS位(DMASR:2)或其他位(非OWN为0引起的错误)和NIS位(DMASR:16)置位。 +4) 不允许单个帧跨越多个描述符,一帧必须由一个描述符和一个缓冲区关联清楚。 +5) 如果MAC开启了IEEE1588 PTP模式,那么在DMA控制器把数据推送到FIFO之后,MAC会把发送 +V2.4 449 + +# Page 453 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +时间戳写到TDes2和TDes3中,并复位OWN位。 +6) 在发送完一个帧之后,如果发送描述符使能了发送完成中断(置位TDes1:31),DMA控制器就会 +置位发送完成中断标志位(DMASR:0),然后继续取下一个发送描述符。 +下图展示了默认发送流程。 +图27-11发送流程 +Start +Start TxDMA Stop TxDMA +(Re-)fetch next +descriptor +Poll demand (HB) Yes +error? +No +TxDMA suspended No b O it w se n t ? +Yes +Transfer data +from buffer(s) +(HB) Yes +error? +No +Wait for Txfer +completed +Wait for Tx status +Time stamp Yes Write time stamp to +present? TDES2 and TDES3 +No +Write status word No (HB) Yes +to TDES0 error? +No (HB) Yes +error? +27.1.6.4.2 接收 DMA配置 +建立DMA接收流转机制的步骤如下: +1) 设置发送缓冲区队列和描述符队列,设置好接收描述符的各个域各个位;将描述符初始地址注册 +到DMARDLAR寄存器中;置位OWN位,将描述符使用权限交给DMA控制器; +2) 置位SR位,开始接收流程; +3) 在接收流转机制运行时,DMA控制器获取下一个描述符,检查接收描述符配置,在FIFO接收到下 +一帧时,对帧内容进行过滤和识别等多项检查,将帧数据转发描述符指定的缓冲区中,写描述符 +状态域并获取下一个接收描述符,报接收完成中断。如果帧未通过过滤会被标记或丢弃,如果帧 +存在检验和错误、CRC错误或帧过短将会被标记,如果帧过长可能会被掐断或报接收看门狗超时 +错误。DMA控制器遇到接收描述符不可用等致命错误将会停止接收流程,用户需要特别留意; +4) 用户至少需要使能一个接收完成中断,在以太网中断函数中将使用过的接收描述符恢复到待命状 +态,以保证接收流程可以不间断地运行下去。用户可以在中断函数中将待处理的数据缓冲区地址 +传递出来,或处理一些打断接收流程的异常事件。 +V2.4 450 + +# Page 454 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +5) 如果使能了PTP时间戳,再DMA控制器转存数据,写描述符状态域时,同时也会将当前的时间戳 +写进描述符的后两个字。用户应及时将时间戳读出并补全原写在后两个字的缓冲区地址和下一描 +述符地址。 +下图展示了默认接收流转机制: +图27-12 接收流程 +Start +Start RxDMA Stop RxDMA +Poll demand/ (Re-)Fetch next +new frame available descriptor +RxDMA suspended (HB) error? Yes +Yes No +Frame transfer No Own bit set? +complete? +No Yes +Yes Flush disabled? Frame data No +available? +No Yes +rem F a l i u n s i h ng t h fr e a me Write data to buffer(s) Wait for frame data +(HB) error? Yes +No +Flush No Own bit set No Frame transfer +disabled? for next desc? complete? +No Yes Yes Yes +Set descriptor error inter C m lo e s d e i a R t D e E d S e 0 s c a r s i ptor Ti p m re e s s e t n a t m ? p Yes W R r D it E e S t 2 im an e d s t R a D m E p S 3 to +No +Close d e R s D c E ri S p 0 t o a r s last No (HB) error? Yes +(HB) No +error? +Yes +27.1.7 中断 +以太网收发器拥有两个中断向量,一个是以太网唤醒事件,另一个是普通的收发事件。当检测 +到唤醒帧或魔法帧的时候,会触发以太网唤醒事件。普通的以太网收发中断事件包括DMA中断和 +ETH中断。 +27.1.7.1 DMA 中断 +DMA中断大致可以分为两组,即正常的中断(NIS)和异常的中断(AIS),异常的中断一般意味 +着数据收发的异常,需要特别注意。用户在处理中断时需要检索所有的中断标志位,并将已经产生的 +中断源全部处理掉。下图是以太网收发器的中断示意图。 +V2.4 451 + +# Page 455 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图27-13 中断示意图 +DMA中断是以太网收发器中最重要的中断,一般的用户逻辑中都需要依靠中断接收帧,确认帧 +发送出去,或是及时处理被打断的收发逻辑。 +27.1.7.2 ETH 中断 +ETH中断主要包括PTP的时间闹钟触发,收发计数到了MMC寄存器的某种设定值,以及PMT。ETH +的用处主要是功能性的,相对 DMA 中断而言并不十分复杂和重要。用户可以使用 PTP 中断实现闹钟, +使用MMC中断实现测速,或使用PMT中断实现远程唤醒。另外,ETH还支持当内置物理层连接状态发 +生改变时产生中断。 +27.1.7.3 PMT 中断 +将PMT中断单独提出来重述一遍的原因是这个中断拥有独立的中断向量,使用时需注意。 +27.1.8 寄存器描述 +表27-22 以太网相关寄存器列表 +MAC控制相关寄存器地址映射 +名称 偏移地址 描述 复位值 +R32_ETH_MACCR 0x40028000 MAC控制寄存器 0x00000000 +R32_ETH_MACFFR 0x40028004 帧过滤寄存器 0x00000000 +R32_ETH_MACHTHR 0x40028008 哈希值列表寄存器高位 0x00000000 +R32_ETH_MACHTLR 0x4002800C 哈希值列表寄存器低位 0x00000000 +R32_ETH_MACMIIAR 0x40028010 MII地址寄存器 0x00000000 +R32_ETH_MACMIIDR 0x40028014 MII数据寄存器 0x00000000 +R32_ETH_MACFCR 0x40028018 MAC流控寄存器 0x00000000 +R32_ETH_MACVLAN 0x4002801C VLAN标签寄存器 0x00000000 +R32_ETH_MACRWUFFR 0x40028028 唤醒帧过滤器寄存器 0x00000000 +R32_ETH_MACPMTCSR 0x4002802C PMT控制和状态寄存器 0x00000000 +R32_ETH_MACSR 0x40028038 MAC中断状态寄存器 0x00000000 +R32_ETH_MACIMR 0x4002803C MAC中断屏蔽寄存器 0x00000000 +R32_ETH_MACA0HR 0x40028040 MAC地址寄存器0高32位 0x8000FFFF +R32_ETH_MACA0LR 0x40028044 MAC地址寄存器0低32位 0xFFFFFFFF +V2.4 452 + +# Page 456 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_ETH_MACA1HR 0x40028048 MAC地址寄存器1高32位 0x0000FFFF +R32_ETH_MACA1LR 0x4002804C MAC地址寄存器1低32位 0xFFFFFFFF +R32_ETH_MACA2HR 0x40028050 MAC地址寄存器2高32位 0x0000FFFF +R32_ETH_MACA2LR 0x40028054 MAC地址寄存器2低32位 0xFFFFFFFF +R32_ETH_MACA3HR 0x40028058 MAC地址寄存器3高32位 0x0000FFFF +R32_ETH_MACA3LR 0x4002805C MAC地址寄存器3低32位 0xFFFFFFFF +R32_ETH_MACCFG0 0x40028098 MAC软件复位控制寄存器0 0x00000000 +MMC控制相关寄存器地址映射,注意:地址非连续 +名称 偏移地址 描述 复位值 +R32_ETH_MMCCR 0x40028100 MMC控制寄存器 0x00000000 +R32_ETH_MMCRIR 0x40028104 MMC接收寄存器 0x00000000 +R32_ETH_MMCTIR 0x40028108 MMC发送中断寄存器 0x00000000 +R32_ETH_MMCRIMR 0x4002810C MMC接收中断屏蔽寄存器 0x00000000 +R32_ETH_MMCTIMR 0x40028110 MMC发送中断屏蔽寄存器 0x00000000 +R32_ETH_MMCTGFSCCR 0x4002814C MMC一次冲突后发送好帧计数器 0x00000000 +R32_ETH_MMCTGFMSCCR 0x40028150 MMC多次冲突后发送好帧计数器 0x00000000 +R32_ETH_MMCTGFCR 0x40028168 MMC发送好帧计数寄存器 0x00000000 +R32_ETH_MMCRFCECR 0x40028194 MMC接收CRC有误帧计数寄存器 0x00000000 +R32_ETH_MMCRFAECR 0x40028198 MMC接收对齐错误帧计数寄存器 0x00000000 +R32_ETH_MMCRGUFCR 0x400281C4 MMC接收好单播帧计数寄存器 0x00000000 +IEEE1588(PTP)相关寄存器地址映射 +名称 偏移地址 描述 复位值 +R32_ETH_PTPTSCR 0x40028700 PTP时间戳控制寄存器 0x00000000 +R32_ETH_PTPSSIR 0x40028704 PTP亚秒递增寄存器 0x00000000 +R32_ETH_PTPTSHR 0x40028708 PTP时间戳寄存器高位 0x00000000 +R32_ETH_PTPTSLR 0x4002870C PTP时间戳寄存器低位 0x00000000 +R32_ETH_PTPTSHUR 0x40028710 PTP时间戳更新寄存器高位 0x00000000 +R32_ETH_PTPTSLUR 0x40028714 PTP时间戳更新寄存器低位 0x00000000 +R32_ETH_PTPTSAR 0x40028718 PTP时间戳加数寄存器 0x00000000 +R32_ETH_PTPTTHR 0x4002871C PTP目标寄存器高位 0x00000000 +R32_ETH_PTPTTLR 0x40028720 PTP目标寄存器低位 0x00000000 +DMA相关寄存器地址映射注意:地址非连续 +名称 偏移地址 描述 复位值 +R32_ETH_DMABMR 0x40029000 DMA总线模式寄存器 0x00000001 +R32_ETH_DMATPDR 0x40029004 DMA发送查询寄存器 0x00000000 +R32_ETH_DMARPDR 0x40029008 DMA接收查询寄存器 0x00000000 +R32_ETH_DMARDLAR 0x4002900C DMA接收描述符地址寄存器 0x00000000 +R32_ETH_DMATDLAR 0x40029010 DMA发送描述符地址寄存器 0x00000000 +R32_ETH_DMASR 0x40029014 DMA状态寄存器 0x00000000 +R32_ETH_DMAOMR 0x40029018 DMA操作模式寄存器 0x00000000 +R32_ETH_DMAIER 0x4002901C DMA中断使能寄存器 0x00000000 +V2.4 453 + +# Page 457 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +R32_ETH_DMAMFBOCR 0x40029020 DMA丢失帧寄存器 0x00000000 +R32_ETH_DMACHTDR 0x40029048 DMA当前发送描述符寄存器 0x00000000 +R32_ETH_DMACHRDR 0x4002904C DMA当前接收描述符寄存器 0x00000000 +R32_ETH_DMACHTBAR 0x40029050 DMA当前发送缓存寄存器 0x00000000 +R32_ETH_DMACHRBAR 0x40029054 DMA当前接收缓存寄存器 0x00000000 +内部10M物理层相关寄存器地址 +名称 偏移地址 描述 复位值 +BMCR 0x00 基本控制寄存器 0x2100 +BMSR 0x01 基本状态寄存器 0x1809 +ETH_ANLPAR 0x05 自动协商链接方能力寄存器 0x0001 +PHY_SR 0x10 物理层状态寄存器 0x0000 +PHY_MDIX 0x1E 自动翻转寄存器 0x0000 +注:内部物理层寄存器的偏移地址在SMI接口中使用 +27.1.8.1 MAC 控制相关寄存器各位域 +27.1.8.1.1 MAC控制寄存器(R32_ETH_MACCR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reser +TCD[2:0] Reserved WD JD PI PR IFG[2:0] +ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser Reser +FES[1:0] LM DM IPCO Reserved APCS Reserved TE RE TCF +ved ved +位 名称 访问 描述 复位值 +发送时钟延迟域。此域用来延迟发送时钟。MAC控 +制器把经过CES位(ETH_MACCR[1])选择的发送时 +[31:29] TCD[2:0] RW 0 +钟进行延时输出。延时时间计算公式: +Tdalay=TCD(ETH_MACCR[31:29])*0.5ns; +[28:24] Reserved RO 保留。 0 +看门狗设置位: +0:MAC打开看门狗,只能接受最大2048字节的以 +23 WD RW 太网帧,超长部分会被切断; 0 +1:MAC关闭开门狗,能接收最大16384个字节的 +以太网帧。 +Jabber设置位: +0:如果用户试图发送超过2048字节以上长度的以 +22 JD RW 太网帧,MAC会关闭发送器; 0 +1:MAC关闭Jabber定时器,最多能发送16384字 +节的以太网帧。 +内置10MPHY发送驱动偏置电流设置位: +21 PI RW 0 +0:额定驱动; +V2.4 454 + +# Page 458 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:节能发送。 +内置10MPHY片内50欧电阻上拉开启设置位。 +20 PR RW 0:片内50欧电阻断开; 0 +1:片内50欧电阻连接; +帧间隙设置域。这里设置了发送两个帧之间的最短 +时间间隙。 +000:96位时间; +001:88位时间; +010:80位时间; +[19:17] IFG[2:0] RW 0 +011:72位时间; +100:64位时间; +101:56位时间; +110:48位时间; +111:40位时间。 +16 Reserved RO 保留。 0 +以太网速度设置域: +00:10Mbit/s; +[15:14] FES[1:0] RW 01:100Mbit/s; 0 +10:1Gbit/s; +11:保留,未使用。 +13 Reserved RO 保留。 0 +12 LM RW 自循环模式使能位。置该位使能自循环模式。 0 +11 DM RW 双工模式使能位。置该位使能全双工模式。 0 +IPv4校验检验使能位: +0:关闭接收端IPv4的校验和检验功能,相应的 +PCE、PHCE标志位总是为0。见接收描述符各位定 +10 IPCO RW 0 +义; +1:使能IPv4的校验检验,MAC控制器会对TCP、 +UDP和ICMP报头进行校验和检验。 +[9:8] Reserved RO 保留。 0 +填充&CRC自动剥离使能位: +0:MAC不修改帧内容; +7 APCS RW 1:MAC仅在长度/类型字段值小于或等于1500字 0 +节时,去除帧上的Pad/FCS字段。如果长度/类型 +字段大于或等于1501字节,不会更改帧内容。 +[6:4] Reserved RO 保留。 0 +发送使能位: +0:MAC在发送完当前帧之后,关闭发送器,不再 +3 TE RW 0 +发送任何帧; +1:使能MAC发送器。 +接收使能位: +0:MAC在接收完当前帧之后,关闭接收器,不再 +2 RE RW 0 +接收任何帧; +1:使能MAC接收器。 +发送时钟翻转设置位: +1 TCF RW 0 +0:将TCES选择的TXC直接作为芯片输出的 +V2.4 455 + +# Page 459 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +GTX_CLK; +1:将TCES选择的TXC的反相作为芯片输出的 +GTX_CLK。 +0 Reserved RO 保留。 0 +27.1.8.1.2 MAC帧过滤寄存器(R32_ETH_MACFFR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RA Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved HPF SAF SAIF PCF[1:0] BFD PAM DAIF HM HU PM +位 名称 访问 描述 复位值 +接收全部位: +0:MAC只把通过了过滤器的帧转发到接收队列中; +31 RA RW 0 +1:MAC把所有收到的帧转发到接收队列中,不管其 +是否通过了过滤器。 +[30:11] Reserved RO 保留。 0 +HASH过滤或者完美过滤选择位: +0:在HM或者HU置位的前提下,只要符合HASH过 +10 HPF RW 滤器,就能通过地址过滤; 0 +1:根据HM或者HU的值来确定单播/多播模式下使 +用什么过滤方式。 +源地址过滤选择位: +9 SAF RW 0:MAC对未通过源MAC地址过滤的帧进行标记; 0 +1:MAC会直接丢弃未通过源MAC地址过滤的帧。 +源地址过滤结果颠倒位: +0:接收的帧的源地址如果和 MAC 地址寄存器中启 +8 SAIF RW 用的源地址不一致则认为是未通过源地址过滤器; 0 +1:接收的帧的源地址如果和 MAC 地址寄存器中启 +用的源地址一致则认为是未通过源地址过滤器。 +流控帧通过控制域: +00/01:MAC不转发任何流控帧给应用程序; +[7:6] PCF[1:0] RW 10:MAC 转发所有流控帧到应用程序中,包括未通 00b +过地址过滤器的流控帧; +11:MAC只转发通过地址过滤器的流控帧。 +广播帧接收控制位: +5 BFD RW 0:接收所有广播帧; 0 +1:丢弃所有广播帧。 +通过全部多播帧控制位; +4 PAM RW 0:多播帧能否通过过滤取决于HM的值; 0 +1:全部的多播帧都能通过地址过滤。 +目的MAC地址过滤器过滤结果颠倒控制位: +3 DAIF RW 0 +0:过滤器结果正常生效; +V2.4 456 + +# Page 460 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:对多播帧和单播帧,是否过滤器通过的结果进行 +颠倒再生效。 +多播帧过滤模式选择位: +2 HM RW 0:进行完美地址过滤; 0 +1:进行HASH地址过滤。 +单播帧过滤模式选择位: +1 HU RW 0:进行完美地址过滤; 0 +1:进行HASH地址过滤。 +混杂模式使能位。所有帧都能通过地址过滤器,且 +0 PM RW 0 +不标记过滤结果。 +27.1.8.1.3 哈希值列表寄存器(R32_ETH_MACHTHR、R32_ETH_MACHTLR) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HTH[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HTH[15:0] +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HTL[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HTL[31:15] +位 名称 访问 描述 复位值 +[31:0] HTH[31:0] RW 哈希列表高32位。 0 +[31:0] HTL[31:0] RW 哈希列表低32位。 0 +27.1.8.1.4 MII地址寄存器(R32_ETH_MACMIIAR) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PA[4:0] MR[4:0] Reserved CR[2:0] MW MB +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +物理层地址域。用户将需要操作的物理层地址写进 +[15:11] PA[4:0] RW 0 +此域。 +物理层寄存器地址域。用户将需要操作的寄存器地 +[10:6] MR[4:0] RW 0 +址写进此域。 +V2.4 457 + +# Page 461 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +5 Reserved RO 保留。 0 +时钟范围设定域。用户请保持为000b,使MII频率 +[4:2] CR[2:0] RW 0 +为主频的42分频。 +读写设定位: +1 MW RW 0:对物理层进行读操作; 0 +1:对物理层进行写操作。 +MII忙标志位: +该位由用户置位,表示命令硬件开始进行读或者写 +0 MB RW1Z 0 +的操作,读写期间应保持物理地址,寄存器地址和 +数据域不变。在硬件将此位清零后,表示完成操作。 +27.1.8.1.5 MII数据寄存器(R32_ETH_MACMIIDR) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MD[15:0] +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +MII操作数据域。此域用来存放将要通过MII接口从 +[15:0] MD[15:0] RW 0 +物理层读取的数据,或者存放向物理层写入的数据。 +27.1.8.1.6 MAC流控寄存器(R32_ETH_MACFCR) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +PT[15:0] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved UPFD RFCE TFCE FCB +位 名称 访问 描述 复位值 +Pause 间隔域。此域用来作为控制 Pause 时间域的 +[31:16] PT[15:0] RW 0 +值,单位为当前的MII接口发送64字节的耗时。 +[15:4] Reserved RO 保留。 0 +单播Pause帧检测位: +0:MAC只接收带协议规范定义的唯一地址的Pause帧; +3 UPFD RW 0 +1:MAC同时检测Pause帧是否MAC地址寄存器0中 +定义的单播地址。 +接收流控使能位: +2 RFCE RW 0:MAC不解析Pause帧; 0 +1:MAC解析Pause帧并关闭发送器一段时间。 +1 TFCE RW 发送流控使能位: 0 +V2.4 458 + +# Page 462 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:MAC关闭发送流控,不发送Pause帧; +1:MAC使能发送流控,可以发送Pause帧。 +流控忙标志位。对此位置位可以发送一个Pause帧, +0 FCB RW1Z 发送完成后由硬件清零。在对整个MACFCR寄存器进 0 +行操作时,需要保证FCB位为0。 +27.1.8.1.7 VLAN标签寄存器(MACVLAN) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved VLANT +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +VLANTI[15:0] +位 名称 访问 描述 复位值 +[31:17] Reserved RO 保留。 0 +标签比较控制位: +0:将VLAN帧的第15,16字节的全部16位数据都 +16 VLANT RW 与VLANTI域进行比较; 0 +1:只使用VLAN帧的第15,16字节的[11:0]位数据 +都与VLANTI域的相应位进行比较。 +标签对比样本域。根据IEEE 802.1协议,VLAN帧 +的第[15:13]位是用户优先级,[12]是规范格式指示 +符,位[11:0]VLAN标识符域。 +[15:0] VLANTI[15:0] RW 0 +如果 VLANTI全为 0,那么 MAC 将不再关心 VLAN 帧 +的第15,16字节,而当其第13,14字节为0x8100 +(注意大小端)时即判定为VLAN帧。 +27.1.8.1.8 唤醒帧过滤寄存器(R32_MACRWUFFR) +偏移地址:0x28 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RWUFFR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RWUFFR[15:0] +位 名称 访问 描述 复位值 +唤醒帧过滤寄存器实际上时八个不同的寄存器,对 +其进行连续八次的读操作可以读出全部寄存器,同 +[31:0] RWUFFR[31:0] RW 样对其进行连续八次的写操作可以写进全部八个寄 0 +存器。这八个寄存器各个位的说明详见27.1.5.6.3 +节的描述。 +27.1.8.1.9 PMT控制和状态寄存器(R32_ETH_MACPMTCSR) +V2.4 459 + +# Page 463 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +WFFRP Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved GU Reserved WFR MPR Reserved WFE MPE PD +位 名称 访问 描述 复位值 +唤醒帧过滤寄存器指针复位。置此位会将 +31 WFFRP RW1Z MACRWUFFR 寄存器全部清零。此位会在一个时钟周 0 +期自动清零。 +[30:10] Reserved RO 保留。 0 +全局单播位。置此位会使MAC将所有通过过滤器的 +9 GU RW 0 +单播帧都认为是唤醒帧。 +[8:7] Reserved RO 保留。 0 +唤醒帧接收标志位。当收到唤醒帧时,此位会被置 +6 WFR RZ 0 +位。读取自动清零。 +魔法帧接收标志位。当收到魔法帧时,此位会被置 +5 MPR RZ 0 +位。读取自动清零。 +[4:3] Reserved RO 保留。 0 +唤醒帧使能位。置此位允许在接收到唤醒帧时产生 +2 WFE RW 0 +PMT事件。 +魔法帧使能位。置此位允许在接收到魔法帧时产生 +1 MPE RW 0 +PMT事件。 +掉电控制位。置此位会使MAC进入掉电模式:丢弃 +其他所有帧,直到其收到了唤醒帧或魔法帧,唤醒 +0 PD RW1Z 0 +后 MAC 自动清零。在置此位前需要将 WFE 或者 MPE +置位。 +27.1.8.1.10 MAC中断状态寄存器(R32_ETH_MACSR) +偏移地址:0x38 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TSTS Reserved MMCTS MMCRS MMCS PMTS Reserved +位 名称 访问 描述 复位值 +[31:10] Reserved RO 保留。 0 +时间戳触发中断标志位。当到达PTP系统时钟设定 +9 TSTS RZ 0 +的时间时,此标志位会被置位。 +[8:7] Reserved RO 保留。 0 +MMC发送中断标志位。当MMC寄存器组中的MMCTIR +6 MMCTS RO 0 +寄存器产生任一中断时,该位置位。当MMC寄存器 +V2.4 460 + +# Page 464 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +组中的MMCTIR寄存器全部清零时,此位也即清零。 +MMC接收中断标志位。当MMC寄存器组中的MMCRIR +5 MMCRS RO 寄存器产生任一中断时,该位置位。当MMC寄存器 0 +组中的MMCRIR寄存器全部清零时,此位也即清零。 +MMC 状态标志位。当 MMCTS 或 MMCRS 置位时会触发 +4 MMCS RO 此位置位;当 MMCTS、MMCRS 全部清零时此位即清 0 +零。 +PMT 状态标志位。在掉电模式下,如果 MAC 收到魔 +3 PMTS RO 法帧或者唤醒帧唤醒了 MAC,那么此位会被置位; 0 +清除WFR和MPR两位后此位被清零。 +[2:0] Reserved RO 保留。 0 +27.1.8.1.11 MAC中断屏蔽寄存器(R32_ETH_MACIMR) +偏移地址:0x3C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TSTIM Reserved PMTIM Reserved +位 名称 访问 描述 复位值 +[31:10] Reserved RO 保留。 0 +9 TSTIM RW 时间戳中断屏蔽位。置此位将禁止产生时间戳中断。 0 +[8:4] Reserved RO 保留。 0 +3 PMTIM RW PMT中断屏蔽位。置此位将屏蔽PMT中断。 0 +[2:0] Reserved RO 保留。 0 +27.1.8.1.12 MAC地址寄存器 0高 32位(R32_ETH_MACA0HR) +偏移地址:0x40 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +MO Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA0H[15:0] +位 名称 访问 描述 复位值 +31 MO RO 总是为1。 1 +[30:16] Reserved RO 保留。 0 +[15:0] MACA0H[15:0] RW MAC地址的高16位,即47:32位。 0xFFFF +27.1.8.1.13 MAC地址寄存器 0低 32位(R32_ETH_MACA0LR) +偏移地址:0x44 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 461 + +# Page 465 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +MACA0L[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA0L[15:0] +位 名称 访问 描述 复位值 +MAC地址的低32位,即31:0位。一般情况下,MAC 0xFFFF +[31:0] MACA0L[31:0] RW +地址寄存器0的地址是MAC本身的地址。 FFFF +27.1.8.1.14 MAC地址寄存器 1高 32位(R32_ETH_MACA1HR) +偏移地址:0x48 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +AE SA MBC[5:0] Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA1H[15:0] +位 名称 访问 描述 复位值 +地址过滤使能位: +31 AE RW 0:地址过滤器忽略MAC地址1; 0 +1:地址过滤器使用MAC地址1来进行完美过滤。 +地址角色选择位: +0:MAC 地址 1 被用来和接收到的帧的目标地址对 +30 SA RW 0 +比; +1:MAC地址1被用来和接收到的帧的源地址对比。 +屏蔽字控制域。MBC 的各个位用来对应屏蔽 MAC 地 +址1的某个字节,用来禁止将MAC地址1的某个字 +节参与到接收帧的源地址或目标地址的比较中。 +R32_ETH_MACA1HR[29]置位则屏蔽MACA1H[15:8]; +R32_ETH_MACA1HR[28]置位则屏蔽MACA1H[7:0]; +R32_ETH_MACA1HR[27]置位则屏蔽 +[29:24] MBC[5:0] RW MACA1L[31:24]; 0 +R32_ETH_MACA1HR[26]置位则屏蔽 +MACA1L[23:16]; +R32_ETH_MACA1HR[25]置位则屏蔽MACA1L[15:8]; +R32_ETH_MACA1HR[24]置位则屏蔽MACA1L[7:0]。 +注:R32_ETH_MACA1HR[29:27]的功能应同时开启或 +关闭。 +[23:16] Reserved RO 保留。 0 +[15:0] MACA1H[15:0] RW MAC地址的高16位,即47:32位。 0xFFFF +27.1.8.1.15 MAC地址寄存器 1低 32位(R32_ETH_MACA1LR) +偏移地址:0x4C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 462 + +# Page 466 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +MACA1L[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA1L[15:0] +位 名称 访问 描述 复位值 +0xFFFF +[31:0] MACA1L[31:0] RW MAC地址的低32位,即31:0位。 +FFFF +27.1.8.1.16 MAC地址寄存器 2高 32位(R32_ETH_MACA2HR) +偏移地址:0x50 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +AE SA MBC[5:0] Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA2H[15:0] +位 名称 访问 描述 复位值 +地址过滤使能位: +31 AE RW 0:地址过滤器忽略MAC地址2; 0 +1:地址过滤器使用MAC地址2来进行完美过滤。 +地址角色选择位: +0:MAC 地址 2 被用来和接收到的帧的目标地址对 +30 SA RW 0 +比; +1:MAC地址2被用来和接收到的帧的源地址对比。 +屏蔽字控制域。MBC 的各个位用来对应屏蔽 MAC 地 +址2的某个字节,用来禁止将MAC地址2的某个字 +节参与到接收帧的源地址或目标地址的比较中。 +R32_ETH_MACA2HR[29]置位则屏蔽MACA2H[15:8]; +R32_ETH_MACA2HR[28]置位则屏蔽MACA2H[7:0]; +R32_ETH_MACA2HR[27]置位则屏蔽 +[29:24] MBC[5:0] RW MACA2L[31:24]; 0 +R32_ETH_MACA2HR[26]置位则屏蔽 +MACA2L[23:16]; +R32_ETH_MACA2HR[25]置位则屏蔽MACA2L[15:8]; +R32_ETH_MACA2HR[24]置位则屏蔽MACA2L[7:0]。 +注:R32_ETH_MACA2HR[29:27]的功能应同时开启或 +关闭。 +[23:16] Reserved RO 保留。 0 +[15:0] MACA2H[15:0] RW MAC地址的高16位,即47:32位。 0xFFFF +27.1.8.1.17 MAC地址寄存器 2低 32位(R32_ETH_MACA2LR) +偏移地址:0x54 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 463 + +# Page 467 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +MACA2L[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA2L[15:0] +位 名称 访问 描述 复位值 +0xFFFF +[31:0] MACA2L[31:0] RW MAC地址的低32位,即31:0位。 +FFFF +27.1.8.1.18 MAC地址寄存器 3高 32位(R32_ETH_MACA3HR) +偏移地址:0x58 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +AE SA MBC[5:0] Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA3H[15:0] +位 名称 访问 描述 复位值 +地址过滤使能位: +31 AE RW 0:地址过滤器忽略MAC地址3; 0 +1:地址过滤器使用MAC地址3来进行完美过滤。 +地址角色选择位: +0:MAC 地址 3 被用来和接收到的帧的目标地址对 +30 SA RW 0 +比; +1:MAC地址3被用来和接收到的帧的源地址对比。 +屏蔽字控制域。MBC 的各个位用来对应屏蔽 MAC 地 +址3的某个字节,用来禁止将MAC地址3的某个字 +节参与到接收帧的源地址或目标地址的比较中。 +R32_ETH_MACA3HR[29]置位则屏蔽MACA3H[15:8]; +R32_ETH_MACA3HR[28]置位则屏蔽MACA3H[7:0]; +R32_ETH_MACA3HR[27]置位则屏蔽 +[29:24] MBC[5:0] RW MACA2L[31:24]; 0 +R32_ETH_MACA3HR[26]置位则屏蔽 +MACA2L[23:16]; +R32_ETH_MACA3HR[25]置位则屏蔽MACA3L[15:8]; +R32_ETH_MACA3HR[24]置位则屏蔽MACA3L[7:0]。 +注:R32_ETH_MACA3HR[29:27]的功能应同时开启或 +关闭。 +[23:16] Reserved RO 保留。 0 +0xFFFF +[15:0] MACA3H[15:0] RW MAC地址的高16位,即47:32位。 +FFFF +27.1.8.1.19 MAC地址寄存器 3低 32位(R32_ETH_MACA3LR) +偏移地址:0x5C +V2.4 464 + +# Page 468 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +MACA3L[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MACA3L[15:0] +位 名称 访问 描述 复位值 +0xFFFF +[31:0] MACA3L[31:0] RW MAC地址的低32位,即31:0位。 +FFFF +27.1.8.1.20 MAC软件复位控制寄存器 0(R32_ETH_MACCFG0) +偏移地址:0x98 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +MACRXMACTX DMARX DMATX +Reserved +_RST _RST _RST _RST +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved +位 名称 访问 描述 复位值 +MAC接收复位控制: +0:不复位; +31 MACRX_RST RW 0 +1:复位。 +一个周期后该位自动清零。 +MAC发送复位控制: +0:不复位; +30 MACTX_RST RW 0 +1:复位。 +一个周期后该位自动清零。 +DMA接收复位控制: +0:不复位; +29 DMARX_RST RW 0 +1:复位。 +一个周期后该位自动清零。 +DMA发送复位控制: +0:不复位; +28 DMATX_RST RW 0 +1:复位。 +一个周期后该位自动清零。 +[27:0] Reserved RO 保留。 0 +注:R32_ETH_MACCFG0寄存器仅适用于批号倒数第六位不为0的CH32F207、CH32V307、CH32V317产 +品。 +27.1.8.2 MMC 相关寄存器各位域 +27.1.8.2.1 MMC控制寄存器(R32_ETH_MMCCR) +偏移地址:0x0100 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 465 + +# Page 469 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved MCF ROR CSR CR +位 名称 访问 描述 复位值 +[31:4] Reserved RO 保留。 0 +计数器冻结控制位。置此位会将MMC所有的计数器 +值全部冻结。复此位即恢复各计数器计数。在冻结 +3 MCF RW 0 +时置位ROR再读取任意计数器,会导致该计数器清 +零。 +读时复位控制位。置此位会使读取任一计数器之后 +2 ROR RW 0 +清零计数器的值。 +计数器回转停止位。置此位会使计数器增正到最大 +1 CSR RW 0 +值后停止而不自动归零。 +计数器复位控制位。置此位将复位全部计数器。此 +0 CR RW1Z 0 +位在一个系统周期后将自动清零。 +27.1.8.2.2 MMC接收中断寄存器(R32_ETH_MMCRIR) +偏移地址:0x0104 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reser +Reserved RGUFS +ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RFCES Reserved +位 名称 访问 描述 复位值 +[31:18] Reserved RO 保留。 0 +17 RGUFS RZ 接收好帧数量过半时会置此位。 0 +[16:6] Reserved RO 保留。 0 +5 RFCES RZ 接收CRC校验错误的帧数量过半时会置此位。 0 +[4:0] Reserved RO 保留。 0 +27.1.8.2.3 MMC发送中断寄存器(R32_ETH_MMCTIR) +偏移地址:0x0108 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved TGFS Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved +位 名称 访问 描述 复位值 +V2.4 466 + +# Page 470 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[31:22] Reserved RO 保留。 0 +21 TGFS RZ 发送帧数过半时此位会置位。 0 +[20:0] Reserved RO 保留。 0 +27.1.8.2.4 MMC接收中断屏蔽寄存器(R32_ETH_MMCRIMR) +偏移地址:0x010C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reser +Reserved RGUFM +ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RFCEM Reserved +位 名称 访问 描述 复位值 +[31:18] Reserved RO 保留。 0 +接收好帧过半中断屏蔽位。置此位将屏蔽接收好帧 +17 RGUFM RW 0 +计数器值达到一半时产生的中断。 +[16:6] Reserved RO 保留。 0 +接收CRC错误帧过半中断屏蔽位。置此位将屏蔽接 +5 RFCEM RW 收到 CRC 错误的帧计数器值达到一半时产生的中 0 +断。 +[4:0] Reserved RO 保留。 0 +27.1.8.2.5 MMC发送中断屏蔽寄存器(R32_ETH_MMCTIMR) +偏移地址:0x0110 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved TGFM Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved +位 名称 访问 描述 复位值 +[31:22] Reserved RO 保留。 0 +发送好帧过半中断屏蔽位。置此位将屏蔽发送好帧 +21 TGFM RW 0 +计数器值达到一半时产生的中断。 +[20:0] Reserved RO 保留。 0 +27.1.8.2.6 MMC一次冲突后发送好帧计数器(R32_ETH_MMCTGFSCCR) +偏移地址:0x014C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TGFSCCR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +V2.4 467 + +# Page 471 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +TGFSCCR[15:0] +位 名称 访问 描述 复位值 +这个域包含在半双工模式下,单个冲突后成功发送 +[31:0] TGFSCCR[31:0] RO 0 +的帧的数量,即单个冲突后发送好帧的计数器。 +27.1.8.2.7 MMC多次冲突后发送好帧计数器(R32_ETH_MMCTGFMSCCR) +偏移地址:0x0150 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TGFMSCCR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TGFMSCCR[15:0] +位 名称 访问 描述 复位值 +这个域包含在半双工模式下,一个以上冲突后成功 +[31:0] TGFMSCCR[31:0] RO 0 +发送的帧的数量,即多个冲突后发送好帧的计数器。 +27.1.8.2.8 MMC发送好帧计数寄存器(R32_ETH_MMCTGFCR) +偏移地址:0x0168 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TGFC[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TGFC[15:0] +位 名称 访问 描述 复位值 +[31:0] TGFC[31:0] RO MAC发送出去的正确帧的计数量。 0 +27.1.8.2.9 MMC接收 CRC有误帧计数寄存器(R32_ETH_MMCRFCECR) +偏移地址:0x0194 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RFCECR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RFCECR[15:0] +位 名称 访问 描述 复位值 +[31:0] RFCECR[31:0] RO MAC接收到的存在CRC校验错误的帧的计数器。 0 +27.1.8.2.10 MMC接收对齐错误计数寄存器(R32_ETH_MMCRFAECR) +偏移地址:0x0198 +V2.4 468 + +# Page 472 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RFAECR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RFAECR[15:0] +位 名称 访问 描述 复位值 +[31:0] RFAECR[31:0] RO MAC接收到的存在对齐错误的帧的计数器。 0 +27.1.8.2.11 MMC接收好帧计数寄存器(R32_ETH_MMCRGUFCR) +偏移地址:0x01C4 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RGUFCR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RGUFCR[15:0] +位 名称 访问 描述 复位值 +[31:0] RGUFCR[31:0] RO MAC接收到的正常的帧的数量。 0 +27.1.8.3 IEEE 1588(PTP)相关寄存器各位域 +27.1.8.3.1 PTP时间戳控制寄存器(R32_ETH_PTPTSCR) +偏移地址:0x0700 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved TSARU TSITE TSSTU TSSTI TSFCU TSE +位 名称 访问 描述 复位值 +[31:6] Reserved RO 保留。 0 +加数寄存器更新控制位。置此位后,加数寄存器的 +值将会加到累加器中。精调模式下使用此位。累加 +5 TSARU RW 0 +器自增完毕后此位自动清零。此位只能在为0时置 +位。 +时间戳中断触发使能位。置此位后,当PTP系统时 +4 TSITE RW 0 +间达到设定目标时间寄存器的值时,将产生中断。 +系统时间更新控制位。置此位后,PTP 系统时间将 +3 TSSTU RW 0 +加上更新寄存器中的值。更新完毕后此位自动清零。 +时间戳初始化控制位。置此位后,PTP 的系统时间 +2 TSSTI RW 将会被替换成更新寄存器中的值。更新完毕后此位 0 +自动清零。 +1 TSFCU RW 更新模式选择控制位: 0 +V2.4 469 + +# Page 473 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:表示使用粗调模式; +1:表示使用精调模式。 +附加时间戳使能位: +0 TSE RW 0:不向描述符中添加时间戳; 0 +1:发送或接收完成后,向描述符中添加时间戳。 +27.1.8.3.2 PTP亚秒递增寄存器(R32_ETH_PTPSSIR) +偏移地址:0x0704 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved STSSI[7:0] +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +亚秒步进值。在粗调模式下,每个主频周期,PTP系 +[7:0] STSSI[7:0] RW 统时间会自增这个值;在精调模式下,在累加器溢 00h +出时,PTP系统时间会自增这个值。 +27.1.8.3.3 PTP时间戳寄存器高位(R32_ETH_PTPTSHR) +偏移地址:0x0708 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +STS[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +STS[15:0] +位 名称 访问 描述 复位值 +[31:0] TSHR[31:0] RO PTP系统时间值,实时值,单位为秒。 0 +27.1.8.3.4 PTP时间戳寄存器低位(R32_ETH_PTPTSLR) +偏移地址:0x070C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +STPNS STSS[30:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +STSS[15:0] +位 名称 访问 描述 复位值 +系统时间正负标志位。1表示当前时间为负,0表示 +31 STPNS RO 0 +当前时间为正。 +[30:0] STSS[30:0] RO PTP系统时间值,实时值,单位为亚秒,即约0.46 0 +V2.4 470 + +# Page 474 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +纳秒。STSS溢出时,STS自增1秒。 +27.1.8.3.5 PTP时间戳更新寄存器高 32位(R32_ETH_PTPTSHUR) +偏移地址:0x0710 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TSUS[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TSUS[15:0] +位 名称 访问 描述 复位值 +时间戳更新秒值,用来替换到PTP系统时间高位或 +[31:0] TSUS[31:0] RW 0 +者表示其在系统时间上加减的秒值。 +27.1.8.3.6 PTP时间戳更新寄存器低 32位(R32_ETH_PTPTSLUR) +偏移地址:0x0714 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TSUPN +TSUSS[30:16] +S +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TSUSS[30:0] +位 名称 访问 描述 复位值 +时间戳更新正负标志位。当更新时间方式为使用 +TSUS和TSUSS直接替换PTP系统时间时,TSUPNS应 +为0;当更新时间方式为使用TSUS和TSUSS作在原 +31 TSUPNS RW 0 +PTP系统时间值上的加减时,TSUPNS为1表示在PTP +系统时间的基础上减去TSUS和TSUSS,为0表示在 +PTP系统时间的基础上加上TSUS和TSUSS。 +时间戳更新亚秒值,用来替换到PTP系统时间高位 +[30:0] TSUSS[30:0] RW 0 +或者表示其在系统时间上加减的亚秒值。 +27.1.8.3.7 PTP时间戳加数寄存器(R32_ETH_PTPTSAR) +偏移地址:0x0718 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TSA[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TSA[15:0] +位 名称 访问 描述 复位值 +[31:0] TSA[31:0] RW 时间戳加数值。这个寄存器只在精调模式下才会被 0 +V2.4 471 + +# Page 475 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +使用。TSA的值会在每个系统周期被加到累加器中, +如果累加器溢出,则会触发精调模式下的系统时间 +更新。 +27.1.8.3.8 PTP目标时间寄存器高 32位(R32_ETH_PTPTTHR) +偏移地址:0x071C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TTSH[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TTSH[15:0] +位 名称 访问 描述 复位值 +目标时间秒值。如果PTP系统时间达到或者超过这 +[31:0] TTSH[31:0] RW 0 +个值,且使能了相关中断,那么会产生一个中断。 +27.1.8.3.9 PTP目标时间寄存器低 32位(R32_ETH_PTPTTLR) +偏移地址:0x0720 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TTSL[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TTSL[15:0] +位 名称 访问 描述 复位值 +目标时间亚秒值。如果PTP系统时间达到或超过这 +[31:0] TTSL[31:0] RW 0 +个值,且使能了相关中断,那么会产生一个中断。 +27.1.8.4 DMA 控制相关寄存器各位域 +27.1.8.4.1 DMA总线模式寄存器(R32_ETH_DMABMR) +偏移地址:0x1000 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser +Reserved DSL[4:0] SR +ved +位 名称 访问 描述 复位值 +[31:7] Reserved RO 保留。 0 +[6:2] DSL[4:0] RW 描述符跳跃长度: 0 +V2.4 472 + +# Page 476 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +这些位定义了2个不以链式结构连接的描述符之间 +的跳跃距离,单位为字(32位)。地址跳跃是指从 +当前描述符的结尾到下一个描述符开头的地址差 +值。当 DSL 域为 0 时,在环形结构下,DMA 认为描 +述符是相邻地连续排列的。 +1 Reserved RO 保留。 0 +软件复位: +置 1 时,MAC 的 DMA控制器复位 MAC 所有子系统的 +0 SR RW 内部寄存器和逻辑电路。在MAC内部不同时钟域模 1 +块完成复位操作后,自动清除该位。在重新写 MAC +的寄存器前,应当确保该位为0。 +27.1.8.4.2 DMA发送查询寄存器(R32_ETH_DMATPDR) +偏移地址:0x1004 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TPDR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TPDR[15:0] +位 名称 访问 描述 复位值 +发送查询命令。用户通过向这个寄存器写任意值来 +[31:0] TPDR[31:0] RW 启动被暂停的发送流程。重启发送流程后,这个寄 0 +存器会被自动清零。 +27.1.8.4.3 DMA接收查询寄存器(R32_ETH_DMARPDR) +偏移地址:0x1008 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RPDR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RPDR[15:0] +位 名称 访问 描述 复位值 +接收查询命令。接收流程可能会被各种意外而打断, +[31:0] RPDR[31:0] RW 需要用户向这个寄存器写任意值来重启接收流程。 0 +重启接收流程后,这个寄存器会被自动清零。 +27.1.8.4.4 DMA接收描述符地址寄存器(R32_ETH_DMARDLAR) +偏移地址:0x100C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +V2.4 473 + +# Page 477 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +RDLAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RDLAR[15:0] +位 名称 访问 描述 复位值 +这个寄存器用来存储第一个接收 DMA 描述符的地 +[31:0] RDLAR[31:16] RW 址。注意描述符需要16字节对齐,所以这个寄存器 0 +的后4位应该为0。 +27.1.8.4.5 DMA发送描述符地址寄存器(R32_ETH_DMATDLAR) +偏移地址:0x1010 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TDLAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +TDLAR[15:0] +位 名称 访问 描述 复位值 +这个寄存器用来存储第一个发送 DMA 描述符的地 +[31:0] TDLAR[31:0] RW 址。注意描述符需要16字节对齐,所以这个寄存器 0 +的后4位应该为0。 +27.1.8.4.6 DMA状态寄存器(R32_ETH_DMASR) +偏移地址:0x1014 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reser Reser +PLS TSTS PMTS MMCS EBS[2:0] TPS[2:0] RPS[2:0] NIS +ved ved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +AIS ERS FBES Reserved ETS RWTS RPSS RBUS RS TUS ROS TJTS TBUS TPSS TS +位 名称 访问 描述 复位值 +内部10M物理层连接状态改变标志位。此位置位表 +31 PLS RW1Z 0 +示物理层连接上或者已断开。或写1清零。 +30 Reserved RO 保留。 0 +时间戳触发状态标志位。在PTP部分产生中断事件 +时,此位会被置位,如果使能了PTP中断则会产生 +29 TSTS RO 0 +中断。清除PTP部分的全部标志位后,此位会自动 +清除。 +PMT触发状态标志位。在PMT部分产生中断事件时, +28 PMTS RO 此位会被置位,如果使能了PMT中断则会产生中断。 0 +清除PMT部分的全部标志位后,此位会自动清除。 +V2.4 474 + +# Page 478 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +MMC触发状态标志位。在MMC部分产生中断事件时, +27 MMCS RO 此位会被置位,如果使能了MMC中断则会产生中断。 0 +清除MMC部分的全部标志位后,此位会自动清除。 +26 Reserved RO 保留。 0 +错误状态域。该域表示造成总线错误的类型。此域 +只在DMASR[13]位被置位的情况下才有效。 +DMASR[23]:0:发送DMA转发数据时出错; +1:接收DMA转发数据时出错; +[25:23] EBS[2:0] RO 0 +DMASR[24]:0:读数据转发时出错; +RO 1:写数据转发时出错; +DMASR[25]:0:访问描述符时出错; +1:访问数据缓存时出错; +发送流程状态域。这个域用来表示当前发送DMA的 +状态。 +000:停止,接收到复位或者停止发送命令; +001:运行,正在取发送描述符; +010:运行,正在等待状态信息; +[22:20] TPS[2:0] RO 000b +011:运行,正在读取发送缓冲区数据并压进FIFO; +100,101:保留; +110:暂停,发送描述符不可用或者发送缓存数据下 +溢; +111:运行,正在关闭发送描述符; +接收流程状态域。这个域用来表示当前接收DMA的 +状态。 +000:停止,接收到复位或者停止发送命令; +001:运行,正在取接收描述符; +010:保留; +[19:17] RPS[2:0] RO 000b +011:运行,正在等待接收数据包; +100:暂停,接收描述符不可用; +101:运行,正在关闭接收描述符; +110:保留; +111:运行,正在把接收数据从FIFO压入内存中; +正常中断汇总位。在 DMAIER 寄存器中使能的中断 +下,如果下列位任一被置位,NIS位同样会被置位。 +-DMASR[0]:发送中断; +-DMASR[2]:发送缓存不可用; +-DMASR[6]:接收中断; +16 NIS RW1Z 0 +-DMASR[14]:早接收中断; +-DMASR[31]:内部10M物理层连接状态改变 +NIS 位为黏着位,当导致 NIS 位置 1 的对应中断状 +态位被清零时,必须通过写1的方式将NIS位也清 +零。 +异常中断汇总位。在 DMAIER 寄存器中使能的中断 +下,如果下列位任一被置位,AIS位同样会被置位。 +15 AIS RW1Z 0 +-DMASR[1]:发送流程停止; +-DMASR[3]:发送啰嗦(Jabber)超时; +V2.4 475 + +# Page 479 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +-DMASR[4]:接收FIFO溢出; +-DMASR[5]:发送数据下溢; +-DMASR[7]:接收缓存不可用; +-DMASR[8]:接收流程停止; +-DMASR[9]:接收看门狗超时; +-DMASR[10]:早发送; +-DMASR[13]:总线错误; +AIS 位为黏着位,当导致 AIS 位置 1 的对应中断状 +态位被清零时,必须通过写1的方式将AIS位也清 +零。 +早接收状态位。该位被置位时,表示收到数据帧时 +14 ERS RW1Z DMA 已经填满了第一个缓冲区,但是完整的帧还没 0 +接收完毕。RS置位后,ERS位自动清零。 +总线错误位。该位被置位时,表示发送了总线错误。 +13 FBES RW1Z 具体原因见[25:23]位。该位被置位后,相应的DMA 0 +控制器将关闭总线访问。 +[12:11] Reserved RO 保留。 0 +早发送状态位。置位时表示发送帧已经全部压入 +10 ETS RW1Z 0 +FIFO。 +看门狗超时标志位。置位时表示帧长已经超过了 +9 RWTS RW1Z 0 +2048字节。 +接收流程停止状态位。该位置位表示接收流程已经 +8 RPSS RW1Z 0 +停止。 +接收缓存不可用状态位。该位置位表示接收描述符 +权限归属CPU,DMA无法获得,接收流程已经暂停。 +7 RBUS RW1Z 用户需要释放描述符并向 RPDR 寄存器中填入一个 0 +值来恢复接收流程。DMA 会在接收下一帧时重试获 +取描述符。 +接收完成状态位。该位置位表示已经完成一帧的接 +6 RS RW1Z 0 +收,帧信息也更新到描述符中。 +发送数据下溢位。该位置位表示发送缓存在发送帧 +5 TUS RW1Z 时发生了发送数据下溢。此时发送进程暂停并把数 0 +据下溢错误位置位。 +接收状态溢出位。该位被置位表示接收缓冲发生了 +4 ROS RW1Z 0 +数据溢出。 +发送啰嗦(Jabber)定时器超时位。该位被置位表 +3 TJTS RW1Z 示发送器过于繁忙,发送已经停止,描述符的啰嗦 0 +(Jabber)超时位已经置位。 +发送缓存不可用状态位。该位被置位表示发送描述 +符被CPU占用,DMA无法获取,发送流程已经暂停。 +2 TBUS RW1Z 0 +第[22:20]位显示了当前的发送状态。应用程序需要 +释放发送描述符。 +发送流程停止状态位。该位被置位表示发送流程已 +1 TPSS RW1Z 0 +经停止。 +发送完成标志位。该位被置位表示已经完成一帧的 +0 TS RW1Z 0 +发送,描述符归属权已经交还CPU。 +V2.4 476 + +# Page 480 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +27.1.8.4.7 DMA操作模式寄存器(R32_ETH_DMAOMR) +偏移地址:0x1018 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DTCEF +Reserved Reserved TSF FTF Reserved +D +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser +Reserved ST Reserved FEF FUGF Reserved SR +ved +位 名称 访问 描述 复位值 +[31:27] Reserved RO 保留。 0 +不丢弃TCP/IP校验和错误帧控制位: +0:如果FEF位为0,MAC会丢弃所有有错误的帧; +26 DTCEFD RW 0 +1:发现TCP/IP/ICMP/UDP之类协议的检验和存在错 +误时,不丢弃该帧。 +[25:22] Reserved RO 保留。 0 +发送存储转发控制位: +0:发送流程写入FIFO的数据达到确定值之后就会 +21 TSF RW 启动发送; 0 +1:发送流程将完整的帧全部写入FIFO后才会启动 +发送。 +20 FTF RW 发送FIFO清空控制位。置此位将复位发送FIFO。 0 +[19:14] Reserved RO 保留。 0 +开始或停止发送控制位: +13 ST RW 0:发送完当前帧之后,发送进程进入停止状态; 0 +1:把发送进程置为运行状态。 +[12:8] Reserved RO 保留。 0 +转发错误帧控制位: +7 FEF RW 0:接收FIFO会丢弃有错误的帧; 0 +1:除了过短的帧之外,所有的帧都会转发给DMA。 +转发过短的帧控制位: +6 FUGF RW 0:接收FIFO丢弃所有长度小于64字节的帧; 0 +1:接收FIFO转发长度过短的帧。 +[5:2] Reserved RO 保留。 0 +开始或停止接收控制位: +0:在转发完当前接收到的帧后,接收DMA进入停止 +1 SR RW 模式,下一次传输从当前接收描述符位置开始; 0 +1:开启接收流程,DMA从当前位置取接收描述符或 +者从标识符表头位置取接收描述符。 +0 Reserved RO 保留。 0 +27.1.8.4.8 DMA中断使能寄存器(R32_ETH_DMAIER) +偏移地址:0x101C +V2.4 477 + +# Page 481 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +PLE Reserved NISE +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +AISE ERS FBES Reserved ETIE RWTIE RPSIE RBUIE RIE TUIE ROIE TJTIE TBUIE TPSIE TIE +位 名称 访问 描述 复位值 +31 PLE RW 内部10M物理层连接状态改变中断使能位。 0 +[30:17] Reserved RO 保留。 0 +正常中断使能位。使能该位将使能以下中断。 +-DMASR[0]:发送中断; +16 NISE RW -DMASR[2]:发送缓存不可用; 0 +-DMASR[6]:接收中断; +-DMASR[14]:早接收中断。 +异常中断。使能该位将使能以下中断。 +-DMASR[1]:发送流程停止; +-DMASR[3]:发送啰嗦(Jabber)超时; +-DMASR[4]:接收FIFO溢出; +-DMASR[5]:发送数据下溢; +15 AISE RW 0 +-DMASR[7]:接收缓存不可用; +-DMASR[8]:接收流程停止; +-DMASR[9]:接收看门狗超时; +-DMASR[10]:早发送; +-DMASR[13]:总线错误。 +早接收中断使能位。使能该位即可以产生早接收中 +14 ERS RW 0 +断。NISE须置位。AISE须置位。 +总线致命错误中断使能位。使能该位即可以产生总 +13 FBES RW 0 +线错误中断。AISE须置位。 +[12:11] Reserved RO 保留。 0 +早发送中断使能位。使能该位即可以产生早发送中 +10 ETIE RW 0 +断。AISE须置位。 +接收看门狗中断使能位。使能该位即可以产生接收 +9 RWTIE RW 0 +看门狗超时中断。AISE须置位。 +接收流程停止中断使能位。使能该位即可以产生接 +8 RPSIE RW 0 +受流程停止中断。 +接收缓存不可用中断使能位。使能该位即可以产生 +7 RBUIE RW 0 +接受缓存不可用中断。AISE须置位。 +接收完成中断使能位。使能该位即可以产生接收完 +6 RIE RW 0 +成中断。NISE须置位。 +发送下溢中断使能。使能该位即可以产生发送下溢 +5 TUIE RW 0 +中断。AISE须置位。 +接收溢出中断。使能该位即可以产生接收溢出中断。 +4 ROIE RW 0 +AISE须置位。 +发送啰嗦(Jabber)超时中断使能。使能该位即可 +3 TJTIE RW 0 +以产生发送啰嗦(Jabber)超时中断。AISE须置位。 +V2.4 478 + +# Page 482 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +发送缓存不可用中断使能。使能该位即可以产生发 +2 TBUIE RW 0 +送缓存不可用中断。NISE须置位 +发送流程停止中断使能。使能该位即可以产生发送 +1 TPSIE RW 0 +流程停止中断。AISE须置位。 +发送完成中断使能。使能该位即可以产生发送完成 +0 TIE RW 0 +中断。NISE须置位。 +27.1.8.4.9 DMA丢失帧寄存器(R32_ETH_DMAMFBOCR) +偏移地址:0x1020 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved OFOC MFA[10:0] OMFC +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MFC[15:0] +位 名称 访问 描述 复位值 +[31:29] Reserved RO 保留。 0 +28 OFOC RZ FIFO上溢计数器的上溢位。 0 +[27:17] MFA[10:0] RZ 应用程序所丢失的帧。 0 +16 OMFC RZ 丢失帧计数器溢出位。 0 +丢失帧计数器。这个域表示由于接收缓冲区不可用 +[15:0] MFC[15:0] RZ 0 +导致的帧丢失的数量。 +27.1.8.4.10 DMA当前发送描述符寄存器(R32_ETH_DMACHTDR) +偏移地址:0x1048 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HTDAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HTDAR[15:0] +位 名称 访问 描述 复位值 +这个寄存器值指向目前正在使用的发送描述符。此 +[31:0] HTDAR[31:0] RO 0 +寄存器由DMA负责实时更新。 +27.1.8.4.11 DMA当前接收描述符寄存器(R32_ETH_DMACHRDR) +偏移地址:0x104C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HRDAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HRDAR[15:0] +V2.4 479 + +# Page 483 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +位 名称 访问 描述 复位值 +这个寄存器值指向目前正在使用的接收描述符。此 +[31:0] HRDAR[31:0] RO 0 +寄存器由DMA负责实时更新。 +27.1.8.4.12 DMA当前发送缓冲区寄存器(R32_ETH_DMACHTBAR) +偏移地址:0x1050 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HTBAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HTBAR[15:0] +位 名称 访问 描述 复位值 +这个寄存器值指向目前正在使用的发送缓冲区。此 +[31:0] HTBAR[31:0] RO 0 +寄存器由DMA负责实时更新。 +27.1.8.4.13 DMA当前接收缓冲区寄存器(R32_ETH_DMACHRBAR) +偏移地址:0x1054 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +HRBAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HRBAR[15:0] +位 名称 访问 描述 复位值 +这个寄存器值指向目前正在使用的接收缓冲区。此 +[31:0] HRBAR[31:0] RO 0 +寄存器由DMA负责实时更新。 +27.1.8.5 内部 10M 物理层相关寄存器地址 +27.1.8.5.1 基础控制寄存器(BMCR) +偏移地址:0x00 +位 名称 访问 描述 复位值 +0:正常操作; +15 RST RW/SC 0 +1:PHY复位。 +0:正常操作; +14 Loopback RW 0 +1:使能回环。 +13 Speed Selection RO 0:10Mb/s; 0 +0:禁止自动协商; +12 Auto-Negotiation RW 1 +1:使能自动协商。 +[11:10] Reserved RO 保留。 0 +Restart Auto- 0:正常操作; +9 RW/SC 0 +Negotiation 1:重新自动协商。 +V2.4 480 + +# Page 484 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:半双工; +8 Duplex Mode RW 1 +1:全双工。 +0:正常操作; +7 Collision Test RW 0 +1:冲突检测使能。 +[6:0] Reserved RO 保留。 0 +27.1.8.5.2 基础状态寄存器(BMSR) +地址偏移:0x01 +位 名称 访问 描述 复位 +[15:6] Reserved RO 保留。 0 +Auto- +0:自动协商未完成; +5 Negotiation RO 0 +1:自动协商完成。 +Complete +[4:3] Reserved RO 保留。 0 +0:物理层未建立链接; +2 Link RO 0 +1:物理层建立链接。 +[1:0] Reserved RO 保留。 0 +27.1.8.5.3 自动协商链接方能力寄存器(R16_ETH_ANLPAR) +偏移地址:0x05 +位 名称 访问 描述 复位值 +下一页位。 +15 NP RO 0:发送基本能力数据页; 0 +1:发送协议细节数据页。 +0:没有应答; +14 ACK RO 0 +1:链接方确认接收到本地节点的能力数据字。 +0:链接方没有指示远端故障; +13 RF RO 0 +1:链接方正在指示一个远端故障。 +12 Reserved RO 保留。 0 +0:链接方不支持非对称流控; +11 ASYPAUSE RO 1:链接方支持非对称流控。 0 +启用自动协商时,此位反映链接方的能力。 +0:链接方不支持流控; +10 PAUSE RO 1:链接方支持流控。 0 +启用自动协商时,此位反映链接方的能力。 +0:链接方不支持100Base-T4; +9 100Base-T4 RO 0 +1:链接方支持100Base-T4。 +0:链接方不支持100Base-TX全双工; +8 100Base-TX-FD RO 0 +1:链接方支持100Base-TX全双工。 +0:链接方不支持100Base-TX; +7 100Base-TX RO 0 +1:链接方支持100Base-TX。 +V2.4 481 + +# Page 485 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +由并行检测建立了100Base-TX链接之后,该位同样 +会被置位。 +0:链接方不支持10Base-TX全双工; +6 10Base-T-FD RO 0 +1:链接方支持10Base-TX全双工。 +0:链接方不支持10Base-T; +1:链接方支持10Base-T。 +5 10Base-T RO 0 +由并行检测建立了10 Base-T链接之后,该位同样 +会被置位。 +链接方的二进制编码节点选择器,当前仅 CSMA/CD +[4:0] SELECT[4:0] RO 00001b +<00001>被指定。 +27.1.8.5.4 物理层状态寄存器(PHYSR) +偏移地址:0x10 +位 名称 访问 描述 复位值 +[15:4] Reserved RO 保留。 0 +0:正常模式; +3 Loopback_10M RO 0 +1:PHY工作于10M自循环。 +0:半双工模式; +2 Full_10M RO 0 +1:PHY工作于10M全双工。 +[1:0] Reserved RO 保留。 0 +27.1.8.5.5 自动翻转寄存器(MDIX) +偏移地址寄存器:0x1E +位 名称 访问 描述 复位值 +[15:4] Reserved RO 保留。 0 +1x:保留; +[3:2] P/N RW 00:P/N极性正常; 0 +01:P/N极性颠倒。 +00:自动; +[1:0] T/R RW 01:MDIX; 0 +1x:MDI。 +27.2 关于 CH32F208、CH32V203、CH32V208 产品 +27.2.1 以太网控制器简介 +芯片集成了以太网控制器MAC和PHY以及DMA,兼容IEEE802.3协议。内部DMA传输数据和接收 +数据到系统RAM中。PHY物理层是一个10Mbit/S的以太网络收发器,提供部分网络PHY寄存器,可以 +设置发送和接收性能。 +网络底层操作主要以子程序库提供应用支持,对寄存器不作详细介绍。主要特性: + 支持全双工和半双工 + 支持短包填充设置 + 支持CRC设置和填充 + 支持巨型帧接收 + 支持不同的过滤模式组合 +V2.4 482 + +# Page 486 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn + 支持pause帧发送和设置 + 支持自动协商机制 + 支持DMA,用于发送和接收数据 + PHY收发器兼容10BASE-T,发送模块支持节能模式 + 内置50欧姆传输阻抗匹配电阻,也可选择外接 + 提供由IEEE分配的全球唯一MAC地址 +27.2.2 寄存器描述 +表27-23 以太网控制器相关寄存器列表 +名称 偏移地址 描述 复位值 +R8_ETH_EIE 0x40028003 中断使能寄存器 0x00 +R8_ETH_EIR 0x40028004 中断标志寄存器 0x00 +R8_ETH_ESTAT 0x40028005 状态寄存器 0x00 +R8_ETH_ECON2 0x40028006 PHY模拟参数设置寄存器 0x0A +R8_ETH_ECON1 0x40028007 收发控制寄存器 0x00 +R32_ETH_TX 0x40028008 发送DMA控制寄存器 0xXXXXXXXX +发送DMA缓存区起始地址寄存 +R16_ETH_ETXST 0x40028008 0xXXXX +器 +R16_ETH_ETXLN 0x4002800A 发送长度寄存器 0xXXXX +R32_ETH_RX 0x4002800C 接收DMA控制寄存器 0x00000000 +接收DMA缓冲区起始地址寄存 +R16_ETH_ERXST 0x4002800C 0x0000 +器 +R16_ETH_ERXLN 0x4002800E 接收长度寄存器 0x0000 +R32_ETH_HTL 0x40028010 Hash表低字节寄存器 0x484EA033 +R32_ETH_HTH 0x40028014 Hash表高字节寄存器 0x5000EF97 +R32_ETH_MACON 0x40028018 接收过滤设置寄存器 0x10000000 +R8_ETH_ERXFCON 0x40028018 接收包过滤控制寄存器 0x00 +R8_ETH_MACON1 0x40028019 Mac层流控制寄存器 0x00 +R8_ETH_MACON2 0x4002801A Mac层封包控制寄存器 0x00 +R8_ETH_MABBIPG 0x4002801B 最小包间间隔寄存器 0x10 +R32_ETH_TIM 0x4002801C 流控制暂停帧时间寄存器 0xXXXXXXXX +R16_ETH_EPAUS 0x4002801C 流控制暂停帧时间寄存器 0xXXXX +R16_ETH_MAMXFL 0x4002801E 最大接收包长度寄存器 0x0000 +R16_ETH_MIRD 0x40028020 MII读数据寄存器 0x1100 +R32_ETH_MIWR 0x40028024 MII写寄存器 0x00000000 +R8_ETH_MIREGADR 0x40028024 MII地址寄存器 0x00 +R8_ETH_MISTAT 0x40028025 MII状态寄存器 0x00 +R16_ETH_MIWR 0x40028026 MII写数据寄存器 0x0000 +R32_ETH_MAADRL 0x40028028 MAC地址低字节寄存器 0xXXXXXXXX +R16_ETH_MAADRH 0x4002802C MAC地址高字节寄存器 0xXXXX +27.2.2.1 中断使能寄存器(R8_ETH_EIE) +位 名称 访问 描述 复位值 +以太网中断使能: +7 RB_ETH_EIE_INTIE RW 0 +0:关闭中断; +V2.4 483 + +# Page 487 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:开启中断。 +接收完成中断使能: +6 RB_ETH_EIE_RXIE RW 0:关闭中断; 0 +1:开启中断。 +5 Reserved RO 保留。 0 +Link变化中断使能: +4 RB_ETH_EIE_LINKIE RW 0:关闭中断; 0 +1:开启中断。 +发送完成中断使能: +3 RB_ETH_EIE_TXIE RW 0:关闭中断; 0 +1:开启中断。 +内置的 50 欧姆阻抗匹配电阻使能: +2 RB_ETH_EIE_R_EN50 RW 0:片内电阻断开; 0 +1:片内电阻连接。 +发送错误中断使能: +1 RB_ETH_EIE_TXERIE RW 0:关闭中断; 0 +1:开启中断。 +接收错误中断使能: +0 RB_ETH_EIE_RXERIE RW 0:关闭中断; 0 +1:开启中断。 +27.2.2.2 中断标志寄存器(R8_ETH_EIR) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +6 RB_ETH_EIR_RXIF RW1 接收完成标志。 0 +5 Reserved RO 保留。 0 +4 RB_ETH_EIR_LINKIF RW1 Link变化标志。 0 +3 RB_ETH_EIR_TXIF RW1 发送完成标志。 0 +2 Reserved RO 保留。 0 +1 RB_ETH_EIR_TXERIF RW1 发送错误标志。 0 +0 RB_ETH_EIR_RXERIF RW1 接收错误标志。 0 +27.2.2.3 状态寄存器(R8_ETH_ESTAT) +位 名称 访问 描述 复位值 +7 RB_ETH_ESTAT_INT RW1 中断。 0 +6 RB_ETH_ESTAT_BUFER RW1 Buffer错误。 0 +5 RB_ETH_ESTAT_RXCRCER RO 接收CRC出错。 0 +4 RB_ETH_ESTAT_RXNIBBLE RO 接收nibble错误。 0 +3 RB_ETH_ESTAT_RXMORE RO 接收超过设定最大数据包。 0 +2 RB_ETH_ESTAT_RXBUSY RO 接收进行中。 0 +1 RB_ETH_ESTAT_TXABRT RO 发送被MCU打断。 0 +0 Reserved RO 保留。 0 +27.2.2.4 PHY 模拟参数设置寄存器(R8_ETH_ECON2) +位 名称 访问 描述 复位值 +V2.4 484 + +# Page 488 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[7:4] Reserved RO 保留。 0 +RB_ETH_ECON2_RX +[3:1] RW 保留,必须写入110b。 110b +RB_ETH_ECON2_MUST +发送端节能驱动控制: +0 RB_ETH_ECON2_TX RW 0:额定驱动; 0 +1:节能驱动。 +27.2.2.5 收发控制寄存器(R8_ETH_ECON1) +位 名称 访问 描述 复位值 +发送模块复位: +7 RB_ETH_ECON1_TXRST RW 0:不复位; 0 +1:复位发送模块。 +接收模块复位: +6 RB_ETH_ECON1_RXRST RW 0:不复位; 0 +1:复位接收模块。 +[5:4] Reserved RO 保留。 0 +发送开始,发送完成后自动清零: +3 RB_ETH_ECON1_TXRTS RW 0:无动作; 0 +1:启动发送。 +接收使能控制: +2 RB_ETH_ECON1_RXEN RW 0:关闭接收; 0 +1:开启接收。 +[1:0] Reserved RO 保留。 0 +27.2.2.6 发送 DMA 缓存区地址寄存器(R16_ETH_ETXST) +位 名称 访问 描述 复位值 +R16_ETH_ETXST[15:0 发送DMA缓冲区起始地址。 +[15:0] RW X +] 低15位有效,地址必须4字节对齐。 +27.2.2.7 发送长度(R16_ETH_ETXLN) +位 名称 访问 描述 复位值 +R16_ETH_ETXLN[15:0 +[15:0] RW 发送长度。 X +] +27.2.2.8 接收 DMA 缓冲区地址寄存器(R16_ETH_ERXST) +位 名称 访问 描述 复位值 +R16_ETH_ERXST[15:0 接收DMA缓冲区起始地址。 +[15:0] RW X +] 低15位有效,地址必须4字节对齐。 +27.2.2.9 接收长度寄存器(R16_ETH_ERXLN) +位 名称 访问 描述 复位值 +R16_ETH_ERXLN[15:0 +[15:0] RO 接收长度。 0 +] +V2.4 485 + +# Page 489 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +27.2.2.10 Hash 表低字节寄存器(R32_ETH_HTL) +位 名称 访问 描述 复位值 +[31:24] R8_ETH_EHT3[7:0] RW Hash Table字节3。 X +[23:16] R8_ETH_EHT2[7:0] RW Hash Table字节2。 X +[15:8] R8_ETH_EHT1[7:0] RW Hash Table字节1。 X +[7:0] R8_ETH_EHT0[7:0] RW Hash Table字节0。 X +27.2.2.11 Hash 表高字节寄存器(R32_ETH_HTH) +位 名称 访问 描述 复位值 +[31:24] R8_ETH_EHT7[7:0] RW Hash Table字节7。 X +[23:16] R8_ETH_EHT6[7:0] RW Hash Table字节6。 X +[15:8] R8_ETH_EHT5[7:0] RW Hash Table字节5。 X +[7:0] R8_ETH_EHT4[7:0] RW Hash Table字节4。 X +27.2.2.12 接收过滤设置寄存器(R8_ETH_ERXFCON) +位 名称 访问 描述 复位值 +单播匹配过滤设置: +7 RB_ETH_ERXFCON_UCEN RW 0:丢弃所有单播包; 0 +1:接收目标地址匹配的包。 +6 Reserved RO 保留。 0 +CRC校验过滤设置: +5 RB_ETH_ERXFCON_CRCEN RW 0:丢弃CRC错误的包; 0 +1:接收CRC错误的包。 +接收过滤使能: +4 RB_ETH_ERXFCON_EN RW 0:关闭接收过滤功能; 0 +1:开启接收过滤功能。 +魔法包过滤设置: +3 RB_ETH_ERXFCON_MPEN RW 0:丢弃魔法包; 0 +1:接收魔法包。 +hash表匹配过滤设置: +2 RB_ETH_ERXFCON_HTEN RW 0:丢弃hash表匹配的包; 0 +1:接收hash表匹配的包。 +组播包匹配过滤设置: +1 RB_ETH_ERXFCON_MCEN RW 0:丢弃所有组播包; 0 +1:接收所有组播包。 +广播包匹配过滤设置: +0 RB_ETH_ERXFCON_BCEN RW 0:丢弃所有广播包; 0 +1:接收所有广播包。 +27.2.2.13 Mac 层流控制寄存器(R8_ETH_MACON1) +位 名称 访问 描述 复位值 +[7:6] Reserved RO 保留。 0 +pause帧设置,全双工下有效 +[5:4] RB_ETH_MACON1_FCEN RW 00:停止发送暂停帧; 0 +01:发送一次暂停帧,然后停止发送; +V2.4 486 + +# Page 490 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +10:周期性发送暂停帧; +11:发送0 timer暂停帧,然后停止发 +送。 +发送pause帧使能控制: +3 RB_ETH_MACON1_TXPAUS RW 0:不发送pause帧; 0 +1:使能发送。 +接收pause帧使能: +2 RB_ETH_MACON1_RXPAUS RW 0:不接收pause帧; 0 +1:使能接收。 +控制帧设置: +RB_ETH_MACON1_PASSAL +1 RW 0:控制帧将被过滤; 0 +L +1:没被过滤的控制帧将写入缓存。 +MAC层接收使能: +0 RB_ETH_MACON1_MARXEN RW 0:MAC不接收数据; 0 +1:MAC接收使能。 +27.2.2.14 Mac 层封包控制寄存器(R8_ETH_MACON2) +位 名称 访问 描述 复位值 +短包填充设置: +000:不填充短包; +001:所有短包填充0至60字节,再4 +字节CRC; +010:不填充短包; +011:所有短包填充0至64字节,再4 +RB_ETH_MACON2_PADCFG 字节CRC; +[7:5] RW 0 +[2:0] 100:不填充短包; +101:检测到字段为0x8100的VLAN网 +络包自动填充0至64字节,否则短包 +填充60字节0,填充后再4字节CRC; +110:不填充短包; +111:所有短包填充0至64字节,再4 +字节CRC。 +发送添加CRC控制: +RB_ETH_MACON2_TXCRCE +4 RW 0:硬件不填充CRC; 0 +N +1:硬件填充CRC。 +3 RB_ETH_MACON2_PHDREN RW 特殊4字节不参与CRC校验。 0 +允许接收巨型帧: +2 RB_ETH_MACON2_HFRMEN RW 0:不允许接收巨型帧; 0 +1:允许接收。 +1 Reserved RO 保留。 0 +以太网络通讯模式: +0 RB_ETH_MACON2_FULDPX RW 0:半双工; 0 +1:全双工。 +V2.4 487 + +# Page 491 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +27.2.2.15 最小包间间隔寄存器(R8_ETH_MABBIPG) +位 名称 访问 描述 复位值 +7 Reserved RO 保留。 0 +[6:0] R8_ETH_MABBIPG[6:0] RW 最小包间间隔字节数。 0010000b +27.2.2.16 流控制暂停帧时间寄存器(R16_ETH_EPAUS) +位 名称 访问 描述 复位值 +[15:0] R16_ETH_EPAUS[15:0] RW 流控制暂停帧时间。 X +27.2.2.17 最大接收包长度寄存器(R16_ETH_MAMXFL) +位 名称 访问 描述 复位值 +R16_ETH_MAMXFL[15:0 +[15:0] RW 最大接收包长度。 0 +] +27.2.2.18 MII 读数据寄存器(R16_ETH_MIRD) +位 名称 访问 描述 复位值 +[15:0] R16_ETH_MIRD[15:0] RW MII读数据寄存器。 0x1100 +27.2.2.19 MII 地址寄存器(R8_ETH_MIREGADR) +位 名称 访问 描述 复位值 +[7:5] Reserved RO 保留。 0 +[4:0] RB_ETH_MIREGADR_MIRDL RW PHY寄存器地址。 0 +27.2.2.20 MII 状态寄存器(R8_ETH_MISTAT) +位 名称 访问 描述 复位值 +[7:1] Reserved RO 保留。 0 +MII寄存器操作状态: +0 R8_ETH_MII_STA RO 0:读MII寄存器; 0 +1:写MII寄存器。 +27.2.2.21 MII 写数据寄存器(R16_ETH_MIWR) +位 名称 访问 描述 复位值 +[15:0] R16_ETH_MIWR WO MII 写数据寄存器。 0 +27.2.2.22 MAC 地址寄存器(R32_ETH_MAADRL、R16_ETH_MAADRH) +位 名称 访问 描述 复位值 +R32_ETH_MAADRL +[31:0] RW MAC Address字节1~4。 x +[31:0] +R16_ETH_MAADRH +[15:0] RW MAC Address字节5~6。 x +[15:0] +注:内部10M物理层相关寄存器内容详见27.1.8.5内部10M物理层相关寄存器地址部分。 +27.2.3 操作指南 +V2.4 488 + +# Page 492 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1.初始化 +(1)、配置安全寄存器进入安全模式,打开以太网络的时钟和电源; +(2)、开启相应的中断,可选的,启动阻抗匹配电阻; +(3)、配置接收过滤模式、CRC功能、MAC地址; +(4)、设置缓存; +(5)、启动接收,开启中断。 +2.发送数据 +(1)、写入R16_ETH_ETXLN数据长度; +(2)、写入R16_ETH_ETXST数据地址; +(3)、使能RB_ETH_ECON1_TXRTS标志,启动发送。 +3.接收数据 +(1)、预先设置好接收地址,使能接收; +(2)、使用中断或查询到接收完成状态; +(3)、读取R16_ETH_ERXLN接收长度; +(4)、更新R16_ETH_ERXST接收地址。 +具体的应用请基于以太网协议栈库使用,并参考提供的网络应用示例。 +V2.4 489 + +# Page 493 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 28 章 SDIO 接口(SDIO) +本章模块描述适用于CH32F20x和CH32V30x、CH32V31x微控制器全系列部分产品。 +本章单独所述“SDIO”,是指微控制器上一个为操作 SD 卡等外部存储卡或其他设备而设计的通 +信接口,是微控制器的一个外设。微控制器的 SDIO直接挂载在 HB总线上,由 HCLK 直接提供时钟, +能实现较高的通讯速度,微控制器的 SDIO 用作 SDIO 主机,被控制的设备也被统称 SDIO 设备。应用 +中一般使用 SDIO 来读写 SD 卡、TF 卡或 eMMC 颗粒,或控制其他使用 SDIO 作为通讯接口的设备,比 +如WiFi/4G模块。 +28.1 主要特征 +28.1.1 特征 + 支持SD卡、SDIO卡和MMC卡 + 支持1位、4位和8位总线 + SDIO的时钟最快可达到HCLK的一半 + 兼容MMC 规范4.5 + 兼容SD卡规范2.0,SDIO卡规范2.0 + 不兼容SPI或QSPI +28.1.2 概述 +微控制器的 SDIO 支持与 SD 卡或 MMC 卡等存储器通讯,需要明确的是,SDIO 仅仅是提供一组实 +现SD卡、MMC卡规范单次命令传输所需要的时钟,数据和命令控制时序,各命令间的先后组合需用用 +户通过程序自行确定。此外,对于各种存储卡而言,SDIO仅仅只能实现读写功能,文件系统所提供的 +对文件的功能需要用户自行通过程序构建文件系统而实现。 +SDIO 不同于 QSPI 接口,其没有片选引脚,并多出一个 CMD引脚,CMD可以认为是一个特殊数据 +线,专门用来传输命令和响应;SDIO有1位、4位和8位三种数据线宽度可选;SDIO的时钟在配置时 +一般工作在 400kHz 以下的频率,当正式进行数据传输时,则可以配成 SDIO 设备所支持的最大时钟, +微控制器所支持的最大 SDIO 时钟输出为 HCLK的一半,按照协议当 SDIO 设备接收的时钟大于某个阈 +值时,需要降低时钟线、数据线和命令线的波形峰值,以节省波形上升和下降的耗时。 +与 SD卡不同,SDIO卡经常指代使用 SDIO接口的 WIFI/蓝牙模块和 4G模块等非存储设备。如果 +没有特殊说明,本章叙述的内容一定适用于 SD 卡,只适用于 SDIO卡或 MMC 卡的内容将会特别指出。 +本章在叙述时,优先将SD卡视为潜在操作对象,其次为SDIO卡,最后为MMC卡。 +28.2 接口和时钟 +SDIO 通过 HB 总线接收 CPU 对其的控制,SDIO 的寄存器中有一个 FIFO 接口,CPU 或 DMA 通过读 +写 FIFO 获取或发生数据。SDIO 由 HCLK 直接供给时钟,并拥有一个中断入口,支持多种中断源。由 +SDIO直接控制的引脚有SDIO_CK、SDIO_CMD、SDIO_D[7:0]这十个,通过几个引脚连接到SDIO设备上。 +SDIO是一个主机主导的通讯接口,所有的传输必须由微控制器发起。 +28.2.1 外设结构 +SDIO的结构如图28-1所示。 +V2.4 490 + +# Page 494 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图28-1 SDIO的结构图 +Power management +SDIO_CK +Clock management +Interrupt +DMA request +Status Control Command +flag logic timer +IN +CMD SDIO_CMD +OUT +Bus in H t B erface R R e e g s i p s o t n e s r e re S g h is if t t e r CRC +Status Contro Data +HB bus CMD flag l logic timer +IN +Parameter SDIO_D[7:0] +OUT +Send and Shift CRC +receive FIFO register +HCLK/2 +SDIO是微控制器作为主机直接操作SDIO设备的外设,其大概由HB接口、时钟控制部分、CMD线 +控制部分,数据线控制部分和控制寄存器部分这五个模块组成,SDIO是一个半双工的外设,CPU向控 +制寄存器写入需要发送的命令和数据,命令线和数据线控制模块负责将命令或数据推到 IO 上,并加 +上CRC。SDIO的数据流由通用DMA负责完成从RAM到SDIO的FIFO的搬移,SDIO的FIFO有32个32 +位的大小。 +28.2.2 引脚及其配置 +SDIO需要配置的引脚及其模式见表28-1。 +表28-1 SDIO的引脚配置 +GPIO SDIO复用功能 需要配置成的引脚模 需要配置成的引脚速 +式 度 +PC[8:11] SDIO_D[0:3] 推挽复用输出 50MHz +PC12 SDIO_CK 推挽复用输出 50MHz +PD2 SDIO_CMD 推挽复用输出 50MHz +PB8 SDIO_D4 推挽复用输出 50MHz +PB9 SDIO_D5 推挽复用输出 50MHz +PC6 SDIO_D6 推挽复用输出 50MHz +PC7 SDIO_D7 推挽复用输出 50MHz +注:从机模式时,SDIO_CK引脚应配置为浮空输入,且从机模式仅适用于CH32F20x_D8、 +CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号倒数第六位不为0的产品。 +28.2.3 时钟 +SDIO 的时钟引脚为 SDIO_CK,其输出时钟由 HCLK分频得到,分频系数可配置为 2-261之间的任 +意整数值。SDIO设备在初始化的时候一般只支持最高400kHz时钟的单总线模式,在初始化后,主机 +一般会发起切换至低电压的操作,同时将时钟提升至微控制器和 SDIO 设备双方能接受的最大时钟。 +不同版本和速度等级的SD卡所支持时钟速度和切换流程有所区别,用户需要自行了解。 +V2.4 491 + +# Page 495 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +28.2.4 命令状态机 +SDIO的命令工作流程遵循如下图的状态机。 +图28-2 命令状态机 +Receive CE-ATA +Resetting command +Wait_CPL +completion signal, or +CPSM disabled or +command CRC failed +CPSM enable and +Idle +suspend commands Receive response or Receive response in CE-ATA +Disable disable or command mode, no interrupt, wait +CPSM CRC failure for CE-ATA command to +complete signal enable +Suspend +Enable and CPSM disabled or +Receive +command start CPSM disabled command timeout +Final data or unresponsive +Response +Send start +Wait +response Wait +Receive response in CE-ATA +mode without interruption, +wait for CE-ATA command +to complete signal disable +28.2.5 数据状态机 +SDIO的数据工作流程遵循如下图的状态机。 +图28-3 数据状态机 +Disable DPSM +Resetting DPSM enable, +read wait start, Read wait +SDI/O mode +Idle enable +Disable or Enable and do not +CRC failure Disable or send Read wait stop +Disable or FIFO or timeout data end +Disable or Rx FIFO +underload or data +empty or timeout +end or CRC failure +Enable or start bit error +receive data, Start +Busy and send +Wait_R read wait, enable +Idle SDI/O mode +Wait_R +Packet End End of packet, +Disable or +or end of data, +CRC failure +or FIFO overload +Data +Start bit +preparation +Send +Receive +V2.4 492 + +# Page 496 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +28.3 SDIO 协议简述 +SDIO 上的通讯以传输为最小单位,每个传输总是以主机在 CMD 线上发送命令为起始,有的命令 +发送之后,SDIO设备同样会在CMD线上发送一段数据回复主机,称为“响应”,有时还会伴随着数据 +的传输,数据的传输是在D线上。命令和响应的格式是固定的,各域各位的定义根据不同的命令或响 +应而确定。响应和数据传输需要在命令或响应结束后规定的时间内发出或停止,否则将产生超时错误。 +本小节的目的是以较小的篇幅让用户对使用 SDIO 所必要的一些规范的细节有初步的了解,并不 +保证详尽和更新及时。微控制器的SDIO也仅仅保证其实现了SD 2.0,SDIO 2.0及MMC 4.5规范的硬 +件操作基础,对于更高版本规范定义的功能,例如双边沿采样等,并不一定支持。用户在做具体开发 +时应以SD规范,SDIO规范和MMC规范为依据进行SDIO交互编程。 +28.3.1 总线时序 +SD 卡的传输都是以主机发起 CMD 发起的,SD 卡可能不回复响应,可能回复短响应和长响应,有 +的响应后面还会伴随数据传输。而在SDIO卡或MMC卡的通讯中,还可能会有SDIO设备主动报中断的 +情况。时序如下图组所示。 +图28-4 SDIO的无响应时序和无数据时序(以SD卡为例) +From host to card From host to card From card to host +SDIO_CMD Command Command Response +SDIO_D +Operation(no response) Operation(no response) +图28-5 SDIO的多块读时序(以SD卡为例) +From host to card From card to host +Data From card to host Stop command +Stop data transmission +SDIO_CMD Command Response Command Response +SDIO_D Data block crc Data block crc Data block crc +Block read +operation +Multi-block Data stop +read operation operation +V2.4 493 + +# Page 497 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图28-6 SDIO的多块写时序(以SD卡为例) +From host to cardFrom card to host +Stop command +Data from host to card +Stop data transmission +SDIO_CMD Command Response Command Response +Busy Busy +SDIO_D Busy signalData block crc signal Data block crc signal +Optional for CE-ATA Block write Data stop +Card Busy Signal operation operation +Multi-block +write operation +图28-7 SDIO的数据流读时序(以SDIO卡为例) +From host to cardFrom card to host +Stop command +Data from card to host Stop data transmission +SDIO_CMD Command Response Command Response +SDIO_D Data Flow +Data transfer Data stop +operation operation +图28-8 SDIO的数据流写时序(以SDIO卡为例) +From host to card From card to host +Stop command +Data from host to card +Stop data transmission +SDIO_CMD Command Response Command Response +SDIO_D Data Flow +Data transfer Data stop +operation operation +28.3.2 命令 +SDIO传输大部分以命令(CMD)开始,SDIO主机通过命令向设备告知自己的意图。命令的格式如 +下表。 +V2.4 494 + +# Page 498 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表28-2 命令格式 +位/域的名 结束 +起始位 传输位 命令索引 命令参数 CRC7 +称 位 +位次/宽度 47 46 [45:40] / 6 [39:8] / 32 [7:1] / 7 0 +bits bits bits +值 0b 1b X X X 1b +命令大致有四种: +1) 广播命令(bc):发给总线上的所有的卡,没有响应返回; +2) 带响应的广播命令(bcr):发给总线上的所有的卡,有响应返回; +3) 点对点命令(ac):发给特定的卡,但没有数据传输; +4) 带数据传输的点对点命令(adtc):发给特定的卡,并附带数据传输; +下面是一些常用的命令。 +28.3.2.1 基础命令 +基础命令是SD卡所支持的一些较基本的功能。 +表28-3 SD卡的基础命令 +命令索引 类型 参数 回复类型 简写 描述 +复位所有的卡到 +CMD0 bc [31:0]填充位无意义; 无 GO_IDLE_STATE +IDLE状态 +CMD2 bcr [31:0]填充位无意义; R2 ALL_SEND_CID 所有卡回复CID +CMD3 bcr [31:0]填充位无意义; R6 SEND_RELATIVE_ADDR 回复新的RCA +[31:16]RCA; R1b 选中或者取消选 +CMD7 ac SELECT/DESELECT_CARD +[15:0]填充位无意义; 选中卡 选中某个卡 +[31:12]保留; +发送SD卡接口条 +CMD8 bcr [11:8]供电; R7 SEND_IF_COND +件。 +[7:0]校验模式; +[31:16]RCA; +CMD9 ac R2 SEND_CSD 要求CSD。 +[15:0]填充位无意义; +[31:16]RCA; +CMD10 ac R2 SEND_CID 要求CID。 +[15:0]填充位无意义; +切换到 1.8V 电 +CMD11 ac [31:0]填充位无意义; R1 VOLATGE_SWITCH +平。 +强制卡停止 传 +CMD12 ac [31:0]填充位无意义; R1b STOP_TRANSMISSION +输; +[31:16]RCA; +[15]发送任务状态寄 发送状态或任务 +CMD13 ac R1 SEND_STATUS/SEND_TASK_STATUS +存器; 状态寄存器 +[14:0] 填充位; +[31:16]RCA; 要 求 卡 进 到 +CMD15 ac 无 GO_INACTIVE_STATE +[15:0]填充位无意义; INACTIVE模式; +28.3.2.2 擦除命令 +SD卡也是FLASH的结构,写入前也需要擦除FLASH,但是SD卡内部集成了擦除逻辑,在执行写命 +令前如果发现没有擦除会自动补上擦除操作。在很多情况下特别是大批量写之前,如果主动执行擦除 +有助于提高效率。 +V2.4 495 + +# Page 499 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +表28-4 SD卡的擦除命令[1] +命令 +类型 参数 回复类型 简写 描述 +索引 +[31:0]开始擦除的地址 设定擦除的首地 +CMD32 ac R1 ERASE_WR_BLK_START +[2] 址 +[31:0]结束擦除的地址 设定擦除的尾地 +CMD33 ac R1 ERASE_WR_BLK_END +[2] 址 +参数为 0 即普通 +CMD38 ac [31:0]擦除模式 R1b ERASE +擦 +注1:这里的擦除命令是SD协议规范定义的SD卡的擦除命令,SDIO卡和MMC卡的擦除命令与此 +有区别;2:目前常用的SDHC/SDXC(2GB到2TB)级别的卡写入的擦除地址必须是块地址,即512字 +节对齐; +28.3.2.3 块传输的读命令 +表28-5 SD卡的块读命令[1] +命令索 +类型 参数 回复类型 简写 描述 +引 +CMD16 ac [31:0]块长度 R1 SET_BLOCKLEN 写入块长度,512 +adtc [31:0]单个块的地址 设定单个读的起 +CMD17 R1 READ_SINGLE_BLOCK +[1] 始地址 +adtc [31:0]多个块的地址 设定单个读的起 +CMD18 R1 READ_MULTIPLE_BLOCK +[1] 始地址 +adtc 发送表示模式变 +CMD19 [31:0]保留位 R1 SEND_TUNING_BLOCK +化的64字节序列 +ac [31:28]保留位 +CMD20 R1b SPEED_CLASS_CONTROL 速度控制控制 +[27:0]速度控制位 +ac [31:6]保留位 SDUC 才会用用 +CMD22 R1 ADDRESS_EXTENSION +[5:0]扩展地址 到。 +CMD23 ac [31:0]块计数器 R1 SET_BLOCK_COUNT 块计数器 +注:1:目前常用的SDHC/SDXC(2GB到2TB)级别的卡写入的擦除地址必须是块地址,即512字节对 +齐。 +28.3.2.4 块传输的写命令 +表28-6 SD卡的块读命令[1] +命令索 +类型 参数 回复类型 简写 描述 +引 +CMD16 ac [31:0]块长度 R1 SET_BLOCKLEN 写入块长度,512 +设定单个块写的 +CMD24 adtc [31:0]块的地址[1] R1 WRITE_BLOCK +起始地址 +[31:0]多个块的地址 设定多个块写的 +CMD25 adtc R1 WRITE_MULTIPLE_BLOCK +[1] 起始地址 +对 CSD 可编程的 +CMD27 adtc [31:0]填充位 R1 PROGRAM_CSD +字编程 +注:1:目前常用的SDHC/SDXC(2GB到2TB)级别的卡写入的擦除地址必须是块地址,即512字节对 +齐。 +V2.4 496 + +# Page 500 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +28.3.3 响应 +响应作为 SDIO 设备对主机的必要回复,同样也是在 CMD 线上传输的,且必须在规定的时间内回 +复。响应传输为高位在前低位在后,响应长度和各比特各域的定义由响应的类型具体决定,但所有的 +响应都是由一个固定为0的起始位开始,跟着一个为固定0的传输方向位[1]。所有的响应最后都有一 +个停止位,固定为1[1]。大致有7种响应,SD卡支持R1 / R1b / R2 / R3 / R6 / R7,SDIO卡还支 +持R4 / R5,格式见下文。 +28.3.3.1 R1 响应 +普通响应,总长48位,有CRC7校验,卡状态域为32位。格式如下表。 +表28-7 R1的格式 +位/域的名称 起始位 传输位 响应索引 卡状态 CRC7 结束位 +位次/宽度 47 46 [45:40] / 6 bits [39:8] / 32 bits [7:1] / 7 bits 0 +值 0b 0b 跟随CMD索引 X X 1b +28.3.3.2 R1b 响应 +R1b 的格式和 R1 一致,但是可以在响应后添加繁忙信号,即钳住数据线 D2。主机收到繁忙信号 +(检测到SDIO_D2为低)后需要进行相应处理。 +28.3.3.3 R2 响应 +应对特定几个命令的响应,总长136位,CRC7校验包含在卡状态域中,卡状态域为128位。卡状 +态域存放CID寄存器或CSD寄存器的值,CID寄存器一般作为CMD2/CMD10的回复,CSD寄存器一般作 +为 CMD9 的回复,CID/CSD 寄存器的具体含义见 28.4.2 设备寄存器部分。需要注意的是 R2 只会回复 +CID/CSD 寄存器的[127:1]段,CID/CSD[0]固定为 1 的保留位[2]被结束位占据,结束位固定也为 1。 +格式如下表。 +表28-8 R2的格式 +位/域的名 起始 传输 命令索引 卡状态 结束位 +称 位 位 +位次/宽度 135 134 [133:128] / 6 bits [127:1] / 127 bits 0 +值 0b 0b 111111b CID/CSD 1b +28.3.3.4 R3 响应 +回复OCR寄存器的专用响应,总长48位,没有CRC7校验。OCR寄存器一般作为ACMD41的回复。 +格式如下表。 +表28-9 R3的格式 +位/域的名 起始 传输位 命令索引 卡状态 保留 结束位 +称 位 +位次/宽度 47 46 [45:40] / 6 [39:8] / 32 [7:1] / 7 0 +bits bits bits +值 0b 0b 111111b OCR 1111111b 1b +28.3.3.5 R4 响应 +应对CMD5的响应回复OCR及相关寄存器的专用响应,总长48位,有CRC7校验。R4应用在SDIO +卡中,格式如下表。 +表28-10 R4的格式 +位/域的名称 位次 宽度(单位:bit) 值 +V2.4 497 + +# Page 501 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +起始位 47 1 0b +传输位 46 1 0b +保留 [45:40] 6 111111b +卡就绪 39 1 X +IO功能数目 [38:36] 3 X +当前寄存器 [35] 1 X +填充位 [34:33] 2 00b +S18A 32 1 X +IO OCR [31:8] 24 OCR +CRC校验域 [7:1] 7 1111111b +结束位 0 1 1b +注:MMC卡R4的格式和SDIO卡不同。 +28.3.3.6 R5 响应 +应对CMD5的专用响应,总长48位,有CRC7校验。R5应用在SDIO卡中,格式如下表。 +表28-11 R5的格式 +位/域的名 起始 传输位 命令索引 填充位 响应格式 读写数据 CRC7 结束 +称 位 位 +位次 47 46 [45:40] [39:24] [23:16] [15:8] [7:1] 0 +宽度 1 1 6 16 8 8 7 1 +值 0b 0b 110100b 0000h X X X 1b +注:MMC卡R5的格式和SDIO卡不同。 +28.3.3.7 R6 响应 +回复RCA的专用响应,总长48位,有CRC7校验,格式如下表。 +表28-12 R6的格式 +位/域的名 起始位 传输位 命令索引 卡的RCA 卡状态位 CRC7 结束 +称 位 +位次 47 46 [45:40] [39:24] [23:8] [7:1] 0 +宽度 1 1 6 16 16 7 1 +值 0b 0b 000011b X X X 1b +28.3.3.8 R7 响应 +应对CMD8的专用响应,表明支持的电压的信息,总长48位,有CRC7校验,格式如下表。 +表28-13 R7的格式 +位/域的 起始 传输 命令索 PCIe 1V2 PCIe响 接受的电 检查回 结束 +保留位 CRC7 +名称 位 位 引 支持 应 压 馈 位 +位次 47 46 [45:40] [39:22] 21 20 [19:16] [15:8] [7:1] 0 +宽度 1 1 6 18 1 1 4 8 7 1 +值 0b 0b 001000b 00000h X X X X X 1b +28.3.4 数据传输 +数据传输在数据线SDIO_D上进行,有1/4/ 8位三种宽度,数据传输时一般是一个时钟的起始位 +在最前面,每个字节的高位在前,低位在后。对于 SD 卡仅仅支持的块传输模式,每个块的数据传输 +V2.4 498 + +# Page 502 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +结束后还跟着CRC校验。 +开启RANDOM_LEN_EN位,配置DBLOCKSIZE2表示的字节长度,配置R32_SDIO_DLEN表示的传输数 +据总长度,使能 DTEN 位,填写数据至 R32_SDIO_FIFO,即可完成任意字节长度且带 CRC 校验的块传 +输。(注:仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C批号 +倒数第六位不为0的产品) +MMC卡还支持数据流传输模式,此时不附带CRC。下图为数据传输的格式。 +图28-9 SD卡单总线数据传输字节的格式 +图28-10 SD卡4总线数据传输字节的格式 +图28-11 SD卡单总线数据传输一个512位字的格式 +图28-12 SD卡4总线数据传输一个512位字的格式 +28.3.5 从模式 +开启SLV_MODE位,即处于等待主机命令的状态,接收到的命令参数会放在RESP1,接收到的命令 +V2.4 499 + +# Page 503 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +索引会放在RESP2,同时自动向主机应答R1类型的应答,应答参数为CMDARG的值。 +从模式下的数据收发参考主模式,但从机可以使用SLV_FORCE_ERR位强制数据块CRC错,从而表 +示不期望的数据读写。 +注:(1)从机只支持R1类型的应答,主从通信所用的命令索引和参数含义均由软件定义; +(2)从机模式仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、CH32V31x_D8C +批号倒数第六位不为0的产品。 +28.4 应用 +28.4.1 设备初始化和设备寄存器 +28.4.1.1 OCR 寄存器 +操作条件寄存器(Operation Conditions Register)存储了SD卡的一些其接收的供电电压的信 +息和相关的状态位。相关的位定义如下表。 +表28-14 OCR寄存器位定义 +位次 位定义 描述 +0-3 保留。 +4 保留。 +5 保留。 +6 保留。 +7 为低电压范围保留 +8 保留 +9 保留 +10 保留 +11 保留 +12 保留 +13 保留 支持的V 电压范围,单位为伏特。 +DD +14 保留 +15 2.7-2.8 +16 2.8-2.9 +17 2.9-3.0 +18 3.0-3.1 +19 3.1-3.2 +20 3.2-3.3 +21 3.3-3.4 +22 3.4-3.5 +23 3.5-3.6 +24 接受切换到1.8V +25-26 保留 +27 超过2TB支持状态位 +28 保留 +29 UHS-II卡状态位 此位被置位表示此卡支持UHS-II接口。 +30 卡容量状态(CCS) 此位被置位表示卡容量大于2GB。 +31 卡上电状态位(busy) 此位在卡上电完成后被置位。上电完成后,其他位才有意义。 +28.4.1.2 CID 寄存器 +V2.4 500 + +# Page 504 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CID存储了一些身份识别信息。 +表28-15 CID寄存器各位各域的定义 +位/域名称 简写 宽度 位次 +厂商ID MID 8 [127:120] +应用ID OID 16 [119:104] +产品名称 PNM 40 [103:64] +产品版本 PRV 8 [63:56] +产品序列号 PSN 32 [55:24] +保留 无 4 [23:20] +生产日期 MDT 12 [19:8] +CRC7 CRC 7 [7:1] +固定位,固定为1 无 1 [0] +28.4.1.3 CSD 寄存器 +CSD 寄存器存储了 SD 卡的特征数据。以目前最常用的 SDHC 和 SDXC 卡最常用的第二版的 CSD 为 +例,各位域的定义如下表。 +表28-16 CSD寄存器各位域的含义 +名称 简写 宽度 值 读写 位次 +CSD版本 CSD_STRUCTURE 2 01b RO [127:126] +保留 无 6 00_0000b RO [125120 +读数访问时 +TAAC 8 0Eh RO [119:112] +间 +用时钟周期 +表示的读数 NSAC 8 00h RO [111:104] +访问时间 +最大数据发 +TRAN_SPEED 8 32h5Ah0Bh2Bh RO [103:96] +送速度 +卡命令类 CCC 12 X1X1101101X1b RO [95:84] +读数据块最 +READ_BL_LEN 4 9 RO [83:80] +大长度 +允许块部分 +READ_BL_PARTIAL 1 0 RO [79] +读 +块写不对齐 WRITE_BLK_MISALIGN 1 0 RO [78] +块读不对齐 READ_BLK_MISALIGN 1 0 RO [77] +执行的DSR DSR_IMP 1 X RO [76] +保留 无 6 00_0000b RO [75:70] +设备大小 C_SIZE 22 XXXXXXh RO [69:48] +保留 无 1 0 RO [47] +单块擦使能 ERASE_BLK_EN 1 1 RO [46] +擦扇区尺寸 SECTOR_SIZE 7 7Fh RO [45:39] +写保护组大 +WP_GRP_SIZE 7 0000000b RO [38:32] +小 +写保护组使 +WP_GRP_ENABLE 1 0 RO [31] +能 +保留 无 2 00b RO [30:29] +V2.4 501 + +# Page 505 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +写速度因素 R2W_FACTOR 3 010b RO [28:26] +最大写数据 +WRITE_BL_LEN 4 9 RO [25:22] +块长度 +允许块部分 +WRITE_BL_PARTIAL 1 0 RO [21] +写 +保留 无 5 00000b RO [20:16] +文件格式组 FILE_FORMAT_GRP 1 0 RO [15] +复制标志 TMP_WRITE_PROTECT 1 X RW OTP [14] +永久写保护 PERM_WRITE_PROTECT 1 X RW OTP [13] +临时写保护 TMP_WRITE_PROTECT 1 X RW [12] +文件格式 FILE_FOMAT 2 00b RO [11:10] +保留 无 2 00b RO [9:8] +CRC CRC 7 0000000b RW [7:1] +未使用,必 +无 1 1b RO [0] +须使用1 +28.4.1.4 RCA 寄存器 +相对卡地址寄存器存储了卡的地址,为16位,默认值为0. +28.4.2 电压切换 +在 SD 卡初始化后期,需要进行接口电平切换,将 SD卡的时钟线数据线和命令线的 IO 电平切换 +到1.8V水平。对于压摆率不是足够优秀的器件,使用更低的电平标准有助于提升频率。但是SD的供 +电电压并不一定变化,只在较新版本的协议才出现了低电压供电的SD卡。 +切换电压的步骤如下图。 +图28-13 电压切换序列 +CMD55 R1 CMD41 R3 CMD55 R1 CMD41 R3 CMD11 R1 电压切换 CMD2 R2 +28.4.3 时钟切换 +初始化时 SD 卡的时钟只有 400kHz,在电压完成切换之后可以将时钟提升至较高的水平,例如 +SDHC 卡 UHS-I 模式第一档速度,总线时钟可以达到 80MHz,鉴于微控制器的 IO 输出能力,应将时钟 +限制在50MHz之内。 +28.5 中断 +28.5.1 SDIO 中断 +SDIO支持多种中断源,如中断使能寄存器(R32_SDIO_IER)所示的有24种情况都可以触发中断, +用户可酌情自行开启。 +28.5.2 SDIO 设备中断 +需要注意的是不光SDIO外设可以向CPU报中断,外接SDIO卡和MMC卡也能向SDIO外设报中断。 +在 4 位总线模式下,中断线是 D1,在 8 位总线模式下,中断线是 D7,低电平有效。如果在空闲状态 +下 SDIO检测到 D1或 D7为低电平,应读取 SDIO设备的状态寄存器或中断标志寄存器及时响应中断。 +CPU通过R32_SDIO_STA寄存器的SDIOIT 位可以得到SDIO主机是否收到中断。 +V2.4 502 + +# Page 506 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +28.6 寄存器描述 +表28-17 SDIO相关寄存器列表 +名称 访问地址 描述 复位值 +R32_SDIO_POWER 0x40018000 电源寄存器 0x00000000 +R32_SDIO_CLKCR 0x40018004 时钟寄存器 0x00000000 +R32_SDIO_ARG 0x40018008 命令参数寄存器 0x00000000 +R32_SDIO_CMD 0x4001800C 命令寄存器 0x00000000 +R32_SDIO_RESPCMD 0x40018010 响应寄存器 0x00000000 +R128_SDIO_RESPX 0x40018014 响应参数寄存器 0x00000000 +R32_SDIO_DTIMER 0x40018024 数据定时寄存器 0x00000000 +R32_SDIO_DLEN 0x40018028 传输长度寄存器 0x00000000 +R32_SDIO_DCTLR 0x4001802C 数据控制寄存器 0x00000000 +R32_SDIO_DCOUNT 0x40018030 传输计数寄存器 0x00000000 +R32_SDIO_STA 0x40018034 状态寄存器 0x00000000 +R32_SDIO_ICR 0x40018038 中断清除寄存器 0x00000000 +R32_SDIO_MASK 0x4001803C 中断使能寄存器 0x00000000 +R32_SDIO_FIFOCNT 0x40018048 FIFO计数器 0x00000000 +R32_SDIO_DCTRL2 0x40018060 数据控制寄存器2 0x00000000 +R32_SDIO_FIFO 0x40018080 FIFO寄存器 0x00000000 +28.6.1 电源寄存器(R32_SDIO_POWER) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PWRCTRL +Reserved +[1:0] +位 名称 访问 描述 复位值 +[31:2] Reserved RO 保留。 0 +电源检测位: +00:电源关闭,时钟停止; +[1:0] PWRCTRL[1:0] RW 01:保留; 0 +10:保留的上电状态; +11:上电状态,卡时钟开启。 +28.6.2 时钟寄存器(R32_SDIO_CLKCR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +V2.4 503 + +# Page 507 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +Rese HWFC_ NEGE BYPAS PWRSA +WIDBUS[1:0] CLKEN CLKDIV[7:0] +rved EN DGE S V +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +硬件流控使能位,此位置位后,TXFIFOE 和 +RXFIFOF信号才起作用。 +14 HWFC_EN RW 0 +0:关闭硬件流控; +1:开启硬件流控。 +SDIO_CK相位选择位。 +13 NEGEDGE RW 0:在HCLK的上升沿产生SDIO_CK; 0 +1:在HLCK的下降沿生产SDIO_CK。 +总线宽度配置域: +00:1位总线模式,使用SDIO_D0; +[12:11] WIDBUS[1:0] RW 01:4位总线模式,使用SDIO_D[3:0]; 0 +10:8位总线模式,使用SDIO_D[7:0]; +11:未使用。 +时钟旁路使能位: +0:SDIO_CK通过分频器分频得出; +10 BYPASS RW 0 +1:SDIO_CK直接接到HCLK上。 +注:使用该位时需使能HWFC_EN位。 +空闲时时钟状态配置位。此位置位后,总线空 +闲时关闭SDIO_CK输出以节省电能。 +9 PWRSAV RW 0 +0:SDIO_CK始终输出; +1:SDIO_CK只在需要时输出。 +时钟使能位: +8 CLKEN RW 0:SDIO_CK被禁止输出; 0 +1:SDIO_CK被允许输出。 +时钟分频系数域,此域表示SDIO_CK与HCLK的 +关系。SDIO_CK=HCLK/(CLKDIV+2)。 +[7:0] CLKDIV[7:0] RW 0 +注意在初始化阶段,SDIO_CK应低于400kHz。 +注:CLKDIV[7:0]的设置值最小为1。 +注:(1)时钟配置寄存器用来控制SDIO_CK相关的参数,需要注意的是本寄存器在读写数据期间到 +7个HCLK周期内不能更改; +(2)从机时无需配置时钟寄存器。 +28.6.3 命令参数寄存器(R32_SDIO_ARG) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CMDARG[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CMDARG[15:0] +位 名称 访问 描述 复位值 +V2.4 504 + +# Page 508 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +主机模式:命令的参数域。此域存放的是命令 +中的参数,会作为命令的一部分一起发生到 +[31:0] CMDARG RW CMD线上。 0 +从机模式:从机回复应答的 32 位响应参数寄 +存器。 +28.6.4 命令寄存器(R32_SDIO_CMD) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SDIOS +ATACM ENCMD CPSME WAITP WAITI WAITRESP +Res NIEN uspen CMDINDEX[5:0] +D Compl N END NT [1:0] +d +位 名称 访问 描述 复位值 +[31:15] Reserved RO 保留。 0 +进行 CE-ATA 命令。如果置此位,CPSM 将转到 +14 ATACMD RW 0 +CMD61。 +不使能CE-ATA中断设置位。如果置此位,CE- +13 NIEN RW 0 +ATA将不产生中断。 +使能CMD完成信号使能位。如果置此位,命令 +12 ENCMDCompl RW 0 +完成将产生信号。 +暂停命令发生位。如果置此位,将发送一个暂 +11 SDIOSuspend RW 0 +停信号。仅适用于SDIO卡。 +CPSM(命令通道状态机)使能位。如果置此位, +10 CPSMEN RW 0 +将使能CPSM。 +命令等待控制位。如果设置此位,发送命令前, +9 WAITPEND RW 0 +CPSM会等待数据传输完成。 +命令等待中断控制位。如果置此位,CPSM会关 +8 WAITINT RW 0 +闭超时控制并等待中断产生。 +响应类型等位域。此域指示 CPSM 期望收到的 +响应类型。 +00:无响应,等待CMDSENT标志; +[7:6] WAITRESP[1:0] RW 0 +01:短响应,等待CMDREND或CCRCFAIL标志; +10:无响应,等待CMDSENT标志; +11:长响应,等待CMDREND或CCRCFAIL标志; +[5:0] CMDINDEX[5:0] RW 命令索引域。此域表明具体的命令值。 0 +28.6.5 响应寄存器(R32_SDIO_RESPCMD) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +V2.4 505 + +# Page 509 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved RESPCMD[5:0] +位 名称 访问 描述 复位值 +[31:6] Reserved RO 保留。 0 +[5:0] RESPCMD[5:0] RO 这个域记录了收到的响应的索引值。 0 +28.6.6 响应参数寄存器(R128_SDIO_RESPX) +位 名称 访问 描述 复位值 +主机模式:当响应为长响应时,整128位均表 +示卡状态;当响应为短响应时,低32位表示卡 +[127:0] CARDSTATUSx RO 0 +状态。SDIO外设先收到卡状态的最高位,并从 +R128_SDIO_RESX最低位开始存储。 +28.6.6.1 响应参数寄存器高 32 位(R128_SDIO_RESP1[127:96]) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CARDSTATUS1[127:112] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CARDSTATUS1[111:96] +位 名称 访问 描述 复位值 +主机模式:卡状态[127:96]; +从机模式:接收命令收到的命令参数。 +注:从机模式仅适用于 CH32F20x_D8、 +[31:0] CARDSTATUS1 RO 0 +CH32F20x_D8C 、 CH32V30x_D8 、 +CH32V30x_D8C、CH32V31x_D8C批号倒数 +第六位不为0的产品。 +28.6.6.2 响应参数寄存器次高 32 位(R128_SDIO_RESP2[95:64]) +偏移地址:0x18 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CARDSTATUS2[95:80] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CARDSTATUS2[79:64] +位 名称 访问 描述 复位值 +主机模式:卡状态[95:64]; +从机模式:接收命令收到的命令索引。 +[31:0] CARDSTATUS2 RO 注:从机模式仅适用于 CH32F20x_D8、 0 +CH32F20x_D8C 、 CH32V30x_D8 、 +CH32V30x_D8C、CH32V31x_D8C批号倒数 +V2.4 506 + +# Page 510 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第六位不为0的产品。 +28.6.6.3 响应参数寄存器次低 32 位(R128_SDIO_RESP3[63:32]) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CARDSTATUS3[63:48] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CARDSTATUS3[47:32] +位 名称 访问 描述 复位值 +[31:0] CARDSTATUS3 RO 主机模式:卡状态[63:32]。 0 +28.6.6.4 响应参数寄存器低 32 位(R128_SDIO_RESP4[31:0]) +偏移地址:0x20 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CARDSTATUS4[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CARDSTATUS4[15:0] +位 名称 访问 描述 复位值 +[31:0] CARDSTATUS4 RO 主机模式:卡状态[31:0]。 0 +28.6.7 数据定时寄存器(R32_SDIO_DTIMER) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +DATATIME[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATATIME[15:0] +位 名称 访问 描述 复位值 +[31:0] DATATIME RW 数据超时时长。以SDIO_CK的周期数为单位。 0 +28.6.8 传输长度寄存器(R32_SDIO_DLEN) +偏移地址:0x28 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved DATALENGTH[24:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATALENGTH[15:0] +位 名称 访问 描述 复位值 +V2.4 507 + +# Page 511 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[31:25] Reserved RO 保留。 0 +传输数据长度域。此域的值在开启传输时会被 +加载到传输计数器。对于块传输,此域的值必 +[24:0] DATALENGTH[24:0] RW 须是块大小的整数倍,块大小由 SDIO 设备定 0 +义,存储在 R32_SDIO_DCTLR[7:4]中,常见值 +为512B等。 +28.6.9 数据控制寄存器(R32_SDIO_DCTRL) +偏移地址:0x2C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +SDIO RWSTO RWSTA DTMOD +Reserved RWMOD DBLOCKSIZE[3:0] DMAEN DTDIR DTEN +EN P RT E +位 名称 访问 描述 复位值 +[31:12] Reserved RO 保留。 0 +SDIO 使能位,此位被置位后,DPSM 可以执行 +11 SDIOEN RW 0 +SDIO卡特定的一些操作。 +读等待模式: +10 RWMOD RW 0:停止SDIO_CK控制读等待; 0 +1:使用SDIO_D2控制读等待。 +读等待停止位,如果RWSTART位被置位,那么 +9 RWSTOP RW 0 +读等待将被停止。 +8 RWSTART RW 读等待开始位,置此位将执行读等待操作。 0 +数据块长度域。此域存储了数据块的长度,采 +用块传输前必须定义块传输长度。此域可以写 +[7:4] DBLOCKSIZE[3:0] RW 0 +入的值为0到1110b之间,表示的块传输长度 +为2BLKLEN,即0到16384字节之间。 +DMA使能位: +3 DMAEN RW 0:关闭DMA; 0 +1:使能DMA。 +传输模式设置位,置此位设置传输模式。 +0:块传输; +1:流传输。 +2 DTMODE RW 注:流传输的 4 位、8 位总线模式仅支持 0 +CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C批号倒数第六位 +不为0的产品。 +传输方向设置位。置此位设置传输方向。 +1 DTDIR RW 0:控制器到卡; 0 +1:卡到控制器; +传输使能位。置此位开始数据传输。 +0 DTEN RW 0 +具体流程为,置此位后,DPSM 进入 Wait_S 或 +V2.4 508 + +# Page 512 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +Wait_R的流程(取决于传输方向), +28.6.10 传输计数寄存器(R32_SDIO_DCOUNT) +偏移地址:0x30 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved DATACOUNT[24:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +DATACOUNT[15:0] +位 名称 访问 描述 复位值 +[31:25] Reserved RO 保留。 0 +传输数据计数器域。在启动传输时,发送长度 +[24:0] DATACOUNT[24:0] RO 寄存器的值将会被加载到此计数器中,并随着 0 +传输过程递减。 +28.6.11 状态寄存器(R32_SDIO_STA) +偏移地址:0x34 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CEAT SDIOI RXDAV TXDAV RXFI TXFIF RXFIF TXFI +Reserved +AEND T L L FOE OE OF FOF +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RXFI TXFI DBCK STBI DATA CMDS CMDRE RXOV TXUND DTIME CTIM DCRCF CCRCF +RXACT TXACT CMDACT +FOHF FOHE END TERR END ENT ND ERR ERR OUT EOUT AIL AIL +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +此位被置位时,CMD61 接收到 CE-ATA 完成信 +23 CEATAEND RO 0 +号。 +22 SDIOIT RO 此位被置位时,SDIO收到设备中断。 0 +21 RXDAVL RO 此位被置位时,接收FIFO数据可用。 0 +20 TXDAVL RO 此位被置位时,发送FIFO中的数据可用。 0 +19 RXFIFOE RO 此位被置位时,接收FIFO空。 0 +18 TXFIFOE RO 此位被置位时,发送FIFO空。 0 +17 RXFIFOF RO 此位被置位时,接收FIFO满。 0 +16 TXFIFOF RO 此位被置位时,发送FIFO满。 0 +15 RXFIFOHF RO 此位被置位时,接收FIFO半满。 0 +14 TXFIFOHE RO 此位被置位时,发送FIFO半空。 0 +13 RXACT RO 此位被置位时,正在接收数据。 0 +12 TXACT RO 此位被置位时,正在发送数据。 0 +11 CMDACT RO 此位被置位时,正在传输命令。 0 +此位被置位时,已经发送或者接受了数据块且 +10 DBCKEND RO 0 +CRC校验通过。 +V2.4 509 + +# Page 513 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +此位被置位时,在宽总线模式下,所有数据线 +9 STBITERR RO 0 +都没有检测到起始信号。 +此位被置位时,数据传输结束(传输计数器为 +8 DATAEND RO 0 +零)。 +7 CMDSENT RO 此位被置位时,命令已经发送出去。 0 +6 CMDREND RO 此位被置位时,已经收到响应,CRC检验成功。 0 +5 RXOVERR RO 此位被置位时,接收FIFO上溢。 0 +4 TXUNDERR RO 此位被置位时,发送FIFO下溢。 0 +3 DTIMEOUT RO 此位被置位时,数据超时。 0 +此位被置位时,命令超时超过了64个SDIO_CK +2 CTIMEOUT RO 0 +周期。 +此位被置位时,已经发送或者接受了数据块但 +1 DCRCFAIL RO 0 +CRC校验失败。 +此位被置位时,已经收到响应,但CRC检验失 +0 CCRCFAIL RO 0 +败。 +28.6.12 中断清除寄存器(R32_SDIO_ICR) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +CEATA SDIOI +Reserved Reserved +ENDC TC +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +CTIM +DBCKE STBIT DATA CMDSEN CMDR RXOV TXUND DTIME DCRCF CCRCF +Reserved EOUT +NDC ERRC ENDC TC ENDC ERRC ERRC OUTC AILC AILC +C +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +23 CEATAENDC RW 置此位清除状态寄存器中的CEATAEND位。 0 +22 SDIOITC RW 置此位清除状态寄存器中的SDIOIT位。 0 +[21:11] Reserved RW 保留。 0 +10 DBCKENDC RW 置此位清除状态寄存器中的DBCKEND位。 0 +9 STBITERRC RW 置此位清除状态寄存器中的STBITERR位。 0 +8 DATAENDC RW 置此位清除状态寄存器中的DATAEND位。 0 +7 CMDSENTC RW 置此位清除状态寄存器中的CMDSENT位。 0 +6 CMDRENDC RW 置此位清除状态寄存器中的CMDREND位。 0 +5 RXOVERRC RW 置此位清除状态寄存器中的RXOVERR位。 0 +4 TXUNDERRC RW 置此位清除状态寄存器中的TXUNDERR位。 0 +3 DTIMEOUTC RW 置此位清除状态寄存器中的DTIMEOUT位。 0 +2 CTIMEOUTC RW 置此位清除状态寄存器中的CTIMEOUT位。 0 +1 DCRCFAILC RW 置此位清除状态寄存器中的DCRCFAIL位。 0 +0 CCRCFAILC RW 置此位清除状态寄存器中的CCRCFAIL位。 0 +28.6.13 中断使能寄存器(R32_SDIO_MASK) +V2.4 510 + +# Page 514 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +偏移地址:0x3C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RXFI TXFI +CEATAE SDIOI RXDAV TXDAV TXFIF RXFIF +Reserved FOEI FOFI +NDIE TIE LIE LIE OEIE OFIE +E E +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RXFI TXFI DBCK STBI DATA CMDS RXOV CTIM +RXACT TXACT CMDACT CMDRE TXUND DTIME DCRCF CCRCF +FOHF FOHE ENDI TERR ENDI ENTI ERRI EOUT +IE IE IE NDIE ERRIE OUTIE AILIE AILIE +IE IE E IE E E E IE +位 名称 访问 描述 复位值 +[31:24] Reserved RO 保留。 0 +置此位后,状态寄存器在置CEATAEND位时将产生中 +23 CEATAENDIE RW 0 +断。 +置此位后,状态寄存器在置 SDIOIT 位时将产生中 +22 SDIOITIE RW 0 +断。 +置此位后,状态寄存器在置 RXDAVL 位时将产生中 +21 RXDAVLIE RW 0 +断。 +置此位后,状态寄存器在置 TXDAVL 位时将产生中 +20 TXDAVLIE RW 0 +断。 +置此位后,状态寄存器在置RXFIFOE位时将产生中 +19 RXFIFOEIE RW 0 +断。 +置此位后,状态寄存器在置TXFIFOE位时将产生中 +18 TXFIFOEIE RW 0 +断。 +置此位后,状态寄存器在置RXFIFOF位时将产生中 +17 RXFIFOFIE RW 0 +断。 +置此位后,状态寄存器在置TXFIFOF位时将产生中 +16 TXFIFOFIE RW 0 +断。 +置此位后,状态寄存器在置RXFIFOHF位时将产生中 +15 RXFIFOHFIE RW 0 +断。 +置此位后,状态寄存器在置TXFIFOHE位时将产生中 +14 TXFIFOHEIE RW 0 +断。 +13 RXACTIE RW 置此位后,状态寄存器在置RXACT位时将产生中断。 0 +12 TXACTIE RW 置此位后,状态寄存器在置TXACT位时将产生中断。 0 +11 CMDACTIE RW 置此位后,状态寄存器在置CMDACT位时将产生中断。 0 +置此位后,状态寄存器在置DBCKEND位时将产生中 +10 DBCKENDIE RW 0 +断。 +置此位后,状态寄存器在置STBITERR位时将产生中 +9 STBITERRIE RW 0 +断。 +置此位后,状态寄存器在置DATAEND位时将产生中 +8 DATAENDIE RW 0 +断。 +置此位后,状态寄存器在置CMDSENT位时将产生中 +7 CMDSENTIE RW 0 +断。 +6 CMDRENDIE RW 置此位后,状态寄存器在置CMDREND位时将产生中 0 +V2.4 511 + +# Page 515 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +断。 +置此位后,状态寄存器在置RXOVERR位时将产生中 +5 RXOVERRIE RW 0 +断。 +置此位后,状态寄存器在置TXUNDERR位时将产生中 +4 TXUNDERRIE RW 0 +断。 +置此位后,状态寄存器在置DTIMEOUT位时将产生中 +3 DTIMEOUTIE RW 0 +断。 +置此位后,状态寄存器在置CTIMEOUT位时将产生中 +2 CTIMEOUTIE RW 0 +断。 +置此位后,状态寄存器在置DCRCFAIL位时将产生中 +1 DCRCFAILIE RW 0 +断。 +置此位后,状态寄存器在置CCRCFAIL位时将产生中 +0 CCRCFAILIE RW 0 +断。 +28.6.14 FIFO 计数寄存器(R32_SDIO_FIFOCNT) +偏移地址:0x48 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +FIFOCOUNT[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FIFOCOUNT[15:0] +位 名称 访问 描述 复位值 +FIFO包含还未写入FIFO或者还未从FIFO读出 +的字(32bit)数。在设置 R32_SDIO_DCTLR: +R32_SDIO_DCTLR时,如果DPSM空闲,FIFO计 +[31:0] FIFOCOUNT[31:0] RO 0 +数器将从R32_SDIO_TLEN中加载传输长度值, +如果此值不能被4整除,则最后的1至3个字 +节会被当做一个字处理。 +28.6.15 数据控制寄存器 2(R32_SDIO_DCTRL2) +偏移地址:0x60 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +SLV_C SLV_F RANDO +SLV_M +Reserved K_PHA ORCE_ Reserved M_LEN +ODE +SE ERR _EN +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved DBLOCKSIZE2 +位 名称 访问 描述 复位值 +[31:27] Reserved R0 保留。 0 +SLV_MODE 为 1 时,从模式输出 DATA 时的相位 +[26] SLV_CK_PHASE RW 选择位: 0 +0:在内部SDCK上升沿输出DATA; +V2.4 512 + +# Page 516 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:在内部SDCK下降沿输出DATA。 +SLV_MODE为0时: +0:DTEN位写0清空FIFO; +1:DTEN位写0不清空FIFO。 +从机模式下软件强制数据块CRC错误 +[25] SLV_FORCE_ERR RW 0:使用硬件正确的CRC值; 0 +1:软件强制数据块CRC为错误值。 +从模式使能位: +[24] SLV_MODE RW 0:控制器工作在主机模式下; 0 +1:控制器CPSM和DPSM工作在从模式下。 +[23:17] Reserved R0 保留。 0 +数据块任意字节长度使能位: +0:数据块只能是 2DBLOCKSIZE字节; +[16] RANDOM_LEN_EN RW 0 +1:数据块可以是0–2048的任意长度,长度为 +DBLOCKSIZE2。 +[15:12] Reserved R0 保留。 0 +[11:0] DBLOCKSIZE2 RW 任意字节长度模式的数据块长度域。 0 +注:R32_SDIO_DCTRL2寄存器仅适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C批号倒数第六位不为0的产品。 +28.6.16 FIFO(R32_SDIO_FIFO) +偏移地址:0x80 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +FIFODATA[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +FIFODATA[31:15] +位 名称 访问 描述 复位值 +FIFO 数据域。此域即为 FIFO 的数据。读写此 +[31:0] FIFODATA[31:0] RW 域将读出接收到的数据或者发送待发的数据。 0 +SDIO的FIFO共32个字(一个字为32位)。 +V2.4 513 + +# Page 517 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 29 章 随机数发生器(RNG) +本章模块描述适用于CH32F20x、CH32V30x和CH32V31x微控制器系列部分产品。 +随机数发生器(RNG),以连续模拟噪声为基础,在主机读取数据时提供32bit的随机数。 +29.1 主要特性 + 可产生32bit随机数 + 可实现错误管理 + 可被单独禁止,降低功耗 +图29-1 RNG模块框图 +32-bit HB bus +Data register +Control register RNG_DR +RNG_CR +RNG_CLK LFSR +Status register Feeds linear feedback +Clock checker shift register +RNG_SR and Fault +detector +Simulated seeds +29.2 功能描述 +随机发送器采用模拟电路实现,该电路产生线性反馈移位寄存器(RNG_LFSR)的种子,用于生成 +32位随机数。RNG_LFSR由专用时钟(PLL48CLK)按照恒定频率提供时钟信息,故随机数质量与HCLK +时钟有关。当有大量种子引入RNG_LFSR后,RNG_LFSR的内容会传入数据寄存器(RNG_DR)。 +29.2.1 RNG 操作 +RNG具体操作步骤如下: +1) 若使能中断,需通过将RNG_CR寄存器中的IE位置1(当准备好随机数或出现错误时产生该中 +断)。 +2) 通过配置RNG_CR寄存器的RNGEN位使能随机数产生,同时激活模拟部分、RNG_LFSR和错误检 +测器。 +3) 若使能中断,每次产生中断时,通过查询RNG_SR寄存器中的SEIS和CEIS位为0确定未出现错 +误且DRDY为为1确定随机数已准备就绪。之后即可读取RNG_DR寄存器中的内容。 +29.2.2 错误管理 +RNG出错包括时钟错误和种子错误。当出现时钟错误时,RNG无法再产生随机数,此时需检查时 +钟控制器是否正确配置,是否可提供RNG时钟,然后将CEIS位清零。当CECS位为0时,RNG可正 +常工作。当产生时钟错误时,对上一个随机数没有影响,可正常使用。当出现种子错误时,此时 +V2.4 514 + +# Page 518 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +RNG_DR寄存器中的值不可使用该随机数,若用重新使用RNG,需要先将SEIS位清零,然后将RNGEN +位清零并置1,重新初始化和重新启动RNG。 +29.3 寄存器描述 +表29-1 RNG相关寄存器列表 +名称 访问地址 描述 复位值 +R32_RNG_CR 0x40023C00 RNG控制寄存器 0x00000000 +R32_RNG_SR 0x40023C04 RNG状态寄存器 0x00000000 +R32_RNG_DR 0x40023C08 RNG数据寄存器 0x00000000 +29.3.1 RNG 控制寄存器(RNG_CR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved IE RNGEN Reserved +位 名称 访问 描述 复位值 +[31:4] Reserved RO 保留。 0 +中断使能控制: +3 IE RW 0:禁止RNG中断; 0 +1:使能RNG中断。 +随机数发生器使能: +2 RNGEN RW 0:禁止随机数发生器; 0 +1:使能随机数发生器。 +[1:0] Reserved RW 保留。 0 +29.3.2 RNG 状态寄存器(RNG_SR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved SEIS CEIS Reserved SECS CECS DRDY +位 名称 访问 描述 复位值 +[31:7] Reserved RO 保留。 0 +种子错误中断状态(此位与SECS同时设置): +0:未检测倒错误序列; +6 SEIS RW 1:检测到以下错误序列之一: 0 +-超过64个相同连续位; +-超过32个连续交替的0和1。 +5 CEIS RW 时钟错误中断状态(此位与CECS同时设置): 0 +V2.4 515 + +# Page 519 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:正确检测到PLL48CLK时钟; +1:未正确检测到PLL48CLK时钟。 +[4:3] Reserved RO 保留。 0 +种子错误当前状态: +0:未检测出错误序列; +2 SECS RO 1:检测到以下错误序列之一: 0 +-超过64个相同连续位; +-超过32个连续交替的0和1。 +时钟错误当前状态: +1 CECS RO 0:正确检测到PLL48CLK时钟; 0 +1:未正确检测到PLL48CLK时钟。 +数据就绪(读取RNG_DR寄存器后,该位清0): +0 DRDY RO 0:RNG_DR寄存器无效,此随机数不可用; 0 +1:RNG_DR寄存器有效,此随机数可用。 +29.3.3 RNG 数据寄存器(RNG_DR) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +RNDATA[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +RNDATA[15:0] +位 名称 访问 描述 复位值 +[31:0] RNDATA RO 32位随机数。 0 +V2.4 516 + +# Page 520 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 30 章 运算放大器(OPA) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器系列部分产品。 +运算放大器模块(OPA),包含4个可独立配置的运算放大器。每个运算放大器的输入和输出均 +连接至I/O口,且输入引脚可选择,输出引脚可选择配置到通用I/O口或复用为ADC采样通道的 +I/O。 +30.1 主要特性 + 输入引脚可选择 + 输出引脚可选择通用I/O口或ADC采样通道 +30.2 功能描述 +置位OPAx_EN,即可使能对应的OPAx,配置OPAx_MODE可选择OPAx的输出通道为ADC采样通道 +或者普通I/O口,配置OPAx_PSEL,可选择OPAx的正向输入引脚,配置OPAx_NSEL,可选择OPAx的 +负向输入引脚。 +图30-1 OPA结构框图 +EN1 +OPA1_CH0P 0 +OPA1_CH1P 1 PSEL1 MODE1 0 OPA1_OUT0 ++ +1 OPA1_OUT1 +OPA1_CH0N 0 +OPA1_CH1N 1 NSEL1 - OPA1 +EN2 +OPA2_CH0P 0 +OPA2_CH1P 1 PSEL2 MODE2 0 OPA2_OUT0 ++ +1 OPA2_OUT1 +OPA2_CH0N 0 +OPA2_CH1N 1 NSEL2 - OPA2 +EN3 +OPA3_CH0P 0 +OPA3_CH1P 1 PSEL3 MODE3 0 OPA3_OUT0 ++ +1 OPA3_OUT1 +OPA3_CH0N 0 +OPA3_CH1N 1 NSEL3 - OPA3 +EN4 +OPA4_CH0P 0 +OPA4_CH1P 1 PSEL4 MODE4 0 OPA4_OUT0 ++ +1 OPA4_OUT1 +OPA4_CH0N 0 +OPA4_CH1N 1 NSEL4 - OPA4 +注:各OPA详细说明请参考对应型号的数据手册。 +V2.4 517 + +# Page 521 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +30.3 寄存器描述 +表30-1 OPA相关寄存器列表 +名称 访问地址 描述 复位值 +R32_OPA_CTLR 0x40023804 OPA配置寄存器 0x00000000 +30.3.1 OPA 配置寄存器(OPA_CTLR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +PSEL4 NSEL4 MODE4 EN4 PSEL3 NSEL3 MODE3 EN3 PSEL2 NSEL2 MODE2 EN2 PSEL1 NSEL1 MODE1 EN1 +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0 +OPA4正向输入端选择: +0:CH0P; +15 PSEL4 RW 1:CH1P。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA4负向输入端选择: +0:CH0N; +14 NSEL4 RW 1:CH1N。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA4输出通道选择: +0:输出通道为OPA4_OUT0; +13 MODE4 RW 1:输出通道为OPA4_OUT1。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA4使能: +0:禁止OPA4; +12 EN4 RW 1:使能OPA4。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA3正向输入端选择: +0:CH0P; +11 PSEL3 RW 1:CH1P。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA3负向输入端选择: +0:CH0N; +10 NSEL3 RW 0 +1:CH1N。 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +V2.4 518 + +# Page 522 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +CH32V30x_D8C、CH32V31x_D8C。 +OPA3输出通道选择: +0:输出通道为OPA3_OUT0; +9 MODE3 RW 1:输出通道为OPA3_OUT1。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA3使能: +0:禁止OPA3; +8 EN3 RW 1:使能OPA3。 0 +注:适用于CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、 +CH32V30x_D8C、CH32V31x_D8C。 +OPA2正向输入端选择: +7 PSEL2 RW 0:CH0P; 0 +1:CH1P。 +OPA2负向输入端选择: +6 NSEL2 RW 0:CH0N; 0 +1:CH1N。 +OPA2输出通道选择: +5 MODE2 RW 0:输出通道为OPA2_OUT0; 0 +1:输出通道为OPA2_OUT1。 +OPA2使能: +4 EN2 RW 0:禁止OPA2; 0 +1:使能OPA2。 +OPA1正向输入端选择: +3 PSEL1 RW 0:CH0P; 0 +1:CH1P。 +OPA1负向输入端选择: +2 NSEL1 RW 0:CH0N; 0 +1:CH1N。 +OPA1输出通道选择: +1 MODE1 RW 0:输出通道为OPA1_OUT0; 0 +1:输出通道为OPA1_OUT1。 +OPA1使能: +0 EN1 RW 0:禁止OPA1; 0 +1:使能OPA1。 +V2.4 519 + +# Page 523 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 31 章 电子签名(ESIG) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +电子签名包含了芯片识别信息:闪存区容量和唯一身份标识。它由厂家在出厂时烧录到存储器模 +块的系统存储区域,可以通过SWD(SDI)或者应用代码读取。 +31.1 功能描述 +闪存区容量:指示当前芯片用户应用程序可以使用大小。 +唯一身份标识:96位二进制码,对任意一个微控制器都是唯一的,用户只能读访问不能修改。此 +唯一标识信息可以用作微控制器(产品)的安全密码、加解密钥、产品序列号等,用来提高系统安全 +机制或表明身份信息。 +以上内容用户都可以按8/16/32位进行读访问。 +31.2 寄存器描述 +表31-1 ESIG相关寄存器列表 +名称 访问地址 描述 复位值 +R16_ESIG_FLACAP 0x1FFFF7E0 闪存容量寄存器 0xXXXX +R32_ESIG_UNIID1 0x1FFFF7E8 UID寄存器1 0xXXXXXXXX +R32_ESIG_UNIID2 0x1FFFF7EC UID寄存器2 0xXXXXXXXX +R32_ESIG_UNIID3 0x1FFFF7F0 UID寄存器3 0xXXXXXXXX +31.2.1 闪存容量寄存器(ESIG_FLACAP) +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +F_SIZE[15:0] +位 名称 访问 描述 复位值 +以Kbyte为单位的闪存容量。 +[15:0] F_SIZE RO x +例:0x0080 = 128 K字节 +31.2.2 UID 寄存器(ESIG_UNIID1) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +U_ID[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +U_ID[15:0] +位 名称 访问 描述 复位值 +[31:0] U_ID[31:0] RO UID的0-31位。 x +31.2.3 UID 寄存器(ESIG_UNIID2) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +U_ID[63:48] +V2.4 520 + +# Page 524 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +U_ID[47:32] +位 名称 访问 描述 复位值 +[31:0] U_ID[63:32] RO UID的32-63位。 x +31.2.4 UID 寄存器(ESIG_UNIID3) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +U_ID[95:80] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +U_ID[79:64] +位 名称 访问 描述 复位值 +[31:0] U_ID[95:64] RO UID的64-95位。 x +V2.4 521 + +# Page 525 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 32 章 闪存及用户选择字(FLASH) +本章模块描述适用于CH32F20x、CH32V20x、CH32V30x和CH32V31x微控制器全系列产品。 +32.1 闪存组织 +芯片内部闪存组织结构如下(以xVCT6为例): +表32-1 闪存组织结构 +块 名称 地址范围 大小(字节) +页0 0x08000000 – 0x080000FF 256 +页1 0x08000100 – 0x080001FF 256 +页2 0x08000200 – 0x080002FF 256 +页3 0x08000300 – 0x080003FF 256 +页4 0x08000400 – 0x080004FF 256 +主存储器 +页5 0x08000500 – 0x080005FF 256 +页6 0x08000600 – 0x080006FF 256 +页7 0x08000700 – 0x080007FF 256 +… … … +页1919 0x08077F00 – 0x08077FFF 256 +系统引导代码存储 0x1FFF8000 – 0x1FFFEFFF 28K +信息块 +用户选择字 0x1FFFF800 – 0x1FFFF87F 128 +注: +1) 上述主存储器区域用于用户的应用程序存储,以4K字节(16页)单位进行写保护划分;除 +了“厂商配置字”区域出厂锁定,用户不可访问,其他区域在一定条件下用户可操作。 +2) 在进行FLASH相关操作时,强烈建议系统主频不大于120M。 +若实际应用一定要求使用系统主频大于120M,需注意: +在进行非零等待区域FLASH 和零等待区域FLASH、用户字读写以及厂商配置字和Boot区域 +读时,需做以下操作,首先将HCLK进行2分频(相关外设时钟也同时分频,影响需评估),FLASH +操作完成后再恢复,保证 FLASH 访问时钟频率不超过 60Mhz(FLASH_CTLR 寄存器的 bit[25]- +SCKMOD可配置FLASH访问时钟频率为系统时钟或系统时钟的一半,该bit默认配置为系统时钟 +的一半)。 +32.2 闪存编程及安全性 +32.2.1 两种编程/擦除方式 + 标准编程:此方式是默认编程方式(兼容方式)。这种模式下 CPU 以单次 2 字节方式执行编程, +单次4K字节执行擦除及整片擦除操作。 + 快速编程:此方式采用页操作方式(推荐)。经过特定序列解锁后,执行单次256字节的编程及 +256字节擦除、32K字节擦除、整片擦除。 +注:FLASH擦写相关函数,仅可放在零等待区FLASH中。 +32.2.2 安全性-防止非法访问(读、写、擦) + 页写入保护 + 读保护 +芯片处于读保护状态下时: +1) 主存储器 0-15 页(4K 字节)自动写保护状态,不受 FLASH_WPR 寄存器控制;解除读保护状态, +V2.4 522 + +# Page 526 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +所有主存储页都由FLASH_WPR寄存器控制。 +2) 系统引导代码区、SWD或SDI模式、RAM区域都不可对主存储器进行擦除或编程,整片擦除除外。 +可擦除或编程用户选择字区域。如果试图解除读保护(编程用户字),芯片将自动擦除整片用户 +区。 +32.3 FLASH 增强读模式 +FLASH 增强读模式适用于用户程序运行在 FLASH 中(用户代码空间超过用户选择字 +RAM_CODE_MOD[1:0]位配置的CODE大小空间),开启该模式,可提高FLASH访问效率。开启该模式需 +将FLASH_CTLR寄存器的EHMOD位置1,此时读EHMODS位,EHMODS位置1即增强读模式已生效,关闭 +该模式需先将 EHMOD位清0,再将 RSENACT置 1。同时可通过配置 FLASH_CTLR寄存器的 SCKMOD位选 +择访问时钟频率。 +注:在使用FLASH增强读模式,需注意以下几点: +1) 在对FLASH进行任何模式的擦除或编程(包括解除读保护等用户字编程)等操作之前,须先退出 +增强读模式,否者会导致擦除和编程操作失败; +2) 在进入停止模式之前,须先退出增强读模式,否者可能导致停止模式异常; +3) 在电源复位和系统复位结束后,芯片由硬件控制自动退出增强读模式。 +32.4 寄存器描述 +表32-2 FLASH相关寄存器列表 +名称 访问地址 描述 复位值 +R32_FLASH_KEYR 0x40022004 FPEC键寄存器 0xXXXXXXXX +R32_FLASH_OBKEYR 0x40022008 OBKEY寄存器 0xXXXXXXXX +R32_FLASH_STATR 0x4002200C 状态寄存器 0x00000000 +R32_FLASH_CTLR 0x40022010 配置寄存器 0x00008080 +R32_FLASH_ADDR 0x40022014 地址寄存器 0x00000000 +R32_FLASH_OBR 0x4002201C 选择字寄存器 0xXXXXXXXX +R32_FLASH_WPR 0x40022020 写保护寄存器 0xXXXXXXXX +R32_FLASH_MODEKEYR 0x40022024 扩展键寄存器 0xXXXXXXXX +32.4.1 FPEC 键寄存器(FLASH_KEYR) +偏移地址:0x04 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +KEYR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +KEYR[15:0] +位 名称 访问 描述 复位值 +FPEC键,用于输入FPEC的解锁键包括: +RDPRT键 = 0x000000A5; +[31:0] KEYR[31:0] WO x +KEY1 = 0x45670123; +KEY2 = 0xCDEF89AB。 +V2.4 523 + +# Page 527 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +32.4.2 OBKEY 寄存器(FLASH_OBKEYR) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +OBKEYR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OBKEYR[15:0] +位 名称 访问 描述 复位值 +[31:0] OBKEYR[31:0] WO 选择字键,用于输入选择字键解除OBWRE。 x +32.4.3 状态寄存器(FLASH_STATR) +偏移地址:0x0C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser WRPRT +Reserved EHMODS EOP Reserved WRBSY BSY +ved ERR +位 名称 访问 描述 复位值 +[31:8] Reserved RO 保留。 0 +FLASH增强读模式启用状态位: +7 EHMODS RO 0:FLASH增强读模式未启用; 0 +1:FLASH增强读模式已启用。 +6 Reserved RO 保留。 0 +指示操作结束,写1清零。 +5 EOP RW1 0 +每次成功擦除或编程时,硬件会置位。 +指示写保护错误,写1清零。 +4 WRPRTERR RW1 0 +如果对写保护的地址编程时,硬件会置位。 +[3:2] Reserved RO 保留。 0 +该位在快速页编程时使用,指示编程数据正 +在写入。在页编程时,当写入数据,该位被设 +1 WRBSY RO 0 +置‘1’,硬件自动清‘0’;如果该位为‘0’, +表示允许写入下个数据。 +指示忙状态: +0 BSY RO 0:操作结束; 0 +1:表示闪存操作正在进行。 +注:进行编程操作时,需要确定FLASH_CTLR寄存器的STRT位为0。 +V2.4 524 + +# Page 528 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +32.4.4 配置寄存器(FLASH_CTLR) +偏移地址:0x10 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +SCKM EHMO Rese RSEN PGSTR +Reserved Reserved BER32 FTER FTPG +OD D rved ACT T +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reser Reser Rese +FLOCK Reserved EOPIE ERRIE OBWRE LOCK STRT OBER OBPG MER PER PG +ved ved rved +位 名称 访问 描述 复位值 +[31:26] Reserved RO 保留。 0 +FLASH访问时钟配置: +0:FLASH 访问时钟频率=系统时钟一半 +(SYSCLK/2); +25 SCKMOD RW 0 +1:FLASH访问时钟频率=系统时钟(SYSCLK)。 +注:FLASH访问时钟频率不超过60MHZ。 +此位为普通解锁+快速解锁。 +FLASH增强读模式: +该模式,在程序运行在 FLASH 时,可提高访 +问效率。 +0:关闭FLASH增强读模式,需配合RSENACT +24 EHMOD RW 0 +位一起操作,退出步骤先将EHMOD位清0,再 +将RSENACT置1。 +1:使能FLASH增强读模式。 +此位为普通解锁+快速解锁。 +23 Reserved RO 保留。 0 +退出增强读模式,硬件自动清除,需配合 +EHMOD 位一起操作,退出步骤先将 EHMOD 位 +22 RSENACT WO 0 +清0,再将RSENACT置1。 +此位为普通解锁。 +开始。置1启动一次页编程,硬件自动清除。 +21 PGSTRT RW0 0 +此位为普通解锁。 +[20:19] Reserved RO 保留。 0 +执行32KB擦除。 +18 BER32 RW 0 +此位为普通解锁+快速解锁。 +执行快速页(256Byte)擦除操作。 +17 FTER RW 0 +此位为普通解锁+快速解锁。 +执行快速页编程操作。 +16 FTPG RW 0 +此位为普通解锁+快速解锁。 +快速编程锁。只能写‘1’。当该位为‘1’时 +表示快速编程/擦除模式不可用。在检测到正 +15 FLOCK RW1 确的解锁序列后,硬件清除此位为‘0’。 1 +软件置1,重新加锁。 +此位为普通解锁。 +V2.4 525 + +# Page 529 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +[14:13] Reserved RO 保留。 0 +操作完成中断控制(FLASH_STATR 寄存器中 +EOP置位): +12 EOPIE RW 0:禁止产生中断; 0 +1:允许产生中断。 +此位为普通解锁。 +11 Reserved RO 保留。 0 +错误状态中断控制(FLASH_STATR 寄存器中 +PGERR/WRPRTERR置位): +10 ERRIE RW 0:禁止产生中断; 0 +1:允许产生中断。 +此位为普通解锁。 +用户选择字锁,软件清0: +0:软件清零后重新加锁用户选择字; +1:表示可以对用户选择字进行编程操作。需 +9 OBWRE RW0 0 +要在 FLASH_OBKEYR 寄存器中写入正确序列 +后由硬件置位。 +此位为普通解锁。 +8 Reserved RO 保留。 0 +锁。只能写‘1’。当该位为‘1’时表示FPEC +和FLASH_CTLR被锁住不可写。在检测到正确 +的解锁序列后,硬件清除此位为‘0’。 +7 LOCK RW1 1 +在一次不成功的解锁操作后,直到下次系统 +复位前,该位不会再改变。 +此位为普通解锁。 +开始。置 1 启动一次擦除动作,硬件自动清 +6 STRT RW1 0(BSY变‘0’)。 0 +此位为普通解锁。 +执行用户选择字擦除 +5 OBER RW 0 +此位为普通解锁。 +执行用户选择字编程 +4 OBPG RW 0 +此位为普通解锁。 +3 Reserved RO 保留。 0 +执行全擦除操作(擦除整个用户区)。 +2 MER RW 0 +此位为普通解锁。 +执行标准页(4KB)擦除操作。 +1 PER RW 0 +此位为普通解锁。 +执行标准编程操作。 +0 PG RW 0 +此位为普通解锁。 +32.4.5 地址寄存器(FLASH_ADDR) +偏移地址:0x14 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +FAR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +V2.4 526 + +# Page 530 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +FAR[15:0] +位 名称 访问 描述 复位值 +闪存地址,进行编程时为编程的地址,进行 +擦除时为擦除的起始地址。 +[31:0] FAR[31:0] WO 0 +当 FLASH_STATR 寄存器中的 BSY 位为‘1’ +时,不能写此寄存器。 +32.4.6 选择字寄存器(FLASH_OBR) +偏移地址:0x1C +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +IWD +RAM_CODE_M STANDY STOP +Reserved Reserved G RDPRT OBERR +OD[2:0] RST RST +SW +位 名称 访问 描述 复位值 +[31:10] Reserved RO 保留。 0 +00x:CODE-192KB + RAM-128KB +01x:CODE-224KB + RAM-96KB +10x:CODE-256KB + RAM-64KB +110:CODE-128KB + RAM-192KB +111:CODE-288KB + RAM-32KB +注:(1)适用于CH32V303RC、CH32V303VC、 +CH32V307RC、CH32V307WC、CH32V307VC、 +CH32F203RC、CH32F203VC、CH32F207VC、 +RAM_CODE_M +[9:7] RO CH32V317VC、CH32V317WC、CH32V317SC, x +OD[2:0] +(2)110b仅适用于批号倒数第六位不为0的 +USER +产品。 +00x:CODE-128KB + RAM-64KB +01x:CODE-144KB + RAM-48KB +1xx:CODE-160KB + RAM-32KB +注:适用于 CH32V20x_D8W、CH32V20x_D8、 +CH32F20x_D8W。 +[6:5] Reserved RO 保留。 x +4 STANDYRST RO 待机模式下系统复位控制。 x +3 STOPRST RO 停止模式下系统复位控制。 x +2 IWDGSW RO 独立看门狗(IWDG)硬件使能位。 1 +读保护状态。 +1 RDPRT RO 0:表示闪存当前读保护失效; 1 +1:表示闪存当前读保护有效。 +V2.4 527 + +# Page 531 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +选择字错误。 +0 OBERR RO 0:表示选择字和它的反码匹配; 0 +1:表示选择字和它的反码不匹配。 +注:USER和RDPRT在系统复位后从用户选择字区域加载。 +32.4.7 写保护寄存器(FLASH_WPR) +偏移地址:0x20 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +WRP[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +WRP[15:0] +位 名称 访问 描述 复位值 +闪存写保护状态。 +0:写保护有效; +[31:0] WRP[31:0] RO 1:写保护失效。 X +每个比特位代表4K字节(16页)存储写保护 +状态。 +注:WPR在系统复位后从用户选择字区域加载。 +32.4.8 扩展键寄存器(FLASH_MODEKEYR) +偏移地址:0x24 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +MODEKEYR[31:16] +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +MODEKEYR[15:0] +位 名称 访问 描述 复位值 +输入下面序列解锁快速编程/擦除模式: +[31:0] MODEKEYR[31:0] WO KEY1 = 0x45670123; X +KEY2 = 0xCDEF89AB。 +32.5 闪存操作流程 +32.5.1 读操作 +在通用地址空间内进行直接寻址,任何8/16/32位数据的读操作都能访问闪存模块的内容并得到 +相应的数据。 +32.5.2 解除闪存锁 +系统复位后,闪存控制器(FPEC)和 FLASH_CTLR 寄存器是被锁定的,不可访问。通过写入序列 +到FLASH_KEYR寄存器可解锁闪存控制器模块。 +解锁序列: +1) 向FLASH_KEYR寄存器写入KEY1 = 0x45670123(第1步必须是KEY1); +V2.4 528 + +# Page 532 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +2) 向FLASH_KEYR寄存器写入KEY2 = 0xCDEF89AB(第2步必须是KEY2)。 +上述操作必须按序并连续执行,否则属于错误操作,会锁死FPEC模块和FLASH_CTLR寄存器并产 +生总线错误,直到下次系统复位。 +闪存控制器(FPEC)和FLASH_CTLR寄存器可以通过将FLASH_CTLR寄存器的“LOCK”位,置1来 +再次锁定。 +32.5.3 主存储器标准编程 +标准编程每次可以写入 2字节。当 FLASH_CTLR 寄存器的 PG 位为‘1’时,每次向闪存地址写入 +半字(2 字节)将启动一次编程,写入任何非半字数据,FPEC 都会产生总线错误。编程过程中,BSY +位为‘1’,编程结束,BSY位为‘0’,EOP位为‘1’。 +注:当BSY位为‘1’时,将禁止对任何寄存器执行写操作。 +图32-1 FLASH编程 +读FLASH_CTRL的LOCK位 +LOCK位=1? 是 执行“解除闪存锁”操作 +否 +置FLASH_CTLR的PG位=1 +指定地址写入半字(2字节) +BSY位=1? 是 +否 +读EOP/WRPRTERR判断编程结果 +读编程地址检查写入数据 +继续编程? 是 +否 +结束,PG位=0 +1)检查FLASH_CTLR寄存器LOCK,如果为1,需要执行“解除闪存锁”操作。 +2)设置FLASH_CTLR寄存器的PG位为‘1’,开启标准编程模式。 +3)向指定闪存地址(偶地址)写入要编程的半字。 +4)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示编程结束,将EOP位清0。 +5)查询FLASH_STATR寄存器看是否有错误,或者读编程地址数据校验。 +6)继续编程可以重复3-5步骤,结束编程将PG位清0。 +32.5.4 主存储器标准擦除 +闪存可以按标准页(4K字节)擦除,也可以整片擦除。 +V2.4 529 + +# Page 533 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +图32-2 FLASH页擦除 +读FLASH_CTRL的LOCK位 +LOCK位=1? 是 执行“解除闪存锁”操作 +否 +置FLASH_CTLR的PER位=1 +在FLASH_ADDR寄存器写入擦除 +的页首地址(一次擦除16页) +置FLASH_CTLR的STRT位=1 +BSY位=1? 是 +否 +读出擦除页数据验证 +继续擦除? 是 +否 +结束,PEG位=0 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)设置FLASH_CTLR寄存器的PER位为‘1’,开启标准页擦除模式。 +3)向FLASH_ADDR寄存器写入选择擦除的页首地址。 +4)设置FLASH_CTLR寄存器的STRT位为‘1’,启动一次擦除动作。 +5)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将EOP位清0。 +6)读擦除页的数据进行校验。 +7)继续标准页擦除可以重复3-5步骤,结束擦除将PEG位清0。 +注:擦除成功后,字读- 0xe339e339,半字读- 0xe339,偶地址字节读- 0x39,奇地址读0xe3。 +图32-3 FLASH整片擦除 +读FLASH_CTRL的LOCK位 +LOCK位=1? 是 执行“解除闪存锁”操作 +否 +置FLASH_CTLR的MER位=1 +置FLASH_CTLR的STRT位=1 +BSY位=1? 是 +否 +读出所有页数据验证 +结束,MEG位=0 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)设置FLASH_CTLR寄存器的MER位为‘1’,开启整片擦除模式。 +3)设置FLASH_CTLR寄存器的STRT位为‘1’,启动擦除动作。 +4)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将EOP位清0。 +5)读擦除页的数据进行校验。 +V2.4 530 + +# Page 534 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +6)将MER位清0。 +32.5.5 快速编程模式解锁 +通过写入序列到FLASH_MODEKEYR寄存器可解锁快速编程模式操作。解锁后,FLASH_CTLR寄存器 +的FLOCK位将清0,表示可以进行快速擦除和编程操作。通过将FLASH_CTLR寄存器的“FLOCK”位软 +件置1来再次锁定。 +解锁序列: +1)向FLASH_MODEKEYR寄存器写入KEY1 = 0x45670123; +2)向FLASH_MODEKEYR寄存器写入KEY2 = 0xCDEF89AB。 +上述操作必须按序并连续执行,否则属于错误操作会锁定,直到下次系统复位才能重新解锁。 +注:快速编程操作需要解除“LOCK”和“FLOCK”两层锁定。 +32.5.6 主存储器快速编程 +快速编程按页(256字节)进行编程。 +1)检查FLASH_CTLR寄存器LOCK位,如果为‘1’,需要执行“解除闪存锁”操作。 +2)检查FLASH_CTLR寄存器FLOCK位,如果为‘1’,需要执行“快速编程模式解锁”操作。 +3)检查FLASH_STATR寄存器的BSY位,以确认没有其他正在进行的编程操作。 +4)设置FLASH_CTLR寄存器的FTPG位为‘1’,使能快速页编程模式。 +5)使用32位方式向FLASH地址写入数据,例如 +*(uint32_t*)0x8000000 = 0x12345678; +6)等待FLASH_STATR寄存器的WR_BSY为‘0’,写入下个数据。 +7)重复步骤5-6共64次。 +8)设置FLASH_CTLR寄存器的PGSTRT位为‘1’,启动快速页编程。 +9)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示一次快速页编程完成,将EOP位 +清0。 +10)查询FLASH_STATR寄存器看是否有错误,或者读编程地址数据校验。 +11)继续快速页编程可以重复5-10步骤,结束编程将FTPG位清0。 +32.5.7 主存储器快速擦除 +快速擦除按页(256字节)进行擦除。 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)检查FLASH_CTLR寄存器FLOCK位,如果为1,需要执行“快速编程模式解锁”操作。 +3)检查FLASH_STATR寄存器的BSY位,以确认没有其他正在进行的编程操作。 +4)设置FLASH_CTLR寄存器的FTER位为‘1’,开启快速页擦除(256字节)模式功能。 +5)向FLASH_ADDR寄存器写入快速擦除页的首地址。 +6)设置FLASH_CTLR寄存器的STRT位为‘1’,启动一次快速页擦除(256字节)动作。 +7)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将EOP位清0。 +8)查询FLASH_STATR寄存器看是否有错误,或者读擦除页地址数据校验。 +9)继续快速页擦除可以重复5-8步骤,结束擦除将FTER位清0。 +注:擦除成功后,字读- 0xe339e339,半字读- 0xe339,偶地址字节读- 0x39,奇地址读0xe3。 +快速擦除按块(32K字节)进行擦除。 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)检查FLASH_CTLR寄存器FLOCK位,如果为1,需要执行“快速编程模式解锁”操作。 +3)检查FLASH_STATR寄存器的BSY位,以确认没有其他正在进行的编程操作。 +4)设置FLASH_CTLR寄存器的BER32位为‘1’,开启快速块擦除(32K字节)模式功能。 +V2.4 531 + +# Page 535 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +5)向FLASH_ADDR寄存器写入快速擦除块的首地址。 +6)设置FLASH_CTLR寄存器的STRT位为‘1’,启动一次快速块擦除(32K字节)动作。 +7)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将EOP位清0。 +8)查询FLASH_STATR寄存器看是否有错误,或者读擦除页地址数据校验。 +9)继续快速页擦除可以重复5-8步骤,结束擦除将BER32位清0。 +注:擦除成功后,字读- 0xe339e339,半字读- 0xe339,偶地址字节读- 0x39,奇地址读0xe3。 +32.6 用户选择字 +用户选择字固化在FLASH中,在系统复位后会被重新装载到相应寄存器,用户可以任意的进行擦 +除和编程。用户选择字信息块总共有8个字节(4个字节为写保护,1个字节为读保护,1个字节为配 +置选项,2个字节存储用户数据),每个位都有其反码位用于装载过程中的校验。下面描述了选择字 +信息结构和意义。 +表32-3 32位选择字格式划分 +[31:24] [23:16] [15:8] [7:0] +选择字字节1反码 选择字字节1 选择字字节0反码 选择字字节0 +表32-4 用户选择字信息结构 +地址 +[31:24] [23:16] [15:8] [7:0] +位 +0x1FFFF800 nUSER USER nRDPR RDPR +0x1FFFF804 nData1 Data1 nData0 Data0 +0x1FFFF808 nWRPR1 WRPR1 nWRPR0 WRPR0 +0x1FFFF80C nWRPR3 WRPR3 nWRPR2 WRPR2 +名称/字节 描述 复位值 +读保护控制位,配置是否可以读出闪存中的代码。 +0xA5:若此字节为0xA5(nRDP必须为0x5A),表示 +RDPR 当前代码处于非读保护状态,可以读出; 0xA5 +其他值:表示代码读保护状态,不可读,0-15页(4K) +将自动写保护,不受WRPR0控制。 +00x:CODE-192KB + RAM-128KB +01x:CODE-224KB + RAM-96KB +10x:CODE-256KB + RAM-64KB +110:CODE-128KB + RAM-192KB +111:CODE-288KB + RAM-32KB +注:(1)适用于 CH32V303RC、CH32V303VC、 +RAM_CODE_M CH32V307RC、CH32V307WC、CH32V307VC、CH32F203RC、 +USER [7:5] x +OD CH32F203VC、CH32F207VC、CH32V317VC、CH32V317WC、 +CH32V317SC系列芯片; +(2)110b仅适用于批号倒数第六位不为0的产品。 +00x:CODE-128KB + RAM-64KB +01x:CODE-144KB + RAM-48KB +1xx:CODE-160KB + RAM-32KB +V2.4 532 + +# Page 536 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:适用于 CH32V20x_D8W、CH32V20x_D8、 +CH32F20x_D8W系列芯片。 +[4:3] Reserved 保留。 11b +待机模式下系统复位控制: +2 STANDYRST 0:启用,进入待机模式产生系统复位; 1 +1:不启用,进入待机模式系统不复位。 +停止模式下系统复位控制: +1 STOPRST 0:启用,进入停止模式产生系统复位; 1 +1:不启用,进入停止模式不复位系统。 +独立看门狗(IWDG)硬件使能位: +0 IWDGSW 0:IWDG功能由硬件开启(随LSI时钟决定); 1 +1:IWDG功能由软件开启,禁止硬件开启。 +Data0–Data1 存储用户数据2字节。 0xFFFF +写保护控制位。每个比特位用于控制主存储器中1个 +扇区(4K字节/扇区)的写保护状态: +0:启用写保护; +1:关闭写保护。 +4个字节用于保护总共480K字节的主存储器。 +WRPR0 - WRPR3 0xFFFFFFFF +WRPRO:第0-7扇区存储写保护控制; +WRPR1:第8-15扇区存储写保护控制; +WRPR2:第16-23扇区存储写保护控制; +WRPR3:位0-6提供第24-30扇区的写保护;位7提 +供第31-119扇区的写保护。 +32.6.1 用户选择字解锁 +通过写入序列到 FLASH_OBKEYR 寄存器可解锁用户选择字操作。解锁后,FLASH_CTLR 寄存器的 +OBWRE位将置1,表示可以进行用户选择字的擦除和编程。通过将FLASH_CTLR寄存器的“OBWRE”位, +软件清0来再次锁定。 +解锁序列: +1)向FLASH_OBKEYR寄存器写入KEY1 = 0x45670123; +2)向FLASH_OBKEYR寄存器写入KEY2 = 0xCDEF89AB。 +注:用户选择字操作需要解除“LOCK”和“OBWRE”两层锁定。 +32.6.2 用户选择字编程 +只支持标准编程方式,一次写入半字(2字节)。实际过程中,对用户选择字进行编程时,FPEC +只使用半字中的低字节,并自动计算出高字节(高字节为低字节的反码),然后开始编程操作,这将 +保证用户选择字中的字节和它的反码始终是正确的。 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)检查FLASH_STATR寄存器的BSY位,以确认没有其他正在进行的编程操作。 +3)检查FLASH_CTLR寄存器OBWRE位,如果为0,需要执行“用户选择字解锁”操作。 +4)设置FLASH_CTLR寄存器的OBPG位为‘1’。 +5)写入要编程的半字(2字节)到指定地址。 +6)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示编程结束,将EOP位清0。 +7)读编程地址数据校验。 +8)继续编程可以重复5-7步骤,结束编程将OBPG位清0。 +V2.4 533 + +# Page 537 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +注:当修改选择字中的“读保护”变成“非保护”状态时,会自动执行一次整片擦除主存储区操作。 +如果修改“读保护”之外的选型,则不会出现整片擦除的操作。 +32.6.3 用户选择字擦除 +直接擦除整个128字节用户选择字区域。 +1)检查FLASH_CTLR寄存器LOCK位,如果为1,需要执行“解除闪存锁”操作。 +2)检查FLASH_STATR寄存器的BSY位,以确认没有正在进行的编程操作。 +3)检查FLASH_CTLR寄存器OBWRE位,如果为0,需要执行“用户选择字解锁”操作。 +4)设置FLASH_CTLR 寄存器的 OBER位为‘1’,之后设置 FLASH_CTLR寄存器的 STRT位为‘1’,开 +启用户选择字擦除。 +5)等待BSY位变为‘0’或FLASH_STATR寄存器的EOP位为‘1’表示擦除结束,将EOP位清0 +6)读擦除地址数据校验。 +7)结束将OBER位清0。 +注:擦除成功后,字读- 0xe339e339,半字读- 0xe339,字节读- 0x39。 +32.6.4 解除读保护 +闪存是否读保护,由用户选择字决定。读取 FLASH_OBR 寄存器,当 RDPRT 位为‘1’表示当前闪 +存处于读保护状态,闪存操作上受到读保护状态的一系列安全防护。解除读保护过程如下: +1)擦除整个用户选择字区域,此时读保护字段RDPR,此时读保护仍然有效。 +2)用户选择字编程,写入正确的 RDPR 代码 0xA5 以解除闪存的读保护。(此步骤首先将导致系统自 +动对闪存执行整片擦除操作) +3)进行上电复位以重新加载选择字节(包括新的RDPR码),此时读保护被解除。 +32.6.5 解除写保护 +闪存是否写保护,由用户选择字决定。读取 FLASH_WPR 寄存器,每个比特位代表 4K 字节闪存空 +间,当比特位为‘1’表示非写保护状态,为‘0’表示写保护。解除写保护过程如下: +1)擦除整个用户选择字区域。 +2)写入正确的RDPR码0xA5,允许读访问; +3)进行系统复位,重新加载选择字节(包括新的WRPR[3:0]字节),写保护被解除。 +V2.4 534 + +# Page 538 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 33 章 扩展配置(EXTEN) +33.1 扩展配置 +系统提供了EXTEN扩展配置单元(EXTEN_CTR寄存器)。该单元使用HB时钟,只在系统复位执行 +复位动作。主要包括以下几个扩展控制位功能: +1) 调节内置电压:LDOTRIM和ULLDOTRIM字段选择默认值,在调节性能和功耗时可以修改其值。 +2) PLL时钟选择:HSIPRE字段配合原有的时钟配置寄存器,提供了HSI时钟进行分频或不分频作为 +PLL的输入时钟的选择。 +3) Lock-up功能监控:LKUPEN字段启用,将打开系统的Lock-up情况监控,一旦发生Lock-up情况, +系统将进行软件复位,并将LKUPRST字段置1,读取后可以写1清除此标志。 +4) USBD 模块的内置电阻及传输速度控制:USB 全速设备控制器(USBD)通过 USBDPU 字段选择是否 +使用内置的上拉电阻(1.5KΩ),不启用时需要在USB的引脚接上拉电阻(低速模式接UD-引脚, +全速模式接UD+引脚)。USBDLS字段配置当前USB设备速度模式。 +5) ETH模块10M以太网和1000M以太网RGMII接口是否启用控制位:通过ETH_10M启用10M以太网 +功能,通过ETH_RGMII启用1000M以太网RGMII接口。 +6) 低功耗模式下HSE振荡控制位:通过该位可控制在低功耗模式下,HSE是否振荡。 +注:不同型号扩展寄存器位定义不同,具体细节参考配置扩展控制寄存器(EXTEN_CTR)。 +33.2 寄存器描述 +表33-1 EXTEN相关寄存器列表 +名称 访问地址 描述 复位值 +R32_EXTEN_CTR 0x40023800 配置扩展控制寄存器 0x00000A40 +R32_EXTEN_CTR2 0x40023808 配置扩展控制寄存器2 0x00000000 +R32_FEATURE_SIGN 0x1FFFF7D0 特征信息指示寄存器 0xE339XXXX +33.2.1 配置扩展控制寄存器(EXTEN_CTR) +偏移地址:0x00 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +HSEK LDOTRIM ULLDOTRIM LKUP LKUP Reser HSI RGMII ETH10 USBD USBD +Reserved +PLP [1:0] [1:0] RST EN ved PRE ON M PU LS +位 名称 访问 描述 复位值 +[31:13] Reserved RO 保留。 0 +低功耗模式下HSE振荡控制位: +0:低功耗模式下,HSE不振荡; +12 HSEKPLP RW 1:低功耗模式下,HSE保持振荡。 0 +注:适用于 CH32V20x_D8、CH32V20x_D8W、 +CH32F20x_D8W。 +调整数字内核电压值,LDO电压值: +[11:10] LDOTRIM[1:0] RW 10b +00:1.3V; +V2.4 535 + +# Page 539 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +01:1.2V; +10:1.1V; +11:1.0V。 +[9:8] ULLDOTRIM[1:0] RW 调整低功耗模式下,ULLDO电压值 10b +LOCKUP复位标志: +7 LKUPRST RW1 0:正常; 0 +1:发生LOCKUP导致系统复位,写1清除。 +LOCKUP监测功能: +0:不启用; +6 LKUPEN RW 1 +1:启用,系统发生lock-up时执行复位并将 +LOCKUP_RST置位。 +5 Reserved RO 保留。 0 +HSI 时钟是否分频:(只能在 PLL 关闭下写 +入) +4 HSIPRE RW 0 +0:HSI时钟经2分频作为PLL输入时钟; +1:HSI时钟作为PLL输入时钟。 +1000M 以太网 RGMII 接口是否启用和时钟使 +能: +0:不启用并关闭时钟; +3 RGMIION RW 0 +1:启用 1000M 以太网 RGMII 接口并使能时 +钟。 +注:适用于CH32F207、CH32V307。 +10M以太网是否启用和时钟使能: +0:不启用并关闭时钟; +2 ETH10M RW 1:启用10M以太网功能并使能时钟。 0 +注:适用于CH32F207、CH32V307、CH32V203、 +CH32V208、CH32F208产品。 +USBD内部上拉电阻是否启用: +1 USBDPU RW 0:不启用(外部要接上拉电阻); 0 +1:启用(外部不用接上拉电阻)。 +USBD工作模式选择: +0 USBDLS RW 0:全速模式; 0 +1:低速模式。 +33.2.2 配置扩展控制寄存器 2(EXTEN_CTR2) +偏移地址:0x08 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +OPA4_ OPA3_ OPA2_ OPA1_ +Reserved +HSMD HSMD HSMD HSMD +位 名称 访问 描述 复位值 +[31:4] Reserved R0 保留。 0 +V2.4 536 + +# Page 540 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +OPA4高速模式使能: +[3] OPA4_HSMD RW 0:OPA4关闭高速模式; 0 +1:OPA4开启高速模式。 +OPA3高速模式使能: +[2] OPA3_HSMD RW 0:OPA3关闭高速模式; 0 +1:OPA3开启高速模式。 +OPA2高速模式使能: +[1] OPA2_HSMD RW 0:OPA2关闭高速模式; 0 +1:OPA2开启高速模式。 +OPA1高速模式使能: +[0] OPA1_HSMD RW 0:OPA1关闭高速模式; 0 +1:OPA1开启高速模式。 +注:EXTEN_CTR2 寄存器仅适用于 CH32F20x_D8、CH32F20x_D8C、CH32V30x_D8、CH32V30x_D8C、 +CH32V31x_D8C批号倒数第六位不为0的产品。 +33.2.3 特征信息指示寄存器(FEATURE_SIGN) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +Reserved +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +Reserved Reserved VLEVEL +位 名称 访问 描述 复位值 +[31:16] Reserved RO 保留。 0xE339 +[15:8] Reserved RO bit[15:8]复位值为bit[7:0]复位值取反。 X +[7:1] Reserved RO 保留。 0x7F +V 支持最低供电电压: +DD +0 VLEVEL RO 0:1.8V; x +1:2.4V。 +注:仅适用于bit[7:0]复位值与bit[15:8]复位值取反的产品。若非取反,则V 支持最低供电电压为 +DD +2.4V。 +V2.4 537 + +# Page 541 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +第 34 章 调试支持(DBG) +34.1 主要特征 +此寄存器允许在调试状态下配置MCU。包括: + 支持独立看门狗(IWDG)的计数器 + 支持窗口看门狗(WWDG)的计数器 + 支持定时器的计数器 + 支持I2CSMBus的超时控制 + 支持bxCAN通信 +34.2 寄存器描述 +34.2.1 RISC-V 调试 MCU 配置寄存器(DBGMCU_CR) +地址:0x7C0(CSR) +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +TIM10 TIM9_ CAN2_ CAN1_ TIM8_ TIM7_ TIM6_ TIM5_ +Reserved +_STOP STOP STOP STOP STOP STOP STOP STOP +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +I2C2_ I2C1_ +TIM4_TIM3_TIM2_TIM1_ SMBUS SMBUS WWDG_IWDG_ STAND +Reserved STOP SLEEP +STOP STOP STOP STOP _TIME _TIME STOP STOP BY +OUT OUT +位 名称 访问 描述 复位值 +[31:24] Reserved RW 保留。 0 +定时器 10 调试停止位。当内核进入调试状态时计 +数器停止工作。 +23 TIM10_STOP RW 0 +0:定时器10的计数器仍然正常工作; +1:定时器10的计数器停止工作。 +定时器9调试停止位。当内核进入调试状态时计数 +器停止工作。 +22 TIM9_STOP RW 0 +0:定时器9的计数器仍然正常工作; +1:定时器9的计数器停止工作。 +CAN2 调试停止位。当内核进入调试状态时 CAN2 停 +止运行。 +21 CAN2_STOP RW 0 +0:CAN2仍然正常运行; +1:CAN2的接收寄存器不继续接收数据; +CAN1 调试停止位。当内核进入调试状态时 CAN1 停 +止运行。 +20 CAN1_STOP RW 0 +0:CAN1仍然正常运行; +1:CAN1的接收寄存器不继续接收数据。 +定时器8调试停止位。当内核进入调试状态时计数 +19 TIM8_STOP RW 器停止工作。 0 +0:定时器8的计数器仍然正常工作; +V2.4 538 + +# Page 542 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +1:定时器8的计数器停止工作; +定时器7调试停止位。当内核进入调试状态时计数 +器停止工作。 +18 TIM7_STOP RW 0 +0:定时器7的计数器仍然正常工作; +1:定时器7的计数器停止工作; +定时器6调试停止位。当内核进入调试状态时计数 +器停止工作。 +17 TIM6_STOP RW 0 +0:定时器6的计数器仍然正常工作; +1:定时器6的计数器停止工作。 +定时器5调试停止位。当内核进入调试状态时计数 +器停止工作。 +16 TIM5_STOP RW 0 +0:定时器5的计数器仍然正常工作; +1:定时器5的计数器停止工作。 +定时器4调试停止位。当内核进入调试状态时计数 +器停止工作。 +15 TIM4_STOP RW 0 +0:定时器4的计数器仍然正常工作; +1:定时器4的计数器停止工作。 +定时器3调试停止位。当内核进入调试状态时计数 +器停止工作。 +14 TIM3_STOP RW 0 +0:定时器3的计数器仍然正常工作; +1:定时器3的计数器停止工作。 +定时器2调试停止位。当内核进入调试状态时计数 +器停止工作。 +13 TIM2_STOP RW 0 +0:定时器2的计数器仍然正常工作; +1:定时器2的计数器停止工作。 +定时器1调试停止位。当内核进入调试状态时计数 +器停止工作。 +12 TIM1_STOP RW 0 +0:定时器1的计数器仍然正常工作; +1:定时器1的计数器停止工作。 +SMBUS 超时模式调试停止位。当内核进入调试状态 +I2C2_SMBUS_TIMEOU 时停止SMBUS超时模式。 +11 RW 0 +T 0:与正常模式操作相同; +1:冻结SMBUS的超时控制。 +SMBUS 超时模式调试停止位。当内核进入调试状态 +I2C1_SMBUS_TIMEOU 时停止SMBUS超时模式。 +10 RW 0 +T 0:与正常模式操作相同; +1:冻结SMBUS的超时控制。 +窗口看门狗调试停止位。当内核进入调试状态时调 +试窗口看门狗停止工作。 +9 WWDG_STOP RW 0 +0:窗口看门狗计数器仍然正常工作; +1:窗口看门狗计数器停止工作。 +独立看门狗调试停止位。当内核进入调试状态时看 +门狗停止工作。 +8 IWDG_STOP RW 0 +0:看门狗计数器仍然正常工作; +1:看门狗计数器停止工作。 +[7:3] Reserved RW 保留。 0 +V2.4 539 + +# Page 543 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +调试待机模式位: +0:(FCLK关,HCLK关)整个数字电路部分都断电。 +从软件的观点看,退出STANDBY模式与复位是一样 +的(除了一些状态位指示了微控制器刚从 STANDBY +2 STANDBY RW 状态退出); 0 +1:(FCLK开,HCLK开)数字电路部分不下电,FCLK +和HCLK时钟由内部RL振荡器提供时钟。另外,微 +控制器通过产生系统复位来退出STANDBY模式和复 +位是一样的。 +调试停止模式位: +0:(FCLK关,HCLK关)在停止模式时,时钟控制 +器禁止一切时钟(包括HCLK和FCLK)。当从STOP +模式退出时,时钟的配置和复位之后的配置一样(微 +控制器由8MHz的内部RC振荡器(HIS)提供时钟)。 +1 STOP RW 因此,软件必需重新配置时钟控制系统启动 PLL, 0 +晶振等; +1:(FCLK开,HCLK开)在停止模式时,FCLK和HCLK +时钟由内部RC振荡器提供。当退出停止模式时,软 +件必需重新配置时钟系统启动 PLL,晶振等(与配 +置此比特位为0时的操作一样)。 +调试睡眠模式位: +0:(FCLK开,HCLK关)在睡眠模式时,FCLK由原 +先已配置好的系统时钟提供,HCLK则关闭。由于睡 +0 SLEEP RW 眠模式不会复位已配置好的时钟系统,因此从睡眠 0 +模式退出时,软件不需要重新配置时钟系统; +1:(FCLK开,HCLK开)在睡眠模式时,FCLK和HCLK +时钟都由原先配置好的系统时钟提供。 +注:适用于CH32V20x、CH32V30x和CH32V31x系列。当系统进入调试模式之后,芯片具有某外设,调 +试模块则具有配置该外设的功能,调试MCU配置寄存器则具有该外设所对应的配置位。 +34.2.2 ARM 调试 MCU 配置寄存器(DBGMCU_CR) +地址:0xE0042004 +31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 +I2C2_ +TIM10 TIM9_ CAN2_ TIM8_ TIM7_ TIM6_ TIM5_ SMBUS +Reserved +_STOP STOP STOP STOP STOP STOP STOP _TIME +OUT +15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +I2C1_ +SMBUSCAN1_TIM4_TIM3_ TIM2_ TIM1_ WWDG_IWDG_ TRACE_MODE TRACE STAND +Reserved STOP SLEEP +_TIME STOP STOP STOP STOP STOP STOP STOP [1:0] _IOEN BY +OUT +位 名称 访问 描述 复位值 +[31:24] Reserved RW 保留。 0 +V2.4 540 + +# Page 544 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +定时器 10 调试停止位。当内核进入调试状态时计 +数器停止工作。 +23 TIM10_STOP RW 0 +0:定时器10的计数器仍然正常工作; +1:定时器10的计数器停止工作。 +定时器9调试停止位。当内核进入调试状态时计数 +器停止工作。 +22 TIM9_STOP RW 0 +0:定时器9的计数器仍然正常工作; +1:定时器9的计数器停止工作。 +CAN2 调试停止位。当内核进入调试状态时 CAN2 停 +止运行。 +21 CAN2_STOP RW 0 +0:CAN2仍然正常运行; +1:CAN2的接收寄存器不继续接收数据。 +定时器8调试停止位。当内核进入调试状态时计数 +器停止工作。 +20 TIM8_STOP RW 0 +0:定时器8的计数器仍然正常工作; +1:定时器8的计数器停止工作。 +定时器7调试停止位。当内核进入调试状态时计数 +器停止工作。 +19 TIM7_STOP RW 0 +0:定时器7的计数器仍然正常工作; +1:定时器7的计数器停止工作。 +定时器6调试停止位。当内核进入调试状态时计数 +器停止工作。 +18 TIM6_STOP RW 0 +0:定时器6的计数器仍然正常工作; +1:定时器6的计数器停止工作。 +定时器5调试停止位。当内核进入调试状态时计数 +器停止工作。 +17 TIM5_STOP RW 0 +0:定时器5的计数器仍然正常工作; +1:定时器5的计数器停止工作。 +SMBUS 超时模式调试停止位。当内核进入调试状态 +I2C2_SMBUS_TIMEOU 时停止SMBUS超时模式。 +16 RW 0 +T 0:与正常模式操作相同; +1:冻结SMBUS的超时控制。 +SMBUS 超时模式调试停止位。当内核进入调试状态 +I2C1_SMBUS_TIMEOU 时停止SMBUS超时模式。 +15 RW 0 +T 0:与正常模式操作相同; +1:冻结SMBUS的超时控制。 +CAN1 调试停止位。当内核进入调试状态时 CAN1 停 +止运行。 +14 CAN1_STOP RW 0 +0:CAN1仍然正常运行; +1:CAN1的接收寄存器不继续接收数据。 +定时器4调试停止位。当内核进入调试状态时计数 +器停止工作。 +13 TIM4_STOP RW 0 +0:定时器4的计数器仍然正常工作; +1:定时器4的计数器停止工作。 +定时器3调试停止位。当内核进入调试状态时计数 +12 TIM3_STOP RW 0 +器停止工作。 +V2.4 541 + +# Page 545 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +0:定时器3的计数器仍然正常工作; +1:定时器3的计数器停止工作。 +定时器2调试停止位。当内核进入调试状态时计数 +器停止工作。 +11 TIM2_STOP RW 0 +0:定时器2的计数器仍然正常工作; +1:定时器2的计数器停止工作。 +定时器1调试停止位。当内核进入调试状态时计数 +器停止工作。 +10 TIM1_STOP RW 0 +0:定时器1的计数器仍然正常工作; +1:定时器1的计数器停止工作。 +窗口看门狗调试停止位。当内核进入调试状态时调 +试窗口看门狗停止工作。 +9 WWDG_STOP RW 0 +0:窗口看门狗计数器仍然正常工作; +1:窗口看门狗计数器停止工作。 +独立看门狗调试停止位。当内核进入调试状态时看 +门狗停止工作。 +8 IWDG_STOP RW 0 +0:看门狗计数器仍然正常工作; +1:看门狗计数器停止工作。 +跟踪引脚分配控制位,该位和 TRACE_IOEN 配合使 +用。 +当TRACE_IOEN=0时: +xx:不分配跟踪引脚(默认状态)。 +[7:6] TRACE_MODE[1:0] RW 当TRACE_IOEN=1时: xx +00:跟踪引脚使用异步模式; +01:跟踪引脚使用同步模式,并且数据长度为1; +10:跟踪引脚使用同步模式,并且数据长度为2; +11:跟踪引脚使用同步模式,并且数据长度为4。 +跟踪引脚分配使能位,该位和 TRACE_MODE 配合使 +用。 +5 TRACE_IOEN RW 0 +0:不分配跟踪引脚(默认状态); +1:分配跟踪引脚。 +[4:3] Reserved RW 保留。 0 +调试待机模式位: +0:(FCLK关,HCLK关)整个数字电路部分都断电。 +从软件的观点看,退出STANDBY模式与复位是一样 +的(除了一些状态位指示了微控制器刚从 STANDBY +2 STANDBY RW 状态退出); 0 +1:(FCLK开,HCLK开)数字电路部分不下电,FCLK +和HCLK时钟由内部RL振荡器提供时钟。另外,微 +控制器通过产生系统复位来退出STANDBY模式和复 +位是一样的。 +调试停止模式位: +0:(FCLK关,HCLK关)在停止模式时,时钟控制 +1 STOP RW 器禁止一切时钟(包括HCLK和FCLK)。当从STOP 0 +模式退出时,时钟的配置和复位之后的配置一样(微 +控制器由8MHz的内部RC振荡器(HIS)提供时钟)。 +V2.4 542 + +# Page 546 + +CH32F/V20x_V30x_V31x系列应用手册 https://wch.cn +因此,软件必需重新配置时钟控制系统启动 PLL, +晶振等。 +1:(FCLK开,HCLK开)在停止模式时,FCLK和HCLK +时钟由内部RC振荡器提供。当退出停止模式时,软 +件必需重新配置时钟系统启动 PLL,晶振等(与配 +置此比特位为0时的操作一样)。 +调试睡眠模式位: +0:(FCLK开,HCLK关)在睡眠模式时,FCLK由原 +先已配置好的系统时钟提供,HCLK则关闭。由于睡 +0 SLEEP RW 眠模式不会复位已配置好的时钟系统,因此从睡眠 0 +模式退出时,软件不需要重新配置时钟系统; +1:(FCLK开,HCLK开)在睡眠模式时,FCLK和HCLK +时钟都由原先配置好的系统时钟提供。 +注:适用于CH32F20x系列。当系统进入调试模式之后,芯片具有某外设,调试模块则具有配置该外 +设的功能,调试MCU配置寄存器则具有该外设所对应的配置位。 +V2.4 543 + diff --git a/doc/CH32二维运行结构概览.md b/doc/CH32二维运行结构概览.md new file mode 100644 index 0000000..c0cb381 --- /dev/null +++ b/doc/CH32二维运行结构概览.md @@ -0,0 +1,274 @@ +# Page 1 + +⼆维运⾏结构概览 +CH32 +版本: +V1.1 +更新说明 :更新系统架构图 +概述 +1. +本⽂档旨在描述运⾏于 CH32 单⽚机上的核⼼业务逻辑和软件架构。系统屏蔽了底层的硬件驱动细节, +主要聚焦于单⽚机端的业务流转和数据处理。整个系统由采集、处理、发送三⼤核⼼模块组成,并辅以 +TCP 协议栈库和动态参数配置功能,以确保系统在⾼性能要求下稳定⾼效地运⾏。 +系统核⼼架构 +2. +系统整体基于数据流驱动,涵盖了从图像帧获取到最终⽹络传输的完整⽣命周期。 + +# Page 2 + +外部物理 +相机接⼝ +硬件接⼝ +单⽚机端系统架构 +业务核⼼层 +DI 传感器 采集与 DMA 连续轮询 +电平跳变缓冲 满帧就绪事件 +每满帧触发的 DMA 处理 +Loop +外部 IO 状态缓冲 触发模式配置 +有效电平指令 外部硬触发模式 +内部软触发模式 +待下⼀帧 外部触发等待模块 内部软触发判定模块 +信号跳变读取历史 单帧掩膜嗅探达标 +锁定事件帧 ⽆跳变 未达标 +交付绝对控制权 +预处理提取模块 丢弃 动态切换_触发设定 +安全热更新_触发阈值与ROI 零拷⻉有效数据负载 +打包与发送模块 +安全热更新_ +⼨ +裁剪位置与尺 +调⽤ Send API (5512) +⽹络与底层传输层 +调整发送策略 TCP 协议栈库 +以太⽹/Wi-Fi TCP 报⽂ +触发 Recv 回调 (5511) +参数管理与控制模块 上位机 ConfigServer +收到 NG 检测结果 +硬件 IO 交互边界 +定时驱动模块 +发出维持延迟⾼电平 +DO ⽓缸/报警灯 +核⼼功能模块详细设计 +3. +采集模块 +3.1 +定位:底层硬件和信号抽象。 +职责:负责与相机进⾏物理通信。对单⽚机其他业务代码⽽⾔,它是⼀个完全解耦的⿊盒。 +业务对接机制:采集模块内部⾃⾏处理相机通信、触发延时、DMA采集等。每完成⼀帧的采集,模 +块会将数据转化为统⼀的⼆维整数矩阵(Integer Matrix),存⼊单⽚机内存的环形缓冲区,并通过 +软中断、回调函数或信号量通知预处理模块接管数据。 + +# Page 3 + +内部软触发判定模块(核⼼控制块) +3.2 +定位:轮询模式下的事件嗅探器。 +职责:在内部触发( TriggerMode = 0 )模式下,⾼频处理由底层 DMA 源源不断抛出的完整原始测 +温满帧,判断并锁定有效⽬标进⼊画⾯的“瞬间”。 +⼯作机制: +i. ⾼速嗅探:每收到⼀帧满帧,⽴即调⽤ Preprocess_CheckInternalTrigger2D API 快速浏览预 +设的触发感兴趣区域 (Trigger ROI)。这避免了对⽆需关注的⽆⽬标区域进⾏毫⽆意义的算⼒浪 +费。 +ii. 掩膜嗅探:运⽤设定的温度阈值将低温背景瞬间剥除,并迅速计算出该⼩格 ROI 内部的最⾼温 +度或平均温度。 +iii. 定格:当发现温度满⾜判定条件时,⽴刻向主控系统反馈命中信号(返回 1),主控随即接管该 +帧缓冲区的绝对控制权(防⽌它被后续 DMA 盲⽬轮询覆盖),将其确认为事件起点帧(第 0 +帧),推⼊下⼀级的数据裁剪与提取阶段,并开启定时连拍。 +预处理与提取模块(核⼼业务块) +3.3 +定位:数据加⼯、过滤清洗与裁剪提炼。 +职责:接收整数矩阵,并根据当前的算法参数(如过滤阈值 +TriggerTemperatureThreshold +、⽬标 +尺⼨ +TargetWidth * TargetHeight +)进⾏滑动滤波和坐标锁定。 +核⼼处理逻辑(温度过滤与最⼤均温滑动计算): +i. 温度过滤预处理:识别出低于阈值的像素,在计算中视作默认低温值(如 90,即9.0°C),保 +留⾼于等于阈值的像素原始温度参与计算。 +ii. 滑动窗⼝计算:通过列累加和向右滑动窗⼝(加右侧新列减左侧旧列),快速计算⼆维矩阵内 +连续 +TargetWidth * TargetHeight +区域的总和(即平均温度)。 +iii. 位置锁定:在预设或受控范围(如 ROI)内记录总和最⼤值的起始坐标 (X, Y) ,这即是触发 +帧的最佳裁剪位置。 +iv. 零拷⻉极速搬运:基于锁定好的坐标 (X, Y) ,从原始环形缓冲区中原样提取出这块 +TargetWidth * TargetHeight +的未被修改过的真实测温有效像素。直接填⼊外部提供的已经偏 +移好的⽹络打包内存中。 +执⾏流程: + +# Page 4 + +收到新帧就绪信号 +获取当前帧⼆维数组指针 +是否开启内部触发判定? +是 +否(外部硬触发) 计算触发ROI内的最⾼/均温 +达标 未触发 +读取匹配参数: 阈值与⽬标 +丢弃退出 +尺⼨ +温度阈值过滤计算_仅⽤于 +统计寻优 +执⾏窗⼝滑动累加与最⼤均 +温计算 + +# Page 5 + +锁定最优坐标 X, Y +根据 X, Y 裁剪提取原汁原味 +的未处理像素矩阵 +附带正确极值统计信息⽣成 +结果 +⽆缝移交⽹络 TCP 组包零拷 +⻉发送 +打包与发送模块(核⼼业务块) +3.4 TCP +定位:基于 TCP Raw Stream 2.0 协议的应⽤层通信封装、链路管理与调度引擎。 +主要功能总结: +i. 双流管理与主动连接:采⽤“采集端主动连接,上位机被动监听”模式,解决 IP 不固定的问题。 +系统维护两个独⽴的 TCP ⻓连接以实现控制与数据解耦: +控制流 (Port 5511):⽤于配置下发、指令控制与⼼跳维护。 +数据流 (Port 5512):专属⽤于⾼频温度数据(如 TemperatureFrame_t)的实时上报。 +ii. ⾝份握⼿与动态绑定:连接建⽴后发送⾸包进⾏握⼿(Handshake),携带硬件 UUID。⽀持服 +务端对逻辑设备 ID (DevID) 的冲突检测和动态重新分配,保证多设备并发下的正确识别。 +iii. 数据封装与打包:按照 2.0 ⼩端序规范,将业务数据封装为 TLV(Type-Length-Value)结构。 +⾃动在其外侧包裹核⼼帧头(包含 +Magic标识(0x55AA) +、序列号、时间戳、载荷属性等)以及 +尾部的 +CRC16 +校验和。 +iv. 可靠性传输机制: +重传与确认:针对控制指令和握⼿实施 ACK 确认与重传。 +⼤包分⽚ (Fragmentation):当业务载荷超过 MTU/分⽚最⼤限制时,⾃动进⾏序列分⽚ +传输,以确保⽹络利⽤率。 +v. 链路诊断与恢复:维持周期⼼跳机制(Keep-Alive)具备超时判定功能;在遭遇断⽹或对端重 +置后,可执⾏指数退避式的⾼容忍度重连,并⾃动重启握⼿绑定流程。 +执⾏流程概览: + +# Page 6 + +应⽤层触发通信 +消息类型分类 +业务数据上报 +按 TLV 封装并定位⾄ 5512 +⼼跳/响应/状态 +数据流 +载荷是否⼤于允许的单次发 按 TLV 封装并定位⾄ 5511 +送上限? 控制流 +否 +是 +执⾏⼤包分⽚ +⽣成完整数据包 +Fragmentation +附加 FrameHeader 与 +CRC16 校验帧 + +# Page 7 + +CRC16 校验帧 +调⽤底层 TCP 协议栈对应 +Socket 发送接⼝ +参数更改模块(控制业务块) +3.5 +定位:系统的“神经中枢”与配置通道。 +职责:解析基于 TCP 连接传来的上位机控制指令,动态修改单⽚机的⼯作⾏为及参数(如:预处 +理阈值,⽹络打包频率等),⽽⽆需复位单⽚机。 +执⾏流程: +i. 解析:TCP 栈触发接收回调,提取载荷中的指令码及配置数据。 +ii. 校验:检查数据的合法性。 +iii. 应⽤:使⽤原⼦操作或影⼦寄存器(Shadow Buffer)机制更新全局参数结构体,确保正在进 +⾏图像处理的流⽔线不会因为参数中途突变⽽导致指针越界或计算崩溃。 +iv. 回执:向客⼾端回传 ACK 包,告知参数修改⽣效。 +硬件 与触发反馈模块(交互边界) +3.6 IO +定位:处理与外部硬件的物理数字电平交互(DI/DO),连接“触发动作”与“剔除执⾏”。 +职责与⼯作机制:负责实时响应外部脉冲输⼊或程序内部事件,并能根据⽹络判定结果执⾏动作以 +控制外部设备。 +① 触发采集机制(影响⼯作流起点) +采集流⽔线的启动⽅式严格受触发模式配置参数的影响: +1. 外部触发 (External Trigger): +⾏为逻辑:系统实时监听预设的 DI 触发引脚(例如:接收光电传感器的输⼊)。当检测到有效 +电平变化,并在通过设定的消抖滤波间隔 ( TriggerDebounceIntervalMs ) 确认信号稳定后,视 +为正式触发。 +影响:系统在经历特定的触发延时后,命令采集模块连续捕捉设定的张数 +( TriggerBurstCount )。只有被这批动作捕捉到的⼆维矩阵数据才会进⼊预处理与 TCP 发送队 +列。⾮触发状态下,系统处于待机且不产⽣多余计算和⽹络流量。 +2. 内部触发 (Internal Trigger / 轮询阈值触发): +⾏为逻辑:采集模块通过底层 DMA 持续不间断地循环向单⽚机缓冲内存区抛出测温画⾯。主 +程序每收到⼀帧,都会调⽤ Preprocess_CheckInternalTrigger2D 进⾏轻量级的 ROI 温度计算 +嗅探。 + +# Page 8 + +算法双轨制设计:(核⼼重点) ⽆论是触发嗅探还是后续的截取寻优,系统都会使⽤配置的恒 +定底噪温度(如 9.0℃)掩盖低温像素。但最终打包进⽹络的数据与统计报告(最⾼/最低/平均 +温)必须是原汁原味、从未被过滤过的测温像素。这种分离设计既保证了单⽚机极速抓取⽬标 +的抗⼲扰能⼒,⼜避免了上位机 AI 模型因收到修改过的纯⾊背景图⽽发⽣误判。 +影响:⼀旦⽬标进⼊画⾯,触发算法判定达标,系统会⽴刻“锁定”该帧所在缓冲区(防⽌被 +DMA 再次覆盖),确认其为事件起点帧(第0帧),并在提取发出后稳定连拍指定的定格张数。 +内部触发 (基于轮询) ⾏为动作图: +硬件采集/DMA 单⽚机主循环 Preprocess模块 +loop [每⼀帧采集完成] +推送当前帧 (Raw Buffer) +1. Preprocess_CheckInternalTrigger2D() +在 TriggerRoi 内执⾏(掩膜过滤 + 极值判定) +alt [判定未触发 (< Threshold)] +返回 0 (丢弃) +解锁缓冲让下⼀次 DMA 覆盖 +[判定触发 (>= Threshold)] +返回 1 (锁定⽬标) +记录本帧为 [事件第0帧], 锁定缓冲 +2. Preprocess_Execute() +全范围滑窗寻优 + 原样零拷⻉提取 +TcpTxBuffer 组装完毕 +开启定时连拍并推送到⽹络发送队列 +硬件采集/DMA 单⽚机主循环 Preprocess模块 + +# Page 9 + +② ⾃动剔除与报警输出机制 驱动机构 +( ) +本架构⽀持全链路防错的闭环响应机制,将上位机的智能分析结果迅速转译为实际动作: +接收判定 (触发下发):TCP 接收任务(控制流)收到来⾃主机的特定结果回调封包(如 +DetectionResult_t 宣告当前帧检测失败/缺陷,即 Result == 1 / NG)。 +执⾏输出 (DO 直接驱动): +i. 识别到 NG,系统内部回调会⽴即响应,拉⾼预先配置的 DO 输出引脚(对应⽣产流⽔线的废 +料剔除⽓缸、拨⽚或是声光报警装置)。 +ii. 系统内部开启定时器,维持该⾼电平动作状态 NGioDelay 毫秒时⻓,这确保了较慢的机械分拨 +机构能吃满⾏程去推落次品。 +iii. NGioDelay 时间期满后,定时中断会⾃动将对应 DO 信号电平拉低复位,⼲净利落地收回⽓ +缸,复归常态以应对下⼀次测试。 +协议栈功能库(底层⽀持) +3.7 TCP +定位:可靠的流式⽹络传输⽀持(如 LwIP 移植)。 +职责: +Socket 抽象:提供标准化、极简的创建、监听、连接、发送、接收 API。 +状态机维护:⾃动处理三次握⼿、四次挥⼿、重传及断线侦测操作。 +缓冲管理:管理底层的发送缓冲和接收窗⼝(TCP Window)。 +性能保证与优化策略 +4. +为确保“采集 -> 处理 -> 发送”这⼀重负载流⽔线在 CH32 上具备⾼帧率、低延迟的性能,需采⽤以下策 +略保障: +1. 零拷⻉ (Zero-Copy) 内存流转: +在整个数据链路中,严禁在不同业务逻辑之间进⾏⼤块内存的 +memcpy +复制。应当采⽤传递内存指 +针的⽅式,让不同的模块轮流获取同⼀块内存的读写权限。 +2. Ping-Pong 双缓冲设计 (Double Buffering): +为“矩阵输出”和“预处理”分配 A/B 两块缓冲区。当采集模块(⿊盒)向 Buffer A 写⼊第 N 帧时,预处 +理模块正在读取 Buffer B 处理第 N-1 帧。两者物理隔离,实现 CPU 和外设间的全并发,⽆缝衔 +接。 +3. 事件驱动与 RTOS 并发: +抛弃低效的死循环轮询模式。围绕 RTOS 任务构建模型:采集结束触发信号量 -> 唤醒⾼优先级处 +理任务 -> 唤醒发送任务。其余时间 CPU 处于休眠或处理低速⽹络事件。 +4. 发包防阻塞与 TCP 合并传输: +将不重要且碎⽚的包合并发送;针对⼤数据块发送,采⽤异步队列机制或者结合 DMA 送到⽹络 + +# Page 10 + +MAC 接⼝,防⽌ CPU ⻓时间处于等待 TCP ACK 的阻塞状态。 + diff --git a/doc/CH32二维运行结构概览.pdf b/doc/CH32二维运行结构概览.pdf new file mode 100644 index 0000000..76ec5bb Binary files /dev/null and b/doc/CH32二维运行结构概览.pdf differ diff --git a/doc/函数调用指南.md b/doc/函数调用指南.md new file mode 100644 index 0000000..137ce94 --- /dev/null +++ b/doc/函数调用指南.md @@ -0,0 +1,237 @@ +# Page 1 + +语⾔版本函数调⽤指南 +C +版本V1.0 +1. 概述 +本指南旨在为 CH32 单⽚机其他业务代码提供调⽤“图像预处理模块”和“TCP 打包与发送模块”的 C 语⾔ API 说明。这两个模块被封装为独⽴的底层库函数, +负责将原始采集数据处理并推送⾄上位机,同时接收上位机配置。 +开发者⽆需关⼼内部的滑窗算⼒优化或是 TCP 连接维持、分⽚等细节,只需按照约定的结构体提供⼊参并调⽤相关 API 即可。 +2. 核⼼数据结构 +2.1 原始图像数据结构 ( RawImageBuffer_t ) +该结构由采集模块(⿊盒)在采集完成后构建并传⼊处理库。注意:本库所有内部计算和过滤针对的均是 16位整数矩阵 (精确到 0.1℃的定点数)。 +typedef struct { +uint16_t* pData; // 指向二维 16位 整数矩阵的起始指针(如 275 代表 27.5℃) +uint16_t Width; // 原始图像宽度 +uint16_t Height; // 原始图像高度 +uint32_t FrameNumber; // 当前帧号(或时间戳),用于溯源 +} RawImageBuffer_t; +2.2 预处理结果结构 ( PreprocessResult_t ) +预处理模块运算完毕后产出的有效数据载荷结构。 +typedef struct { +uint8_t* pValidData; // 必须是 uint8_t 类型的外部缓冲区指针,规避结构体强转导致的内存对齐陷阱 +uint32_t DataLength; // 有效数据的字节长度 (宽度 * 高度 * sizeof(元素)) +uint16_t ValidWidth; // 产出图像宽度 (对于一维,可表示点数) +uint16_t ValidHeight; // 产出图像高度 +int16_t MinTemp; // 有效区域内的最低温度 +int16_t MaxTemp; // 有效区域内的最高温度 +int16_t AvgTemp; // 有效区域内的平均温度 +int16_t RoiTemp; // 触发点温度 +uint8_t Status; // 处理状态 (0: OK, 1: 异常) +uint32_t FrameNumber; // 继承自原始图像的帧号 +} PreprocessResult_t; +2.3 ⽹络封装缓冲结构 ( TcpTxBuffer_t ) +专为 TCP 零拷⻉封包设计的外部分配缓冲区。应⽤层(或专⻔的内存池)提供⾜够⼤的连续内存空间。 +typedef struct { +uint8_t* pBuffer; // 指向由应用层分配的具体内存区 (包含物理组装全空间) +uint32_t TotalCapacity; // 该 Buffer 总容量 +uint32_t HeadOffset; // 【核心】预留给封包用的首部偏移量。载荷将从 pBuffer + HeadOffset 开始写入 +uint32_t ValidPayloadLen; // 在调用封装函数后,由网络库回填的最终报文总长度 +} TcpTxBuffer_t; + +# Page 2 + +2.4 系统运⾏状态与配置 ( ConfigCommon_t , Config2D_t , Config1D_t ) +系统参数配置不再使⽤单⼀的句柄封装,⽽是由通信协议中定义的三个独⽴结构体分别管理: ConfigCommon_t (通⽤参数)、 Config2D_t (⼆维专有参数) +与 +Config1D_t +(⼀维专有参数)。TCP 模块会通过回调动态更新这三个结构体,应⽤层需要保存最新配置以供预处理等模块使⽤(详⻅通信协议规范 2.0)。 +3. 预处理模块 API +3.1 Preprocess_Init +功能:初始化预处理模块,分配静态计算所需的⼯作内存(如列累加数组)。 +原型: +int8_t Preprocess_Init(uint16_t maxWidth, uint16_t maxHeight); +⼊参: +maxWidth / maxHeight : 系统允许的最⼤处理分辨率,⽤于预分配内存池。 +返回值: 0 成功, <0 失败。 +3.2 Preprocess_Execute +功能:对单帧⼆维矩阵进⾏裁剪并导出。系统会基于温度过滤启动滑动窗⼝去寻找热源,锁定⽬标区域(ROI)后,会将这段区域内未被修改过的真实 +原始像素原样导出,写⼊外部提供的 Buffer 中。 +原型: int8_t Preprocess_Execute(const RawImageBuffer_t* input, TcpTxBuffer_t* out_buffer, PreprocessResult_t* output_meta); +⼊参: +input : 采集模块提供的原始数据句柄。 +out_buffer : 应⽤层预先分配好的待发送缓冲区。库将直接通过 out_buffer->pBuffer + out_buffer->HeadOffset 零拷⻉写⼊原始图像测温字节。 +出参: +output_meta : 运算完成的规范化统计结果(⻓宽、最⼤、最⼩温度、平均温度等信息,统计依据同样为未失真的原始像素)。 +返回值: +0 +表⽰处理成功并锁定 ROI, +<0 +表⽰内存越界或其他致命错误。 +3.3 Preprocess_CheckInternalTrigger2D +功能:根据上位机设定的“触发 ROI 区域”、“温度触发阈值”及“判定条件(最⾼温/平均温)”,对传⼊的单帧原始图像进⾏内部热源触发判定。 +原型: +int8_t Preprocess_CheckInternalTrigger2D(const RawImageBuffer_t* input); +⼊参: +input : 当前需要评判的原始图像。 +返回值: 1 表⽰触发条件满⾜(画⾯中设定的 ROI 区域发现了⾜够⾼温的⽬标), 0 表⽰未触发, <0 参数错误。 +使⽤场景:在内部触发机制( TriggerMode = 0 )下,结合相机的连续 DMA 或轮询输出使⽤。 +3.4 Preprocess_Settings_Change +功能:安全地将通过 TCP 接收到的最新业务⼯作参数更新⾄预处理库内部。⽀持影⼦机制加锁更新策略,确保不会破坏正在进⾏处理的流⽔线帧。 +原型: int8_t Preprocess_Settings_Change(const Config2D_t* newConfig2D, const Config1D_t* newConfig1D, const ConfigCommon_t* newCommon); +⼊参: +newConfig2D / newConfig1D : 从上位机新下发的专⽤参数结构体(如 TargetWidth , TriggerTemperatureThreshold )。 +newCommon : 从上位机新下发的通⽤配置结构体。 +返回值: 0 成功, <0 失败。 +4. TCP 打包与发送模块 API +4.1 TcpLogic_Init +功能:初始化整个应⽤层 TCP 管理任务,包括底层 Socket 绑定、接收任务建⽴以及缓冲池初始化。 +原型: int8_t TcpLogic_Init(const uint8_t* deviceUUID, const uint8_t* authToken); +⼊参: +deviceUUID : 16 字节的设备物理识别码(如 MAC 或 UID)。 +authToken : ⾝份验证令牌。 +返回值: +0 +成功, +<0 +失败。 + +# Page 3 + +4.2 TcpLogic_Start +功能:⾮阻塞启动 TCP 服务管理引擎。此后库将在后台⾃动进⾏ 5511 (控制流) 与 5512 (数据流) 的连接、握⼿(Handshake)、重连和⼼跳维持。 +原型: +void TcpLogic_Start(void); +4.3 TcpLogic_BuildAndSendTemperatureFrame +功能:将之前由预处理写⼊ TcpTxBuffer_t 内的数据(连同 PreprocessResult_t 结构体中的统计数据)封装。函数不需要搬移⼤块矩阵数据,直接利 +⽤移位操作和 HeadOffset 空间从前向后组装报⽂头(包含 TLV、Magic等),最后压⼊ 5512 发送缓冲。 +原 +型: +int8_t TcpLogic_BuildAndSendTemperatureFrame(TcpTxBuffer_t* io_buffer, const PreprocessResult_t* processMeta, uint8_t frameType, uint8_t is2D); +⼊参: +io_buffer : 包含已被预处理模块填充过载荷的 Buffer 包裹器。本函数执⾏完后,其中的 ValidPayloadLen 将被更新。 +processMeta : 包含帧号与温区极值统计。 +frameType : 帧类型 (0x00 LIVE, 0x01 TRIGGER, 0x02 MASKED)。 +is2D : 1 为⼆维数组, 0 为⼀维。 +返回值: 0 已组装完毕并压⼊队列, <0 失败。 +4.4 TcpLogic_GetLatestConfig +功能:主动查询并返回 TCP 库缓存的、由上位机最近⼀次下发的完整配置参数结构体。适⽤于应⽤层需要在⾮回调上下⽂中(如初始化后⾸次同步或 +故障恢复后重新拉取)获取当前⽣效配置的场景。 +原型: +int8_t TcpLogic_GetLatestConfig(ConfigCommon_t* out_common, Config2D_t* out_cfg2d, Config1D_t* out_cfg1d); +出参: +out_common : 由调⽤者提供的通⽤配置结构体指针,库将最新缓存的通⽤配置拷⻉到此处。 +out_cfg2d : 由调⽤者提供的⼆维专有配置结构体指针。 +out_cfg1d : 由调⽤者提供的⼀维专有配置结构体指针。 +返回值: +0 +成功(配置有效), +-1 +尚未从上位机收到过任何配置, +<0 +其他错误。 +4.5 接收与配置更新回调注册 +TCP 库在后台线程处理收到的指令(如参数更改或控制信号)。主业务通过注册回调函数来处理这些上位机下发的事件,确保底层安全。 +// 定义回调函数类型 +typedef void (*ConfigUpdateCallback_t)(const ConfigCommon_t* common, const Config2D_t* cfg2d, const Config1D_t* cfg1d); +typedef void (*DetectionResultCallback_t)(uint32_t frameNumber, uint8_t resultStatus); +// 【注意】:此回调专门用于测试上位机主动请求帧。实际业务由硬件触发或DMA循环完成,业务代码不应依赖或实现此回调。 +typedef void (*TempFrameRequestCallback_t)(uint8_t is2dRequest); +// 注册回调 API +void TcpLogic_RegisterConfigCallback(ConfigUpdateCallback_t cb); +void TcpLogic_RegisterDetectionCallback(DetectionResultCallback_t cb); +void TcpLogic_RegisterTempFrameRequestCallback(TempFrameRequestCallback_t cb); +应⽤⽰例:参数热更新 +当注册了 ConfigUpdateCallback_t ,TCP 发⽣控制流的参数接收时,后台库完成参数解析及 CRC 校验后,触发此回调。⽤⼾可在回调中利⽤软中断或影⼦ +积存器机制将新参数赋予当前正在使⽤的 +SystemConfig_t +。 +5. 核⼼ API 设计准则与开发规范 +为兼顾底层性能考量与可靠性⽹络封装,本库严格遵循以下原则: +1. “传⼊指针 + ⻓度” 与预留偏移封包 (Zero-Copy Offset) ⽅案 +物理内存分配由应⽤层(依托其内存池机制)负责,传递给库的操作句柄为 out_buffer 。预处理在填充矩阵数据时,会越过 HeadOffset (这个偏移量 +等于后续 TCP 组合包所需的 Header 及 TLV 指⽰器的⼤⼩)。后续 TCP ⽹络库封装时,仅需要往前填充封包信息,⽆需对上百 KB 的矩阵数据做任何 +memcpy +内存搬移动作。 + +# Page 4 + +2. 防范访问陷阱 (Strict uint8_t Vectoring) +禁⽌将⽹⼝收发缓冲区中的指针强转为 uint32_t 或是具体通讯结构体使⽤。库内部所有的数据移动与地址递增处理严格使⽤ uint8_t * 处理⽹络数据 +流,从根本上阻绝了因不同编译器或单⽚机对⻬法则不⼀导致的 HardFault 或越界访问。 +3. 内置安全⼤⼩端转化 (Bitwise Disassembly/Assembly) +**这是针对 16位 整数矩阵数据的核⼼保障。**⽆论是将采集到的定点温度( uint16_t / int16_t )拆分成⽹络字节流(封包),还是从字节流解析成单⽚ +机状态(解包),都彻底抛弃了直接强转或结构体对⻬强塞的⽅式。库内部严格规定使⽤单字节移位操作(如 val = (buf[0]) | (buf[1]<<8); ),完美 +解决“⽹络端与主机⼩端”之间的安全切换,并在提取矩阵数据时保证 2-Byte Little-Endian 输出。 +6. 底层数据收发机制与平台移植架构 (Port 层解耦) +(预处理及TCP封包逻辑)绝对不会直接操作硬件寄存器或特定的 Socket API。 +取⽽代之的是⼀个位于 qdx_port.h 的硬件抽象层(HAL,Port层)。 +1. 发送:硬件发送缓冲区写⼊地址 ( qdx_port_tcp_send ) +当应⽤层调⽤类似 TcpLogic_BuildAndSendTemperatureFrame 时,传递的是在外部通过内存池预先分派好、并在前⾯加上了协议头的业务缓冲数组(即 +io_buffer->pBuffer )。⽹络库内部并不会“写⼊⽹卡相关的寄存器”,⽽是调⽤ qdx_port_tcp_send 。这保证了只需将封装好的完整、连续的 RAM 地址 +指针和⻓度丢给驱动层。内部的 WCH NET 或 LwIP 会从给定的这个内存地址将其发往 DMA 或以太⽹ MAC。 +2. 接收:硬件接收缓冲区 ( qdx_port_tcp_recv ) +对应地,系统会启动后台线程监听 TCP 数据流。它每次都会从 qdx_port_tcp_recv 尝试获取数据,由底层协议栈驱动将接收到的真正⽹络⽐特流存⼊ +库提供的接收缓冲中,随后库再去解析配置命令。 +7. 常规调⽤流程图 (伪代码模式) +// 1. 初始化 +Preprocess_Init(MAX_W, MAX_H); +TcpLogic_Init(MyUUID, MyToken); +TcpLogic_RegisterConfigCallback(OnConfigUpdated); +TcpLogic_RegisterDetectionCallback(OnHardwareReject); +// 2. 启动网络引擎线程 (RTOS环境下) +TcpLogic_Start(); +// 3. 图像中断 / DMA 轮询回调 +void OnCameraDataReady(uint16_t* matrix, uint16_t w, uint16_t h) { +RawImageBuffer_t rawBuff = {matrix, w, h, ++frameCnt}; +// 【核心】判断这帧图像里是否有物体达到了设定的触发温度 +if (Preprocess_CheckInternalTrigger2D(&rawBuff) == 1) { +// 发现高温目标!分配一块发送专用的零拷贝缓冲 +TcpTxBuffer_t txBuff = MemoryPool_GetTxBuffer(); +PreprocessResult_t resMeta = {0}; +// 交由库执行滑动窗口剪裁,将最核心的高温区域内原始像素直接填入缓冲的预留偏移后 +if (0 == Preprocess_Execute(&rawBuff, &txBuff, &resMeta)) { +// TCP封包:在头部预留好的 HeadOffset 内执行无损组包并发出 +TcpLogic_BuildAndSendTemperatureFrame(&txBuff, &resMeta, 0x01, 1); +} else { +MemoryPool_FreeTxBuffer(&txBuff); +} +} +} +// 4. 当参数更新回调触发时 +void OnConfigUpdated(const ConfigCommon_t* common, const Config2D_t* cfg2d, const Config1D_t* cfg1d) { +// 将获得配置输入给预处理模块,利用互斥锁安全地刷新工作参数(如 TriggerRoi) +Preprocess_Settings_Change(cfg2d, cfg1d, common); +} + +# Page 5 + +6. 函数调⽤时序图 (Control Flow) +通过下⽅时序图,可清晰展⽰从设备启动,到外部通信介⼊,再到硬件持续触发采集的数据流动与函数调⽤顺序。 + +# Page 6 + +主机/中断(Main) TcpLogic (⽹络库) Preprocess (预处理库) ConfigServer (上位机) +1. Preprocess_Init(W, H) +2. TcpLogic_Init(UUID, Token) +3. TcpLogic_RegisterConfigCallback() +4. TcpLogic_Start() +5. ⾃动连接 5511 与 5512,完成握⼿ +6. 下发⾸批动态配置指令 (Type 0x20/0x22) +7. 触发参数回调 OnConfigUpdated() +8. Preprocess_Settings_Change(cfg) +循环运转:依靠中断或任务调度持续⼯作 +9. 分配待发内存 TcpTxBuffer_t(预留 Offset) +10. 等待相机 DMA 完成⼀帧或 IO 触发 +11. Preprocess_Execute(&rawBuff, &txBuff) +在 Offset 位置后写⼊图⽚矩阵⻓串数据 +返回处理 meta 信息及成功的 txBuff +12. TcpLogic_BuildAndSend(txBuff) +在头部 Offset 内利⽤移位封包 TLV/序列号 +数据送⼊ TCP 流发送 (零拷⻉达成) +opt [获取到剔除响应] +TCP 数据流返回 Defect Result (NG) +触发 DetectionResultCallback +拉⾼ DO1 定时执⾏剔除动作 +主机/中断(Main) TcpLogic (⽹络库) Preprocess (预处理库) ConfigServer (上位机) + diff --git a/doc/函数调用指南.pdf b/doc/函数调用指南.pdf new file mode 100644 index 0000000..7f2e9e8 Binary files /dev/null and b/doc/函数调用指南.pdf differ diff --git a/pc/api_demo.exe b/pc/api_demo.exe new file mode 100644 index 0000000..1c66394 Binary files /dev/null and b/pc/api_demo.exe differ diff --git a/pc/build.bat b/pc/build.bat new file mode 100644 index 0000000..35cad67 --- /dev/null +++ b/pc/build.bat @@ -0,0 +1,42 @@ +@echo off +setlocal +cd /d "%~dp0" + +rem === C Language TCP API Demo Client Build Script === +rem This script uses the installed MinGW GCC compiler. +rem It includes the new APItcpDemo files + QDXnetworkStack sources. + +set GCC_PATH=C:\MinGW\bin\gcc.exe + +echo Checking for GCC compiler... +if not exist "%GCC_PATH%" ( + echo [ERROR] GCC compiler not found at: %GCC_PATH% + echo Please ensure MinGW is properly installed. + exit /b 1 +) + +echo. +echo ========================================= +echo Building APItcpDemo (QDXnetworkStack API Client)... +echo Target: api_demo.exe +echo ========================================= +echo. + +rem Compiler flags: -O2 optimization, strictly enable warnings +set CFLAGS=-O2 -Wall -I../QDXnetworkStack + +rem Source files: Demo local sources + the QDXnetworkStack sources +set SRC_FILES=demo_main.c qdx_port_win32.c ../QDXnetworkStack/qdx_tcp_logic.c ../QDXnetworkStack/qdx_protocol.c ../QDXnetworkStack/qdx_preprocess.c + +"%GCC_PATH%" %CFLAGS% %SRC_FILES% -o api_demo.exe -lws2_32 + +if %ERRORLEVEL% equ 0 ( + echo. + echo [SUCCESS] Build completed! Output file: api_demo.exe + echo Usage example: Run 'api_demo.exe' and interact with the console. +) else ( + echo. + echo [FAILED] Build error. Please check the logs above. +) + +pause diff --git a/pc/demo_main.c b/pc/demo_main.c new file mode 100644 index 0000000..59b0b1a --- /dev/null +++ b/pc/demo_main.c @@ -0,0 +1,519 @@ +/** + * @file demo_main.c + * @brief TCP API 调用演示客户端 (一维/二维通用) + * + * 演示使用 QDXnetworkStack API 层的零拷贝发送与参数回调机制。 + * 用户操作流程与原 tcp_c_demo 保持完全一致。 + */ + +#include "qdx_port.h" +#include "qdx_preprocess.h" +#include "qdx_protocol.h" +#include "qdx_tcp_logic.h" + +#include /* _kbhit, _getch */ +#include +#include +#include +#include +#include + +/* ============================================================ + * 宏定义与全局变量 + * ============================================================ */ + +/* 默认服务端连接参数(硬编码) */ +#define DEFAULT_SERVER_IP "127.0.0.1" +#define DEFAULT_CONTROL_PORT 5511 +#define DEFAULT_DATA_PORT 5512 + +/* ANSI 控制台颜色宏定义 */ +#define CLR_RESET "\033[0m" +#define CLR_RED "\033[31m" +#define CLR_GREEN "\033[32m" +#define CLR_YELLOW "\033[33m" +#define CLR_BLUE "\033[34m" +#define CLR_MAGENTA "\033[35m" +#define CLR_CYAN "\033[36m" +#define CLR_DIM "\033[90m" + +static uint8_t g_dimension_mode = 0; /* 0=1D, 1=2D */ +static char g_matrix_dir[260] = {0}; + +/* 发送缓冲区(静态分配,避免 malloc) */ +#define MAX_2D_PIXELS (256 * 256) +static uint16_t g_raw_matrix[MAX_2D_PIXELS]; + +/* API 要求的外部传输缓冲区,总大小 256KB,前置留出 1KB 给网络层附加头部 */ +#define TX_BUFFER_TOTAL_CAPACITY (256 * 1024) +#define TX_BUFFER_HEAD_OFFSET 1024 +static uint8_t g_tx_buffer[TX_BUFFER_TOTAL_CAPACITY]; +static TcpTxBuffer_t g_api_tx_buffer; + +/* ============================================================ + * 辅助函数:十六进制打印 + * ============================================================ */ +static void print_hex(const uint8_t *data, int len) { + (void)data; + (void)len; +} + +/* ============================================================ + * 模拟数据发送逻辑 (1D & 2D) 的前置声明 + * ============================================================ */ +static void simulate_send_2d_frame(uint32_t frameNum); +static void simulate_send_1d_frame(uint32_t frameNum); + +/* ============================================================ + * QDX API 回调函数实现 + * ============================================================ */ + +/** + * @brief 上位机下发配置更新时的回调 + */ +static void on_config_updated(const ConfigCommon_t *common, + const Config2D_t *cfg2d, + const Config1D_t *cfg1d) { + printf(CLR_CYAN "\n[API Callback] 收到最新配置" CLR_RESET "\n"); + + /* 打印通用配置 */ + printf(" -> Common: Pipeline: %.*s, Type: %d, Mode: %d, Tag: %d, " + "Strictness: %d, Custom: %d\n", + 16, common->PipelineId, common->PipelineType, common->WorkMode, + common->ConfigTag, common->StrictnessLevel, common->IsCustomMode); + + /* 打印 2D 配置 */ + printf(" -> 2D: Enabled: %d, Live: %d, DevId: %d, %dx%d, Fps: %d\n", + cfg2d->Enabled, cfg2d->IsLive, cfg2d->DeviceId, cfg2d->Width, + cfg2d->Height, cfg2d->Fps); + printf(" -> 2D: Mask: %d (Thresh: %d, %dx%d), Target: %dx%d\n", + cfg2d->MaskEnabled, cfg2d->MaskThreshold, cfg2d->MaskWidth, + cfg2d->MaskHeight, cfg2d->TargetWidth, cfg2d->TargetHeight); + + /* 打印 1D 配置 */ + printf(" -> 1D: Enabled: %d, RunMode: %d, TriggerType: %d, " + "BufferSize: %d\n", + cfg1d->Enabled, cfg1d->RunMode, cfg1d->TriggerType, cfg1d->BufferSize); + + /* 核心:将配置下发给预处理算法库 */ + Preprocess_Settings_Change(cfg2d, cfg1d, common); + printf(CLR_GREEN " -> [OK] 已将参数同步至预处理引擎" CLR_RESET "\n"); +} + +/** + * @brief 上位机反馈检测结果时的回调 + */ +static void on_detection_result(uint32_t frameNumber, uint8_t resultStatus) { + printf(CLR_CYAN "[API Callback] 收到检测结果: Frame #%u, Result: %s" CLR_RESET + "\n", + frameNumber, resultStatus == 0 ? "OK" : "NG"); +} + +/** + * @brief 当服务端下发 TempFrame(请求回传当前帧)时的回调 + */ +static void on_temp_frame_request(uint8_t is2dRequest) { + printf(CLR_CYAN + "[API Callback] 收到服务端 TempFrame 采集请求 (is2D=%d)" CLR_RESET + "\n", + is2dRequest); + + static uint32_t simulated_frame_num = 1; + + if (g_dimension_mode == 1) { + printf(CLR_MAGENTA " -> 模拟: 开始处理并回传 2D 阵列图像..." CLR_RESET + "\n"); + simulate_send_2d_frame(simulated_frame_num++); + } else { + printf(CLR_MAGENTA " -> 模拟: 开始处理并回传 1D 阵列数据..." CLR_RESET + "\n"); + simulate_send_1d_frame(simulated_frame_num++); + } +} + +/* ============================================================ + * 模拟数据发送逻辑 (1D & 2D) + * ============================================================ */ + +/** + * @brief 随机选取 2D 矩阵文件并解析 + * 逻辑与原 demo 的 parse_temperature_matrix 完全一致 + */ +static int load_random_2d_matrix(uint16_t *matrix, int max_pixels, int *out_w, + int *out_h) { + char pattern[300]; + snprintf(pattern, sizeof(pattern), "%s*.txt", g_matrix_dir); + + WIN32_FIND_DATAA fd; + HANDLE hFind = FindFirstFileA(pattern, &fd); + if (hFind == INVALID_HANDLE_VALUE) + return -1; + + int count = 0; + do { + if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + count++; + } while (FindNextFileA(hFind, &fd)); + FindClose(hFind); + + if (count == 0) + return -1; + + int target = rand() % count; + hFind = FindFirstFileA(pattern, &fd); + int idx = 0; + char filepath[300] = {0}; + + do { + if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + if (idx == target) { + snprintf(filepath, sizeof(filepath), "%s%s", g_matrix_dir, + fd.cFileName); + break; + } + idx++; + } + } while (FindNextFileA(hFind, &fd)); + FindClose(hFind); + + if (filepath[0] == '\0') + return -1; + + static char file_buf[512 * 1024]; + FILE *fp = fopen(filepath, "r"); + if (!fp) + return -1; + + int file_len = (int)fread(file_buf, 1, sizeof(file_buf) - 1, fp); + fclose(fp); + file_buf[file_len] = '\0'; + + char *pos = strstr(file_buf, "\"temperature\""); + if (!pos) + return -1; + pos = strchr(pos, '['); + if (!pos) + return -1; + pos++; + + int width = 0, height = 0, total = 0, row_count = 0; + + while (*pos != '\0') { + if (*pos == '[') { + row_count = 0; + pos++; + } else if (*pos == ']') { + if (row_count > 0) { + height++; + if (width == 0) + width = row_count; + row_count = 0; + } else { + break; + } + pos++; + } else if (*pos >= '0' && *pos <= '9') { + int val = 0; + while (*pos >= '0' && *pos <= '9') { + val = val * 10 + (*pos - '0'); + pos++; + } + if (*pos == '.') { + pos++; + while (*pos >= '0' && *pos <= '9') + pos++; + } + if (total < max_pixels) { + matrix[total] = (uint16_t)val; + } + total++; + row_count++; + } else { + pos++; + } + } + + *out_w = width; + *out_h = height; + return total > 0 ? total : -1; +} + +/** + * @brief 模拟发送 2D 图像帧 (完整 API Zero-Copy 流水线) + */ +static void simulate_send_2d_frame(uint32_t frameNum) { + int w = 0, h = 0; + int total = load_random_2d_matrix(g_raw_matrix, MAX_2D_PIXELS, &w, &h); + if (total <= 0) { + printf(CLR_RED "[Error] 读取 2D 矩阵失败" CLR_RESET "\n"); + return; + } + + /* 1. 构造原始图像结构体 */ + RawImageBuffer_t rawBuff = {.pData = g_raw_matrix, + .Width = (uint16_t)w, + .Height = (uint16_t)h, + .FrameNumber = frameNum}; + + /* 2. 重置发送缓冲包装器(确保偏移正确) */ + g_api_tx_buffer.pBuffer = g_tx_buffer; + g_api_tx_buffer.TotalCapacity = TX_BUFFER_TOTAL_CAPACITY; + g_api_tx_buffer.HeadOffset = TX_BUFFER_HEAD_OFFSET; + g_api_tx_buffer.ValidPayloadLen = 0; + + PreprocessResult_t resMeta = {0}; + + /* 3. 核心 API: 预处理执行。它会根据滑动窗口目标大小提取 ROI, + * 并写入我们提供的 g_tx_buffer[HeadOffset] 处。 */ + if (Preprocess_Execute(&rawBuff, &g_api_tx_buffer, &resMeta) == 0) { + printf(CLR_MAGENTA + "[Data] 预处理完成: 提取出 %dx%d ROI, %.1f~%.1f°C" CLR_RESET "\n", + resMeta.ValidWidth, resMeta.ValidHeight, resMeta.MinTemp / 10.0f, + resMeta.MaxTemp / 10.0f); + + /* 4. 核心 API: TCP 零拷贝图文打包与发送。 + * 内部会在 HeadOffset 前面的 1KB 预留空间中拼装 18 字节包头,直接压入 + * LwIP(WinSock) */ + int8_t err = TcpLogic_BuildAndSendTemperatureFrame( + &g_api_tx_buffer, &resMeta, 0x01 /* TRIGGER */, 1 /* IS_2D */); + + if (err == 0) { + printf(CLR_GREEN " -> [OK] TCP 帧已加入发送队列" CLR_RESET "\n"); + } else { + printf(CLR_RED " -> [Fail] TCP 帧发送失败, 错误码: %d" CLR_RESET + "\n", + err); + } + } else { + printf(CLR_RED + "[Data] 预处理拒绝了本帧数据 (未达到阈值或参数异常)" CLR_RESET "\n"); + } +} + +/** + * @brief 模拟发送 1D 温度帧 + * 1D 模式下不需要滑动窗口图像处理,我们可以跳过 Preprocess_Execute, + * 直接组装 `PreprocessResult_t` 结构后提供给发送库。 + */ +static void simulate_send_1d_frame(uint32_t frameNum) { +#define POINTS_COUNT 30 + + int16_t min_t = 32767; + int16_t max_t = -32768; + int32_t sum_t = 0; + + g_api_tx_buffer.pBuffer = g_tx_buffer; + g_api_tx_buffer.TotalCapacity = TX_BUFFER_TOTAL_CAPACITY; + g_api_tx_buffer.HeadOffset = TX_BUFFER_HEAD_OFFSET; + + uint8_t *dest = g_api_tx_buffer.pBuffer + g_api_tx_buffer.HeadOffset; + + /* 模拟生成温度点 */ + for (int i = 0; i < POINTS_COUNT; i++) { + uint16_t time_offset = (uint16_t)(i * 600 / (POINTS_COUNT - 1)); + uint16_t temp = (uint16_t)(500 + rand() % 501); /* 50.0~100.0 */ + + int16_t t = (int16_t)temp; + if (t < min_t) + min_t = t; + if (t > max_t) + max_t = t; + sum_t += t; + + /* 序列化到 buffer (按协议要求 TempPoint1D_t: 2字节时间偏移 + + * 2字节温度,小端存储) */ + dest[0] = (uint8_t)(time_offset & 0xFF); + dest[1] = (uint8_t)((time_offset >> 8) & 0xFF); + dest[2] = (uint8_t)(temp & 0xFF); + dest[3] = (uint8_t)((temp >> 8) & 0xFF); + + dest += 4; + } + + g_api_tx_buffer.ValidPayloadLen = POINTS_COUNT * 4; + + /* 构造预处理元数据欺骗网络库 */ + PreprocessResult_t resMeta = {.pValidData = g_api_tx_buffer.pBuffer + + g_api_tx_buffer.HeadOffset, + .DataLength = g_api_tx_buffer.ValidPayloadLen, + .ValidWidth = POINTS_COUNT, + .ValidHeight = 1, + .MinTemp = min_t, + .MaxTemp = max_t, + .AvgTemp = (int16_t)(sum_t / POINTS_COUNT), + .RoiTemp = (int16_t)(sum_t / POINTS_COUNT), + .Status = 0, + .FrameNumber = frameNum}; + + printf(CLR_MAGENTA "[Data] 构造 1D 数据完成: %d 点, %.1f~%.1f°C" CLR_RESET + "\n", + POINTS_COUNT, min_t / 10.0f, max_t / 10.0f); + + int8_t err = TcpLogic_BuildAndSendTemperatureFrame( + &g_api_tx_buffer, &resMeta, 0x01 /* TRIGGER */, 0 /* IS_1D */); + + if (err == 0) { + printf(CLR_GREEN " -> [OK] 1D 帧已加入发送队列" CLR_RESET "\n"); + } else { + printf(CLR_RED " -> [Fail] 网络发送失败, 错误码: %d" CLR_RESET "\n", + err); + } + +#undef POINTS_COUNT +} + +/* ============================================================ + * 主函数 (控制台 UI 交互层) + * ============================================================ */ + +int main(void) { + /* 设置控制台支持 UTF-8 和 ANSI 转义 */ + SetConsoleOutputCP(65001); +#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 +#endif + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD dwMode = 0; + GetConsoleMode(hOut, &dwMode); + SetConsoleMode(hOut, dwMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + + printf("========================================================\n"); + printf("= TCP 透传客户端 API 演示版 (基于 QDXnetworkStack.c)\n"); + printf("= 服务端: %s 控制: %d 数据: %d\n", DEFAULT_SERVER_IP, + DEFAULT_CONTROL_PORT, DEFAULT_DATA_PORT); + printf("========================================================\n\n"); + + /* Windows 下需要手动启动 Winsock */ + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { + printf("[ERROR] WSAStartup 失败。\n"); + return 1; + } + + /* 交互式输入设备 ID */ + int input_id = 0; + printf("请输入设备 ID (整数, 例如 101): "); + if (scanf("%d", &input_id) != 1 || input_id < 0 || input_id > 65535) { + printf("[ERROR] 无效。默认设为 101。\n"); + input_id = 101; + } + printf("\n设备 ID 设置为: %d\n\n", input_id); + + /* 清除遗留的回车换行 */ + int c; + while ((c = getchar()) != '\n' && c != EOF) { + } + + /* 选择维度 */ + int dim_choice = 0; + printf("请选择维度模式:\n"); + printf(" 1 - 一维模式 (随机温度数据)\n"); + printf(" 2 - 二维模式 (从目录随机读取矩阵文件)\n"); + printf("请输入 (1 或 2): "); + if (scanf("%d", &dim_choice) != 1 || (dim_choice != 1 && dim_choice != 2)) { + dim_choice = 1; + } + g_dimension_mode = (dim_choice == 2) ? 1 : 0; + printf("\n维度模式: %s\n\n", g_dimension_mode ? "二维 (2D)" : "一维 (1D)"); + + if (g_dimension_mode == 1) { + snprintf(g_matrix_dir, sizeof(g_matrix_dir), "../tcp_c_demo/src/2d_mask/"); + printf("2D 矩阵文件目录: %s\n\n", g_matrix_dir); + } + + /* 生成假 UUID */ + uint8_t uuid[16] = {0}; + srand((unsigned int)GetTickCount()); + for (int i = 0; i < 16; i++) { + uuid[i] = (uint8_t)(rand() % 256); + } + + /* --------------------------------------------------------- + * 重点:纯 API 调用区 + * --------------------------------------------------------- */ + printf(">>> 正在初始化 QDXnetworkStack 库架构...\n"); + + /* 1. 初始化预处理引擎 (分配 256x256 静态滑窗资源) */ + Preprocess_Init(256, 256); + + /* 2. 初始化网络栈 */ + TcpLogic_Init(uuid, NULL); + + /* 3. 注册业务回调 (配置更新、坏品通知、采集请求) */ + TcpLogic_RegisterConfigCallback(on_config_updated); + TcpLogic_RegisterDetectionCallback(on_detection_result); + TcpLogic_RegisterTempFrameRequestCallback(on_temp_frame_request); + + /* 4. [Hack Demo] 因为 API 库不包含直接设置当前 DevID + * 的接口(依赖服务端下发), 但为了 Demo 一开始能用指定的 101 ID + * 发起连接,我们手动造一个回调注入进去, 实际上在真实的 CH32 工程中,ID + * 会保存在 Flash 里面。这演示了库的工作原理。 + */ + // 由于 g_TcpLogic 结构体对于外部是静态隐藏的, + // API 设计中如果要改变 DevID,规范应是等待协议 0x05 下发。 + // 此处模拟真实情况:我们相信服务端会自动给我分发 ID, + // 所以不再强求立刻修改。库有默认 ID=101。 + + /* 5. 启动后台处理收发断连。 + * 它内部通过 _beginthreadex 开了线程! + */ + TcpLogic_Start(); + printf(">>> 库引擎以启动。后台线程已接管所有 Socket 收发。\n\n"); + + /* ========================================================= + * 主业务测试循环 + * ========================================================= */ + printf("菜单 (上位机请求时会自动发送):\n"); + printf(" [s] 立即触发一次发送 [c] 打印当前内存参数册\n"); + printf(" [q] 退出 (Ctrl+C 也可)\n\n"); + + while (1) { + if (_kbhit()) { + int ch = _getch(); + if (ch == 'q' || ch == 'Q') { + break; + } else if (ch == 's' || ch == 'S') { + printf("\n[Manual] 用户主动触发一帧。\n"); + on_temp_frame_request(g_dimension_mode); + } else if (ch == 'c' || ch == 'C') { + ConfigCommon_t com; + Config2D_t c2d; + Config1D_t c1d; + if (TcpLogic_GetLatestConfig(&com, &c2d, &c1d) == 0) { + printf(CLR_GREEN + "\n[Info] 当前静态配置缓存中包含数据 (严苛度: %d)。" CLR_RESET + "\n", + com.StrictnessLevel); + /* 打印通用配置 */ + printf(" -> Common: Pipeline: %.*s, Type: %d, Mode: %d, Tag: %d, " + "Strictness: %d, Custom: %d\n", + 16, com.PipelineId, com.PipelineType, com.WorkMode, + com.ConfigTag, com.StrictnessLevel, com.IsCustomMode); + + /* 打印 2D 配置 */ + printf( + " -> 2D: Enabled: %d, Live: %d, DevId: %d, %dx%d, Fps: %d\n", + c2d.Enabled, c2d.IsLive, c2d.DeviceId, c2d.Width, c2d.Height, + c2d.Fps); + printf(" -> 2D: Mask: %d (Thresh: %d, %dx%d), Target: %dx%d\n", + c2d.MaskEnabled, c2d.MaskThreshold, c2d.MaskWidth, + c2d.MaskHeight, c2d.TargetWidth, c2d.TargetHeight); + + /* 打印 1D 配置 */ + printf(" -> 1D: Enabled: %d, RunMode: %d, TriggerType: %d, " + "BufferSize: %d\n", + c1d.Enabled, c1d.RunMode, c1d.TriggerType, c1d.BufferSize); + } else { + printf(CLR_YELLOW + "\n[Info] 当前静态配置缓存尚未收到上位机同步!" CLR_RESET + "\n"); + } + } + } + Sleep(50); + } + + printf("程序退出中...\n"); + WSACleanup(); + return 0; +} diff --git a/pc/qdx_port_win32.c b/pc/qdx_port_win32.c new file mode 100644 index 0000000..39e324a --- /dev/null +++ b/pc/qdx_port_win32.c @@ -0,0 +1,194 @@ +/** + * @file qdx_port_win32.c + * @brief Windows (WinSock2 + WinAPI) 平台移植层 + * + * 目的:将 qdx_port.h 声明的 HAL 接口映射到 Windows API, + * 使 QDXnetworkStack 库能够在 PC 端运行。 + * + * 注意:本文件仅用于 PC 端 Demo 模拟,不适用于 MCU 移植。 + */ + +#include "qdx_port.h" + +#include /* _beginthreadex */ +#include +#include +#include +#include + + +/* ============================================================ + * 时间与延迟 + * ============================================================ */ + +/* 获取系统启动以来的毫秒数 */ +uint32_t qdx_port_get_tick_ms(void) { return (uint32_t)GetTickCount(); } + +/* 阻塞延迟指定毫秒 */ +void qdx_port_delay_ms(uint32_t ms) { Sleep(ms); } + +/* ============================================================ + * TCP 网络操作 (基于 WinSock2) + * ============================================================ */ + +/** + * @brief 创建 TCP 套接字并连接到远端 + * + * 连接成功后设置 500ms 接收超时,防止接收线程永久阻塞。 + */ +qdx_socket_t qdx_port_tcp_connect(const char *ip, uint16_t port) { + SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sock == INVALID_SOCKET) { + return NULL; + } + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = inet_addr(ip); + + if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) { + closesocket(sock); + return NULL; + } + + /* 设置接收超时 500ms,使 recv 线程可定期检查连接状态 */ + DWORD timeout_ms = 500; + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout_ms, + sizeof(timeout_ms)); + + printf("[Port] TCP 已连接: %s:%d\n", ip, port); + + /* 将 SOCKET 转为不透明指针(SOCKET 本身是 unsigned int 类型) */ + return (qdx_socket_t)(intptr_t)sock; +} + +/* 关闭 TCP 套接字 */ +void qdx_port_tcp_close(qdx_socket_t sock) { + if (sock) { + closesocket((SOCKET)(intptr_t)sock); + } +} + +/* TCP 发送 */ +int32_t qdx_port_tcp_send(qdx_socket_t sock, const uint8_t *data, + uint32_t len) { + if (!sock) + return -1; + int ret = send((SOCKET)(intptr_t)sock, (const char *)data, (int)len, 0); + if (ret == SOCKET_ERROR) { + return -1; + } + return (int32_t)ret; +} + +/** + * @brief TCP 接收(非阻塞/短超时) + * + * 返回值约定: + * > 0 : 实际收到的字节数 + * = 0 : 超时无数据 + * < 0 : 连接断开或错误 + */ +int32_t qdx_port_tcp_recv(qdx_socket_t sock, uint8_t *buf, uint32_t max_len) { + if (!sock) + return -1; + int ret = recv((SOCKET)(intptr_t)sock, (char *)buf, (int)max_len, 0); + if (ret == SOCKET_ERROR) { + int err = WSAGetLastError(); + /* WSAETIMEDOUT / WSAEWOULDBLOCK 表示超时,视为无数据可读 */ + if (err == WSAETIMEDOUT || err == WSAEWOULDBLOCK) { + return 0; + } + return -1; /* 真实错误 */ + } + if (ret == 0) { + return -1; /* 服务端主动关闭连接 */ + } + return (int32_t)ret; +} + +/* ============================================================ + * 互斥锁 (基于 CRITICAL_SECTION) + * ============================================================ */ + +/* 创建互斥锁 */ +qdx_mutex_t qdx_port_mutex_create(void) { + CRITICAL_SECTION *cs = (CRITICAL_SECTION *)malloc(sizeof(CRITICAL_SECTION)); + if (!cs) + return NULL; + InitializeCriticalSection(cs); + return (qdx_mutex_t)cs; +} + +/* 加锁 */ +void qdx_port_mutex_lock(qdx_mutex_t mutex) { + if (mutex) { + EnterCriticalSection((CRITICAL_SECTION *)mutex); + } +} + +/* 解锁 */ +void qdx_port_mutex_unlock(qdx_mutex_t mutex) { + if (mutex) { + LeaveCriticalSection((CRITICAL_SECTION *)mutex); + } +} + +/* 销毁互斥锁 */ +void qdx_port_mutex_delete(qdx_mutex_t mutex) { + if (mutex) { + DeleteCriticalSection((CRITICAL_SECTION *)mutex); + free(mutex); + } +} + +/* ============================================================ + * 线程 (基于 _beginthreadex) + * ============================================================ */ + +/** + * @brief 线程启动包装器 + * + * 目的:_beginthreadex 要求 unsigned __stdcall 签名, + * 而 qdx_thread_entry_t 是 void(*)(void*), + * 需要通过此包装器做签名适配。 + */ +typedef struct { + qdx_thread_entry_t entry; + void *arg; +} ThreadWrapper_t; + +static unsigned __stdcall thread_wrapper(void *param) { + ThreadWrapper_t *tw = (ThreadWrapper_t *)param; + qdx_thread_entry_t entry = tw->entry; + void *arg = tw->arg; + free(tw); /* 释放包装结构,生命周期结束 */ + entry(arg); + return 0; +} + +/* 创建后台线程 */ +int8_t qdx_port_thread_create(const char *name, qdx_thread_entry_t entry, + void *arg, uint32_t stack_size, + uint8_t priority) { + (void)name; /* Windows 线程不直接支持命名 */ + (void)priority; /* 简化 Demo 不设线程优先级 */ + + ThreadWrapper_t *tw = (ThreadWrapper_t *)malloc(sizeof(ThreadWrapper_t)); + if (!tw) + return -1; + tw->entry = entry; + tw->arg = arg; + + HANDLE h = + (HANDLE)_beginthreadex(NULL, stack_size, thread_wrapper, tw, 0, NULL); + if (h == NULL) { + free(tw); + return -1; + } + + /* 分离线程句柄,后台自动运行 */ + CloseHandle(h); + return 0; +} diff --git a/prj/middle/QDXnetworkStack/LICENSE.txt b/prj/middle/QDXnetworkStack/LICENSE.txt new file mode 100644 index 0000000..913e926 --- /dev/null +++ b/prj/middle/QDXnetworkStack/LICENSE.txt @@ -0,0 +1,79 @@ +================================================================================ + END USER LICENSE AGREEMENT +================================================================================ + +Copyright (c) QDX. All rights reserved. + +This End User License Agreement ("Agreement") is a legal agreement between you +(either an individual or a single entity) and QDX regarding the use of the +source code and accompanying documentation (hereinafter referred to as the +"Software Source Code"). + +By obtaining, using, or modifying the Software Source Code, you agree to be +bound by the terms and conditions of this Agreement. If you do not agree, do +not use the Software Source Code. + +-------------------------------------------------------------------------------- +1. COPYRIGHT AND OWNERSHIP +-------------------------------------------------------------------------------- +All title, copyrights, and other intellectual property rights in and to the +Software Source Code (including but not limited to its design concepts, +algorithms, data structures, implementation, and related documentation) are +owned by QDX. The Software Source Code is protected by copyright laws and +international copyright treaties. +QDX reserves the right of final interpretation regarding the terms of this +Agreement and the scope of use of the Software Source Code. + +-------------------------------------------------------------------------------- +2. GRANT OF LICENSE AND RESTRICTIONS +-------------------------------------------------------------------------------- +Subject to your compliance with this Agreement, QDX grants you a limited, +non-transferable, and non-exclusive right to use and modify the Software Source +Code under specific business contexts. + +* Authorized Scope: + The open use of this Software Source Code is strictly limited to the specific, + formally authorized commercial project and its directly related program or + feature development (including debugging, compiling, and system integration). + +* Strict Prohibitions: + Without the express written permission of QDX, it is strictly prohibited to + use this Software Source Code for any unauthorized commercial projects, + products, open-source releases, or to disclose it to any unauthorized third + parties. You may not package this code independently for sale, rental, or + distribution for competitive commercial purposes. + +-------------------------------------------------------------------------------- +3. DISCLAIMER OF WARRANTIES ("AS IS") +-------------------------------------------------------------------------------- +* No Warranties: + The Software Source Code and its associated documentation are provided "AS IS", + without warranty of any kind. QDX makes no express or implied warranties, + including, but not limited to, the implied warranties of merchantability, + fitness for a particular purpose, or non-infringement. + +* No Liability for Variants and Performance: + QDX shall not be responsible for the performance, quality, security, + commercial consequences, or any software failures resulting from any variants + (including new features, refactoring, or ported code snippets) created by you + during your use or modification of the Software Source Code. + +* Limitation of Liability: + In no event shall QDX be liable for any direct, indirect, incidental, special, + or punitive damages (including, but not limited to, loss of profits, business + interruption, loss of data, or loss of business information) arising out of + the use or inability to use the Software Source Code, even if QDX has been + advised of the possibility of such damages. + +-------------------------------------------------------------------------------- +4. LEGAL EFFECT +-------------------------------------------------------------------------------- +QDX holds the final authority and right of interpretation concerning any +disputes arising from or related to this Agreement according to the law. If you +fail to comply with any terms of this Agreement, QDX reserves the right to +terminate your use authorization immediately and pursue legal responsibility for +any economic damages. + +By acquiring and utilizing this Software Source Code, you acknowledge that you +have read, understood, and agreed to be strictly bound by all the authorization +and disclaimer clauses set forth above. diff --git a/prj/middle/QDXnetworkStack/qdx_port.h b/prj/middle/QDXnetworkStack/qdx_port.h new file mode 100644 index 0000000..aa8dbd5 --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_port.h @@ -0,0 +1,125 @@ +/** + * @file qdx_port.h + * @brief Hardware/OS Abstraction Layer (HAL) for QDX Network Stack + * + * Provides platform-independent interfaces for network socket operations, + * timing, mutexes, and threading. Users must implement these functions + * based on their specific MCU OS (e.g., FreeRTOS, LwIP, RT-Thread). + */ + +#ifndef QDX_PORT_H +#define QDX_PORT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ============================================================ + * Time & Delay + * ============================================================ */ + +/** + * @brief Get absolute system uptime/ticks in milliseconds. + * @return Milliseconds since system boot. + */ +uint32_t qdx_port_get_tick_ms(void); + +/** + * @brief Blocking delay in milliseconds. + * @param ms Delay time + */ +void qdx_port_delay_ms(uint32_t ms); + +/* ============================================================ + * Network (TCP Socket) + * ============================================================ */ + +/* Opaque handle for sockets dependent on underlying IP stack */ +typedef void *qdx_socket_t; + +/** + * @brief Create and connect a TCP socket to a remote host. + * @param ip Str IP address of the server (e.g., "192.168.1.10") + * @param port Remote port + * @return Valid socket handle on success, or NULL on failure. + */ +qdx_socket_t qdx_port_tcp_connect(const char *ip, uint16_t port); + +/** + * @brief Close a TCP socket. + * @param sock Socket handle + */ +void qdx_port_tcp_close(qdx_socket_t sock); + +/** + * @brief Send data over TCP socket. + * @param sock Socket handle + * @param data Data buffer to send + * @param len Length of data in bytes + * @return Number of bytes sent, or < 0 for error. + */ +int32_t qdx_port_tcp_send(qdx_socket_t sock, const uint8_t *data, uint32_t len); + +/** + * @brief Receive data from TCP socket (Non-blocking or specific timeout). + * @param sock Socket handle + * @param buf Buffer to store received data + * @param max_len Maximum buffer size + * @return Number of bytes received. Return 0 if timeout/empty. Return < 0 for + * connection closed/error. + */ +int32_t qdx_port_tcp_recv(qdx_socket_t sock, uint8_t *buf, uint32_t max_len); + +/* ============================================================ + * Mutex & Threading + * ============================================================ */ + +/* Opaque handle for mutex */ +typedef void *qdx_mutex_t; + +/** + * @brief Create a recursive or standard mutex. + * @return Mutex handle, or NULL on failure. + */ +qdx_mutex_t qdx_port_mutex_create(void); + +/** + * @brief Lock a mutex. + * @param mutex Mutex handle + */ +void qdx_port_mutex_lock(qdx_mutex_t mutex); + +/** + * @brief Unlock a mutex. + * @param mutex Mutex handle + */ +void qdx_port_mutex_unlock(qdx_mutex_t mutex); + +/** + * @brief Delete a mutex. + * @param mutex Mutex handle + */ +void qdx_port_mutex_delete(qdx_mutex_t mutex); + +/* Thread entry callback definition */ +typedef void (*qdx_thread_entry_t)(void *arg); + +/** + * @brief Create a background thread/task. + * @param name Task name + * @param entry Task entry function + * @param arg Task argument + * @param stack_size Requested stack size in bytes + * @param priority Task priority + * @return 0 on success, < 0 on failure. + */ +int8_t qdx_port_thread_create(const char *name, qdx_thread_entry_t entry, + void *arg, uint32_t stack_size, uint8_t priority); + +#ifdef __cplusplus +} +#endif + +#endif /* QDX_PORT_H */ diff --git a/prj/middle/QDXnetworkStack/qdx_port_template.c b/prj/middle/QDXnetworkStack/qdx_port_template.c new file mode 100644 index 0000000..683c131 --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_port_template.c @@ -0,0 +1,143 @@ +/** + * @file qdx_port_template.c + * @brief Template Implementation of the HAL Port for QDX Network Stack + * + * Instructions: + * 1. Rename this file to qdx_port.c in your MCU project. + * 2. Implement these functions using your specific OS/Network APIs + * (e.g., LwIP, FreeRTOS, RT-Thread, CMSIS-OS). + * 3. Ensure qdx_port_tcp_recv is non-blocking or uses a short timeout, + * so the background thread can periodically check connection status. + */ + +#include "qdx_port.h" +#include /* For NULL */ +/* Include your system headers here + * #include "FreeRTOS.h" + * #include "task.h" + * #include "lwip/sockets.h" + * #include "lwip/sys.h" + */ + +/* ============================================================ + * Time & Delay + * ============================================================ */ + +uint32_t qdx_port_get_tick_ms(void) { + /* TODO: Return current system uptime in milliseconds. + * Example (FreeRTOS): return (uint32_t)(xTaskGetTickCount() * + * portTICK_PERIOD_MS); Example (HAL): return HAL_GetTick(); + */ + return 0; +} + +void qdx_port_delay_ms(uint32_t ms) { + /* TODO: Block current thread for ms milliseconds. + * Example (FreeRTOS): vTaskDelay(pdMS_TO_TICKS(ms)); + * Example (HAL): HAL_Delay(ms); + */ +} + +/* ============================================================ + * Network (TCP Socket) + * ============================================================ */ + +qdx_socket_t qdx_port_tcp_connect(const char *ip, uint16_t port) { + /* TODO: Create socket and connect to IP:PORT. + * Example (LwIP/BSD Sockets): + * int sock = socket(AF_INET, SOCK_STREAM, 0); + * if (sock < 0) return NULL; + * struct sockaddr_in dest_addr; + * dest_addr.sin_addr.s_addr = inet_addr(ip); + * dest_addr.sin_family = AF_INET; + * dest_addr.sin_port = htons(port); + * if (connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) == 0) + * { + * // Optional: Set receive timeout + * return (qdx_socket_t)(intptr_t)sock; + * } + * close(sock); + */ + return NULL; +} + +void qdx_port_tcp_close(qdx_socket_t sock) { + /* TODO: Close the socket gracefully. + * Example: + * if (sock) { + * close((int)(intptr_t)sock); + * } + */ +} + +int32_t qdx_port_tcp_send(qdx_socket_t sock, const uint8_t *data, + uint32_t len) { + /* TODO: Send data through the socket. + * Example: + * if (!sock) return -1; + * return send((int)(intptr_t)sock, data, len, 0); + */ + return -1; +} + +int32_t qdx_port_tcp_recv(qdx_socket_t sock, uint8_t *buf, uint32_t max_len) { + /* TODO: Receive data from the socket. + * Should return actual bytes read. If no bytes are available (timeout), + * return 0. If socket is closed or an error occurs, return < 0. Example: if + * (!sock) return -1; + * // Assume socket was set with SO_RCVTIMEO to prevent hanging forever + * int bytes = recv((int)(intptr_t)sock, buf, max_len, 0); + * if (bytes < 0) { + * if (errno == EAGAIN || errno == EWOULDBLOCK) return 0; // Timeout + * return -1; // Actual error + * } + * return bytes; // Includes bytes == 0 (graceful close) -> might want to + * map to -1 + */ + return -1; +} + +/* ============================================================ + * Mutex & Threading + * ============================================================ */ + +qdx_mutex_t qdx_port_mutex_create(void) { + /* TODO: Create and return a mutex handle. + * Example (FreeRTOS): + * SemaphoreHandle_t mutex = xSemaphoreCreateMutex(); + * return (qdx_mutex_t)mutex; + */ + return NULL; +} + +void qdx_port_mutex_lock(qdx_mutex_t mutex) { + /* TODO: Lock the given mutex. + * Example (FreeRTOS): + * if (mutex) xSemaphoreTake((SemaphoreHandle_t)mutex, portMAX_DELAY); + */ +} + +void qdx_port_mutex_unlock(qdx_mutex_t mutex) { + /* TODO: Unlock the given mutex. + * Example (FreeRTOS): + * if (mutex) xSemaphoreGive((SemaphoreHandle_t)mutex); + */ +} + +void qdx_port_mutex_delete(qdx_mutex_t mutex) { + /* TODO: Delete the given mutex. + * Example (FreeRTOS): + * if (mutex) vSemaphoreDelete((SemaphoreHandle_t)mutex); + */ +} + +int8_t qdx_port_thread_create(const char *name, qdx_thread_entry_t entry, + void *arg, uint32_t stack_size, + uint8_t priority) { + /* TODO: Create a background thread/task to run the entry function. + * Example (FreeRTOS): + * BaseType_t res = xTaskCreate(entry, name, stack_size / + * sizeof(StackType_t), arg, priority, NULL); return (res == pdPASS) ? 0 : -1; + */ + return -1; +} diff --git a/prj/middle/QDXnetworkStack/qdx_preprocess.c b/prj/middle/QDXnetworkStack/qdx_preprocess.c new file mode 100644 index 0000000..7dc475c --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_preprocess.c @@ -0,0 +1,325 @@ +/** + * @file qdx_preprocess.c + * @brief Zero-Copy Image Preprocessing Implementation + */ + +#include "qdx_preprocess.h" +#include "qdx_port.h" +#include + +/* ============================================================ + * Internal State & Configuration Cache + * ============================================================ */ + +/* Static allocation for column sums to avoid malloc */ +#define PREPROCESS_MAX_WIDTH 256 +static uint32_t g_col_sums[PREPROCESS_MAX_WIDTH]; +static uint8_t g_is_initialized = 0; + +/* 配置读写互斥锁,防止 Execute 与 Settings_Change 并发冲突 */ +static qdx_mutex_t g_preprocess_mutex = NULL; + +static struct { + Config2D_t cfg2d; + Config1D_t cfg1d; + ConfigCommon_t common; +} g_PreprocessCfg; + +/* ============================================================ + * API Implementation + * ============================================================ */ + +int8_t Preprocess_Init(uint16_t maxWidth, uint16_t maxHeight) { + (void)maxHeight; /* 列累加仅依赖宽度 */ + + if (maxWidth > PREPROCESS_MAX_WIDTH) { + return -1; /* 超出静态分配缓冲区上限 */ + } + + memset(g_col_sums, 0, sizeof(g_col_sums)); + memset(&g_PreprocessCfg, 0, sizeof(g_PreprocessCfg)); + + /* 创建配置互斥锁 */ + g_preprocess_mutex = qdx_port_mutex_create(); + if (g_preprocess_mutex == NULL) + return -1; + + /* 最小默认配置,防止除零或无限循环 */ + g_PreprocessCfg.cfg2d.TargetWidth = 1; + g_PreprocessCfg.cfg2d.TargetHeight = 1; + + g_is_initialized = 1; + return 0; +} + +int8_t Preprocess_Settings_Change(const Config2D_t *newConfig2D, + const Config1D_t *newConfig1D, + const ConfigCommon_t *newCommon) { + if (!g_is_initialized) + return -1; + + /* 加锁保护配置更新,防止与 Execute 读取产生竞态 */ + qdx_port_mutex_lock(g_preprocess_mutex); + + if (newConfig2D) + memcpy(&g_PreprocessCfg.cfg2d, newConfig2D, sizeof(Config2D_t)); + if (newConfig1D) + memcpy(&g_PreprocessCfg.cfg1d, newConfig1D, sizeof(Config1D_t)); + if (newCommon) + memcpy(&g_PreprocessCfg.common, newCommon, sizeof(ConfigCommon_t)); + + /* 安全检查 */ + if (g_PreprocessCfg.cfg2d.TargetWidth == 0) + g_PreprocessCfg.cfg2d.TargetWidth = 1; + if (g_PreprocessCfg.cfg2d.TargetHeight == 0) + g_PreprocessCfg.cfg2d.TargetHeight = 1; + + qdx_port_mutex_unlock(g_preprocess_mutex); + return 0; +} + +int8_t Preprocess_Execute(const RawImageBuffer_t *input, + TcpTxBuffer_t *out_buffer, + PreprocessResult_t *output_meta) { + if (!g_is_initialized || !input || !input->pData || !out_buffer || + !out_buffer->pBuffer || !output_meta) + return -1; + + /* 加锁快照当前配置,最小化持锁时间 */ + qdx_port_mutex_lock(g_preprocess_mutex); + uint16_t tgt_w = g_PreprocessCfg.cfg2d.TargetWidth; + uint16_t tgt_h = g_PreprocessCfg.cfg2d.TargetHeight; + int16_t thresh = g_PreprocessCfg.cfg2d.TriggerTemperatureThreshold; + qdx_port_mutex_unlock(g_preprocess_mutex); + + uint16_t w = input->Width; + uint16_t h = input->Height; + + /* 目标超过输入时回退到整幅图像 */ + if (tgt_w > w) + tgt_w = w; + if (tgt_h > h) + tgt_h = h; + + /* ---- 缓冲区容量越界检查 ---- */ + uint32_t required_bytes = (uint32_t)tgt_w * tgt_h * 2u; + if (out_buffer->HeadOffset + required_bytes > out_buffer->TotalCapacity) { + return -3; /* 输出缓冲区空间不足 */ + } + + /* 判断是否需要滑窗计算,或直接导出全图 */ + if (tgt_w == w && tgt_h == h) { + /* 无需滑窗,仅做温度过滤与整体统计 */ + int16_t min_t = 32767; + int16_t max_t = -32768; + uint32_t total_sum = 0; + uint32_t pixels = w * h; + + /* Write directly to out_buffer starting at HeadOffset */ + uint8_t *dest_ptr = out_buffer->pBuffer + out_buffer->HeadOffset; + + for (uint32_t i = 0; i < pixels; i++) { + int16_t raww_val = (int16_t)input->pData[i]; + + if (raww_val < min_t) + min_t = raww_val; + if (raww_val > max_t) + max_t = raww_val; + total_sum += raww_val; + + /* Encode Original Raw Value (Little-Endian sequence into uint8_t) */ + *dest_ptr++ = (uint8_t)(raww_val & 0xFF); + *dest_ptr++ = (uint8_t)((raww_val >> 8) & 0xFF); + } + + output_meta->pValidData = out_buffer->pBuffer + out_buffer->HeadOffset; + output_meta->DataLength = pixels * 2; + output_meta->ValidWidth = w; + output_meta->ValidHeight = h; + output_meta->MinTemp = min_t; + output_meta->MaxTemp = max_t; + output_meta->AvgTemp = (int16_t)(total_sum / pixels); + output_meta->RoiTemp = output_meta->AvgTemp; + output_meta->Status = 0; + output_meta->FrameNumber = input->FrameNumber; + + out_buffer->ValidPayloadLen = output_meta->DataLength; + return 0; + } + + /* ------------------------------------------------------------------------ + Perform Sliding Window Search for Average Temperature Target Region + ------------------------------------------------------------------------ */ + + memset(g_col_sums, 0, w * sizeof(uint32_t)); + uint32_t max_region_sum = 0; + uint16_t best_x = 0; + uint16_t best_y = 0; + + for (uint16_t y = 0; y <= h - tgt_h; y++) { + + /* Step 1: Initialize column sums for this row strip + If y == 0, we calculate the entire strip. + Otherwise, we subtract the top row that left, and add the bottom row that + entered. */ + + if (y == 0) { + for (uint16_t c = 0; c < w; c++) { + uint32_t col_total = 0; + for (uint16_t r = 0; r < tgt_h; r++) { + int16_t val = (int16_t)input->pData[r * w + c]; + if (val < thresh) + val = 90; + col_total += val; + } + g_col_sums[c] = col_total; + } + } else { + /* Slide down by 1 row */ + for (uint16_t c = 0; c < w; c++) { + int16_t top_val = (int16_t)input->pData[(y - 1) * w + c]; + int16_t bot_val = (int16_t)input->pData[(y + tgt_h - 1) * w + c]; + + if (top_val < thresh) + top_val = 90; + if (bot_val < thresh) + bot_val = 90; + + g_col_sums[c] = g_col_sums[c] - top_val + bot_val; + } + } + + /* Step 2: Slide Across the Columns (Left to Right) */ + uint32_t current_window_sum = 0; + + /* Initialize first window */ + for (uint16_t c = 0; c < tgt_w; c++) { + current_window_sum += g_col_sums[c]; + } + + if (current_window_sum > max_region_sum) { + max_region_sum = current_window_sum; + best_x = 0; + best_y = y; + } + + /* Slide Right */ + for (uint16_t x = 1; x <= w - tgt_w; x++) { + current_window_sum = + current_window_sum - g_col_sums[x - 1] + g_col_sums[x + tgt_w - 1]; + + if (current_window_sum > max_region_sum) { + max_region_sum = current_window_sum; + best_x = x; + best_y = y; + } + } + } + + /* ------------------------------------------------------------------------ + Extract the Data + ------------------------------------------------------------------------ */ + + int16_t min_t = 32767; + int16_t max_t = -32768; + uint32_t total_sum = 0; + uint32_t pixels = tgt_w * tgt_h; + uint8_t *dest_ptr = out_buffer->pBuffer + out_buffer->HeadOffset; + + for (uint16_t r = 0; r < tgt_h; r++) { + for (uint16_t c = 0; c < tgt_w; c++) { + /* Raw offset into original image */ + uint32_t src_idx = (best_y + r) * w + (best_x + c); + int16_t raww_val = (int16_t)input->pData[src_idx]; + + if (raww_val < min_t) + min_t = raww_val; + if (raww_val > max_t) + max_t = raww_val; + total_sum += raww_val; + + /* Output Original Raw Values */ + *dest_ptr++ = (uint8_t)(raww_val & 0xFF); + *dest_ptr++ = (uint8_t)((raww_val >> 8) & 0xFF); + } + } + + output_meta->pValidData = out_buffer->pBuffer + out_buffer->HeadOffset; + output_meta->DataLength = pixels * 2; + output_meta->ValidWidth = tgt_w; + output_meta->ValidHeight = tgt_h; + output_meta->MinTemp = min_t; + output_meta->MaxTemp = max_t; + output_meta->AvgTemp = (int16_t)(total_sum / pixels); + output_meta->RoiTemp = output_meta->AvgTemp; + output_meta->Status = 0; + output_meta->FrameNumber = input->FrameNumber; + + out_buffer->ValidPayloadLen = output_meta->DataLength; + + return 0; +} + +/* ============================================================ + * Internal Trigger Check + * ============================================================ */ +int8_t Preprocess_CheckInternalTrigger2D(const RawImageBuffer_t *input) { + if (!g_is_initialized || !input || !input->pData) + return -1; + + qdx_port_mutex_lock(g_preprocess_mutex); + uint16_t roi_x = g_PreprocessCfg.cfg2d.TriggerRoiX; + uint16_t roi_y = g_PreprocessCfg.cfg2d.TriggerRoiY; + uint16_t roi_w = g_PreprocessCfg.cfg2d.TriggerRoiW; + uint16_t roi_h = g_PreprocessCfg.cfg2d.TriggerRoiH; + uint8_t condition = g_PreprocessCfg.cfg2d.TriggerCondition; + int16_t thresh = g_PreprocessCfg.cfg2d.TriggerTemperatureThreshold; + qdx_port_mutex_unlock(g_preprocess_mutex); + + uint16_t w = input->Width; + uint16_t h = input->Height; + + /* Boundary Check & Clipping */ + if (roi_w == 0 || roi_h == 0) + return 0; + if (roi_x >= w || roi_y >= h) + return 0; + if (roi_x + roi_w > w) + roi_w = w - roi_x; + if (roi_y + roi_h > h) + roi_h = h - roi_y; + + int16_t max_temp = -32768; + int64_t sum_temp = 0; + uint32_t count = roi_w * roi_h; + + for (uint16_t r = 0; r < roi_h; r++) { + for (uint16_t c = 0; c < roi_w; c++) { + int16_t val = (int16_t)input->pData[(roi_y + r) * w + (roi_x + c)]; + + /* Temperature Filtration Preprocessing */ + if (val < thresh) { + val = 90; /* Treat as 9.0C */ + } + + if (val > max_temp) + max_temp = val; + sum_temp += val; + } + } + + int16_t calc_val = 0; + if (condition == 1) { + /* 1: Max */ + calc_val = max_temp; + } else { + /* 0: Average */ + calc_val = (int16_t)(sum_temp / count); + } + + if (calc_val >= thresh) { + return 1; /* Triggered */ + } + + return 0; /* Not triggered */ +} diff --git a/prj/middle/QDXnetworkStack/qdx_preprocess.h b/prj/middle/QDXnetworkStack/qdx_preprocess.h new file mode 100644 index 0000000..3f07643 --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_preprocess.h @@ -0,0 +1,74 @@ +/** + * @file qdx_preprocess.h + * @brief Zero-Copy Image Preprocessing for Thermal Imaging + * + * Includes Sliding Window Maximum/Average ROI search, + * Temperature filtering, and Data extraction. + */ + +#ifndef QDX_PREPROCESS_H +#define QDX_PREPROCESS_H + +#include "qdx_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize static memory resources for sliding window calculations. + * + * Called once during system boot. Pre-allocates column accumulation arrays + * to prevent dynamic allocation during runtime. + * + * @param maxWidth The maximum supported width of the 2D input matrix + * @param maxHeight The maximum supported height of the 2D input matrix + * @return 0 on success, < 0 on failure. + */ +int8_t Preprocess_Init(uint16_t maxWidth, uint16_t maxHeight); + +/** + * @brief Execute the preprocessing pipeline on a raw frame. + * + * High-performance processing logic that reads `input`, applies thresholds, + * finds the best `TargetWidth x TargetHeight` ROI using sliding window arrays, + * and extracts that region into `out_buffer` starting precisely at + * `HeadOffset`. + * + * @param input Raw thermal image array + * @param out_buffer Pre-allocated transmission buffer wrapper + * @param output_meta Struct to fill with process results/metadata + * @return 0 if successful, < 0 if aborted (e.g., config invalid) + */ +int8_t Preprocess_Execute(const RawImageBuffer_t *input, + TcpTxBuffer_t *out_buffer, + PreprocessResult_t *output_meta); + +/** + * @brief Safely update internal preprocessing shadow parameters. + * + * @param newConfig2D Partial Configuration Update + * @param newConfig1D Partial Configuration Update + * @param newCommon General System Setup + * @return 0 on success. + */ +int8_t Preprocess_Settings_Change(const Config2D_t *newConfig2D, + const Config1D_t *newConfig1D, + const ConfigCommon_t *newCommon); + +/** + * @brief Check if the current frame triggers the internal 2D capture condition + * + * Evaluates the specified TriggerRoi region using either Max or Average + * temperature against the TriggerTemperatureThreshold. + * + * @param input Raw thermal image array + * @return 1 if trigger condition is met, 0 if not met, < 0 on error. + */ +int8_t Preprocess_CheckInternalTrigger2D(const RawImageBuffer_t *input); + +#ifdef __cplusplus +} +#endif + +#endif /* QDX_PREPROCESS_H */ diff --git a/prj/middle/QDXnetworkStack/qdx_protocol.c b/prj/middle/QDXnetworkStack/qdx_protocol.c new file mode 100644 index 0000000..cbc6992 --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_protocol.c @@ -0,0 +1,156 @@ +/** + * @file qdx_protocol.c + * @brief Communication Protocol 2.0 Utility Implementations + */ + +#include "qdx_protocol.h" +#include + +/* ============================================================ + * Shift-Safe Serialization (Little-Endian) + * ============================================================ */ + +void qdx_write_u16_le(uint8_t *buf, uint16_t val) { + buf[0] = (uint8_t)(val & 0xFF); + buf[1] = (uint8_t)((val >> 8) & 0xFF); +} + +void qdx_write_u32_le(uint8_t *buf, uint32_t val) { + buf[0] = (uint8_t)(val & 0xFF); + buf[1] = (uint8_t)((val >> 8) & 0xFF); + buf[2] = (uint8_t)((val >> 16) & 0xFF); + buf[3] = (uint8_t)((val >> 24) & 0xFF); +} + +uint16_t qdx_read_u16_le(const uint8_t *buf) { + return (uint16_t)(buf[0] | (buf[1] << 8)); +} + +uint32_t qdx_read_u32_le(const uint8_t *buf) { + /* 显式转型防止高位字节的符号位扩展 */ + return ((uint32_t)buf[0]) | ((uint32_t)buf[1] << 8) | + ((uint32_t)buf[2] << 16) | ((uint32_t)buf[3] << 24); +} + +/* ============================================================ + * CRC16-MODBUS Checksum (Polynomial: 0xA001, Init: 0xFFFF) + * ============================================================ */ +uint16_t qdx_crc16_modbus(const uint8_t *data, int len) { + uint16_t crc = 0xFFFF; + for (int i = 0; i < len; i++) { + crc ^= data[i]; + for (int j = 0; j < 8; j++) { + if (crc & 0x0001) { + crc >>= 1; + crc ^= 0xA001; + } else { + crc >>= 1; + } + } + } + return crc; +} + +/* ============================================================ + * Build Frame (Header + TLV + Payload + CRC16) + * Uses strict byte shifting to prevent unaligned struct access on MCU. + * ============================================================ */ +int qdx_build_frame(uint8_t *buf, uint8_t msg_class, uint8_t tlv_type, + const uint8_t *payload, uint16_t payload_len, + uint16_t dev_id, uint16_t seq, uint32_t timestamp, + uint8_t flags) { + + flags |= FLAG_LAST_FRAGMENT; + uint16_t total_len = HEADER_SIZE + TLV_HEADER_SIZE + payload_len + CRC_SIZE; + + /* 1. Fill FrameHeader (16 bytes) safely */ + qdx_write_u16_le(buf + 0, PROTO_MAGIC); /* Magic */ + buf[2] = PROTO_VERSION; /* Version */ + qdx_write_u16_le(buf + 3, total_len); /* Length */ + qdx_write_u16_le(buf + 5, seq); /* Sequence */ + qdx_write_u32_le(buf + 7, timestamp); /* Timestamp */ + buf[11] = 0x01; /* Source = MCU (0x01) */ + qdx_write_u16_le(buf + 12, dev_id); /* DevID */ + buf[14] = msg_class; /* Class */ + buf[15] = flags; /* Flags */ + + /* 2. Fill TLV Header (3 bytes) safely */ + buf[16] = tlv_type; /* TLV Type */ + qdx_write_u16_le(buf + 17, payload_len); /* TLV Length */ + + /* 3. Copy Payload(使用 memmove 防止 payload 与 buf 重叠时的未定义行为) */ + if (payload && payload_len > 0) { + memmove(buf + HEADER_SIZE + TLV_HEADER_SIZE, payload, payload_len); + } + + /* 4. Append CRC16 */ + uint16_t crc = qdx_crc16_modbus(buf, total_len - CRC_SIZE); + qdx_write_u16_le(buf + total_len - CRC_SIZE, crc); + + return total_len; +} + +/* ============================================================ + * In-Place Frame Build (Header + CRC only, payload already in place) + * 用于零拷贝场景:payload(含 TLV + 数据)已填充在 buf[HEADER_SIZE] 处, + * 本函数仅写入 16 字节帧头并在尾部追加 CRC16。 + * ============================================================ */ +int qdx_build_frame_inplace(uint8_t *buf, uint8_t msg_class, + uint16_t payload_len, uint16_t dev_id, uint16_t seq, + uint32_t timestamp, uint8_t flags) { + + flags |= FLAG_LAST_FRAGMENT; + uint16_t total_len = HEADER_SIZE + payload_len + CRC_SIZE; + + /* 填写 16 字节帧头 */ + qdx_write_u16_le(buf + 0, PROTO_MAGIC); + buf[2] = PROTO_VERSION; + qdx_write_u16_le(buf + 3, total_len); + qdx_write_u16_le(buf + 5, seq); + qdx_write_u32_le(buf + 7, timestamp); + buf[11] = 0x01; /* Source = MCU */ + qdx_write_u16_le(buf + 12, dev_id); + buf[14] = msg_class; + buf[15] = flags; + + /* payload 已在 buf[16..16+payload_len-1],无需拷贝 */ + + /* 追加 CRC16 */ + uint16_t crc = qdx_crc16_modbus(buf, total_len - CRC_SIZE); + qdx_write_u16_le(buf + total_len - CRC_SIZE, crc); + + return total_len; +} + +/* ============================================================ + * Build Fragmented Frame (Header + Chunk + CRC16, NO TLV) + * ============================================================ */ +int qdx_build_fragment_frame(uint8_t *buf, uint8_t msg_class, + const uint8_t *chunk, uint16_t chunk_len, + uint16_t dev_id, uint16_t seq, uint32_t timestamp, + uint8_t flags) { + + uint16_t total_len = HEADER_SIZE + chunk_len + CRC_SIZE; + + /* 1. Fill FrameHeader (16 bytes) safely */ + qdx_write_u16_le(buf + 0, PROTO_MAGIC); + buf[2] = PROTO_VERSION; + qdx_write_u16_le(buf + 3, total_len); + qdx_write_u16_le(buf + 5, seq); + qdx_write_u32_le(buf + 7, timestamp); + buf[11] = 0x01; /* Source MCU */ + qdx_write_u16_le(buf + 12, dev_id); + buf[14] = msg_class; + buf[15] = flags; + + /* 2. Copy Payload Chunk(使用 memmove 应对潜在重叠) */ + if (chunk && chunk_len > 0) { + memmove(buf + HEADER_SIZE, chunk, chunk_len); + } + + /* 3. Append CRC16 */ + uint16_t crc = qdx_crc16_modbus(buf, total_len - CRC_SIZE); + qdx_write_u16_le(buf + total_len - CRC_SIZE, crc); + + return total_len; +} diff --git a/prj/middle/QDXnetworkStack/qdx_protocol.h b/prj/middle/QDXnetworkStack/qdx_protocol.h new file mode 100644 index 0000000..e3eb7ea --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_protocol.h @@ -0,0 +1,336 @@ +/** + * @file qdx_protocol.h + * @brief Communication Protocol 2.0 Structures and Constants + * + * Platform-independent header for CH32 MCU and other systems. + * All structures use 1-byte alignment. Focuses on safe uint8_t + * serialization and avoiding hardware faults from unaligned access. + */ + +#ifndef QDX_PROTOCOL_H +#define QDX_PROTOCOL_H + +#include + +/* ============================================================ + * Protocol Constants + * ============================================================ */ +#define PROTO_MAGIC 0x55AA /* Frame Header Magic */ +#define PROTO_VERSION 0x20 /* Protocol Version v2.0 */ + +/* Message Classes (Class) */ +#define CLASS_CONTROL 0x01 /* Configuration / Control */ +#define CLASS_DATA 0x02 /* Real-time Data Report */ +#define CLASS_RESPONSE 0x03 /* ACK / NACK / Error */ +#define CLASS_SYSTEM 0x04 /* Handshake / Heartbeat / Sync */ + +/* TLV Types */ +#define TYPE_HANDSHAKE 0x01 +#define TYPE_HEARTBEAT 0x02 +#define TYPE_SYNC_TIME 0x03 +#define TYPE_DEVID_ASSIGN 0x05 +#define TYPE_TEMP_FRAME 0x10 +#define TYPE_RAW_FRAME 0x11 +#define TYPE_CONFIG_COMMON 0x20 +#define TYPE_CONFIG_2D 0x22 +#define TYPE_CONFIG_1D 0x23 +#define TYPE_ACK_PAYLOAD 0x30 +#define TYPE_DETECTION_RESULT 0x40 + +/* Flags */ +#define FLAG_PRIORITY_MASK 0x03 +#define FLAG_COMPRESSED 0x04 +#define FLAG_ENCRYPTED 0x08 +#define FLAG_ACK_REQ 0x10 +#define FLAG_LAST_FRAGMENT 0x20 + +/* Frame Structure Sizes */ +#define HEADER_SIZE 16 /* FrameHeader_t size */ +#define TLV_HEADER_SIZE 3 /* TLV_t size (Type + Length) */ +#define CRC_SIZE 2 /* CRC16 size */ + +/* Fragmentation limit */ +#define MAX_FRAGMENT_PAYLOAD 1400 + +/* Error Codes */ +#define ERR_NONE 0x0000 +#define ERR_CRC 0x1001 +#define ERR_VERSION 0x1002 +#define ERR_LENGTH 0x1003 +#define ERR_AUTH 0x2001 +#define ERR_BUSY 0x2002 +#define ERR_DEV_ID_CONFLICT 0x2003 +#define ERR_PARAM 0x3001 + +/* ============================================================ + * Internal Protocol Structures (Packed to 1 byte) + * ============================================================ */ + +#pragma pack(push, 1) + +/** + * @brief Frame Header (16 bytes) + */ +typedef struct { + uint16_t Magic; + uint8_t Version; + uint16_t Length; + uint16_t Sequence; + uint32_t Timestamp; + uint8_t Source; + uint16_t DevID; + uint8_t Class; + uint8_t Flags; +} FrameHeader_t; + +/** + * @brief TLV Header (3 bytes) + */ +typedef struct { + uint8_t Type; + uint16_t Length; +} TLV_t; + +/** + * @brief Handshake (46 bytes) + */ +typedef struct { + uint16_t ProtocolVersion; + uint8_t DeviceUUID[16]; + uint8_t AuthToken[16]; + char HardwareVersion[8]; + char FirmwareVersion[8]; + uint32_t Capabilities; +} Handshake_t; + +/** + * @brief Heartbeat (6 bytes) + */ +typedef struct { + uint32_t UpTime; + uint8_t CpuLoad; + uint8_t MemUsage; +} Heartbeat_t; + +/** + * @brief ACK Payload (5 bytes) + */ +typedef struct { + uint16_t AckSeq; + uint8_t Status; + uint16_t ErrorCode; +} Ack_t; + +/** + * @brief Device ID Assignment (4 bytes) + */ +typedef struct { + uint16_t NewDevID; + uint16_t Reserved; +} DevIDAssignment_t; + +/** + * @brief Temperature Frame Header (18 bytes) + */ +typedef struct { + uint32_t FrameNumber; + uint16_t Width; + uint16_t Height; + int16_t MinTemp; + int16_t MaxTemp; + int16_t AvgTemp; + int16_t RoiTemp; + uint8_t FrameType; + uint8_t Status; + uint8_t Is2D; + uint8_t Reserved; +} TemperatureFrameHeader_t; + +/** + * @brief 1D Temperature Point (4 bytes) + */ +typedef struct { + uint16_t TimeOffset; + uint16_t Temperature; +} TempPoint1D_t; + +/** + * @brief Detection Result (8 bytes) + */ +typedef struct { + uint32_t FrameNumber; + uint8_t Result; + uint8_t Reserved[3]; +} DetectionResult_t; + +/** + * @brief Common Configuration + */ +typedef struct { + char PipelineId[16]; + uint8_t PipelineType; + uint8_t WorkMode; + uint8_t ConfigTag; + uint8_t StrictnessLevel; + uint8_t IsCustomMode; + uint8_t Reserved[2]; +} ConfigCommon_t; + +/** + * @brief 2D Configuration + */ +typedef struct { + uint8_t Enabled; + uint8_t IsLive; + uint16_t DeviceId; + uint16_t Width; + uint16_t Height; + uint8_t Fps; + uint32_t Exposure; + uint8_t AutoExposure; + uint8_t MaskEnabled; + int16_t MaskThreshold; + uint16_t MaskWidth; + uint16_t MaskHeight; + int16_t Angle; + uint16_t TargetWidth; + uint16_t TargetHeight; + uint8_t TriggerMode; + uint8_t TriggerGpioLine; + uint16_t TriggerDelayMs; + uint8_t TriggerBurstCount; + uint16_t TriggerInternalIntervalMs; + int16_t TriggerTemperatureThreshold; + uint16_t TriggerDebounceIntervalMs; + uint8_t TriggerCondition; + uint16_t TriggerRoiX; + uint16_t TriggerRoiY; + uint16_t TriggerRoiW; + uint16_t TriggerRoiH; + uint16_t NGioDelay; + uint8_t OutputGpioLine; + uint8_t AlarmGpioLine; + uint16_t AlarmHoldMs; + uint8_t StoreNgImagesOnly; + uint8_t TrainingEnabled; + uint16_t TrainingSampleThreshold; + uint16_t ProcessingTimeoutMs; + uint8_t MaxProcessingQueueSize; + uint8_t Reserved; +} Config2D_t; + +/** + * @brief 1D Configuration + */ +typedef struct { + uint8_t Enabled; + uint8_t RunMode; + uint8_t TriggerType; + uint16_t BufferSize; + int16_t TriggerTempLimit; + uint16_t StartPointsToRemove; + uint16_t ReferenceLength; + uint16_t HighTimerLimit; + uint16_t TimerCLimit; + uint8_t NgCountLimit; + uint16_t LSizeStart; + uint16_t RSizeStart; + uint16_t NGioDelay; + uint8_t OutputGpioLine; + uint8_t AlarmGpioLine; + uint16_t AlarmHoldMs; +} Config1D_t; + +#pragma pack(pop) + +/* ============================================================ + * Application Level Business Structures + * ============================================================ */ + +/** + * @brief Raw Image Buffer provided by capture module + */ +typedef struct { + uint16_t *pData; + uint16_t Width; + uint16_t Height; + uint32_t FrameNumber; +} RawImageBuffer_t; + +/** + * @brief Preprocessing result metadata + */ +typedef struct { + uint8_t *pValidData; + uint32_t DataLength; + uint16_t ValidWidth; + uint16_t ValidHeight; + int16_t MinTemp; + int16_t MaxTemp; + int16_t AvgTemp; + int16_t RoiTemp; + uint8_t Status; + uint32_t FrameNumber; +} PreprocessResult_t; + +/** + * @brief Buffer wrapper for Zero-Copy TCP packet building + */ +typedef struct { + uint8_t *pBuffer; + uint32_t TotalCapacity; + uint32_t HeadOffset; /* Reserved header space for envelope */ + uint32_t ValidPayloadLen; +} TcpTxBuffer_t; + +/* System global config hook types */ +typedef void (*ConfigUpdateCallback_t)(const ConfigCommon_t *common, + const Config2D_t *cfg2d, + const Config1D_t *cfg1d); +typedef void (*DetectionResultCallback_t)(uint32_t frameNumber, + uint8_t resultStatus); + +/* ============================================================ + * Protocol Utility Function Declarations + * ============================================================ */ + +/* Calculate Modbus CRC16 */ +uint16_t qdx_crc16_modbus(const uint8_t *data, int len); + +/* Shift-safe write: 16-bit little-endian */ +void qdx_write_u16_le(uint8_t *buf, uint16_t val); + +/* Shift-safe write: 32-bit little-endian */ +void qdx_write_u32_le(uint8_t *buf, uint32_t val); + +/* Shift-safe read: 16-bit little-endian */ +uint16_t qdx_read_u16_le(const uint8_t *buf); + +/* Shift-safe read: 32-bit little-endian */ +uint32_t qdx_read_u32_le(const uint8_t *buf); + +/** + * @brief Build a complete protocol frame using safe byte shifts. + */ +int qdx_build_frame(uint8_t *buf, uint8_t msg_class, uint8_t tlv_type, + const uint8_t *payload, uint16_t payload_len, + uint16_t dev_id, uint16_t seq, uint32_t timestamp, + uint8_t flags); + +/** + * @brief In-place frame build: 仅填写帧头并追加 CRC,不拷贝 payload。 + * 用于零拷贝场景,payload(含 TLV)已在 buf[HEADER_SIZE] 处就位。 + */ +int qdx_build_frame_inplace(uint8_t *buf, uint8_t msg_class, + uint16_t payload_len, uint16_t dev_id, uint16_t seq, + uint32_t timestamp, uint8_t flags); + +/** + * @brief Build a fragmented payload frame (No TLV wrapper). + */ +int qdx_build_fragment_frame(uint8_t *buf, uint8_t msg_class, + const uint8_t *chunk, uint16_t chunk_len, + uint16_t dev_id, uint16_t seq, uint32_t timestamp, + uint8_t flags); + +#endif /* QDX_PROTOCOL_H */ diff --git a/prj/middle/QDXnetworkStack/qdx_tcp_logic.c b/prj/middle/QDXnetworkStack/qdx_tcp_logic.c new file mode 100644 index 0000000..0a5e327 --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_tcp_logic.c @@ -0,0 +1,694 @@ +/** + * @file qdx_tcp_logic.c + * @brief TCP Network Logic Implementation for MCU + */ + +#include "qdx_tcp_logic.h" +#include "qdx_port.h" +#include +#include +#include + +/* ============================================================ + * Internal State & Configuration Cache + * ============================================================ */ + +#define RECV_BUF_SIZE 2048 +#define MAX_FRAGMENT_PAYLOAD 1400 +#define HEARTBEAT_INTERVAL_MS 2000 +#define SERVER_TIMEOUT_MS 6000 +#define RECONNECT_DELAY_MS 3000 + +typedef struct { + qdx_socket_t sock; + uint32_t last_activity_ms; + uint32_t last_heartbeat_ms; + uint32_t last_reconnect_ms; + uint16_t sequence; + uint8_t is_connected; + uint8_t is_running; + const char *label; + uint8_t recv_buffer[RECV_BUF_SIZE * 2]; + uint32_t recv_len; +} TcpStreamCtx_t; + +static struct { + uint8_t uuid[16]; + uint8_t auth_token[16]; + uint16_t dev_id; + int32_t pending_new_dev_id; + uint32_t frame_count; + + TcpStreamCtx_t control_stream; + TcpStreamCtx_t data_stream; + + qdx_mutex_t config_mutex; + uint8_t has_valid_config; + ConfigCommon_t cached_common; + Config2D_t cached_cfg2d; + Config1D_t cached_cfg1d; + + ConfigUpdateCallback_t config_cb; + DetectionResultCallback_t detect_cb; + TempFrameRequestCallback_t temp_req_cb; +} g_TcpLogic; + +/* Server endpoint prototype - user would configure these, but we map to demo + * defaults */ +static const char *SERVER_IP = "127.0.0.1"; +static const uint16_t CONTROL_PORT = 5511; +static const uint16_t DATA_PORT = 5512; + +/* ============================================================ + * Internal Helpers + * ============================================================ */ + +static void tcp_stream_init(TcpStreamCtx_t *ctx, const char *label) { + memset(ctx, 0, sizeof(TcpStreamCtx_t)); + ctx->label = label; +} + +static void tcp_stream_disconnect(TcpStreamCtx_t *ctx) { + ctx->is_connected = 0; + if (ctx->sock) { + qdx_port_tcp_close(ctx->sock); + ctx->sock = NULL; + } +} + +static int8_t tcp_stream_connect(TcpStreamCtx_t *ctx, const char *ip, + uint16_t port) { + ctx->sock = qdx_port_tcp_connect(ip, port); + if (ctx->sock == NULL) + return -1; + + ctx->is_connected = 1; + ctx->last_activity_ms = qdx_port_get_tick_ms(); + ctx->last_heartbeat_ms = ctx->last_activity_ms; + ctx->recv_len = 0; + return 0; +} + +static int32_t tcp_send_frame(TcpStreamCtx_t *ctx, uint8_t msg_class, + uint8_t tlv_type, const uint8_t *payload, + uint16_t payload_len, uint8_t flags) { + if (!ctx->is_connected || ctx->sock == NULL) + return -1; + + /* Max frame buffer for generic small control/heartbeat messages. + Note: Images use BuildAndSendTemperatureFrame instead of this. */ + uint8_t buffer[1024]; + if (HEADER_SIZE + TLV_HEADER_SIZE + payload_len + CRC_SIZE > sizeof(buffer)) { + return -1; /* Too large for generic send */ + } + + uint16_t seq = ctx->sequence++; + int frame_len = + qdx_build_frame(buffer, msg_class, tlv_type, payload, payload_len, + g_TcpLogic.dev_id, seq, qdx_port_get_tick_ms(), flags); + + int32_t sent = qdx_port_tcp_send(ctx->sock, buffer, frame_len); + if (sent < 0) { + tcp_stream_disconnect(ctx); + return -1; + } + return sent; +} + +static void tcp_send_handshake(TcpStreamCtx_t *ctx) { + uint8_t payload[54]; + memset(payload, 0, sizeof(payload)); + qdx_write_u16_le(payload + 0, 0x0200); + memcpy(payload + 2, g_TcpLogic.uuid, 16); + memcpy(payload + 18, g_TcpLogic.auth_token, 16); + /* Safe string copy without relying on strncpy platform behavior */ + const char *hw = "V1.0"; + const char *fw = "V2.0"; + for (int i = 0; i < 8 && hw[i]; i++) + payload[34 + i] = hw[i]; + for (int i = 0; i < 8 && fw[i]; i++) + payload[42 + i] = fw[i]; + qdx_write_u32_le(payload + 50, 0x07); + + tcp_send_frame(ctx, CLASS_SYSTEM, TYPE_HANDSHAKE, payload, sizeof(payload), + FLAG_ACK_REQ); +} + +static void tcp_send_heartbeat(TcpStreamCtx_t *ctx) { + uint8_t payload[6]; + qdx_write_u32_le(payload + 0, qdx_port_get_tick_ms()); + payload[4] = 10; /* Placeholder CpuLoad */ + payload[5] = 20; /* Placeholder MemUsage */ + + tcp_send_frame(ctx, CLASS_SYSTEM, TYPE_HEARTBEAT, payload, sizeof(payload), + 0); +} + +static void tcp_send_ack(TcpStreamCtx_t *ctx, uint16_t ack_seq, uint8_t status, + uint16_t error_code) { + uint8_t payload[5]; + qdx_write_u16_le(payload + 0, ack_seq); + payload[2] = status; + qdx_write_u16_le(payload + 3, error_code); + + tcp_send_frame(ctx, CLASS_RESPONSE, TYPE_ACK_PAYLOAD, payload, + sizeof(payload), 0); +} + +/* ============================================================ + * Receiving and Parsing + * ============================================================ */ + +static void qdx_deserialize_config_common(ConfigCommon_t *cfg, + const uint8_t *val) { + /* PipelineId: 16 字节字符数组,逐字节拷贝 */ + for (int i = 0; i < 16; i++) + cfg->PipelineId[i] = (char)val[i]; + cfg->PipelineType = val[16]; + cfg->WorkMode = val[17]; + cfg->ConfigTag = val[18]; + cfg->StrictnessLevel = val[19]; + cfg->IsCustomMode = val[20]; + cfg->Reserved[0] = val[21]; + cfg->Reserved[1] = val[22]; +} + +static void qdx_deserialize_config2d(Config2D_t *cfg, const uint8_t *val) { + cfg->Enabled = val[0]; + cfg->IsLive = val[1]; + cfg->DeviceId = qdx_read_u16_le(val + 2); + cfg->Width = qdx_read_u16_le(val + 4); + cfg->Height = qdx_read_u16_le(val + 6); + cfg->Fps = val[8]; + cfg->Exposure = qdx_read_u32_le(val + 9); + cfg->AutoExposure = val[13]; + cfg->MaskEnabled = val[14]; + cfg->MaskThreshold = (int16_t)qdx_read_u16_le(val + 15); + cfg->MaskWidth = qdx_read_u16_le(val + 17); + cfg->MaskHeight = qdx_read_u16_le(val + 19); + cfg->Angle = (int16_t)qdx_read_u16_le(val + 21); + cfg->TargetWidth = qdx_read_u16_le(val + 23); + cfg->TargetHeight = qdx_read_u16_le(val + 25); + cfg->TriggerMode = val[27]; + cfg->TriggerGpioLine = val[28]; + cfg->TriggerDelayMs = qdx_read_u16_le(val + 29); + cfg->TriggerBurstCount = val[31]; + cfg->TriggerInternalIntervalMs = qdx_read_u16_le(val + 32); + cfg->TriggerTemperatureThreshold = (int16_t)qdx_read_u16_le(val + 34); + cfg->TriggerDebounceIntervalMs = qdx_read_u16_le(val + 36); + cfg->TriggerCondition = val[38]; + cfg->TriggerRoiX = qdx_read_u16_le(val + 39); + cfg->TriggerRoiY = qdx_read_u16_le(val + 41); + cfg->TriggerRoiW = qdx_read_u16_le(val + 43); + cfg->TriggerRoiH = qdx_read_u16_le(val + 45); + cfg->NGioDelay = qdx_read_u16_le(val + 47); + cfg->OutputGpioLine = val[49]; + cfg->AlarmGpioLine = val[50]; + cfg->AlarmHoldMs = qdx_read_u16_le(val + 51); + cfg->StoreNgImagesOnly = val[53]; + cfg->TrainingEnabled = val[54]; + cfg->TrainingSampleThreshold = qdx_read_u16_le(val + 55); + cfg->ProcessingTimeoutMs = qdx_read_u16_le(val + 57); + cfg->MaxProcessingQueueSize = val[59]; + cfg->Reserved = val[60]; +} + +static void qdx_deserialize_config1d(Config1D_t *cfg, const uint8_t *val) { + cfg->Enabled = val[0]; + cfg->RunMode = val[1]; + cfg->TriggerType = val[2]; + cfg->BufferSize = qdx_read_u16_le(val + 3); + cfg->TriggerTempLimit = (int16_t)qdx_read_u16_le(val + 5); + cfg->StartPointsToRemove = qdx_read_u16_le(val + 7); + cfg->ReferenceLength = qdx_read_u16_le(val + 9); + cfg->HighTimerLimit = qdx_read_u16_le(val + 11); + cfg->TimerCLimit = qdx_read_u16_le(val + 13); + cfg->NgCountLimit = val[15]; + cfg->LSizeStart = qdx_read_u16_le(val + 16); + cfg->RSizeStart = qdx_read_u16_le(val + 18); + cfg->NGioDelay = qdx_read_u16_le(val + 20); + cfg->OutputGpioLine = val[22]; + cfg->AlarmGpioLine = val[23]; + cfg->AlarmHoldMs = qdx_read_u16_le(val + 24); +} + +static void parse_and_dispatch_tlv(TcpStreamCtx_t *ctx, const uint8_t *packet, + uint16_t pkt_len) { + uint16_t hdr_seq = qdx_read_u16_le(packet + 5); + uint8_t hdr_flags = packet[15]; + + /* TLV Data starts after header (16 bytes) */ + int offset = HEADER_SIZE; + int payload_len = pkt_len - HEADER_SIZE - CRC_SIZE; + int parsed_len = 0; + + uint8_t cfg_updated = 0; + + //printf("\n[DEBUG][%s] 收到 TLV 包: Seq=%d, PayloadLen=%d\n", ctx->label, + // hdr_seq, payload_len); + + while (parsed_len <= payload_len - 3) { + uint8_t type = packet[offset]; + uint16_t len = qdx_read_u16_le(packet + offset + 1); + + //printf("[DEBUG][%s] -> 解析 TLV: Type=0x%02X, Len=%d\n", ctx->label, type, + //len); + + if (parsed_len + 3 + len > payload_len) { + //printf("[DEBUG][%s] ! 结构错误: 剩余长度不足 (需 %d, 剩 %d)\n", + //ctx->label, len, payload_len - parsed_len - 3); + break; /* Malformed */ + } + + const uint8_t *value = packet + offset + 3; + + switch (type) { + case TYPE_DEVID_ASSIGN: { + if (len >= sizeof(DevIDAssignment_t)) { + uint16_t new_id = qdx_read_u16_le(value); + g_TcpLogic.pending_new_dev_id = new_id; + tcp_send_ack(ctx, hdr_seq, 0, 0); + } + break; + } + case TYPE_CONFIG_COMMON: { + if (len >= sizeof(ConfigCommon_t)) { + qdx_port_mutex_lock(g_TcpLogic.config_mutex); + qdx_deserialize_config_common(&g_TcpLogic.cached_common, value); + g_TcpLogic.has_valid_config = 1; + cfg_updated = 1; + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + } + break; + } + case TYPE_CONFIG_2D: { + if (len >= sizeof(Config2D_t)) { + //printf("[DEBUG][%s] * 解析 Config2D 成功\n", ctx->label); + qdx_port_mutex_lock(g_TcpLogic.config_mutex); + qdx_deserialize_config2d(&g_TcpLogic.cached_cfg2d, value); + g_TcpLogic.has_valid_config = 1; /* 任意配置到达即标记有效 */ + cfg_updated = 1; + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + } else { + //printf("[DEBUG][%s] ! Config2D 长度不对: len=%d, sizeof=%d\n", + //ctx->label, len, (int)sizeof(Config2D_t)); + } + break; + } + case TYPE_CONFIG_1D: { + if (len >= sizeof(Config1D_t)) { + qdx_port_mutex_lock(g_TcpLogic.config_mutex); + qdx_deserialize_config1d(&g_TcpLogic.cached_cfg1d, value); + g_TcpLogic.has_valid_config = 1; /* 任意配置到达即标记有效 */ + cfg_updated = 1; + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + } + break; + } + case TYPE_TEMP_FRAME: { + if (g_TcpLogic.temp_req_cb) { + /* If payload length is >= 18 (TemperatureFrameHeader_t), we can peek + at Is2D. Otherwise we pass 0 or a default value. For now let's pass + an indicator if Is2D is set. */ + uint8_t is2d = 0; + if (len >= 18) { + is2d = value[18]; /* index 18 in TemperatureFrameHeader_t is Is2D */ + } + g_TcpLogic.temp_req_cb(is2d); + } + break; + } + case TYPE_DETECTION_RESULT: { + if (len >= sizeof(DetectionResult_t) && g_TcpLogic.detect_cb) { + uint32_t frame_num = qdx_read_u32_le(value); + uint8_t result_status = value[4]; + g_TcpLogic.detect_cb(frame_num, result_status); + } + break; + } + default: + break; + } + + offset += (3 + len); + parsed_len += (3 + len); + } + + if (cfg_updated && g_TcpLogic.config_cb && g_TcpLogic.has_valid_config) { + /* Safely trigger callback. Passing pointers to cached config is ok + during the context of this thread, but user must copy if they + dispatch to another task. */ + qdx_port_mutex_lock(g_TcpLogic.config_mutex); + g_TcpLogic.config_cb(&g_TcpLogic.cached_common, &g_TcpLogic.cached_cfg2d, + &g_TcpLogic.cached_cfg1d); + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + } + + if (hdr_flags & FLAG_ACK_REQ) { + tcp_send_ack(ctx, hdr_seq, 0, 0); + } +} + +static void tcp_process_rx_buffer(TcpStreamCtx_t *ctx) { + while (ctx->recv_len >= HEADER_SIZE) { + /* 1. Search for Magic 0x55AA */ + int start_idx = -1; + for (uint32_t i = 0; i <= ctx->recv_len - 2; i++) { + if (ctx->recv_buffer[i] == 0xAA && ctx->recv_buffer[i + 1] == 0x55) { + start_idx = i; + break; + } + } + + if (start_idx == -1) { + ctx->recv_buffer[0] = ctx->recv_buffer[ctx->recv_len - 1]; + ctx->recv_len = 1; + break; + } + + if (start_idx > 0) { + /* 缓冲区内部左移,源与目标重叠,必须使用 memmove */ + memmove(ctx->recv_buffer, ctx->recv_buffer + start_idx, + ctx->recv_len - start_idx); + ctx->recv_len -= start_idx; + if (ctx->recv_len < HEADER_SIZE) + break; + } + + uint8_t version = ctx->recv_buffer[2]; + uint16_t length = qdx_read_u16_le(ctx->recv_buffer + 3); + + if (version != PROTO_VERSION || length < HEADER_SIZE + CRC_SIZE) { + /* 丢弃 Magic 标记,缓冲区内部左移 2 字节 */ + //printf("\n[DEBUG][%s] 错误: Header 验证失败! Version=0x%02X " + //"(Expected=0x%02X), Length=%d\n", + //ctx->label, version, PROTO_VERSION, length); + memmove(ctx->recv_buffer, ctx->recv_buffer + 2, ctx->recv_len - 2); + ctx->recv_len -= 2; + continue; + } + + if (length > sizeof(ctx->recv_buffer)) { + /* Frame too large, drop entirely */ + //printf("\n[DEBUG][%s] 错误: 帧长度超限 (length=%d, max=%d)\n", ctx->label, + //length, (int)sizeof(ctx->recv_buffer)); + ctx->recv_len = 0; + break; + } + + if (ctx->recv_len < length) { + break; /* Need more data */ + } + + /* 2. Validate CRC */ + uint16_t received_crc = qdx_read_u16_le(ctx->recv_buffer + length - 2); + uint16_t calculated_crc = qdx_crc16_modbus(ctx->recv_buffer, length - 2); + + if (received_crc == calculated_crc) { + /* 3. Dispatch */ + parse_and_dispatch_tlv(ctx, ctx->recv_buffer, length); + } else { + //printf("\n[DEBUG][%s] 错误: CRC 校验失败! Calc=0x%04X, Recv=0x%04X " + //"(Len=%d)\n", + //ctx->label, calculated_crc, received_crc, length); + } + + /* 4. 移除已处理帧(缓冲区内部左移,必须 memmove) */ + memmove(ctx->recv_buffer, ctx->recv_buffer + length, + ctx->recv_len - length); + ctx->recv_len -= length; + } +} + +static void recv_thread_entry(void *arg) { + TcpStreamCtx_t *ctx = (TcpStreamCtx_t *)arg; + + while (ctx->is_running) { + if (!ctx->is_connected) { + qdx_port_delay_ms(100); + continue; + } + + /* Leave space for maximum TCP MTU read */ + if (sizeof(ctx->recv_buffer) - ctx->recv_len > 0) { + int32_t bytes = + qdx_port_tcp_recv(ctx->sock, ctx->recv_buffer + ctx->recv_len, + sizeof(ctx->recv_buffer) - ctx->recv_len); + + if (bytes > 0) { + ctx->recv_len += bytes; + ctx->last_activity_ms = qdx_port_get_tick_ms(); + tcp_process_rx_buffer(ctx); + } else if (bytes < 0) { + /* Disconnected / Error */ + tcp_stream_disconnect(ctx); + } + } else { + /* Buffer completely full but no valid packet found. Prevent overflow + * lock. */ + ctx->recv_len = 0; + } + + qdx_port_delay_ms(10); + } +} + +/* ============================================================ + * Main Background Manager + * ============================================================ */ + +static void manager_thread_entry(void *arg) { + while (1) { + uint32_t now = qdx_port_get_tick_ms(); + + /* DevID Reassignment Handling */ + if (g_TcpLogic.pending_new_dev_id >= 0) { + g_TcpLogic.dev_id = (uint16_t)g_TcpLogic.pending_new_dev_id; + g_TcpLogic.pending_new_dev_id = -1; + + tcp_stream_disconnect(&g_TcpLogic.control_stream); + tcp_stream_disconnect(&g_TcpLogic.data_stream); + + g_TcpLogic.control_stream.last_reconnect_ms = 0; + g_TcpLogic.data_stream.last_reconnect_ms = 0; + qdx_port_delay_ms(500); + continue; + } + + /* Connection Management: Control Stream */ + if (!g_TcpLogic.control_stream.is_connected) { + if (now - g_TcpLogic.control_stream.last_reconnect_ms > + RECONNECT_DELAY_MS) { + if (tcp_stream_connect(&g_TcpLogic.control_stream, SERVER_IP, + CONTROL_PORT) == 0) { + tcp_send_handshake(&g_TcpLogic.control_stream); + } + g_TcpLogic.control_stream.last_reconnect_ms = qdx_port_get_tick_ms(); + } + } + + /* Connection Management: Data Stream */ + if (!g_TcpLogic.data_stream.is_connected) { + if (now - g_TcpLogic.data_stream.last_reconnect_ms > RECONNECT_DELAY_MS) { + if (tcp_stream_connect(&g_TcpLogic.data_stream, SERVER_IP, DATA_PORT) == + 0) { + tcp_send_handshake(&g_TcpLogic.data_stream); + } + g_TcpLogic.data_stream.last_reconnect_ms = qdx_port_get_tick_ms(); + } + } + + /* Heartbeat & Timeout checks */ + if (g_TcpLogic.control_stream.is_connected) { + if (now - g_TcpLogic.control_stream.last_heartbeat_ms > + HEARTBEAT_INTERVAL_MS) { + tcp_send_heartbeat(&g_TcpLogic.control_stream); + g_TcpLogic.control_stream.last_heartbeat_ms = now; + } + } + + if (g_TcpLogic.data_stream.is_connected) { + if (now - g_TcpLogic.data_stream.last_heartbeat_ms > + HEARTBEAT_INTERVAL_MS) { + tcp_send_heartbeat(&g_TcpLogic.data_stream); + g_TcpLogic.data_stream.last_heartbeat_ms = now; + } + } + + qdx_port_delay_ms(100); + } +} + +/* ============================================================ + * Public API Implementations + * ============================================================ */ + +int8_t TcpLogic_Init(const uint8_t *deviceUUID, const uint8_t *authToken) { + memset(&g_TcpLogic, 0, sizeof(g_TcpLogic)); + + if (deviceUUID) + memcpy(g_TcpLogic.uuid, deviceUUID, 16); + if (authToken) + memcpy(g_TcpLogic.auth_token, authToken, 16); + + /* Default DevID = 101 */ + g_TcpLogic.dev_id = 101; + g_TcpLogic.pending_new_dev_id = -1; + + g_TcpLogic.config_mutex = qdx_port_mutex_create(); + if (g_TcpLogic.config_mutex == NULL) + return -1; + + tcp_stream_init(&g_TcpLogic.control_stream, "Control"); + tcp_stream_init(&g_TcpLogic.data_stream, "Data"); + + return 0; +} + +void TcpLogic_Start(void) { + g_TcpLogic.control_stream.is_running = 1; + g_TcpLogic.data_stream.is_running = 1; + + qdx_port_thread_create("tcp_mgr", manager_thread_entry, NULL, 2048, 3); + qdx_port_thread_create("tcp_rx_c", recv_thread_entry, + &g_TcpLogic.control_stream, 2048, 4); + qdx_port_thread_create("tcp_rx_d", recv_thread_entry, &g_TcpLogic.data_stream, + 2048, 4); +} + +int8_t TcpLogic_GetLatestConfig(ConfigCommon_t *out_common, + Config2D_t *out_cfg2d, Config1D_t *out_cfg1d) { + if (!out_common || !out_cfg2d || !out_cfg1d) + return -2; + + qdx_port_mutex_lock(g_TcpLogic.config_mutex); + if (!g_TcpLogic.has_valid_config) { + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + return -1; + } + + memcpy(out_common, &g_TcpLogic.cached_common, sizeof(ConfigCommon_t)); + memcpy(out_cfg2d, &g_TcpLogic.cached_cfg2d, sizeof(Config2D_t)); + memcpy(out_cfg1d, &g_TcpLogic.cached_cfg1d, sizeof(Config1D_t)); + qdx_port_mutex_unlock(g_TcpLogic.config_mutex); + + return 0; +} + +void TcpLogic_RegisterConfigCallback(ConfigUpdateCallback_t cb) { + g_TcpLogic.config_cb = cb; +} + +void TcpLogic_RegisterDetectionCallback(DetectionResultCallback_t cb) { + g_TcpLogic.detect_cb = cb; +} + +void TcpLogic_RegisterTempFrameRequestCallback(TempFrameRequestCallback_t cb) { + g_TcpLogic.temp_req_cb = cb; +} + +/* ============================================================ + * Zero-Copy Frame Building & Fragmentation for Temperature Data + * ============================================================ */ + +int8_t +TcpLogic_BuildAndSendTemperatureFrame(TcpTxBuffer_t *io_buffer, + const PreprocessResult_t *processMeta, + uint8_t frameType, uint8_t is2D) { + + if (!g_TcpLogic.data_stream.is_connected || !io_buffer || !processMeta) + return -1; + if (io_buffer->ValidPayloadLen == 0) + return -2; + + g_TcpLogic.frame_count++; + + /* We need to prepend: TLV Header (3) + TemperatureFrameHeader_t (18) */ + uint32_t tlv_wrapper_len = TLV_HEADER_SIZE + sizeof(TemperatureFrameHeader_t); + + /* Ensure application left enough head room */ + if (io_buffer->HeadOffset < HEADER_SIZE + tlv_wrapper_len) { + return -3; /* Not enough offset space allocated by user memory pool */ + } + + /* Start writing right before the application payload */ + uint8_t *tlv_start = + io_buffer->pBuffer + io_buffer->HeadOffset - tlv_wrapper_len; + + /* 1. Fill TLV Header manually via shift */ + uint32_t tlv_value_len = + sizeof(TemperatureFrameHeader_t) + io_buffer->ValidPayloadLen; + tlv_start[0] = TYPE_TEMP_FRAME; + qdx_write_u16_le(tlv_start + 1, (uint16_t)tlv_value_len); + + /* 2. Fill TemperatureFrameHeader manually via shift to avoid alignment + * faults + */ + uint8_t *temp_hdr = tlv_start + TLV_HEADER_SIZE; + qdx_write_u32_le(temp_hdr + 0, processMeta->FrameNumber); + qdx_write_u16_le(temp_hdr + 4, processMeta->ValidWidth); + qdx_write_u16_le(temp_hdr + 6, processMeta->ValidHeight); + qdx_write_u16_le(temp_hdr + 8, (uint16_t)processMeta->MinTemp); + qdx_write_u16_le(temp_hdr + 10, (uint16_t)processMeta->MaxTemp); + qdx_write_u16_le(temp_hdr + 12, (uint16_t)processMeta->AvgTemp); + qdx_write_u16_le(temp_hdr + 14, (uint16_t)processMeta->RoiTemp); + temp_hdr[16] = frameType; + temp_hdr[17] = processMeta->Status; + temp_hdr[18] = is2D; + temp_hdr[19] = 0; /* Reserved */ + + /* Total payload length is the entire TLV block */ + uint32_t total_tlv_len = TLV_HEADER_SIZE + tlv_value_len; + + /* 3. Handle Fragmentation if necessary */ + if (total_tlv_len <= MAX_FRAGMENT_PAYLOAD) { + /* No fragmentation needed, build frame in place at the front */ + uint8_t *frame_start = tlv_start - HEADER_SIZE; + uint16_t seq = g_TcpLogic.data_stream.sequence++; + + int final_len = qdx_build_frame_inplace( + frame_start, CLASS_DATA, (uint16_t)total_tlv_len, g_TcpLogic.dev_id, + seq, qdx_port_get_tick_ms(), 0); + + int32_t sent = + qdx_port_tcp_send(g_TcpLogic.data_stream.sock, frame_start, final_len); + return (sent >= 0) ? 0 : -1; + } + + /* Fragmentation required. + Note: For zero-copy fragmentation, we send piece by piece. + We need an external buffer for each piece's frame header + CRC. + We can't easily prepend headers to later fragments inline. */ + + uint32_t offset = 0; + uint8_t frag_buf[HEADER_SIZE + MAX_FRAGMENT_PAYLOAD + CRC_SIZE]; + uint32_t frag_count = + (total_tlv_len + MAX_FRAGMENT_PAYLOAD - 1) / MAX_FRAGMENT_PAYLOAD; + + for (uint32_t i = 0; i < frag_count; i++) { + uint32_t chunk_len = total_tlv_len - offset; + if (chunk_len > MAX_FRAGMENT_PAYLOAD) + chunk_len = MAX_FRAGMENT_PAYLOAD; + + uint8_t flags = (i == frag_count - 1) ? FLAG_LAST_FRAGMENT : 0; + uint16_t seq = g_TcpLogic.data_stream.sequence++; + + /* We copy the chunk into frag_buf to append Header/CRC. + This involves ONE copy of the chunk, but it's small (1400 bytes at a + time), and ensures we don't need additional memory pools. */ + int frame_len = qdx_build_fragment_frame( + frag_buf, CLASS_DATA, tlv_start + offset, (uint16_t)chunk_len, + g_TcpLogic.dev_id, seq, qdx_port_get_tick_ms(), flags); + + int32_t sent = + qdx_port_tcp_send(g_TcpLogic.data_stream.sock, frag_buf, frame_len); + if (sent < 0) { + tcp_stream_disconnect(&g_TcpLogic.data_stream); + return -1; + } + + offset += chunk_len; + } + + return 0; +} diff --git a/prj/middle/QDXnetworkStack/qdx_tcp_logic.h b/prj/middle/QDXnetworkStack/qdx_tcp_logic.h new file mode 100644 index 0000000..f786e1a --- /dev/null +++ b/prj/middle/QDXnetworkStack/qdx_tcp_logic.h @@ -0,0 +1,112 @@ +/** + * @file qdx_tcp_logic.h + * @brief Zero-Copy TCP Network Logic and State Machine tailored for MCU + * + * Implements connection management (Dual Stream 5511/5512), + * packet handling, heartbeating, config caching, and callbacks. + */ + +#ifndef QDX_TCP_LOGIC_H +#define QDX_TCP_LOGIC_H + +#include "qdx_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Initialize the TCP logic module + * + * @param deviceUUID Provide standard UUID for the device. + * @param authToken Optional auth token for connections. + * @return 0 on success, < 0 on failure. + */ +int8_t TcpLogic_Init(const uint8_t *deviceUUID, const uint8_t *authToken); + +/** + * @brief Wait for and start non-blocking network connection attempts. + * + * It will spawn background threads for Control and Data streams + * connecting to the server. + */ +void TcpLogic_Start(void); + +/** + * @brief Encapsulate and send a temperature frame without generic memory copy. + * + * Uses the pre-filled `TcpTxBuffer_t` (containing image array) to prepend + * the required nested headers directly into the buffer offset. + * + * @param io_buffer The user-allocated buffer containing Image payload starting + * at HeadOffset + * @param processMeta Real-time analysis metadata for the image data + * @param frameType Frame type: 0=LIVE, 1=TRIGGER, 2=MASKED + * @param is2D 1 for 2D matrix, 0 for 1D array + * @return 0 successfully sent to transmission queue, < 0 if failed + */ +int8_t +TcpLogic_BuildAndSendTemperatureFrame(TcpTxBuffer_t *io_buffer, + const PreprocessResult_t *processMeta, + uint8_t frameType, uint8_t is2D); + +/** + * @brief Retrieves a distinct copy of the latest active configuration + * structure. + * + * Recommended for safe reads of configuration during offline or fallback + * scenarios. Requires pointers to pre-allocated Config* structures. + * + * @param out_common Required pointer to common config structure. + * @param out_cfg2d Required pointer to 2d config structure. + * @param out_cfg1d Required pointer to 1d config structure. + * @return 0 on success, -1 if no configuration has been stored or received. + */ +int8_t TcpLogic_GetLatestConfig(ConfigCommon_t *out_common, + Config2D_t *out_cfg2d, Config1D_t *out_cfg1d); + +/** + * @brief Register configuration parsing event callback. + * + * Fired immediately after the host sends a Configuration payload and it is + * safely cached to the internal registers. + * + * @param cb Callable function matching the interface + */ +void TcpLogic_RegisterConfigCallback(ConfigUpdateCallback_t cb); + +/** + * @brief Register remote decision consequence callback (e.g. Reject / Ok + * processing result). + * + * Fired shortly after the host finishes processing a sent 2D or 1D target + * frame. + * + * @param cb Callable function matching the interface + */ +void TcpLogic_RegisterDetectionCallback(DetectionResultCallback_t cb); + +/** + * @brief Callback for when host requests a temperature frame. + * + * Fired when the host sends a TYPE_TEMP_FRAME request (typically empty or + * carrying trigger context). The device should capture an image and reply by + * calling TcpLogic_BuildAndSendTemperatureFrame. + * + * @param is2dRequest Non-zero if request is specifically for 2D frame, zero if + * for 1D. + */ +typedef void (*TempFrameRequestCallback_t)(uint8_t is2dRequest); + +/** + * @brief Register host temperature frame request callback. + * + * @param cb Callable function matching the interface + */ +void TcpLogic_RegisterTempFrameRequestCallback(TempFrameRequestCallback_t cb); + +#ifdef __cplusplus +} +#endif + +#endif /* QDX_TCP_LOGIC_H */