diff --git a/bsp/hc32/README.md b/bsp/hc32/README.md index 57f03240a53..523387d7e16 100644 --- a/bsp/hc32/README.md +++ b/bsp/hc32/README.md @@ -3,15 +3,18 @@ HC32 系列 BSP 目前支持情况如下表所示: -| **BSP 文件夹名称** | **开发板名称** | -|:------------------------- |:------------------------- | +| **BSP 文件夹名称** | **开发板名称** | +|:------------------------- |:----------------------------- | | **F1 系列** | | +| **F3 系列** | | +| [ev_hc32f334_lqfp64](ev_hc32f334_lqfp64) | 小华 官方 EV_F334_LQ64 开发板 | | **F4 系列** | | -| [ev_hc32f460_lqfp100_v2](ev_hc32f460_lqfp100_v2) | 小华 官方 EV_F460_LQ100_V2 开发板 | -| [ev_hc32f4a0_lqfp176](ev_hc32f4a0_lqfp176) | 小华 官方 EV_F4A0_LQ176 开发板 | -| [ev_hc32f448_lqfp80](ev_hc32f448_lqfp80) | 小华 官方 EV_F448_LQ80 开发板 | -| [ev_hc32f472_lqfp100](ev_hc32f472_lqfp100) | 小华 官方 EV_F472_LQ100 开发板 | -| [lckfb-hc32f4a0-lqfp100](lckfb-hc32f4a0-lqfp100) | 立创开发板 天空星-HC32F4A0PITB | +| [ev_hc32f448_lqfp80](ev_hc32f448_lqfp80) | 小华 官方 EV_F448_LQ80 开发板 | +| [ev_hc32f460_lqfp100_v2](ev_hc32f460_lqfp100_v2) | 小华 官方 EV_F460_LQ100_V2 开发板 | +| [ev_hc32f472_lqfp100](ev_hc32f472_lqfp100) | 小华 官方 EV_F472_LQ100 开发板 | +| [ev_hc32f4a0_lqfp176](ev_hc32f4a0_lqfp176) | 小华 官方 EV_F4A0_LQ176 开发板 | +| [lckfb-hc32f4a0-lqfp100](lckfb-hc32f4a0-lqfp100) | 立创开发板 天空星-HC32F4A0PITB | +| [ev_hc32f4a8_lqfp176](ev_hc32f4a8_lqfp176) | 小华 官方 EV_F4A8_LQ176 开发板 | | **M1 系列** | | | **M4 系列** | | @@ -23,4 +26,3 @@ HC32 系列 BSP 目前支持情况如下表所示: | [外设驱动介绍](docs/HC32系列驱动介绍.md) | 讲解 HC32 系列 BSP 驱动的支持情况,以及如何利用驱动框架开发应用程序 | | **BSP 制作与提交** | **简介** | | [BSP 制作教程](docs/HC32系列BSP制作教程.md) | 讲解 HC32 系列 BSP 的制作方法 | - diff --git a/bsp/hc32/ev_hc32f334_lqfp64/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f334_lqfp64/.ci/attachconfig/ci.attachconfig.yml index 1ff7e77400f..84e83f68114 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f334_lqfp64/.ci/attachconfig/ci.attachconfig.yml @@ -1,7 +1,137 @@ +# ------ device CI ------ +devices.adc: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_USING_ADC2=y + - CONFIG_BSP_USING_ADC3=y + - CONFIG_BSP_ADC1_USING_DMA=y + - CONFIG_BSP_ADC2_USING_DMA=y + - CONFIG_BSP_ADC3_USING_DMA=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_CRC=y +devices.dac: + kconfig: + - CONFIG_BSP_USING_DAC=y + - CONFIG_BSP_USING_DAC1=y + - CONFIG_BSP_USING_DAC2=y +devices.flash: + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y devices.gpio: - kconfig: + kconfig: - CONFIG_BSP_USING_GPIO=y -devices.uart: +devices.hwtimer: + kconfig: + - CONFIG_BSP_USING_HWTIMER=y + - CONFIG_BSP_USING_TMRA_1=y +devices.i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1=y + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.mcan: + kconfig: + - CONFIG_BSP_USING_MCAN=y + - CONFIG_BSP_USING_MCAN1=y + - CONFIG_BSP_USING_MCAN2=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y + - CONFIG_BSP_USING_PWM_TMR4_1_OVH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OVL=y + - CONFIG_BSP_USING_PWM_TMR4_1_OWH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OWL=y + - CONFIG_BSP_USING_PWM_TMR4_1_OXH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OXL=y +devices.pwm_tmr6: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMRA=y + - CONFIG_BSP_USING_PWM_TMRA_1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH3=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH4=y +devices.rtc: + kconfig: + - CONFIG_BSP_USING_RTC=y + - CONFIG_RT_USING_ALARM=y +devices.soft_i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y +devices.spi: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y - CONFIG_BSP_USING_UART=y - - CONFIG_BSP_USING_UART2=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: + kconfig: + - CONFIG_RT_USING_SERIAL_V2=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.watchdog_swdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_SWDT=y +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.spi_flash: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y diff --git a/bsp/hc32/ev_hc32f334_lqfp64/README.md b/bsp/hc32/ev_hc32f334_lqfp64/README.md index 81bd92ccaab..a7e2ff21424 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/README.md +++ b/bsp/hc32/ev_hc32f334_lqfp64/README.md @@ -1,8 +1,8 @@ -# XHSC EV_F334_LQ64_Rev1.0 开发板 BSP 说明 +# XHSC EV_F334_LQ64 开发板 BSP 说明 ## 简介 -本文档为小华半导体为 EV_F334_LQ64_Rev1.0 开发板提供的 BSP (板级支持包) 说明。 +本文档为小华半导体为 EV_F334_LQ64 开发板提供的 BSP (板级支持包) 说明。 主要内容如下: @@ -14,79 +14,63 @@ ## 开发板介绍 -EV_F334_LQ64_Rev1.0 是 XHSC 官方推出的开发板,搭载 HC32F334MCTI 芯片,基于 ARM Cortex-M4 内核,最高主频 200 MHz,具有丰富的板载资源,可以充分发挥 HC32F334MCTI 的芯片性能。 +EV_F334_LQ64 是 XHSC 官方推出的开发板,搭载 HC32F334KATI 芯片,基于 ARM Cortex-M4 内核,最高主频 120 MHz,具有丰富的板载资源,可以充分发挥 HC32F334KATI 的芯片性能。 开发板外观如下图所示: ![board](figures/board.png) -EV_F334_LQ64_Rev1.0 开发板常用 **板载资源** 如下: - -- **MCU** - - HC32F334MCTI - - 主频200MHz - - 256KB FLASH - - 68KB RAM -- **外部Memory** - - BL24C256(EEPROM, 256Kbits) - - W25Q64(SPI NOR,64MB) - - IS62WV51216(SRAM, 1MB) -- **常用外设** - - LED: 4 个,User LED(LED0,LED1,LED2,LED3)。 - - 按键: 5 个,矩阵键盘(K1~K4), WAKEUP(K5),RESET(K0) -- **常用接口** - - USB转串口 - - CAN DB9接口 * 2 - - TFT接口 - - SmartCard接口 - - I2C/USART/SPI接口 -- **调试接口** - - 板载DAP调试器 - - 标准JTAG/SWD/Trace - -开发板更多详细信息请参考小华半导体半导体[EV_F334_LQ64_Rev1.0](https://www.xhsc.com.cn) +EV_F334_LQ64 开发板常用 **板载资源** 如下: + +- MCU:HC32F334KATI,主频120MHz,128KB FLASH,36KB RAM +- 常用外设 + - LED:2 个,User LED(LED0、LED1)。 + - 按键:4个,K1、K2、WAKEUP(K3)、RESET(K0)。 +- 常用接口:CAN接口、LIN接口、RS485接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 + +开发板更多详细信息请参考小华半导体半导体[EV_F334_LQ64](https://www.xhsc.com.cn) ## 外设支持 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | -|:-------- |:--------:|:--------:| -| USB 转串口 | 支持 | 使用 UART2 | -| LED | 支持 | LED1~4 | - -| **片上外设** | **支持情况** | **备注** | -|:------------- |:--------:|:------------------------------------------:| -| Crypto | 支持 | AES, CRC, HASH, RNG, UID | -| DAC | 支持 | | -| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 | -| CAN | 支持 | CAN1、CAN2 | -| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | -| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) | -| PM | 支持 | | -| Lptimer | 支持 | | -| Hwtimer | 支持 | Hwtimer1~5 | -| Pulse_encoder | 支持 | | -| PWM | 支持 | | -| RTC | 支持 | 闹钟精度为1分钟 | -| WDT | 支持 | | -| I2C | 支持 | 软件、硬件 I2C | -| QSPI | 支持 | | -| SPI | 支持 | SPI1~3
SPI1支持W25Q | -| UART | 支持 | UART1~6
UART2为console使用 | +| **板载外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| USB 转串口 | 支持 | 使用 UART2 | + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| ADC | 支持 | | +| Crypto | 支持 | CRC | +| DAC | 支持 | | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1...PF3 ---> PIN:0,1...68 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| MCAN | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| WDT | 支持 | | ## 使用说明 使用说明分为如下两个章节: - 快速上手 - + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 - + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + ### 快速上手 本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 @@ -103,14 +87,14 @@ EV_F334_LQ64_Rev1.0 开发板常用 **板载资源** 如下: #### 运行结果 -下载程序成功之后,系统会自动运行,观察开发板上LED的运行效果,绿色LED3会周期性闪烁。 +下载程序成功之后,系统会自动运行,观察开发板上LED的运行效果,绿色LED1会周期性闪烁。 USB虚拟COM端口默认连接串口2,在终端工具里打开相应的串口,复位设备后,可以看到 RT-Thread 的输出信息: ``` \ | / - RT - Thread Operating System - / | \ 5.0.1 build Feb 4 2024 16:44:26 + / | \ 4.1.0 build Apr 24 2022 13:32:39 2006 - 2022 Copyright by RT-Thread team msh > ``` @@ -127,12 +111,6 @@ msh > 4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 -## 注意事项 - -| 板载外设 | 模式 | 注意事项 | -| ---- | ---- | ------------------------------------------------------------------------------------------------------ | -| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | - ## 联系人信息 维护人: diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig b/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig index 6c6cdf0fd3d..a2bf2035bfb 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/Kconfig @@ -30,11 +30,6 @@ menu "Onboard Peripheral Drivers" bool "Enable SPI FLASH (w25q64 spi1)" select BSP_USING_SPI select BSP_USING_SPI1 - select BSP_USING_ON_CHIP_FLASH - select RT_USING_SFUD - select RT_USING_DFS - select RT_USING_FAL - select RT_USING_MTD_NOR default n endmenu @@ -198,11 +193,11 @@ menu "On-chip Peripheral Drivers" config BSP_I2C1_SCL_PIN int "i2c1 scl pin number" range 1 68 - default 22 + default 22 # PB6 config BSP_I2C1_SDA_PIN int "I2C1 sda pin number" range 1 68 - default 23 + default 23 # PB7 endif endif @@ -262,36 +257,6 @@ menu "On-chip Peripheral Drivers" select BSP_SPI1_TX_USING_DMA default n endif - - menuconfig BSP_USING_SPI2 - bool "Enable SPI2 BUS" - default n - if BSP_USING_SPI2 - config BSP_SPI2_TX_USING_DMA - bool "Enable SPI2 TX DMA" - select BSP_SPI_USING_DMA - default n - config BSP_SPI2_RX_USING_DMA - bool "Enable SPI2 RX DMA" - select BSP_SPI_USING_DMA - select BSP_SPI2_TX_USING_DMA - default n - endif - - menuconfig BSP_USING_SPI3 - bool "Enable SPI3 BUS" - default n - if BSP_USING_SPI3 - config BSP_SPI3_TX_USING_DMA - bool "Enable SPI3 TX DMA" - select BSP_SPI_USING_DMA - default n - config BSP_SPI3_RX_USING_DMA - bool "Enable SPI3 RX DMA" - select BSP_SPI_USING_DMA - select BSP_SPI3_TX_USING_DMA - default n - endif endif menuconfig BSP_USING_ADC @@ -333,6 +298,9 @@ menu "On-chip Peripheral Drivers" config BSP_USING_DAC1 bool "using dac1" default n + config BSP_USING_DAC2 + bool "using dac2" + default n endif menuconfig BSP_USING_MCAN @@ -361,7 +329,7 @@ menu "On-chip Peripheral Drivers" config BSP_USING_SWDT bool "SWDT(3.72hour(max))" config BSP_USING_WDT - bool "WDT(10.7s(max))" + bool "WDT(8.9s(max))" endchoice config BSP_WDT_CONTINUE_COUNT @@ -383,9 +351,6 @@ menu "On-chip Peripheral Drivers" config BSP_RTC_USING_LRC bool "RTC Using LRC" - - config BSP_RTC_USING_XTAL_DIV - bool "RTC Using XTAL Division" endchoice endif @@ -479,16 +444,11 @@ menu "On-chip Peripheral Drivers" config BSP_USING_PWM_TMRA_1_CH2 bool "Enable timerA-1 channel2" default n - endif - menuconfig BSP_USING_PWM_TMRA_2 - bool "Enable timerA-2 output PWM" - default n - if BSP_USING_PWM_TMRA_2 - config BSP_USING_PWM_TMRA_2_CH1 - bool "Enable timerA-2 channel1" + config BSP_USING_PWM_TMRA_1_CH3 + bool "Enable timerA-1 channel3" default n - config BSP_USING_PWM_TMRA_2_CH2 - bool "Enable timerA-2 channel2" + config BSP_USING_PWM_TMRA_1_CH4 + bool "Enable timerA-1 channel4" default n endif endif @@ -518,6 +478,12 @@ menu "On-chip Peripheral Drivers" config BSP_USING_PWM_TMR4_1_OWL bool "Enable TMR4_1_OWL channel5" default n + config BSP_USING_PWM_TMR4_1_OXH + bool "Enable TMR4_1_OXH channel6" + default n + config BSP_USING_PWM_TMR4_1_OXL + bool "Enable TMR4_1_OXL channel7" + default n endif endif menuconfig BSP_USING_PWM_TMR6 @@ -600,14 +566,6 @@ menu "On-chip Peripheral Drivers" bool "unit 3" config BSP_USING_INPUT_CAPTURE_TMR6_4 bool "unit 4" - config BSP_USING_INPUT_CAPTURE_TMR6_5 - bool "unit 5" - config BSP_USING_INPUT_CAPTURE_TMR6_6 - bool "unit 6" - config BSP_USING_INPUT_CAPTURE_TMR6_7 - bool "unit 7" - config BSP_USING_INPUT_CAPTURE_TMR6_8 - bool "unit 8" endif endif endmenu diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/board.c b/bsp/hc32/ev_hc32f334_lqfp64/board/board.c index 35f7a1fbc63..f5791403f24 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/board.c +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/board.c @@ -80,7 +80,7 @@ void SystemClock_Config(void) #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) /* Xtal32 config */ - GPIO_AnalogCmd(XTAL32_PORT, XTAL32_IN_PIN | XTAL32_OUT_PIN, ENABLE); + GPIO_AnalogCmd(XTAL32_PORT, XTAL32_PIN, ENABLE); (void)CLK_Xtal32StructInit(&stcXtal32Init); stcXtal32Init.u8State = CLK_XTAL32_ON; stcXtal32Init.u8Drv = CLK_XTAL32_DRV_HIGH; diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.c b/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.c index 0f30c3fd3df..46dc6f4c45f 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.c +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.c @@ -114,10 +114,15 @@ rt_err_t rt_hw_board_dac_init(CM_DAC_TypeDef *DACx) switch ((rt_uint32_t)DACx) { #if defined(BSP_USING_DAC1) - case (rt_uint32_t)CM_DAC: + case (rt_uint32_t)CM_DAC1: (void)GPIO_Init(DAC1_CH1_PORT, DAC1_CH1_PIN, &stcGpioInit); (void)GPIO_Init(DAC1_CH2_PORT, DAC1_CH2_PIN, &stcGpioInit); break; +#endif +#if defined(BSP_USING_DAC2) + case (rt_uint32_t)CM_DAC2: + (void)GPIO_Init(DAC2_CH1_PORT, DAC2_CH1_PIN, &stcGpioInit); + break; #endif default: result = -RT_ERROR; @@ -131,15 +136,22 @@ rt_err_t rt_hw_board_dac_init(CM_DAC_TypeDef *DACx) #if defined(RT_USING_CAN) void CanPhyEnable(void) { + stc_gpio_init_t stcGpioInit; + #if defined(BSP_USING_MCAN1) - TCA9539_WritePin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_PIN_RESET); - TCA9539_ConfigPin(CAN1_STB_PORT, CAN1_STB_PIN, TCA9539_DIR_OUT); + GPIO_StructInit(&stcGpioInit); + stcGpioInit.u16PinState = PIN_STAT_RST; + stcGpioInit.u16PinDir = PIN_DIR_OUT; + GPIO_Init(MCAN1_PHY_STBY_PORT, MCAN1_PHY_STBY_PIN, &stcGpioInit); #endif #if defined(BSP_USING_MCAN2) - TCA9539_WritePin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_PIN_RESET); - TCA9539_ConfigPin(CAN2_STB_PORT, CAN2_STB_PIN, TCA9539_DIR_OUT); + GPIO_StructInit(&stcGpioInit); + stcGpioInit.u16PinState = PIN_STAT_RST; + stcGpioInit.u16PinDir = PIN_DIR_OUT; + GPIO_Init(MCAN2_PHY_STBY_PORT, MCAN2_PHY_STBY_PIN, &stcGpioInit); #endif } + rt_err_t rt_hw_board_mcan_init(CM_MCAN_TypeDef *MCANx) { rt_err_t result = RT_EOK; @@ -178,13 +190,7 @@ rt_err_t rt_hw_spi_board_init(CM_SPI_TypeDef *CM_SPIx) switch ((rt_uint32_t)CM_SPIx) { #if defined(BSP_USING_SPI1) - case (rt_uint32_t)CM_SPI1: - GPIO_StructInit(&stcGpioInit); - stcGpioInit.u16PinState = PIN_STAT_SET; - stcGpioInit.u16PinDir = PIN_DIR_OUT; - GPIO_Init(SPI1_WP_PORT, SPI1_WP_PIN, &stcGpioInit); - GPIO_Init(SPI1_HOLD_PORT, SPI1_HOLD_PIN, &stcGpioInit); - + case (rt_uint32_t)CM_SPI: (void)GPIO_StructInit(&stcGpioInit); stcGpioInit.u16PinDrv = PIN_HIGH_DRV; stcGpioInit.u16PinInputType = PIN_IN_TYPE_CMOS; @@ -227,22 +233,6 @@ rt_err_t rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef *TMRAx) GPIO_SetFunc(PWM_TMRA_1_CH4_PORT, PWM_TMRA_1_CH4_PIN, PWM_TMRA_1_CH4_PIN_FUNC); #endif break; -#endif -#if defined(BSP_USING_PWM_TMRA_2) - case (rt_uint32_t)CM_TMRA_2: -#ifdef BSP_USING_PWM_TMRA_2_CH1 - GPIO_SetFunc(PWM_TMRA_2_CH1_PORT, PWM_TMRA_2_CH1_PIN, PWM_TMRA_2_CH1_PIN_FUNC); -#endif -#ifdef BSP_USING_PWM_TMRA_2_CH2 - GPIO_SetFunc(PWM_TMRA_2_CH2_PORT, PWM_TMRA_2_CH2_PIN, PWM_TMRA_2_CH2_PIN_FUNC); -#endif -#ifdef BSP_USING_PWM_TMRA_2_CH3 - GPIO_SetFunc(PWM_TMRA_2_CH3_PORT, PWM_TMRA_2_CH3_PIN, PWM_TMRA_2_CH3_PIN_FUNC); -#endif -#ifdef BSP_USING_PWM_TMRA_2_CH4 - GPIO_SetFunc(PWM_TMRA_2_CH4_PORT, PWM_TMRA_2_CH4_PIN, PWM_TMRA_2_CH4_PIN_FUNC); -#endif - break; #endif default: result = -RT_ERROR; @@ -260,7 +250,7 @@ rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef *TMR4x) switch ((rt_uint32_t)TMR4x) { #if defined(BSP_USING_PWM_TMR4_1) - case (rt_uint32_t)CM_TMR4_1: + case (rt_uint32_t)CM_TMR4: #ifdef BSP_USING_PWM_TMR4_1_OUH GPIO_SetFunc(PWM_TMR4_1_OUH_PORT, PWM_TMR4_1_OUH_PIN, PWM_TMR4_1_OUH_PIN_FUNC); #endif @@ -278,6 +268,12 @@ rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef *TMR4x) #endif #ifdef BSP_USING_PWM_TMR4_1_OWL GPIO_SetFunc(PWM_TMR4_1_OWL_PORT, PWM_TMR4_1_OWL_PIN, PWM_TMR4_1_OWL_PIN_FUNC); +#endif +#ifdef BSP_USING_PWM_TMR4_1_OXH + GPIO_SetFunc(PWM_TMR4_1_OXH_PORT, PWM_TMR4_1_OXH_PIN, PWM_TMR4_1_OXH_PIN_FUNC); +#endif +#ifdef BSP_USING_PWM_TMR4_1_OXL + GPIO_SetFunc(PWM_TMR4_1_OXL_PORT, PWM_TMR4_1_OXL_PIN, PWM_TMR4_1_OXL_PIN_FUNC); #endif break; #endif diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.h index 0a060ce4efd..4fa4759a5df 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/board_config.h @@ -66,8 +66,8 @@ #endif #if defined(BSP_USING_ADC3) - #define ADC3_CH_PORT (GPIO_PORT_E) /* Default ADC3_IN1 */ - #define ADC3_CH_PIN (GPIO_PIN_03) + #define ADC3_CH_PORT (GPIO_PORT_B) /* Default ADC3_IN1 */ + #define ADC3_CH_PIN (GPIO_PIN_13) #endif /*********** DAC configure *********/ @@ -77,58 +77,61 @@ #define DAC1_CH2_PORT (GPIO_PORT_A) #define DAC1_CH2_PIN (GPIO_PIN_05) #endif +#if defined(BSP_USING_DAC2) + #define DAC2_CH1_PORT (GPIO_PORT_A) + #define DAC2_CH1_PIN (GPIO_PIN_06) +#endif /*********** CAN configure *********/ #if defined(BSP_USING_MCAN1) - #define MCAN1_TX_PORT (GPIO_PORT_C) - #define MCAN1_TX_PIN (GPIO_PIN_12) - #define MCAN1_TX_PIN_FUNC (GPIO_FUNC_56) + #define MCAN1_TX_PORT (GPIO_PORT_A) + #define MCAN1_TX_PIN (GPIO_PIN_02) + #define MCAN1_TX_PIN_FUNC (GPIO_FUNC_54) + + #define MCAN1_RX_PORT (GPIO_PORT_C) + #define MCAN1_RX_PIN (GPIO_PIN_05) + #define MCAN1_RX_PIN_FUNC (GPIO_FUNC_55) - #define MCAN1_RX_PORT (GPIO_PORT_D) - #define MCAN1_RX_PIN (GPIO_PIN_00) - #define MCAN1_RX_PIN_FUNC (GPIO_FUNC_57) + #define MCAN1_PHY_STBY_PORT (GPIO_PORT_B) + #define MCAN1_PHY_STBY_PIN (GPIO_PIN_01) #endif #if defined(BSP_USING_MCAN2) - #define MCAN2_TX_PORT (GPIO_PORT_H) - #define MCAN2_TX_PIN (GPIO_PIN_02) + #define MCAN2_TX_PORT (GPIO_PORT_B) + #define MCAN2_TX_PIN (GPIO_PIN_11) #define MCAN2_TX_PIN_FUNC (GPIO_FUNC_56) - #define MCAN2_RX_PORT (GPIO_PORT_E) - #define MCAN2_RX_PIN (GPIO_PIN_04) + #define MCAN2_RX_PORT (GPIO_PORT_B) + #define MCAN2_RX_PIN (GPIO_PIN_10) #define MCAN2_RX_PIN_FUNC (GPIO_FUNC_57) + + #define MCAN2_PHY_STBY_PORT (GPIO_PORT_B) + #define MCAN2_PHY_STBY_PIN (GPIO_PIN_02) #endif /************************* SPI port ***********************/ #if defined(BSP_USING_SPI1) #define SPI1_CS_PORT (GPIO_PORT_C) - #define SPI1_CS_PIN (GPIO_PIN_07) + #define SPI1_CS_PIN (GPIO_PIN_01) #define SPI1_SCK_PORT (GPIO_PORT_B) - #define SPI1_SCK_PIN (GPIO_PIN_14) - #define SPI1_SCK_FUNC (GPIO_FUNC_47) - - #define SPI1_MOSI_PORT (GPIO_PORT_B) - #define SPI1_MOSI_PIN (GPIO_PIN_13) - #define SPI1_MOSI_FUNC (GPIO_FUNC_44) + #define SPI1_SCK_PIN (GPIO_PIN_05) + #define SPI1_SCK_FUNC (GPIO_FUNC_49) - #define SPI1_MISO_PORT (GPIO_PORT_D) - #define SPI1_MISO_PIN (GPIO_PIN_09) - #define SPI1_MISO_FUNC (GPIO_FUNC_45) + #define SPI1_MOSI_PORT (GPIO_PORT_A) + #define SPI1_MOSI_PIN (GPIO_PIN_00) + #define SPI1_MOSI_FUNC (GPIO_FUNC_50) - #define SPI1_WP_PORT (GPIO_PORT_D) - #define SPI1_WP_PIN (GPIO_PIN_10) - - #define SPI1_HOLD_PORT (GPIO_PORT_D) - #define SPI1_HOLD_PIN (GPIO_PIN_11) + #define SPI1_MISO_PORT (GPIO_PORT_A) + #define SPI1_MISO_PIN (GPIO_PIN_01) + #define SPI1_MISO_FUNC (GPIO_FUNC_51) #endif /************************ RTC/PM *****************************/ #if defined(BSP_USING_RTC) || defined(RT_USING_PM) #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) #define XTAL32_PORT (GPIO_PORT_C) - #define XTAL32_IN_PIN (GPIO_PIN_14) - #define XTAL32_OUT_PIN (GPIO_PIN_15) + #define XTAL32_PIN (GPIO_PIN_14 | GPIO_PIN_15) #endif #endif @@ -137,46 +140,23 @@ #if defined(BSP_USING_PWM_TMRA_1) #if defined(BSP_USING_PWM_TMRA_1_CH1) #define PWM_TMRA_1_CH1_PORT (GPIO_PORT_A) - #define PWM_TMRA_1_CH1_PIN (GPIO_PIN_08) - #define PWM_TMRA_1_CH1_PIN_FUNC (GPIO_FUNC_4) + #define PWM_TMRA_1_CH1_PIN (GPIO_PIN_00) + #define PWM_TMRA_1_CH1_PIN_FUNC (GPIO_FUNC_15) #endif #if defined(BSP_USING_PWM_TMRA_1_CH2) #define PWM_TMRA_1_CH2_PORT (GPIO_PORT_A) - #define PWM_TMRA_1_CH2_PIN (GPIO_PIN_09) - #define PWM_TMRA_1_CH2_PIN_FUNC (GPIO_FUNC_4) + #define PWM_TMRA_1_CH2_PIN (GPIO_PIN_01) + #define PWM_TMRA_1_CH2_PIN_FUNC (GPIO_FUNC_15) #endif #if defined(BSP_USING_PWM_TMRA_1_CH3) #define PWM_TMRA_1_CH3_PORT (GPIO_PORT_A) - #define PWM_TMRA_1_CH3_PIN (GPIO_PIN_10) - #define PWM_TMRA_1_CH3_PIN_FUNC (GPIO_FUNC_4) + #define PWM_TMRA_1_CH3_PIN (GPIO_PIN_02) + #define PWM_TMRA_1_CH3_PIN_FUNC (GPIO_FUNC_15) #endif #if defined(BSP_USING_PWM_TMRA_1_CH4) #define PWM_TMRA_1_CH4_PORT (GPIO_PORT_A) - #define PWM_TMRA_1_CH4_PIN (GPIO_PIN_11) - #define PWM_TMRA_1_CH4_PIN_FUNC (GPIO_FUNC_4) - #endif - #endif - - #if defined(BSP_USING_PWM_TMRA_2) - #if defined(BSP_USING_PWM_TMRA_2_CH1) - #define PWM_TMRA_2_CH1_PORT (GPIO_PORT_A) - #define PWM_TMRA_2_CH1_PIN (GPIO_PIN_00) - #define PWM_TMRA_2_CH1_PIN_FUNC (GPIO_FUNC_4) - #endif - #if defined(BSP_USING_PWM_TMRA_2_CH2) - #define PWM_TMRA_2_CH2_PORT (GPIO_PORT_A) - #define PWM_TMRA_2_CH2_PIN (GPIO_PIN_01) - #define PWM_TMRA_2_CH2_PIN_FUNC (GPIO_FUNC_4) - #endif - #if defined(BSP_USING_PWM_TMRA_2_CH3) - #define PWM_TMRA_2_CH3_PORT (GPIO_PORT_A) - #define PWM_TMRA_2_CH3_PIN (GPIO_PIN_02) - #define PWM_TMRA_2_CH3_PIN_FUNC (GPIO_FUNC_4) - #endif - #if defined(BSP_USING_PWM_TMRA_2_CH4) - #define PWM_TMRA_2_CH4_PORT (GPIO_PORT_A) - #define PWM_TMRA_2_CH4_PIN (GPIO_PIN_03) - #define PWM_TMRA_2_CH4_PIN_FUNC (GPIO_FUNC_4) + #define PWM_TMRA_1_CH4_PIN (GPIO_PIN_03) + #define PWM_TMRA_1_CH4_PIN_FUNC (GPIO_FUNC_15) #endif #endif @@ -184,65 +164,75 @@ #if defined(BSP_USING_PWM_TMR4_1) #if defined(BSP_USING_PWM_TMR4_1_OUH) #define PWM_TMR4_1_OUH_PORT (GPIO_PORT_A) - #define PWM_TMR4_1_OUH_PIN (GPIO_PIN_08) - #define PWM_TMR4_1_OUH_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OUH_PIN (GPIO_PIN_02) + #define PWM_TMR4_1_OUH_PIN_FUNC (GPIO_FUNC_20) #endif #if defined(BSP_USING_PWM_TMR4_1_OUL) #define PWM_TMR4_1_OUL_PORT (GPIO_PORT_A) - #define PWM_TMR4_1_OUL_PIN (GPIO_PIN_07) - #define PWM_TMR4_1_OUL_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OUL_PIN (GPIO_PIN_01) + #define PWM_TMR4_1_OUL_PIN_FUNC (GPIO_FUNC_20) #endif #if defined(BSP_USING_PWM_TMR4_1_OVH) #define PWM_TMR4_1_OVH_PORT (GPIO_PORT_A) - #define PWM_TMR4_1_OVH_PIN (GPIO_PIN_09) - #define PWM_TMR4_1_OVH_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OVH_PIN (GPIO_PIN_06) + #define PWM_TMR4_1_OVH_PIN_FUNC (GPIO_FUNC_20) #endif #if defined(BSP_USING_PWM_TMR4_1_OVL) - #define PWM_TMR4_1_OVL_PORT (GPIO_PORT_B) - #define PWM_TMR4_1_OVL_PIN (GPIO_PIN_00) - #define PWM_TMR4_1_OVL_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OVL_PORT (GPIO_PORT_A) + #define PWM_TMR4_1_OVL_PIN (GPIO_PIN_04) + #define PWM_TMR4_1_OVL_PIN_FUNC (GPIO_FUNC_20) #endif #if defined(BSP_USING_PWM_TMR4_1_OWH) #define PWM_TMR4_1_OWH_PORT (GPIO_PORT_A) - #define PWM_TMR4_1_OWH_PIN (GPIO_PIN_10) - #define PWM_TMR4_1_OWH_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OWH_PIN (GPIO_PIN_07) + #define PWM_TMR4_1_OWH_PIN_FUNC (GPIO_FUNC_20) #endif #if defined(BSP_USING_PWM_TMR4_1_OWL) #define PWM_TMR4_1_OWL_PORT (GPIO_PORT_B) - #define PWM_TMR4_1_OWL_PIN (GPIO_PIN_01) - #define PWM_TMR4_1_OWL_PIN_FUNC (GPIO_FUNC_2) + #define PWM_TMR4_1_OWL_PIN (GPIO_PIN_02) + #define PWM_TMR4_1_OWL_PIN_FUNC (GPIO_FUNC_20) + #endif + #if defined(BSP_USING_PWM_TMR4_1_OXH) + #define PWM_TMR4_1_OXH_PORT (GPIO_PORT_A) + #define PWM_TMR4_1_OXH_PIN (GPIO_PIN_01) + #define PWM_TMR4_1_OXH_PIN_FUNC (GPIO_FUNC_23) + #endif + #if defined(BSP_USING_PWM_TMR4_1_OXL) + #define PWM_TMR4_1_OXL_PORT (GPIO_PORT_A) + #define PWM_TMR4_1_OXL_PIN (GPIO_PIN_00) + #define PWM_TMR4_1_OXL_PIN_FUNC (GPIO_FUNC_23) #endif #endif /*********** PWM_TMR6 configure *********/ #if defined(BSP_USING_PWM_TMR6_1) #if defined(BSP_USING_PWM_TMR6_1_A) - #define PWM_TMR6_1_A_PORT (GPIO_PORT_A) - #define PWM_TMR6_1_A_PIN (GPIO_PIN_08) - #define PWM_TMR6_1_A_PIN_FUNC (GPIO_FUNC_3) + #define PWM_TMR6_1_A_PORT (GPIO_PORT_C) + #define PWM_TMR6_1_A_PIN (GPIO_PIN_00) + #define PWM_TMR6_1_A_PIN_FUNC (GPIO_FUNC_12) #endif #if defined(BSP_USING_PWM_TMR6_1_B) #define PWM_TMR6_1_B_PORT (GPIO_PORT_A) - #define PWM_TMR6_1_B_PIN (GPIO_PIN_07) - #define PWM_TMR6_1_B_PIN_FUNC (GPIO_FUNC_3) + #define PWM_TMR6_1_B_PIN (GPIO_PIN_00) + #define PWM_TMR6_1_B_PIN_FUNC (GPIO_FUNC_12) #endif #endif #endif #if defined(BSP_USING_INPUT_CAPTURE) - #define INPUT_CAPTURE_TMR6_FUNC (GPIO_FUNC_3) + #define INPUT_CAPTURE_TMR6_FUNC (GPIO_FUNC_14) #if defined(BSP_USING_INPUT_CAPTURE_TMR6_1) - #define INPUT_CAPTURE_TMR6_1_PORT (GPIO_PORT_B) - #define INPUT_CAPTURE_TMR6_1_PIN (GPIO_PIN_09) + #define INPUT_CAPTURE_TMR6_1_PORT (GPIO_PORT_C) + #define INPUT_CAPTURE_TMR6_1_PIN (GPIO_PIN_06) #endif #if defined(BSP_USING_INPUT_CAPTURE_TMR6_2) - #define INPUT_CAPTURE_TMR6_2_PORT (GPIO_PORT_E) + #define INPUT_CAPTURE_TMR6_2_PORT (GPIO_PORT_C) #define INPUT_CAPTURE_TMR6_2_PIN (GPIO_PIN_07) #endif #if defined(BSP_USING_INPUT_CAPTURE_TMR6_3) - #define INPUT_CAPTURE_TMR6_3_PORT (GPIO_PORT_A) - #define INPUT_CAPTURE_TMR6_3_PIN (GPIO_PIN_00) + #define INPUT_CAPTURE_TMR6_3_PORT (GPIO_PORT_B) + #define INPUT_CAPTURE_TMR6_3_PIN (GPIO_PIN_02) #endif #endif diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/adc_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/adc_config.h index be6d4c6de34..13bb213c9ad 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/adc_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/adc_config.h @@ -34,7 +34,7 @@ extern "C" { .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ - .internal_trig1_sel = EVT_SRC_MAX, \ + .internal_trig1_sel = EVT_SRC_TMR0_1_CMP_A, \ .continue_conv_mode_enable = RT_FALSE, \ .data_reg_auto_clear = RT_TRUE, \ } @@ -77,7 +77,7 @@ extern "C" { .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ - .internal_trig1_sel = EVT_SRC_MAX, \ + .internal_trig1_sel = EVT_SRC_TMR0_1_CMP_A, \ .continue_conv_mode_enable = RT_FALSE, \ .data_reg_auto_clear = RT_TRUE, \ } @@ -120,7 +120,7 @@ extern "C" { .internal_trig0_sel = EVT_SRC_TMR0_1_CMP_B, \ .internal_trig1_comtrg0_enable = RT_FALSE, \ .internal_trig1_comtrg1_enable = RT_FALSE, \ - .internal_trig1_sel = EVT_SRC_MAX, \ + .internal_trig1_sel = EVT_SRC_TMR0_1_CMP_A, \ .continue_conv_mode_enable = RT_FALSE, \ .data_reg_auto_clear = RT_TRUE, \ } diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/dac_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/dac_config.h index 610e3f5b2e5..e7bb3e89632 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/dac_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/dac_config.h @@ -27,14 +27,26 @@ extern "C" { .dac_adp_sel = DAC_ADP_SEL_ALL, \ .ch1_output_enable = RT_TRUE, \ .ch2_output_enable = RT_TRUE, \ - .ch1_data_src = DAC_DATA_SRC_DATAREG, \ - .ch2_data_src = DAC_DATA_SRC_DATAREG, \ .ch1_amp_enable = RT_TRUE, \ .ch2_amp_enable = RT_TRUE, \ } #endif /* DAC1_INIT_PARAMS */ #endif /* BSP_USING_DAC1 */ +#ifdef BSP_USING_DAC2 +#ifndef DAC2_INIT_PARAMS +#define DAC2_INIT_PARAMS \ + { \ + .name = "dac2", \ + .vref = 3300, \ + .dac_adp_enable = RT_FALSE, \ + .dac_adp_sel = DAC_ADP_SEL_ALL, \ + .ch1_output_enable = RT_TRUE, \ + .ch1_amp_enable = RT_TRUE, \ + } +#endif /* DAC2_INIT_PARAMS */ +#endif /* BSP_USING_DAC2 */ + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/irq_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/irq_config.h index d9cf2d80ff6..e968e9043fd 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/irq_config.h @@ -120,20 +120,10 @@ extern "C" { #endif /* BSP_USING_UART4 */ #if defined(BSP_USING_SPI1) -#define BSP_SPI1_ERR_IRQ_NUM SPI1_IRQn +#define BSP_SPI1_ERR_IRQ_NUM SPI_IRQn #define BSP_SPI1_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif -#if defined(BSP_USING_SPI2) -#define BSP_SPI2_ERR_IRQ_NUM SPI2_IRQn -#define BSP_SPI2_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT -#endif - -#if defined(BSP_USING_SPI3) -#define BSP_SPI3_ERR_IRQ_NUM SPI3_IRQn -#define BSP_SPI3_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT -#endif - #if defined (BSP_USING_QSPI) #define BSP_QSPI_ERR_IRQ_NUM QSPI_IRQn #define BSP_QSPI_ERR_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT @@ -167,17 +157,11 @@ extern "C" { #if defined(BSP_USING_MCAN1) #define BSP_MCAN1_INT0_IRQ_NUM MCAN1_INT0_IRQn #define BSP_MCAN1_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN1_INT1_IRQ_NUM MCAN1_INT1_IRQn -#define BSP_MCAN1_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN1 */ #if defined(BSP_USING_MCAN2) #define BSP_MCAN2_INT0_IRQ_NUM MCAN2_INT0_IRQn #define BSP_MCAN2_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN2_INT1_IRQ_NUM MCAN2_INT1_IRQn -#define BSP_MCAN2_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN2 */ #if defined(RT_USING_ALARM) @@ -229,6 +213,28 @@ extern "C" { #define BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_PULSE_ENCODER_TMR6_2 */ +#if defined(BSP_USING_INPUT_CAPTURE) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_NUM (INT008_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_NUM (INT009_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM (INT010_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM (INT011_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_3_OVF_IRQ_NUM (INT012_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_3_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_3_CAP_IRQ_NUM (INT013_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_3_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_4_OVF_IRQ_NUM (INT014_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_4_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_4_CAP_IRQ_NUM (INT015_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_4_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#endif/* BSP_USING_INPUT_CAPTURE */ + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/pm_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/pm_config.h index 4d86a2aaee2..9804d7df223 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/pm_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/pm_config.h @@ -54,8 +54,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ { \ .u16Clock = PWC_STOP_CLK_KEEP, \ - .u8StopDrv = PWC_STOP_DRV_HIGH, \ - .u16ExBusHold = PWC_STOP_EXBUS_HIZ, \ .u16FlashWait = PWC_STOP_FLASH_WAIT_ON, \ }, \ .pwc_stop_type = PWC_STOP_WFE_INT, \ @@ -71,7 +69,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ .u8Mode = PWC_PD_MD1, \ .u8IOState = PWC_PD_IO_KEEP1, \ - .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \ }, \ } #endif /*PM_SLEEP_STANDBY_CFG*/ @@ -85,7 +82,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ .u8Mode = PWC_PD_MD3, \ .u8IOState = PWC_PD_IO_KEEP1, \ - .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \ }, \ } #endif /*PM_SLEEP_SHUTDOWN_CFG*/ diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/pwm_tmr_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/pwm_tmr_config.h index e432b5a83d0..651bbc22baa 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/pwm_tmr_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/pwm_tmr_config.h @@ -182,7 +182,7 @@ extern "C" { #define PWM_TMR4_1_CONFIG \ { \ .name = "pwm_t41", \ - .instance = CM_TMR4_1, \ + .instance = CM_TMR4, \ .channel = 0, \ .stcTmr4Init = \ { \ @@ -209,70 +209,6 @@ extern "C" { #endif /* PWM_TMR4_1_CONFIG */ #endif /* BSP_USING_PWM_TMR4_1 */ -#ifdef BSP_USING_PWM_TMR4_2 -#ifndef PWM_TMR4_2_CONFIG -#define PWM_TMR4_2_CONFIG \ - { \ - .name = "pwm_t42", \ - .instance = CM_TMR4_2, \ - .channel = 0, \ - .stcTmr4Init = \ - { \ - .u16ClockDiv = TMR4_CLK_DIV1, \ - .u16PeriodValue = 0xFFFFU, \ - .u16CountMode = TMR4_MD_SAWTOOTH, \ - .u16ClockSrc = TMR4_CLK_SRC_INTERNCLK,\ - }, \ - .stcTmr4OcInit = \ - { \ - .u16CompareValue = 0x0000, \ - .u16OcInvalidPolarity = TMR4_OC_INVD_LOW, \ - .u16CompareModeBufCond = TMR4_OC_BUF_COND_IMMED,\ - .u16CompareValueBufCond = TMR4_OC_BUF_COND_PEAK, \ - .u16BufLinkTransObject = 0U, \ - }, \ - .stcTmr4PwmInit = \ - { \ - .u16Mode = TMR4_PWM_MD_THROUGH, \ - .u16ClockDiv = TMR4_PWM_CLK_DIV1, \ - .u16Polarity = TMR4_PWM_OXH_HOLD_OXL_HOLD,\ - }, \ - } -#endif /* PWM_TMR4_2_CONFIG */ -#endif /* BSP_USING_PWM_TMR4_2 */ - -#ifdef BSP_USING_PWM_TMR4_3 -#ifndef PWM_TMR4_3_CONFIG -#define PWM_TMR4_3_CONFIG \ - { \ - .name = "pwm_t43", \ - .instance = CM_TMR4_3, \ - .channel = 0, \ - .stcTmr4Init = \ - { \ - .u16ClockDiv = TMR4_CLK_DIV1, \ - .u16PeriodValue = 0xFFFFU, \ - .u16CountMode = TMR4_MD_SAWTOOTH, \ - .u16ClockSrc = TMR4_CLK_SRC_INTERNCLK,\ - }, \ - .stcTmr4OcInit = \ - { \ - .u16CompareValue = 0x0000, \ - .u16OcInvalidPolarity = TMR4_OC_INVD_LOW, \ - .u16CompareModeBufCond = TMR4_OC_BUF_COND_IMMED,\ - .u16CompareValueBufCond = TMR4_OC_BUF_COND_PEAK, \ - .u16BufLinkTransObject = 0U, \ - }, \ - .stcTmr4PwmInit = \ - { \ - .u16Mode = TMR4_PWM_MD_THROUGH, \ - .u16ClockDiv = TMR4_PWM_CLK_DIV1, \ - .u16Polarity = TMR4_PWM_OXH_HOLD_OXL_HOLD,\ - }, \ - } -#endif /* PWM_TMR4_3_CONFIG */ -#endif /* BSP_USING_PWM_TMR4_3 */ - #endif /* BSP_USING_PWM_TMR4 */ #ifdef BSP_USING_PWM_TMR6 @@ -328,7 +264,7 @@ extern "C" { #ifndef PWM_TMR6_2_CONFIG #define PWM_TMR6_2_CONFIG \ { \ - .name = "pwm_t61", \ + .name = "pwm_t62", \ .instance = CM_TMR6_2, \ .channel = 0, \ .stcTmr6Init = \ @@ -375,7 +311,7 @@ extern "C" { #ifndef PWM_TMR6_3_CONFIG #define PWM_TMR6_3_CONFIG \ { \ - .name = "pwm_t61", \ + .name = "pwm_t63", \ .instance = CM_TMR6_3, \ .channel = 0, \ .stcTmr6Init = \ @@ -422,7 +358,7 @@ extern "C" { #ifndef PWM_TMR6_4_CONFIG #define PWM_TMR6_4_CONFIG \ { \ - .name = "pwm_t61", \ + .name = "pwm_t64", \ .instance = CM_TMR6_4, \ .channel = 0, \ .stcTmr6Init = \ @@ -465,194 +401,6 @@ extern "C" { } #endif /* PWM_TMR6_4_CONFIG */ #endif /* BSP_USING_PWM_TMR6_4 */ -#ifdef BSP_USING_PWM_TMR6_5 -#ifndef PWM_TMR6_5_CONFIG -#define PWM_TMR6_5_CONFIG \ - { \ - .name = "pwm_t61", \ - .instance = CM_TMR6_5, \ - .channel = 0, \ - .stcTmr6Init = \ - { \ - .u8CountSrc = TMR6_CNT_SRC_SW, \ - .sw_count = \ - { \ - .u32ClockDiv = TMR6_CLK_DIV1, \ - .u32CountMode = TMR6_MD_SAWTOOTH, \ - .u32CountDir = TMR6_CNT_DOWN, \ - }, \ - .u32PeriodValue = 0xFFFF, \ - .u32CountReload = TMR6_CNT_RELOAD_ON, \ - }, \ - .stcPwmInit = \ - { \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - }, \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - } \ - }, \ - } -#endif /* PWM_TMR6_5_CONFIG */ -#endif /* BSP_USING_PWM_TMR6_5 */ -#ifdef BSP_USING_PWM_TMR6_6 -#ifndef PWM_TMR6_6_CONFIG -#define PWM_TMR6_6_CONFIG \ - { \ - .name = "pwm_t61", \ - .instance = CM_TMR6_6, \ - .channel = 0, \ - .stcTmr6Init = \ - { \ - .u8CountSrc = TMR6_CNT_SRC_SW, \ - .sw_count = \ - { \ - .u32ClockDiv = TMR6_CLK_DIV1, \ - .u32CountMode = TMR6_MD_SAWTOOTH, \ - .u32CountDir = TMR6_CNT_DOWN, \ - }, \ - .u32PeriodValue = 0xFFFF, \ - .u32CountReload = TMR6_CNT_RELOAD_ON, \ - }, \ - .stcPwmInit = \ - { \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - }, \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - } \ - }, \ - } -#endif /* PWM_TMR6_6_CONFIG */ -#endif /* BSP_USING_PWM_TMR6_6 */ -#ifdef BSP_USING_PWM_TMR6_7 -#ifndef PWM_TMR6_7_CONFIG -#define PWM_TMR6_7_CONFIG \ - { \ - .name = "pwm_t61", \ - .instance = CM_TMR6_7, \ - .channel = 0, \ - .stcTmr6Init = \ - { \ - .u8CountSrc = TMR6_CNT_SRC_SW, \ - .sw_count = \ - { \ - .u32ClockDiv = TMR6_CLK_DIV1, \ - .u32CountMode = TMR6_MD_SAWTOOTH, \ - .u32CountDir = TMR6_CNT_DOWN, \ - }, \ - .u32PeriodValue = 0xFFFF, \ - .u32CountReload = TMR6_CNT_RELOAD_ON, \ - }, \ - .stcPwmInit = \ - { \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - }, \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - } \ - }, \ - } -#endif /* PWM_TMR6_7_CONFIG */ -#endif /* BSP_USING_PWM_TMR6_7 */ -#ifdef BSP_USING_PWM_TMR6_8 -#ifndef PWM_TMR6_8_CONFIG -#define PWM_TMR6_8_CONFIG \ - { \ - .name = "pwm_t61", \ - .instance = CM_TMR6_8, \ - .channel = 0, \ - .stcTmr6Init = \ - { \ - .u8CountSrc = TMR6_CNT_SRC_SW, \ - .sw_count = \ - { \ - .u32ClockDiv = TMR6_CLK_DIV1, \ - .u32CountMode = TMR6_MD_SAWTOOTH, \ - .u32CountDir = TMR6_CNT_DOWN, \ - }, \ - .u32PeriodValue = 0xFFFF, \ - .u32CountReload = TMR6_CNT_RELOAD_ON, \ - }, \ - .stcPwmInit = \ - { \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HIGH, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HOLD, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - }, \ - { \ - .u32CompareValue = 0x0000, \ - .u32StartPolarity = TMR6_PWM_LOW, \ - .u32StopPolarity = TMR6_PWM_LOW, \ - .u32CountUpMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountDownMatchAPolarity = TMR6_PWM_HOLD, \ - .u32CountUpMatchBPolarity = TMR6_PWM_HIGH, \ - .u32CountDownMatchBPolarity = TMR6_PWM_HIGH, \ - .u32UdfPolarity = TMR6_PWM_LOW, \ - .u32OvfPolarity = TMR6_PWM_LOW, \ - } \ - }, \ - } -#endif /* PWM_TMR6_8_CONFIG */ -#endif /* BSP_USING_PWM_TMR6_8 */ #endif /* BSP_USING_PWM_TMR6 */ diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/config/tmr_capture_config.h b/bsp/hc32/ev_hc32f334_lqfp64/board/config/tmr_capture_config.h index 65d4d8eed54..d147ec7d084 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/config/tmr_capture_config.h +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/config/tmr_capture_config.h @@ -39,7 +39,7 @@ extern "C" { .name = IC2_NAME, \ .ch = TMR6_CH_A, \ .clk_div = TMR6_CLK_DIV32, \ - .first_edge = TMR6_CAPT_COND_TRIGB_RISING, \ + .first_edge = TMR6_CAPT_COND_PWMA_RISING, \ .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM, \ .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO, \ .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM, \ @@ -54,7 +54,7 @@ extern "C" { .name = IC3_NAME, \ .ch = TMR6_CH_B, \ .clk_div = TMR6_CLK_DIV16, \ - .first_edge = TMR6_CAPT_COND_TRIGC_FALLING, \ + .first_edge = TMR6_CAPT_COND_TRIGD_RISING, \ .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_3_CAP_IRQ_NUM, \ .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_3_CAP_IRQ_PRIO, \ .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_3_OVF_IRQ_NUM, \ @@ -62,6 +62,21 @@ extern "C" { } #endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_4) +#define IC4_NAME "ic4" +#define INPUT_CAPTURE_CFG_TMR6_4 \ +{ \ + .name = IC4_NAME, \ + .ch = TMR6_CH_B, \ + .clk_div = TMR6_CLK_DIV16, \ + .first_edge = TMR6_CAPT_COND_PWMA_RISING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_4_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_4_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_4_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_4_OVF_IRQ_PRIO, \ +} +#endif + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f334_lqfp64/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f334_lqfp64/board/linker_scripts/link.icf index 6279dc54ae1..27176e7c87c 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f334_lqfp64/board/linker_scripts/link.icf @@ -82,9 +82,9 @@ define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x1000; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x1000; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat new file mode 100644 index 00000000000..f35553ed5ab --- /dev/null +++ b/bsp/hc32/ev_hc32f334_lqfp64/bsp_compile_ci.bat @@ -0,0 +1,91 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.dac +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.mcan +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/ev_hc32f334_lqfp64/figures/board.png b/bsp/hc32/ev_hc32f334_lqfp64/figures/board.png index f1c984dbd15..3b38373a82c 100644 Binary files a/bsp/hc32/ev_hc32f334_lqfp64/figures/board.png and b/bsp/hc32/ev_hc32f334_lqfp64/figures/board.png differ diff --git a/bsp/hc32/ev_hc32f334_lqfp64/project.uvprojx b/bsp/hc32/ev_hc32f334_lqfp64/project.uvprojx index 5e7b085e349..4052ca9128b 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/project.uvprojx +++ b/bsp/hc32/ev_hc32f334_lqfp64/project.uvprojx @@ -322,7 +322,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f334_lqfp64/template.uvprojx b/bsp/hc32/ev_hc32f334_lqfp64/template.uvprojx index 847334da616..d8205236be3 100644 --- a/bsp/hc32/ev_hc32f334_lqfp64/template.uvprojx +++ b/bsp/hc32/ev_hc32f334_lqfp64/template.uvprojx @@ -325,7 +325,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f448_lqfp80/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f448_lqfp80/.ci/attachconfig/ci.attachconfig.yml index 92d777ca640..7eb2f098c02 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f448_lqfp80/.ci/attachconfig/ci.attachconfig.yml @@ -1,12 +1,133 @@ +# ------ device CI ------ +devices.adc: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_ADC1_USING_DMA=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_RNG=y + - CONFIG_BSP_USING_CRC=y + - CONFIG_BSP_USING_HASH=y +devices.dac: + kconfig: + - CONFIG_BSP_USING_DAC=y + - CONFIG_BSP_USING_DAC1=y +devices.flash: + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_RT_USING_FAL=y + - CONFIG_RT_USING_SPI=y + - CONFIG_RT_USING_SFUD=y devices.gpio: kconfig: - CONFIG_BSP_USING_GPIO=y +devices.hwtimer: + kconfig: + - CONFIG_BSP_USING_HWTIMER=y + - CONFIG_BSP_USING_TMRA_1=y +devices.i2c: + kconfig: - CONFIG_BSP_USING_I2C=y - - CONFIG_BSP_USING_I2C_HW=y - CONFIG_BSP_USING_I2C1=y - - CONFIG_BSP_USING_TCA9539=y - - CONFIG_BSP_USING_EXT_IO=y -devices.uart: + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.mcan: + kconfig: + - CONFIG_BSP_USING_MCAN=y + - CONFIG_BSP_USING_MCAN1=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y +devices.pwm_tmr6: kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMRA=y + - CONFIG_BSP_USING_PWM_TMRA_1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y +devices.qspi: + kconfig: + - CONFIG_BSP_USING_QSPI=y + - CONFIG_BSP_QSPI_USING_DMA=y + - CONFIG_BSP_QSPI_USING_SOFT_CS=y +devices.rtc: + kconfig: + - CONFIG_BSP_USING_RTC=y + - CONFIG_RT_USING_ALARM=y +devices.soft_i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y +devices.spi: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: + kconfig: + - CONFIG_RT_USING_SERIAL_V2=y - CONFIG_BSP_USING_UART=y - - CONFIG_BSP_USING_UART2=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.watchdog_swdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_SWDT=y +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.spi_flash: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/hc32/ev_hc32f448_lqfp80/README.md b/bsp/hc32/ev_hc32f448_lqfp80/README.md index aedac9baecb..e614500cca8 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/README.md +++ b/bsp/hc32/ev_hc32f448_lqfp80/README.md @@ -1,8 +1,8 @@ -# XHSC EV_F448_LQ80_Rev1.0 开发板 BSP 说明 +# XHSC EV_F448_LQ80 开发板 BSP 说明 ## 简介 -本文档为小华半导体为 EV_F448_LQ80_Rev1.0 开发板提供的 BSP (板级支持包) 说明。 +本文档为小华半导体为 EV_F448_LQ80 开发板提供的 BSP (板级支持包) 说明。 主要内容如下: @@ -14,79 +14,65 @@ ## 开发板介绍 -EV_F448_LQ80_Rev1.0 是 XHSC 官方推出的开发板,搭载 HC32F448MCTI 芯片,基于 ARM Cortex-M4 内核,最高主频 200 MHz,具有丰富的板载资源,可以充分发挥 HC32F448MCTI 的芯片性能。 +EV_F448_LQ80 是 XHSC 官方推出的开发板,搭载 HC32F448MCTI 芯片,基于 ARM Cortex-M4 内核,最高主频 200 MHz,具有丰富的板载资源,可以充分发挥 HC32F448MCTI 的芯片性能。 开发板外观如下图所示: ![board](figures/board.png) -EV_F448_LQ80_Rev1.0 开发板常用 **板载资源** 如下: - -- **MCU** - - HC32F448MCTI - - 主频200MHz - - 256KB FLASH - - 68KB RAM -- **外部Memory** - - BL24C256(EEPROM, 256Kbits) - - W25Q64(SPI NOR,64MB) - - IS62WV51216(SRAM, 1MB) -- **常用外设** - - LED: 4 个,User LED(LED0,LED1,LED2,LED3)。 - - 按键: 5 个,矩阵键盘(K1~K4), WAKEUP(K5),RESET(K0) -- **常用接口** - - USB转串口 - - CAN DB9接口 * 2 - - TFT接口 - - SmartCard接口 - - I2C/USART/SPI接口 -- **调试接口** - - 板载DAP调试器 - - 标准JTAG/SWD/Trace - -开发板更多详细信息请参考小华半导体半导体[EV_F448_LQ80_Rev1.0](https://www.xhsc.com.cn) +EV_F448_LQ80 开发板常用 **板载资源** 如下: + +- MCU:HC32F448MCTI,主频200MHz,256KB FLASH,68KB RAM +- 外部RAM:IS61LV6416(SRAM, 128KB) +- 常用外设 + - LED:3 个,User LED(LED0、LED1、LED2) + - 按键:6个,矩阵键盘(K1~K4), WAKEUP(K5),RESET(K0) +- 常用接口:LCD接口、CAN接口、LIN接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 + +开发板更多详细信息请参考小华半导体半导体[EV_F448_LQ80](https://www.xhsc.com.cn) ## 外设支持 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | -|:-------- |:--------:|:--------:| -| USB 转串口 | 支持 | 使用 UART2 | -| LED | 支持 | LED1~4 | - -| **片上外设** | **支持情况** | **备注** | -|:------------- |:--------:|:------------------------------------------:| -| Crypto | 支持 | AES, CRC, HASH, RNG, UID | -| DAC | 支持 | | -| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 | -| CAN | 支持 | CAN1、CAN2 | -| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | -| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) | -| PM | 支持 | | -| Lptimer | 支持 | | -| Hwtimer | 支持 | Hwtimer1~5 | -| Pulse_encoder | 支持 | | -| PWM | 支持 | | -| RTC | 支持 | 闹钟精度为1分钟 | -| WDT | 支持 | | -| I2C | 支持 | 软件、硬件 I2C | -| QSPI | 支持 | | -| SPI | 支持 | SPI1~3
SPI1支持W25Q | -| UART | 支持 | UART1~6
UART2为console使用 | +| **板载外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| USB 转串口 | 支持 | 使用 UART2 | + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| ADC | 支持 | | +| Crypto | 支持 | CRC,HASH,RNG | +| DAC | 支持 | | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1...PH2 ---> PIN:0,1...82 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| MCAN | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| QSPI | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| WDT | 支持 | | ## 使用说明 使用说明分为如下两个章节: - 快速上手 - + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 - + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + ### 快速上手 本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 @@ -110,7 +96,7 @@ USB虚拟COM端口默认连接串口2,在终端工具里打开相应的串口 ``` \ | / - RT - Thread Operating System - / | \ 5.0.1 build Feb 4 2024 16:44:26 + / | \ 4.1.0 build Apr 24 2022 13:32:39 2006 - 2022 Copyright by RT-Thread team msh > ``` @@ -127,12 +113,6 @@ msh > 4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 -## 注意事项 - -| 板载外设 | 模式 | 注意事项 | -| ---- | ---- | ------------------------------------------------------------------------------------------------------ | -| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | - ## 联系人信息 维护人: diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig index 6a543d53b8d..5859ec06f4d 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/Kconfig @@ -662,6 +662,22 @@ menu "On-chip Peripheral Drivers" default n endif + menuconfig BSP_USING_INPUT_CAPTURE + bool "Enable Input Capture" + default n + select RT_USING_INPUT_CAPTURE + if BSP_USING_INPUT_CAPTURE + menuconfig BSP_USING_INPUT_CAPTURE_TMR6 + bool "Use Timer6 As The Input Capture" + default n + if BSP_USING_INPUT_CAPTURE_TMR6 + config BSP_USING_INPUT_CAPTURE_TMR6_1 + bool "unit 1" + config BSP_USING_INPUT_CAPTURE_TMR6_2 + bool "unit 2" + endif + endif + menuconfig BSP_USING_SENSOR bool "Enable SENSOR" default n diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c index 63ae63320e0..2df8c3583a1 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.c @@ -332,6 +332,31 @@ rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x) #endif #endif +#if defined (BSP_USING_INPUT_CAPTURE) +rt_err_t rt_hw_board_input_capture_init(uint32_t *tmr_instance) +{ + rt_err_t result = RT_EOK; + + switch ((rt_uint32_t)tmr_instance) + { +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_1) + case (rt_uint32_t)CM_TMR6_1: + GPIO_SetFunc(INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN, INPUT_CAPTURE_TMR6_1_FUNC); + break; +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_2) + case (rt_uint32_t)CM_TMR6_2: + GPIO_SetFunc(INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN, INPUT_CAPTURE_TMR6_2_FUNC); + break; +#endif + default: + result = -RT_ERROR; + break; + } + return result; +} +#endif + #ifdef RT_USING_PM #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode) diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h index 487e4f2f88e..b67c66df7cf 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/board_config.h @@ -252,6 +252,19 @@ #endif +#if defined(BSP_USING_INPUT_CAPTURE) + #if defined(BSP_USING_INPUT_CAPTURE_TMR6_1) + #define INPUT_CAPTURE_TMR6_1_FUNC (GPIO_FUNC_3) + #define INPUT_CAPTURE_TMR6_1_PORT (GPIO_PORT_A) + #define INPUT_CAPTURE_TMR6_1_PIN (GPIO_PIN_08) + #endif + #if defined(BSP_USING_INPUT_CAPTURE_TMR6_2) + #define INPUT_CAPTURE_TMR6_2_FUNC (GPIO_FUNC_3) + #define INPUT_CAPTURE_TMR6_2_PORT (GPIO_PORT_B) + #define INPUT_CAPTURE_TMR6_2_PIN (GPIO_PIN_02) + #endif +#endif + #if defined(BSP_USING_QSPI) #ifndef BSP_QSPI_USING_SOFT_CS /* QSSN */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h index e1d962ab910..2e0cce799f4 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/irq_config.h @@ -191,17 +191,11 @@ extern "C" { #if defined(BSP_USING_MCAN1) #define BSP_MCAN1_INT0_IRQ_NUM MCAN1_INT0_IRQn #define BSP_MCAN1_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN1_INT1_IRQ_NUM MCAN1_INT1_IRQn -#define BSP_MCAN1_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN1 */ #if defined(BSP_USING_MCAN2) #define BSP_MCAN2_INT0_IRQ_NUM MCAN2_INT0_IRQn #define BSP_MCAN2_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN2_INT1_IRQ_NUM MCAN2_INT1_IRQn -#define BSP_MCAN2_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN2 */ #if defined(RT_USING_ALARM) @@ -253,6 +247,18 @@ extern "C" { #define BSP_PULSE_ENCODER_TMR6_2_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_PULSE_ENCODER_TMR6_2 */ +#if defined(BSP_USING_INPUT_CAPTURE) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_NUM (INT012_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_NUM (INT013_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM (INT014_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM (INT015_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#endif + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/config/tmr_capture_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/config/tmr_capture_config.h new file mode 100644 index 00000000000..d5aa901a6cc --- /dev/null +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/config/tmr_capture_config.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-14 CDT first version + */ + +#ifndef __IC_CONFIG_H__ +#define __IC_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_1) +#define IC1_NAME "ic1" +#define INPUT_CAPTURE_CFG_TMR6_1 \ +{ \ + .name = IC1_NAME, \ + .ch = TMR6_CH_A, \ + .clk_div = TMR6_CLK_DIV32, \ + .first_edge = TMR6_CAPT_COND_PWMA_RISING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_PRIO, \ +} +#endif + +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_2) +#define IC2_NAME "ic2" +#define INPUT_CAPTURE_CFG_TMR6_2 \ +{ \ + .name = IC2_NAME, \ + .ch = TMR6_CH_A, \ + .clk_div = TMR6_CLK_DIV32, \ + .first_edge = TMR6_CAPT_COND_TRIGB_RISING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_PRIO, \ +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __IC_CONFIG_H__ */ diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h index 13e84fa275f..6f0f5e4d826 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/drv_config.h @@ -30,6 +30,7 @@ extern "C" { #include "qspi_config.h" #include "pulse_encoder_config.h" #include "timer_config.h" +#include "tmr_capture_config.h" #ifdef __cplusplus } diff --git a/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf index f9aef6bc410..c0b90175c16 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f448_lqfp80/board/linker_scripts/link.icf @@ -75,9 +75,9 @@ define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0xC00; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat new file mode 100644 index 00000000000..12d5baf2780 --- /dev/null +++ b/bsp/hc32/ev_hc32f448_lqfp80/bsp_compile_ci.bat @@ -0,0 +1,96 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.dac +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.mcan +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.qspi +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx b/bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx index 89d9b64fe61..aaf9e7b389b 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx +++ b/bsp/hc32/ev_hc32f448_lqfp80/project.uvprojx @@ -323,7 +323,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx b/bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx index ac0502478ba..c79587809b5 100644 --- a/bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx +++ b/bsp/hc32/ev_hc32f448_lqfp80/template.uvprojx @@ -326,7 +326,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f460_lqfp100_v2/.ci/attachconfig/ci.attachconfig.yml index d3686da6699..047a4483ef7 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/.ci/attachconfig/ci.attachconfig.yml @@ -1,7 +1,166 @@ +# ------ device CI ------ +devices.adc: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_ADC1_USING_DMA=y +devices.can: + kconfig: + - CONFIG_BSP_USING_CAN=y + - CONFIG_BSP_USING_CAN1=y + - CONFIG_RT_CAN_USING_HDR=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_RNG=y + - CONFIG_BSP_USING_CRC=y + - CONFIG_BSP_USING_HASH=y +devices.flash: + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_RT_USING_FAL=y + - CONFIG_RT_USING_SPI=y + - CONFIG_RT_USING_SFUD=y devices.gpio: kconfig: - CONFIG_BSP_USING_GPIO=y -devices.uart: +devices.hwtimer: + kconfig: + - CONFIG_BSP_USING_HWTIMER=y + - CONFIG_BSP_USING_TMRA_1=y +devices.i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1=y + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y +devices.pwm_tmr6: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMRA=y + - CONFIG_BSP_USING_PWM_TMRA_1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y +devices.qspi: + kconfig: + - CONFIG_BSP_USING_QSPI=y + - CONFIG_BSP_QSPI_USING_DMA=y + - CONFIG_BSP_QSPI_USING_SOFT_CS=y +devices.rtc: kconfig: + - CONFIG_BSP_USING_RTC=y + - CONFIG_RT_USING_ALARM=y +devices.sdio: + kconfig: + - CONFIG_BSP_USING_SDIO=y + - CONFIG_BSP_USING_SDIO1=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.soft_i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y +devices.spi: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y - CONFIG_BSP_USING_UART=y - - CONFIG_BSP_USING_UART4=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: + kconfig: + - CONFIG_RT_USING_SERIAL_V2=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.usb_hs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBD_HS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_hs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBH_HS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.usb_fs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBD_FS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_fs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBH_FS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.watchdog_swdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_SWDT=y +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.spi_flash: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/README.md b/bsp/hc32/ev_hc32f460_lqfp100_v2/README.md index 1b9e1d1db07..7c6a879aef8 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/README.md +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/README.md @@ -22,12 +22,12 @@ EV_F460_LQ100_V2 是 XHSC 官方推出的开发板,搭载 HC32F460PETB 芯片 EV_F460_LQ100_V2 开发板常用 **板载资源** 如下: -- MCU: HC32F460PETB,主频200MHz,512KB FLASH,192KB RAM +- MCU:HC32F460PETB,主频200MHz,512KB FLASH,192KB RAM - 常用外设 - - LED: 4 个,User LED(LED0,LED1,LED2,LED3)。 - - 按键: 11 个,矩阵键盘(K1~K9), WAKEUP(K10), RESET(K11) -- 常用接口: USB转串口、SD卡接口、USB FS、3.5mm耳机接口、Line in接口、喇叭接口 -- 调试接口: 板载DAP调试器、标准JTAG/SWD + - LED:4 个,User LED(LED0、LED1、LED2、LED3)。 + - 按键:11 个,矩阵键盘(K1~K9)、WAKEUP(K10)、RESET(K11) +- 常用接口:SD卡接口、USB FS接口、3.5mm耳机接口、Line in接口、CAN接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 开发板更多详细信息请参考小华半导体半导体[EV_F460_LQ100_V2](https://www.xhsc.com.cn) @@ -35,31 +35,44 @@ EV_F460_LQ100_V2 开发板常用 **板载资源** 如下: 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | -|:-------- |:--------:|:--------:| -| USB 转串口 | 支持 | 使用 UART4 | -| LED | 支持 | LED | - -| **片上外设** | **支持情况** | **备注** | -|:-------- |:--------:|:-----------------------------------:| -| ADC | 支持 | ADC1~2 | -| CAN | 支持 | CAN1 | -| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | -| I2C | 支持 | 软件 | -| UART | 支持 | UART1~4 | +| **板载外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| USB 转串口 | 支持 | 使用 UART4 | + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| ADC | 支持 | | +| CAN | 支持 | | +| Crypto | 支持 | CRC,HASH,RNG | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1... PH2 ---> PIN:0,1...82 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| QSPI | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SDIO | 支持 | | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| USB | 支持 | USBFS Core, device/host模式 | +| WDT | 支持 | | ## 使用说明 使用说明分为如下两个章节: - 快速上手 - + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 - + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + ### 快速上手 本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 @@ -83,7 +96,7 @@ USB虚拟COM端口默认连接串口4,在终端工具里打开相应的串口 ``` \ | / - RT - Thread Operating System - / | \ 4.1.1 build May 25 2022 08:55:55 + / | \ 4.1.0 build Apr 24 2022 13:32:39 2006 - 2022 Copyright by RT-Thread team msh > ``` @@ -102,11 +115,14 @@ msh > ## 注意事项 -| 板载外设 | 模式 | 注意事项 | -| -------- | ------ | ------------------------------------------------------------ | -| USB | device | 由于RTT抽象层的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | -| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | -| USB | host | 目前仅实现并测试了对U盘的支持。 | +| 板载外设 | 模式 | 协议栈 | 注意事项 | +| -------- | ------ | :------------: | ------------------------------------------------------------ | +| USB | device | ALL | 由于协议栈的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | +| USB | host | RTT legacy USB | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | +| USB | host | RTT legacy USB | 目前仅实现并测试了对U盘的支持。 | +| USB | ALL | ALL | CherryUSB 与 RTT legacy USB 组件不可同时使用;
CherryUSB与 ”On-Chip Peripheral Driver---> []Enable USB“ 不可同时使能及配置。 | +| USB | ALL | RTT legacy USB | 通过“board/config/usb_config/usb_app_conf.h” 进行应用个性化配置(主要为FIFO分配) | +| USB | ALL | CherryUSB | 通过“board/ports/usb_config.h”进行应用个性化配置(如FIFO分配、是否使用DMA[Device]等) | ## 联系人信息 diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig index 7a431c98b7d..23155b14f4b 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/Kconfig @@ -68,7 +68,7 @@ menu "On-chip Peripheral Drivers" int "Set UART1 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART2 @@ -101,7 +101,7 @@ menu "On-chip Peripheral Drivers" int "Set UART2 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART3 @@ -134,7 +134,7 @@ menu "On-chip Peripheral Drivers" int "Set UART3 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART4 @@ -167,7 +167,7 @@ menu "On-chip Peripheral Drivers" int "Set UART4 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA - default 64 + default 64 endif endif @@ -377,7 +377,7 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT if BSP_USING_WDT_TMR config BSP_USING_WDT - bool + bool default y config BSP_WDT_CONTINUE_COUNT @@ -562,6 +562,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_USB bool "Enable USB" default n + depends on !RT_USING_CHERRYUSB select RT_USING_USB_DEVICE if BSP_USING_USBD select RT_USING_USB_HOST if BSP_USING_USBH if BSP_USING_USB diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c index 1e03c37f5ee..ba3672a90a6 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board.c @@ -32,7 +32,7 @@ void SystemClock_Config(void) { stc_clock_xtal_init_t stcXtalInit; stc_clock_pll_init_t stcMpllInit; -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) stc_clock_pllx_init_t stcUpllInit; #endif #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) @@ -80,7 +80,7 @@ void SystemClock_Config(void) /* Switch system clock source to MPLL. */ CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL); -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) /* PLLX for USB */ (void)CLK_PLLxStructInit(&stcUpllInit); /* VCO = (8/2)*120 = 480MHz*/ @@ -113,7 +113,7 @@ void PeripheralClock_Config(void) CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK); #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP); #endif } diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.c b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.c index 43898a37a42..abeef5591bb 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.c +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.c @@ -366,6 +366,27 @@ rt_err_t rt_hw_usbfs_board_init(void) } #endif +#if defined(RT_USING_CHERRYUSB) +rt_err_t rt_hw_usbfs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC); /* VBUS */ + } + else + { + GPIO_SetFunc(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, USBF_DRVVBUS_FUNC); /* DRV VBUS */ + } + return RT_EOK; +} +#endif + #if defined(BSP_USING_QSPI) rt_err_t rt_hw_qspi_board_init(void) { diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.h b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.h index d247e6e2a44..48a4d29a19c 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.h +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/board_config.h @@ -15,7 +15,9 @@ #include #include "hc32_ll.h" #include "drv_config.h" - +#if defined(RT_USING_CHERRYUSB) + #include "usb_config.h" +#endif /************************* XTAL port **********************/ #define XTAL_PORT (GPIO_PORT_H) @@ -242,8 +244,15 @@ #endif #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) - #if defined(BSP_USING_USBFS) +#if defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || \ + defined(BSP_USING_USBFS) || defined(RT_USING_USB) + #error "When using CherryUSB, Please donot Enable 'On-Chip Peripheral Driver---> []Enable USB' or using USB legacy version!" + #endif +#endif + +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) /* USBFS Core*/ #define USBF_DP_PORT (GPIO_PORT_A) #define USBF_DP_PIN (GPIO_PIN_12) diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/config/irq_config.h b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/config/irq_config.h index 62122c63948..6290ce25438 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/config/irq_config.h @@ -204,7 +204,7 @@ extern "C" { #define BSP_RTC_ALARM_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* RT_USING_ALARM */ -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) #define BSP_USBFS_GLB_IRQ_NUM INT003_IRQn #define BSP_USBFS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_USBD */ diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.icf index a85e876d63e..54ab4f758ba 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.icf @@ -73,9 +73,9 @@ define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.ld b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.ld index 707126ba630..82e7fe0a8ec 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.ld +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/linker_scripts/link.ld @@ -88,6 +88,12 @@ SECTIONS __rt_init_end = .; . = ALIGN(4); + /* section for CherryUSB. */ + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + . = ALIGN(4); _etext = .; } >FLASH diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/usb_config.h b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/usb_config.h new file mode 100644 index 00000000000..723f0b19040 --- /dev/null +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/board/ports/usb_config.h @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ + #include + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else + #define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL + #define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE + #define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else + #define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN + #define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO + #define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE + #define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN + #define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE + #define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING + #define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING + #define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING + #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO + #define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE + #define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE + #define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS + #define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME + #define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO + #define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE + #define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE + #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + #define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID + #define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC + #define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO + #define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE + #define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE + #define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN + #define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + #define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT + #define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS + #define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM + #define CONFIG_USBDEV_EP_NUM 8 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* Defined FS Core device FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE (32) + +/* Defined FS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE (64) + +/* Defined FS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE (320) + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS + #define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM + #define CONFIG_USBHOST_PIPE_NUM 10 +#endif + + +#ifndef usb_phyaddr2ramaddr + #define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr + #define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat new file mode 100644 index 00000000000..5ae6c2aa698 --- /dev/null +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/bsp_compile_ci.bat @@ -0,0 +1,112 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.can +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.qspi +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.sdio +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_host +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_host +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/project.uvprojx b/bsp/hc32/ev_hc32f460_lqfp100_v2/project.uvprojx index 376544be85a..429c5c2857c 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/project.uvprojx +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/project.uvprojx @@ -323,7 +323,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f460_lqfp100_v2/template.uvprojx b/bsp/hc32/ev_hc32f460_lqfp100_v2/template.uvprojx index f01be29aedc..9285f6c20dd 100644 --- a/bsp/hc32/ev_hc32f460_lqfp100_v2/template.uvprojx +++ b/bsp/hc32/ev_hc32f460_lqfp100_v2/template.uvprojx @@ -326,7 +326,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f472_lqfp100/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f472_lqfp100/.ci/attachconfig/ci.attachconfig.yml index 92d777ca640..7ec37e6f4a7 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f472_lqfp100/.ci/attachconfig/ci.attachconfig.yml @@ -1,12 +1,166 @@ +# ------ device CI ------ +devices.adc: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_ADC1_USING_DMA=y +devices.can: + kconfig: + - CONFIG_BSP_USING_CAN=y + - CONFIG_BSP_USING_CAN1=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_RNG=y + - CONFIG_BSP_USING_CRC=y + - CONFIG_BSP_USING_AES=y + - CONFIG_BSP_USING_HASH=y +devices.dac: + kconfig: + - CONFIG_BSP_USING_DAC=y + - CONFIG_BSP_USING_DAC1=y +devices.flash: + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_RT_USING_FAL=y + - CONFIG_RT_USING_SPI=y + - CONFIG_RT_USING_SFUD=y devices.gpio: kconfig: - CONFIG_BSP_USING_GPIO=y +devices.hwtimer: + kconfig: + - CONFIG_BSP_USING_HWTIMER=y + - CONFIG_BSP_USING_TMRA_1=y +devices.i2c: + kconfig: - CONFIG_BSP_USING_I2C=y - - CONFIG_BSP_USING_I2C_HW=y - CONFIG_BSP_USING_I2C1=y - - CONFIG_BSP_USING_TCA9539=y - - CONFIG_BSP_USING_EXT_IO=y -devices.uart: + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y +devices.pwm_tmr6: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMRA=y + - CONFIG_BSP_USING_PWM_TMRA_1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y +devices.qspi: kconfig: + - CONFIG_BSP_USING_QSPI=y + - CONFIG_BSP_QSPI_USING_DMA=y + - CONFIG_BSP_QSPI_USING_SOFT_CS=y +devices.rtc: + kconfig: + - CONFIG_BSP_USING_RTC=y + - CONFIG_RT_USING_ALARM=y +devices.soft_i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y +devices.spi: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: + kconfig: + - CONFIG_RT_USING_SERIAL_V2=y - CONFIG_BSP_USING_UART=y - - CONFIG_BSP_USING_UART2=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.usb_hs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBD_HS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_hs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBH_HS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.usb_fs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBD_FS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_fs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBH_FS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.watchdog_swdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_SWDT=y +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.spi_flash: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/hc32/ev_hc32f472_lqfp100/README.md b/bsp/hc32/ev_hc32f472_lqfp100/README.md index 63ef09d84d2..a348e2a89e6 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/README.md +++ b/bsp/hc32/ev_hc32f472_lqfp100/README.md @@ -1,8 +1,8 @@ -# XHSC EV_F472_LQ80_Rev1.0 开发板 BSP 说明 +# XHSC EV_F472_LQ100 开发板 BSP 说明 ## 简介 -本文档为小华半导体为 EV_F472_LQ80_Rev1.0 开发板提供的 BSP (板级支持包) 说明。 +本文档为小华半导体为 EV_F472_LQ100 开发板提供的 BSP (板级支持包) 说明。 主要内容如下: @@ -14,69 +14,66 @@ ## 开发板介绍 -EV_F472_LQ80_Rev1.0 是 XHSC 官方推出的开发板,搭载 HC32F472PETI 芯片,基于 ARM Cortex-M4 内核,最高主频 200 MHz,具有丰富的板载资源,可以充分发挥 HC32F472PETI 的芯片性能。 +EV_F472_LQ100 是 XHSC 官方推出的开发板,搭载 HC32F472PETI 芯片,基于 ARM Cortex-M4 内核,最高主频 120 MHz,具有丰富的板载资源,可以充分发挥 HC32F472PETI 的芯片性能。 开发板外观如下图所示: ![board](figures/board.png) -EV_F472_LQ80_Rev1.0 开发板常用 **板载资源** 如下: - -- **MCU** - - HC32F472PETI - - 主频200MHz - - 256KB FLASH - - 68KB RAM -- **外部Memory** - - BL24C256(EEPROM, 256Kbits) - - W25Q64(SPI NOR,64MB) - - IS62WV51216(SRAM, 1MB) -- **常用外设** - - LED: 4 个,User LED(LED0,LED1,LED2,LED3)。 - - 按键: 5 个,矩阵键盘(K1~K4), WAKEUP(K5),RESET(K0) -- **常用接口** - - USB转串口 - - CAN DB9接口 * 2 - - TFT接口 - - SmartCard接口 - - I2C/USART/SPI接口 -- **调试接口** - - 板载DAP调试器 - - 标准JTAG/SWD/Trace - -开发板更多详细信息请参考小华半导体半导体[EV_F472_LQ80_Rev1.0](https://www.xhsc.com.cn) +EV_F472_LQ100 开发板常用 **板载资源** 如下: + +- MCU:HC32F472PETI,主频120MHz,512KB FLASH,68KB RAM +- 外部RAM:IS62WV51216(SRAM,1MB) +- 常用外设 + - LED:3 个,User LED(LED0、LED1、LED2)。 + - 按键:11 个,矩阵键盘(K1~K9)、WAKEUP(K10)、RESET(K0)。 +- 常用接口:LCD接口、USB FS接口、CAN接口、LIN接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 + +开发板更多详细信息请参考小华半导体半导体[EV_F472_LQ100](https://www.xhsc.com.cn) ## 外设支持 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | -|:-------- |:--------:|:--------:| -| USB 转串口 | 支持 | 使用 UART2 | -| LED | 支持 | LED1~4 | - -| **片上外设** | **支持情况** | **备注** | -|:-------- |:--------:|:------------------------------------------:| -| ADC | 支持 | ADC1: CH10, CH11,
ADC3: CH1 | -| CAN | 支持 | CAN1、CAN2 | -| GPIO | 支持 | PA0, PA1... PH2 ---> PIN: 0, 1...82 | -| I2C | 支持 | 软件模拟
硬件I2C1~2
I2C1支持EEPROM(BL24C256) | -| Hwtimer | 支持 | Hwtimer1~5 | -| SPI | 支持 | SPI1~3
SPI1支持W25Q | -| UART | 支持 | UART1~6
UART2为console使用 | +| **板载外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| USB 转串口 | 支持 | 使用 UART2 | + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :-----------: | :-----------------------------------: | +| ADC | 支持 | | +| CAN | 支持 | | +| Crypto | 支持 | AES,CRC,HASH,RNG | +| DAC | 支持 | | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1... PF8 ---> PIN:0,1...89 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| QSPI | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| USB | 支持 | USBFS Core, device/host模式 | +| WDT | 支持 | | ## 使用说明 使用说明分为如下两个章节: - 快速上手 - + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 - 进阶使用 - + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + ### 快速上手 本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 @@ -93,14 +90,14 @@ EV_F472_LQ80_Rev1.0 开发板常用 **板载资源** 如下: #### 运行结果 -下载程序成功之后,系统会自动运行,观察开发板上LED的运行效果,绿色LED3会周期性闪烁。 +下载程序成功之后,系统会自动运行,观察开发板上LED的运行效果,绿色LED5会周期性闪烁。 USB虚拟COM端口默认连接串口2,在终端工具里打开相应的串口,复位设备后,可以看到 RT-Thread 的输出信息: ``` \ | / - RT - Thread Operating System - / | \ 5.0.1 build Feb 4 2024 16:44:26 + / | \ 4.1.0 build Apr 24 2022 13:32:39 2006 - 2022 Copyright by RT-Thread team msh > ``` @@ -119,13 +116,16 @@ msh > ## 注意事项 -| 板载外设 | 模式 | 注意事项 | -| -------- | ------ | ------------------------------------------------------------ | -| USB | device | 由于RTT抽象层的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | -| USB | host | 由于main()函数中的LED闪烁示例,使用的是USBFS主机口的供电控制管脚,因而当配置为使用USBFS 的主机模式时,需要将main()函数中的LED示例代码手动屏蔽。 | -| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | -| USB | host | 为确保USB主机对外供电充足,建议通过J7外接5V电源供电,并短接J8的VIN跳帽。 | -| USB | host | 目前仅实现并测试了对U盘的支持。 | +| 板载外设 | 模式 | 协议栈 | 注意事项 | +| -------- | ------ | :------------: | ------------------------------------------------------------ | +| USB | device | ALL | 由于协议栈的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | +| USB | ALL | ALL | 由于main()函数中的LED闪烁示例,使用的是USBFS主机的供电控制管脚,因而当使用USBFS时,需要将main()函数中的LED示例代码手动屏蔽。 | +| USB | host | RTT legacy USB | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | +| USB | host | ALL | 为确保USB主机对外供电充足,建议通过J7外接5V电源供电,并短接J8的VIN跳帽。 | +| USB | host | RTT legacy USB | 目前仅实现并测试了对U盘的支持。 | +| USB | ALL | ALL | CherryUSB 与 RTT legacy USB 组件不可同时使用;
CherryUSB与 ”On-Chip Peripheral Driver---> []Enable USB“ 不可同时使能及配置。 | +| USB | ALL | RTT legacy USB | 通过“board/config/usb_config/usb_app_conf.h” 进行应用个性化配置(主要为FIFO分配) | +| USB | ALL | CherryUSB | 通过“board/ports/usb_config.h”进行应用个性化配置(如FIFO分配、是否使用DMA[Device]等) | ## 联系人信息 diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig b/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig index 3b0159ec43d..0867ee69290 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/Kconfig @@ -90,7 +90,7 @@ menu "On-chip Peripheral Drivers" int "Set UART1 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART2 @@ -123,7 +123,7 @@ menu "On-chip Peripheral Drivers" int "Set UART2 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART3 @@ -173,7 +173,7 @@ menu "On-chip Peripheral Drivers" int "Set UART4 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART5 @@ -206,7 +206,7 @@ menu "On-chip Peripheral Drivers" int "Set UART5 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART6 @@ -634,6 +634,38 @@ menu "On-chip Peripheral Drivers" endif endif + menuconfig BSP_USING_INPUT_CAPTURE + bool "Enable Input Capture" + default n + select RT_USING_INPUT_CAPTURE + if BSP_USING_INPUT_CAPTURE + menuconfig BSP_USING_INPUT_CAPTURE_TMR6 + bool "Use Timer6 As The Input Capture" + default n + if BSP_USING_INPUT_CAPTURE_TMR6 + config BSP_USING_INPUT_CAPTURE_TMR6_1 + bool "unit 1" + config BSP_USING_INPUT_CAPTURE_TMR6_2 + bool "unit 2" + config BSP_USING_INPUT_CAPTURE_TMR6_3 + bool "unit 3" + config BSP_USING_INPUT_CAPTURE_TMR6_4 + bool "unit 4" + config BSP_USING_INPUT_CAPTURE_TMR6_5 + bool "unit 5" + config BSP_USING_INPUT_CAPTURE_TMR6_6 + bool "unit 6" + config BSP_USING_INPUT_CAPTURE_TMR6_7 + bool "unit 7" + config BSP_USING_INPUT_CAPTURE_TMR6_8 + bool "unit 8" + config BSP_USING_INPUT_CAPTURE_TMR6_9 + bool "unit 9" + config BSP_USING_INPUT_CAPTURE_TMR6_10 + bool "unit 10" + endif + endif + menuconfig BSP_USING_QSPI bool "Enable QSPI BUS" select RT_USING_QSPI @@ -710,6 +742,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_USB bool "Enable USB" default n + depends on !RT_USING_CHERRYUSB select RT_USING_USB_DEVICE if BSP_USING_USBD select RT_USING_USB_HOST if BSP_USING_USBH if BSP_USING_USB diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c index bb1fde8dbff..2a65b3ac58c 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/board.c +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/board.c @@ -118,7 +118,7 @@ void PeripheralClock_Config(void) #if defined(RT_USING_ADC) CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK); #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) CLK_SetUSBClockSrc(CLK_USBCLK_PLLQ); #endif } diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.c b/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.c index c2104338305..8527affb4d4 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.c +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.c @@ -342,6 +342,36 @@ rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef *TMR6x) #endif #endif +#if defined (BSP_USING_INPUT_CAPTURE) +rt_err_t rt_hw_board_input_capture_init(uint32_t *tmr_instance) +{ + rt_err_t result = RT_EOK; + + switch ((rt_uint32_t)tmr_instance) + { +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_1) + case (rt_uint32_t)CM_TMR6_1: + GPIO_SetFunc(INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN, INPUT_CAPTURE_TMR6_1_FUNC); + break; +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_2) + case (rt_uint32_t)CM_TMR6_2: + GPIO_SetFunc(INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN, INPUT_CAPTURE_TMR6_2_FUNC); + break; +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_10) + case (rt_uint32_t)CM_TMR6_10: + GPIO_SetFunc(INPUT_CAPTURE_TMR6_10_PORT, INPUT_CAPTURE_TMR6_10_PIN, INPUT_CAPTURE_TMR6_10_FUNC); + break; +#endif + default: + result = -RT_ERROR; + break; + } + return result; +} +#endif + #ifdef RT_USING_PM #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) @@ -424,3 +454,26 @@ rt_err_t rt_hw_usbfs_board_init(void) return RT_EOK; } #endif + +#if defined(RT_USING_CHERRYUSB) +rt_err_t rt_hw_usbfs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + /* reserved */ + } + else + { + GPIO_OutputCmd(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, ENABLE); + GPIO_SetPins(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN); /* DRV VBUS with GPIO funciton */ + } + return RT_EOK; +} + +#endif diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.h index f942e7ef72c..996a262f19e 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.h +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/board_config.h @@ -16,7 +16,9 @@ #include #include "hc32_ll.h" #include "drv_config.h" - +#if defined(RT_USING_CHERRYUSB) + #include "usb_config.h" +#endif /************************* XTAL port **********************/ #define XTAL_PORT (GPIO_PORT_F) @@ -292,6 +294,24 @@ #endif +#if defined(BSP_USING_INPUT_CAPTURE) + #if defined(BSP_USING_INPUT_CAPTURE_TMR6_1) + #define INPUT_CAPTURE_TMR6_1_PORT (GPIO_PORT_A) + #define INPUT_CAPTURE_TMR6_1_PIN (GPIO_PIN_00) + #define INPUT_CAPTURE_TMR6_1_FUNC (GPIO_FUNC_11) + #endif + #if defined(BSP_USING_INPUT_CAPTURE_TMR6_2) + #define INPUT_CAPTURE_TMR6_2_PORT (GPIO_PORT_B) + #define INPUT_CAPTURE_TMR6_2_PIN (GPIO_PIN_02) + #define INPUT_CAPTURE_TMR6_2_FUNC (GPIO_FUNC_12) + #endif + #if defined(BSP_USING_INPUT_CAPTURE_TMR6_10) + #define INPUT_CAPTURE_TMR6_10_PORT (GPIO_PORT_A) + #define INPUT_CAPTURE_TMR6_10_PIN (GPIO_PIN_12) + #define INPUT_CAPTURE_TMR6_10_FUNC (GPIO_FUNC_11) + #endif +#endif + #if defined(BSP_USING_QSPI) #ifndef BSP_QSPI_USING_SOFT_CS /* QSSN */ @@ -346,8 +366,15 @@ #endif /* BSP_USING_TMR6_PULSE_ENCODER */ #endif /* RT_USING_PULSE_ENCODER */ -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) - #if defined(BSP_USING_USBFS) +#if defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || \ + defined(BSP_USING_USBFS) || defined(RT_USING_USB) + #error "When using CherryUSB, Please donot Enable 'On-Chip Peripheral Driver---> []Enable USB' or using USB legacy version!" + #endif +#endif + +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) /* USBFS Core*/ #define USBF_DP_PORT (GPIO_PORT_A) #define USBF_DP_PIN (GPIO_PIN_12) diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/config/irq_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/config/irq_config.h index a9ec788bda1..48e1c60796f 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/config/irq_config.h @@ -316,11 +316,28 @@ extern "C" { #define BSP_PULSE_ENCODER_TMR6_10_UDF_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_PULSE_ENCODER_TMR6_10 */ -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) #define BSP_USBFS_GLB_IRQ_NUM USBFS_GLB_IRQn #define BSP_USBFS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif +#if defined(BSP_USING_INPUT_CAPTURE) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_NUM (INT012_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_NUM (INT013_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM (INT014_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM (INT015_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) + +#define BSP_INPUT_CAPTURE_TMR6_10_OVF_IRQ_NUM (INT010_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_10_OVF_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#define BSP_INPUT_CAPTURE_TMR6_10_CAP_IRQ_NUM (INT011_IRQn) +#define BSP_INPUT_CAPTURE_TMR6_10_CAP_IRQ_PRIO (DDL_IRQ_PRIO_DEFAULT) +#endif/* BSP_USING_INPUT_CAPTURE */ + #ifdef __cplusplus } #endif diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/config/pm_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/config/pm_config.h index e77cc0f20e4..df1ee98de31 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/config/pm_config.h +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/config/pm_config.h @@ -55,7 +55,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ { \ .u16Clock = PWC_STOP_CLK_KEEP, \ - .u8StopDrv = PWC_STOP_DRV_HIGH, \ .u16ExBusHold = PWC_STOP_EXBUS_HIZ, \ .u16FlashWait = PWC_STOP_FLASH_WAIT_ON, \ }, \ @@ -72,7 +71,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ .u8Mode = PWC_PD_MD1, \ .u8IOState = PWC_PD_IO_KEEP1, \ - .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \ }, \ } #endif /*PM_SLEEP_STANDBY_CFG*/ @@ -86,7 +84,6 @@ extern void rt_hw_board_pm_sysclk_cfg(uint8_t run_mode); { \ .u8Mode = PWC_PD_MD3, \ .u8IOState = PWC_PD_IO_KEEP1, \ - .u8VcapCtrl = PWC_PD_VCAP_0P047UF, \ }, \ } #endif /*PM_SLEEP_SHUTDOWN_CFG*/ diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/config/tmr_capture_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/config/tmr_capture_config.h new file mode 100644 index 00000000000..089d106ae87 --- /dev/null +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/config/tmr_capture_config.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-14 CDT first version + */ + +#ifndef __IC_CONFIG_H__ +#define __IC_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_1) +#define IC1_NAME "ic1" +#define INPUT_CAPTURE_CFG_TMR6_1 \ +{ \ + .name = IC1_NAME, \ + .ch = TMR6_CH_A, \ + .clk_div = TMR6_CLK_DIV32, \ + .first_edge = TMR6_CAPT_COND_PWMA_RISING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_1_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_1_OVF_IRQ_PRIO, \ +} +#endif + +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_2) +#define IC2_NAME "ic2" +#define INPUT_CAPTURE_CFG_TMR6_2 \ +{ \ + .name = IC2_NAME, \ + .ch = TMR6_CH_A, \ + .clk_div = TMR6_CLK_DIV32, \ + .first_edge = TMR6_CAPT_COND_TRIGB_RISING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_2_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_2_OVF_IRQ_PRIO, \ +} +#endif + +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_10) +#define IC10_NAME "ic10" +#define INPUT_CAPTURE_CFG_TMR6_10 \ +{ \ + .name = IC10_NAME, \ + .ch = TMR6_CH_B, \ + .clk_div = TMR6_CLK_DIV16, \ + .first_edge = TMR6_CAPT_COND_TRIGC_FALLING, \ + .irq_num_cap = BSP_INPUT_CAPTURE_TMR6_10_CAP_IRQ_NUM, \ + .irq_prio_cap = BSP_INPUT_CAPTURE_TMR6_10_CAP_IRQ_PRIO, \ + .irq_num_ovf = BSP_INPUT_CAPTURE_TMR6_10_OVF_IRQ_NUM, \ + .irq_prio_ovf = BSP_INPUT_CAPTURE_TMR6_10_OVF_IRQ_PRIO, \ +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __IC_CONFIG_H__ */ diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/drv_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/drv_config.h index d250b654a47..35f5a1fd434 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/drv_config.h +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/drv_config.h @@ -30,6 +30,7 @@ extern "C" { #include "qspi_config.h" #include "pulse_encoder_config.h" #include "timer_config.h" +#include "tmr_capture_config.h" #ifdef __cplusplus } diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.icf index 1e01b623b0c..394bd6e847d 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.icf @@ -87,9 +87,9 @@ define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0xC00; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.ld b/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.ld index 031047e2080..e135b56b8b1 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.ld +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/linker_scripts/link.ld @@ -88,6 +88,12 @@ SECTIONS __rt_init_end = .; . = ALIGN(4); + /* section for CherryUSB. */ + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + . = ALIGN(4); _etext = .; } >FLASH diff --git a/bsp/hc32/ev_hc32f472_lqfp100/board/ports/usb_config.h b/bsp/hc32/ev_hc32f472_lqfp100/board/ports/usb_config.h new file mode 100644 index 00000000000..723f0b19040 --- /dev/null +++ b/bsp/hc32/ev_hc32f472_lqfp100/board/ports/usb_config.h @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ + #include + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else + #define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL + #define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE + #define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else + #define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN + #define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO + #define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE + #define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN + #define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE + #define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING + #define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING + #define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING + #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO + #define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE + #define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE + #define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS + #define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME + #define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO + #define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE + #define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE + #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + #define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID + #define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC + #define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO + #define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE + #define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE + #define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN + #define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + #define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT + #define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS + #define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM + #define CONFIG_USBDEV_EP_NUM 8 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* Defined FS Core device FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE (32) + +/* Defined FS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE (64) + +/* Defined FS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE (320) + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS + #define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM + #define CONFIG_USBHOST_PIPE_NUM 10 +#endif + + +#ifndef usb_phyaddr2ramaddr + #define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr + #define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif diff --git a/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat new file mode 100644 index 00000000000..be8ad075384 --- /dev/null +++ b/bsp/hc32/ev_hc32f472_lqfp100/bsp_compile_ci.bat @@ -0,0 +1,112 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.can +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.dac +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.qspi +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_host +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_host +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/ev_hc32f472_lqfp100/project.uvprojx b/bsp/hc32/ev_hc32f472_lqfp100/project.uvprojx index 271141cf701..20cdef17275 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/project.uvprojx +++ b/bsp/hc32/ev_hc32f472_lqfp100/project.uvprojx @@ -323,7 +323,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f472_lqfp100/template.uvprojx b/bsp/hc32/ev_hc32f472_lqfp100/template.uvprojx index 48a8d19c05b..45ab5234303 100644 --- a/bsp/hc32/ev_hc32f472_lqfp100/template.uvprojx +++ b/bsp/hc32/ev_hc32f472_lqfp100/template.uvprojx @@ -326,7 +326,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f4a0_lqfp176/.ci/attachconfig/ci.attachconfig.yml index 1966b8266d2..d4a7b92a9dc 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/.ci/attachconfig/ci.attachconfig.yml @@ -1,18 +1,36 @@ +# ------ device CI ------ devices.adc: kconfig: - CONFIG_BSP_USING_ADC=y - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_ADC1_USING_DMA=y +devices.can: + kconfig: + - CONFIG_BSP_USING_CAN=y + - CONFIG_BSP_USING_CAN1=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_RNG=y + - CONFIG_BSP_USING_CRC=y + - CONFIG_BSP_USING_AES=y + - CONFIG_BSP_USING_HASH=y +devices.dac: + kconfig: + - CONFIG_BSP_USING_DAC=y + - CONFIG_BSP_USING_DAC1=y devices.flash: kconfig: - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_RT_USING_FAL=y + - CONFIG_RT_USING_SPI=y + - CONFIG_RT_USING_SFUD=y devices.gpio: kconfig: - CONFIG_BSP_USING_GPIO=y - - CONFIG_BSP_USING_I2C=y - - CONFIG_BSP_USING_I2C_HW=y - - CONFIG_BSP_USING_I2C1=y - - CONFIG_BSP_USING_TCA9539=y - - CONFIG_BSP_USING_EXT_IO=y devices.hwtimer: kconfig: - CONFIG_BSP_USING_HWTIMER=y @@ -20,31 +38,158 @@ devices.hwtimer: devices.i2c: kconfig: - CONFIG_BSP_USING_I2C=y -devices.pwm: + - CONFIG_BSP_USING_I2C1=y + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y +devices.pwm_tmr6: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: kconfig: - CONFIG_BSP_USING_PWM=y - CONFIG_BSP_USING_PWM_TMRA=y - CONFIG_BSP_USING_PWM_TMRA_1=y - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y +devices.qspi: + kconfig: + - CONFIG_BSP_USING_QSPI=y + - CONFIG_BSP_QSPI_USING_DMA=y + - CONFIG_BSP_QSPI_USING_SOFT_CS=y devices.rtc: kconfig: - CONFIG_BSP_USING_RTC=y - - CONFIG_BSP_RTC_USING_XTAL32=y + - CONFIG_RT_USING_ALARM=y +devices.sdio: + kconfig: + - CONFIG_BSP_USING_SDIO=y + - CONFIG_BSP_USING_SDIO1=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.soft_i2c: + kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y devices.spi: kconfig: - CONFIG_BSP_USING_SPI=y - CONFIG_BSP_USING_SPI1=y -devices.uart: + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: kconfig: + - CONFIG_RT_USING_SERIAL_V2=y - CONFIG_BSP_USING_UART=y - CONFIG_BSP_USING_UART1=y -devices.watchdog: + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.usb_hs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBD_HS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_hs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBH_HS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.usb_fs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBD_FS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_fs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBH_FS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.watchdog_swdt: kconfig: - CONFIG_BSP_USING_WDT_TMR=y - CONFIG_BSP_USING_SWDT=y -# ------ SEGGER CI ------ -segger: +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.eth_mii: + kconfig: + - CONFIG_BSP_USING_ETH=y + - CONFIG_ETH_INTERFACE_USING_MII=y + - CONFIG_RT_USING_LWIP212=y + - CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +peripheral.eth_rmii: + kconfig: + - CONFIG_BSP_USING_ETH=y + - CONFIG_ETH_INTERFACE_USING_RMII=y + - CONFIG_ETH_PHY_USING_INTERRUPT_MODE=y + - CONFIG_RT_USING_LWIP212=y + - CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +peripheral.exmc_nand: + kconfig: + - CONFIG_BSP_USING_EXMC=y + - CONFIG_BSP_USING_NAND=y + - CONFIG_FINSH_USING_MSH=y +peripheral.exmc_sdram: + kconfig: + - CONFIG_BSP_USING_EXMC=y + - CONFIG_BSP_USING_SDRAM=y + - CONFIG_FINSH_USING_MSH=y +peripheral.spi_flash: kconfig: - - CONFIG_PKG_USING_SEGGER_RTT=y - - CONFIG_RT_USING_SERIAL_V1=y \ No newline at end of file + - CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/README.md b/bsp/hc32/ev_hc32f4a0_lqfp176/README.md index c822f632ec1..bbe6eb75b4a 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/README.md +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/README.md @@ -23,13 +23,13 @@ EV_F4A0_LQ176 是 XHSC 官方推出的开发板,搭载 HC32F4A0SITB 芯片, EV_F4A0_LQ176 开发板常用 **板载资源** 如下: - MCU:HC32F4A0SITB,主频240MHz,2048KB FLASH,512KB RAM -- 外部RAM:IS62WV51216(SRAM, 1MB) IS42S16400J(SDRAM, 8MB) -- 外部FLASH: MT29F2G08AB(Nand, 256MB) W25Q64(SPI NOR, 64MB) +- 外部RAM:IS62WV51216(SRAM,1MB) IS42S16400J(SDRAM,8MB) +- 外部FLASH: MT29F2G08AB(Nand,256MB) W25Q64(SPI NOR,8MB) - 常用外设 - - LED:3 个, user LED(LED0,LED1,LED2)。 + - LED:3 个,User LED(LED0、LED1、LED2)。 - 按键:11 个,矩阵键盘(K1~K9)、WAKEUP(K10)、RESET(K11)。 -- 常用接口:USB转串口、SD卡接口、以太网接口、LCD接口、USB HS、USB FS、USB 3300、DVP接口、3.5mm耳机接口、Line in接口、喇叭接口 -- 调试接口:板载DAP调试器、标准JTAG/SWD。 +- 常用接口:SD卡接口、以太网接口、LCD接口、USB FS/HS接口、DVP接口、3.5mm耳机接口、Line in接口、CAN接口、LIN接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 开发板更多详细信息请参考小华半导体半导体[EV_F4A0_LQ176](https://www.xhsc.com.cn) @@ -37,34 +37,34 @@ EV_F4A0_LQ176 开发板常用 **板载资源** 如下: 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | +| **板载外设** | **支持情况** | **备注** | | :------------ | :-----------: | :-----------------------------------: | -| USB 转串口 | 支持 | 使用 UART1 | -| ETH | 支持 | | -| LED | 支持 | LED | -| Nand | 支持 | MT29F2G08AB | -| SDRAM | 支持 | IS42S16400J | +| ETH | 支持 | RTL8201F | +| Nand | 支持 | MT29F2G08AB | +| SDRAM | 支持 | IS42S16400J | +| USB 转串口 | 支持 | 使用 UART1 | -| **片上外设** | **支持情况** | **备注** | +| **片上外设** | **支持情况** | **备注** | | :------------ | :-----------: | :-----------------------------------: | -| Crypto | 支持 | AES, CRC, HASH, RNG, UID | -| DAC | 支持 | | -| ADC | 支持 | | -| CAN | 支持 | | -| GPIO | 支持 | PA0, PA1... PI13 ---> PIN: 0, 1...141 | -| PM | 支持 | | -| Lptimer | 支持 | | -| Hwtimer | 支持 | | -| Pulse_encoder | 支持 | | -| PWM | 支持 | | -| RTC | 支持 | 闹钟精度为1分钟 | -| WDT | 支持 | | -| I2C | 支持 | 软件、硬件 I2C | -| QSPI | 支持 | | -| SPI | 支持 | SPI1~6 | -| SDIO | 支持 | | -| UART V1 & V2 | 支持 | UART1~10 | -| USB | 支持 | USBFS/HS Core, device/host模式 | +| ADC | 支持 | | +| CAN | 支持 | | +| Crypto | 支持 | AES,CRC,HASH,RNG | +| DAC | 支持 | | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1...PI13 ---> PIN:0,1...141 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| QSPI | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SDIO | 支持 | | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| USB | 支持 | USBFS/HS Core, device/host模式 | +| WDT | 支持 | | ## 使用说明 @@ -121,19 +121,22 @@ msh > ## 注意事项 -| 板载外设 | 模式 | 注意事项 | -| :------: | :----: | :----------------------------------------------------------- | -| USB | device | 由于RTT抽象层的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | -| USB | device | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需先通过J14连接到主机(如PC),再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | -| USB | host | 由于main()函数中的LED闪烁示例,使用的是USBFS主机口的供电控制管脚,因而当配置为使用USBFS Core的主机模式时,需要将main()函数中的LED示例代码手动屏蔽。 | -| USB | host | 为确保USB主机对外供电充足,建议通过J35外接5V电源供电,并短接J32的EXT跳帽。 | -| USB | host | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需通过J14先连接好OTG线,再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | -| USB | host | 目前仅实现并测试了对U盘的支持。 | -| USB | host | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | -| USB | ALL | 由于管脚复用的原因,当配置使用USBHS Core时,无法同时使用板载SPI FLASH。 | +| 板载外设 | 模式 | 协议栈 | 注意事项 | +| :------: | :----: | :------------: | :----------------------------------------------------------- | +| USB | device | ALL | 由于协议栈的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | +| USB | device | ALL | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需先通过J14连接到主机(如PC),再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | +| USB | ALL | ALL | 由于main()函数中的LED闪烁示例,使用的是USBFS主机的供电控制管脚,因而当配置为使用USBFS Core时,需要将main()函数中的LED示例代码手动屏蔽。 | +| USB | host | ALL | 为确保USB主机对外供电充足,建议通过J35外接5V电源供电,并短接J32的EXT跳帽。 | +| USB | host | ALL | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需通过J14先连接好OTG线,再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | +| USB | host | RTT legacy USB | 目前仅实现并测试了对U盘的支持。 | +| USB | host | RTT legacy USB | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | +| USB | ALL | ALL | 由于管脚复用的原因,当配置使用USBHS Core时,无法同时使用板载SPI FLASH。 | +| USB | ALL | ALL | CherryUSB 与 RTT legacy USB 组件不可同时使用;
CherryUSB与 ”On-Chip Peripheral Driver---> []Enable USB“ 不可同时使能及配置。 | +| USB | ALL | RTT legacy USB | 通过“board/config/usb_config/usb_app_conf.h” 进行应用个性化配置(主要为FIFO分配) | +| USB | ALL | CherryUSB | 通过“board/ports/usb_config.h”进行应用个性化配置(如FIFO分配、是否使用DMA[Device]、是否使用高速PHY等) | ## 联系人信息 维护人: -- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file +- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig b/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig index afeee7e418c..dd6cf3734e3 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/Kconfig @@ -146,7 +146,7 @@ menu "On-chip Peripheral Drivers" int "Set UART1 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART2 @@ -179,7 +179,7 @@ menu "On-chip Peripheral Drivers" int "Set UART2 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART3 @@ -263,7 +263,7 @@ menu "On-chip Peripheral Drivers" int "Set UART6 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA - default 64 + default 64 endif menuconfig BSP_USING_UART7 @@ -296,7 +296,7 @@ menu "On-chip Peripheral Drivers" int "Set UART7 RX DMA ping-pong buffer size" range 32 65535 depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA - default 64 + default 64 endif @@ -834,6 +834,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_USB bool "Enable USB" default n + depends on !RT_USING_CHERRYUSB if BSP_USING_USB config BSP_USING_USBD bool diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c index d18b1402c57..18a1d51da3b 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board.c @@ -40,7 +40,7 @@ void SystemClock_Config(void) { stc_clock_xtal_init_t stcXtalInit; stc_clock_pll_init_t stcPLLHInit; -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) stc_clock_pllx_init_t stcPLLAInit; #endif #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) @@ -87,7 +87,7 @@ void SystemClock_Config(void) GPIO_SetReadWaitCycle(GPIO_RD_WAIT4); CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL); -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) /* PLLX for USB */ (void)CLK_PLLxStructInit(&stcPLLAInit); /* VCO = (8/2)*120 = 480MHz*/ @@ -127,7 +127,7 @@ void PeripheralClock_Config(void) CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK); #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP); #endif } diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.c b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.c index 5e05d061786..34e3d86602e 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.c +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.c @@ -630,6 +630,84 @@ rt_err_t rt_hw_usbhs_board_init(void) } #endif +#if defined(RT_USING_CHERRYUSB) +rt_err_t rt_hw_usbfs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC); /* VBUS */ + } + else + { + GPIO_SetFunc(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, USBF_DRVVBUS_FUNC); /* DRV VBUS */ + } + return RT_EOK; +} + +rt_err_t rt_hw_usbhs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + +#if !defined(CONFIG_USB_HS) + /* USBHS work in embedded PHY */ + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBH_DM_PORT, USBH_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_DP_PORT, USBH_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + GPIO_SetFunc(USBH_VBUS_PORT, USBH_VBUS_PIN, USBH_VBUS_FUNC); + } + else + { + GPIO_OutputCmd(USBH_DRVVBUS_PORT, USBH_DRVVBUS_PIN, ENABLE); + GPIO_SetPins(USBH_DRVVBUS_PORT, USBH_DRVVBUS_PIN); /* DRV VBUS with GPIO funciton */ + } +#else + /* Reset 3300 */ + TCA9539_WritePin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_PIN_SET); + TCA9539_ConfigPin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_DIR_OUT); + + (void)GPIO_StructInit(&stcGpioCfg); + /* High drive capability */ + stcGpioCfg.u16PinDrv = PIN_HIGH_DRV; + (void)GPIO_Init(USBH_ULPI_D0_PORT, USBH_ULPI_D0_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D1_PORT, USBH_ULPI_D1_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D2_PORT, USBH_ULPI_D2_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D3_PORT, USBH_ULPI_D3_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D4_PORT, USBH_ULPI_D4_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D5_PORT, USBH_ULPI_D5_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D6_PORT, USBH_ULPI_D6_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D7_PORT, USBH_ULPI_D7_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_STP_PORT, USBH_ULPI_STP_PIN, &stcGpioCfg); + + GPIO_SetFunc(USBH_ULPI_CLK_PORT, USBH_ULPI_CLK_PIN, USBH_ULPI_CLK_FUNC); + GPIO_SetFunc(USBH_ULPI_DIR_PORT, USBH_ULPI_DIR_PIN, USBH_ULPI_DIR_FUNC); + GPIO_SetFunc(USBH_ULPI_NXT_PORT, USBH_ULPI_NXT_PIN, USBH_ULPI_NXT_FUNC); + GPIO_SetFunc(USBH_ULPI_STP_PORT, USBH_ULPI_STP_PIN, USBH_ULPI_STP_FUNC); + GPIO_SetFunc(USBH_ULPI_D0_PORT, USBH_ULPI_D0_PIN, USBH_ULPI_D0_FUNC); + GPIO_SetFunc(USBH_ULPI_D1_PORT, USBH_ULPI_D1_PIN, USBH_ULPI_D1_FUNC); + GPIO_SetFunc(USBH_ULPI_D2_PORT, USBH_ULPI_D2_PIN, USBH_ULPI_D2_FUNC); + GPIO_SetFunc(USBH_ULPI_D3_PORT, USBH_ULPI_D3_PIN, USBH_ULPI_D3_FUNC); + GPIO_SetFunc(USBH_ULPI_D4_PORT, USBH_ULPI_D4_PIN, USBH_ULPI_D4_FUNC); + GPIO_SetFunc(USBH_ULPI_D5_PORT, USBH_ULPI_D5_PIN, USBH_ULPI_D5_FUNC); + GPIO_SetFunc(USBH_ULPI_D6_PORT, USBH_ULPI_D6_PIN, USBH_ULPI_D6_FUNC); + GPIO_SetFunc(USBH_ULPI_D7_PORT, USBH_ULPI_D7_PIN, USBH_ULPI_D7_FUNC); + + TCA9539_WritePin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_PIN_RESET); +#endif + + return RT_EOK; +} +#endif + + #if defined(BSP_USING_QSPI) rt_err_t rt_hw_qspi_board_init(void) { diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.h b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.h index 78eae162a53..31d26ab2354 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.h +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/board_config.h @@ -15,7 +15,9 @@ #include #include "hc32_ll.h" #include "drv_config.h" - +#if defined(RT_USING_CHERRYUSB) + #include "usb_config.h" +#endif /************************* XTAL port **********************/ #define XTAL_PORT (GPIO_PORT_H) @@ -561,8 +563,17 @@ #endif #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) - #if defined(BSP_USING_USBFS) +#if defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || \ + defined(BSP_USING_USBFS) || defined(BSP_USING_USBHS) || \ + defined(BSP_USING_USBHS_PHY_EMBED) || defined(BSP_USING_USBHS_PHY_EXTERN) || \ + defined(RT_USING_USB) + #error "When using CherryUSB, Please donot Enable 'On-Chip Peripheral Driver---> []Enable USB' or using USB legacy version!" + #endif +#endif + +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) /* USBFS Core*/ #define USBF_DP_PORT (GPIO_PORT_A) #define USBF_DP_PIN (GPIO_PIN_12) @@ -575,9 +586,9 @@ #define USBF_DRVVBUS_PIN (GPIO_PIN_09) #define USBF_DRVVBUS_FUNC (GPIO_FUNC_10) #endif - #if defined(BSP_USING_USBHS) + #if defined(BSP_USING_USBHS) || defined(RT_USING_CHERRYUSB) /* USBHS Core*/ - #if defined(BSP_USING_USBHS_PHY_EMBED) + #if defined(BSP_USING_USBHS_PHY_EMBED) || (defined(RT_USING_CHERRYUSB) && !defined(CONFIG_USB_HS)) #define USBH_DP_PORT (GPIO_PORT_B) #define USBH_DP_PIN (GPIO_PIN_15) #define USBH_DP_FUNC (GPIO_FUNC_10) diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/config/irq_config.h b/bsp/hc32/ev_hc32f4a0_lqfp176/board/config/irq_config.h index eebe5cbcda2..9ceb83944b1 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/config/irq_config.h @@ -308,12 +308,12 @@ extern "C" { #endif/* RT_USING_ALARM */ -#if defined(BSP_USING_USBFS) +#if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) #define BSP_USBFS_GLB_IRQ_NUM INT003_IRQn #define BSP_USBFS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_USBFS */ -#if defined(BSP_USING_USBHS) +#if defined(BSP_USING_USBHS) || defined(RT_USING_CHERRYUSB) #define BSP_USBHS_GLB_IRQ_NUM INT000_IRQn #define BSP_USBHS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_USBHS */ diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/hc32f4xx_conf.h b/bsp/hc32/ev_hc32f4a0_lqfp176/board/hc32f4xx_conf.h index eaa2c4bd874..d762176f47b 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/hc32f4xx_conf.h +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/hc32f4xx_conf.h @@ -144,44 +144,14 @@ extern "C" #define ETH_MAC_ADDR4 (0x00U) #define ETH_MAC_ADDR5 (0x00U) -/* Common PHY Registers */ -#define PHY_BCR (0x00U) /*!< Basic Control Register */ -#define PHY_BSR (0x01U) /*!< Basic Status Register */ - -#define PHY_SOFT_RESET (0x8000U) /*!< PHY Soft Reset */ -#define PHY_LOOPBACK (0x4000U) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M (0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M (0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M (0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M (0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION (0x1000U) /*!< Enable auto-negotiation function */ -#define PHY_POWERDOWN (0x0800U) /*!< Select the power down mode */ -#define PHY_ISOLATE (0x0400U) /*!< Isolate PHY from MII */ -#define PHY_RESTART_AUTONEGOTIATION (0x0200U) /*!< Restart auto-negotiation function */ - -#define PHY_100BASE_TX_FD (0x4000U) /*!< 100Base-TX full duplex support */ -#define PHY_100BASE_TX_HD (0x2000U) /*!< 100Base-TX half duplex support */ -#define PHY_10BASE_T_FD (0x1000U) /*!< 10Base-T full duplex support */ -#define PHY_10BASE_T_HD (0x0800U) /*!< 10Base-T half duplex support */ -#define PHY_AUTONEGO_COMPLETE (0x0020U) /*!< Auto-Negotiation process completed */ -#define PHY_LINK_STATUS (0x0004U) /*!< Valid link established */ -#define PHY_JABBER_DETECTION (0x0002U) /*!< Jabber condition detected */ - #if defined (ETH_PHY_USING_RTL8201F) /* PHY(RTL8201F) Address*/ -#define ETH_PHY_ADDR (0x00U) - -/* PHY Configuration delay(ms) */ -#define ETH_PHY_RST_DELAY (0x0080UL) -#define ETH_PHY_CONFIG_DELAY (0x0800UL) -#define ETH_PHY_RD_TIMEOUT (0x0005UL) -#define ETH_PHY_WR_TIMEOUT (0x0005UL) +#define ETH_PHY_ADDR (0x01U) /* PHY Status Register */ -#define PHY_SR (PHY_BCR) /*!< PHY status register */ - -#define PHY_DUPLEX_STATUS (PHY_FULLDUPLEX_10M) /*!< PHY Duplex mask */ -#define PHY_SPEED_STATUS (PHY_HALFDUPLEX_100M) /*!< PHY Speed mask */ +#define PHY_SR (0x00U) /*!< PHY status register */ +#define PHY_DUPLEX_STATUS (0x0100U) /*!< PHY Duplex mask */ +#define PHY_SPEED_STATUS (0x2000U) /*!< PHY Speed mask */ #endif diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.icf index b19e19460ad..6e3bb10d40c 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.icf @@ -86,9 +86,9 @@ define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.ld b/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.ld index 9eba9a320d7..a1e0bc0573f 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.ld +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/linker_scripts/link.ld @@ -88,6 +88,12 @@ SECTIONS __rt_init_end = .; . = ALIGN(4); + /* section for CherryUSB. */ + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + . = ALIGN(4); _etext = .; } >FLASH diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/usb_config.h b/bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/usb_config.h new file mode 100644 index 00000000000..dd239502be3 --- /dev/null +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/board/ports/usb_config.h @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ + #include + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else + #define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL + #define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE + #define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else + #define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN + #define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO + #define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE + #define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN + #define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE + #define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING + #define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING + #define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING + #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO + #define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE + #define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE + #define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS + #define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME + #define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO + #define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE + #define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE + #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + #define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID + #define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC + #define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO + #define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE + #define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE + #define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN + #define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + #define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT + #define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS + #define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM + #define CONFIG_USBDEV_EP_NUM 8 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, + * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. + * +*/ +//#define CONFIG_USB_HS + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* Defined FS Core device FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE (32) + +/* Defined FS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE (64) + +/* Defined FS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE (640) + +/* Defined HS Core Device FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE (1024) +#define CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE (0) + +/* Defined HS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE (512) +#define CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE (256) + +/* Defined HS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE (2048) + + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS + #define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM + #define CONFIG_USBHOST_PIPE_NUM 10 +#endif + + +#ifndef usb_phyaddr2ramaddr + #define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr + #define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat new file mode 100644 index 00000000000..7a3904105df --- /dev/null +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/bsp_compile_ci.bat @@ -0,0 +1,132 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.can +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.dac +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.qspi +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.sdio +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_host +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_host +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + + +scons --attach=peripheral.eth_mii +scons -j4 +scons --attach=default + +scons --attach=peripheral.eth_rmii +scons -j4 +scons --attach=default + +scons --attach=peripheral.exmc_nand +scons -j4 +scons --attach=default + +scons --attach=peripheral.exmc_sdram +scons -j4 +scons --attach=default + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/ev_hc32f4a0_lqfp176/template.uvprojx b/bsp/hc32/ev_hc32f4a0_lqfp176/template.uvprojx index f4ae04a9877..cf934ed2a47 100644 --- a/bsp/hc32/ev_hc32f4a0_lqfp176/template.uvprojx +++ b/bsp/hc32/ev_hc32f4a0_lqfp176/template.uvprojx @@ -325,7 +325,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/.ci/attachconfig/ci.attachconfig.yml b/bsp/hc32/ev_hc32f4a8_lqfp176/.ci/attachconfig/ci.attachconfig.yml index 4be9a3f29aa..e5798b47293 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/.ci/attachconfig/ci.attachconfig.yml +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/.ci/attachconfig/ci.attachconfig.yml @@ -1,12 +1,202 @@ +# ------ device CI ------ +devices.adc: + kconfig: + - CONFIG_BSP_USING_ADC=y + - CONFIG_BSP_USING_ADC1=y + - CONFIG_BSP_ADC1_USING_DMA=y +devices.can: + kconfig: + - CONFIG_RT_USING_CAN_MCAN=y + - CONFIG_BSP_USING_CAN=y + - CONFIG_BSP_USING_CAN1=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.crypto: + kconfig: + - CONFIG_BSP_USING_HWCRYPTO=y + - CONFIG_BSP_USING_UQID=y + - CONFIG_BSP_USING_RNG=y + - CONFIG_BSP_USING_CRC=y + - CONFIG_BSP_USING_HASH=y +devices.dac: + kconfig: + - CONFIG_BSP_USING_DAC=y + - CONFIG_BSP_USING_DAC1=y +devices.flash: + kconfig: + - CONFIG_BSP_USING_ON_CHIP_FLASH=y + - CONFIG_RT_USING_FAL=y + - CONFIG_RT_USING_SPI=y + - CONFIG_RT_USING_SFUD=y devices.gpio: kconfig: - CONFIG_BSP_USING_GPIO=y +devices.hwtimer: + kconfig: + - CONFIG_BSP_USING_HWTIMER=y + - CONFIG_BSP_USING_TMRA_1=y +devices.i2c: + kconfig: - CONFIG_BSP_USING_I2C=y - - CONFIG_BSP_USING_I2C_HW=y - CONFIG_BSP_USING_I2C1=y - - CONFIG_BSP_USING_TCA9539=y - - CONFIG_BSP_USING_EXT_IO=y -devices.uart: + - CONFIG_BSP_I2C1_TX_USING_DMA=y + - CONFIG_BSP_I2C1_RX_USING_DMA=y +devices.input_capture: + kconfig: + - CONFIG_BSP_USING_INPUT_CAPTURE=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6=y + - CONFIG_BSP_USING_INPUT_CAPTURE_TMR6_1=y +devices.mcan: + kconfig: + - CONFIG_RT_USING_CAN_MCAN=y + - CONFIG_BSP_USING_MCAN=y + - CONFIG_BSP_USING_MCAN1=y + - CONFIG_RT_CAN_USING_CANFD=y + - CONFIG_RT_CAN_USING_HDR=y +devices.pm: + kconfig: + - CONFIG_BSP_USING_PM=y + - CONFIG_IDLE_THREAD_STACK_SIZE=512 +devices.pulse_encoder_tmr6: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMR6_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMR6_1=y +devices.pulse_encoder_tmra: + kconfig: + - CONFIG_BSP_USING_PULSE_ENCODER=y + - CONFIG_BSP_USING_TMRA_PULSE_ENCODER=y + - CONFIG_BSP_USING_PULSE_ENCODER_TMRA_1=y +devices.pwm_tmr4: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR4=y + - CONFIG_BSP_USING_PWM_TMR4_1=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUH=y + - CONFIG_BSP_USING_PWM_TMR4_1_OUL=y +devices.pwm_tmr6: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMR6=y + - CONFIG_BSP_USING_PWM_TMR6_1=y + - CONFIG_BSP_USING_PWM_TMR6_1_A=y + - CONFIG_BSP_USING_PWM_TMR6_1_B=y +devices.pwm_tmra: + kconfig: + - CONFIG_BSP_USING_PWM=y + - CONFIG_BSP_USING_PWM_TMRA=y + - CONFIG_BSP_USING_PWM_TMRA_1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH1=y + - CONFIG_BSP_USING_PWM_TMRA_1_CH2=y +devices.qspi: + kconfig: + - CONFIG_BSP_USING_QSPI=y + - CONFIG_BSP_QSPI_USING_DMA=y + - CONFIG_BSP_QSPI_USING_SOFT_CS=y +devices.rtc: + kconfig: + - CONFIG_BSP_USING_RTC=y + - CONFIG_RT_USING_ALARM=y +devices.sdio: + kconfig: + - CONFIG_BSP_USING_SDIO=y + - CONFIG_BSP_USING_SDIO1=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.soft_i2c: kconfig: + - CONFIG_BSP_USING_I2C=y + - CONFIG_BSP_USING_I2C1_SW=y +devices.spi: + kconfig: + - CONFIG_BSP_USING_SPI=y + - CONFIG_BSP_USING_SPI1=y + - CONFIG_BSP_SPI1_TX_USING_DMA=y + - CONFIG_BSP_SPI1_RX_USING_DMA=y + - CONFIG_BSP_SPI_USING_DMA=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.uart_v1: + kconfig: + - CONFIG_RT_USING_SERIAL_V1=y - CONFIG_BSP_USING_UART=y - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.uart_v2: + kconfig: + - CONFIG_RT_USING_SERIAL_V2=y + - CONFIG_BSP_USING_UART=y + - CONFIG_BSP_USING_UART1=y + - CONFIG_RT_SERIAL_USING_DMA=y + - CONFIG_BSP_UART1_RX_USING_DMA=y + - CONFIG_BSP_UART1_TX_USING_DMA=y +devices.usb_hs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBD_HS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_hs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBHS=y + - CONFIG_BSP_USING_USBH_HS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.usb_fs_device: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBD=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBD_FS=y + - CONFIG_RT_USB_DEVICE_MSTORAGE=y +devices.usb_fs_host: + kconfig: + - CONFIG_BSP_USING_USB=y + - CONFIG_BSP_USING_USBH=y + - CONFIG_BSP_USING_USBFS=y + - CONFIG_BSP_USING_USBH_FS=y + - CONFIG_RT_USBH_MSTORAGE=y + - CONFIG_RT_USING_DFS=y + - CONFIG_RT_USING_DFS_ELMFAT=y +devices.watchdog_swdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_SWDT=y +devices.watchdog_wdt: + kconfig: + - CONFIG_BSP_USING_WDT_TMR=y + - CONFIG_BSP_USING_WDT=y + +# ------ peripheral CI ------ +peripheral.eth_mii: + kconfig: + - CONFIG_BSP_USING_ETH=y + - CONFIG_ETH_INTERFACE_USING_MII=y + - CONFIG_RT_USING_LWIP212=y + - CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +peripheral.eth_rmii: + kconfig: + - CONFIG_BSP_USING_ETH=y + - CONFIG_ETH_INTERFACE_USING_RMII=y + - CONFIG_ETH_PHY_USING_INTERRUPT_MODE=y + - CONFIG_RT_USING_LWIP212=y + - CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +peripheral.exmc_nand: + kconfig: + - CONFIG_BSP_USING_EXMC=y + - CONFIG_BSP_USING_NAND=y + - CONFIG_FINSH_USING_MSH=y +peripheral.exmc_sdram: + kconfig: + - CONFIG_BSP_USING_EXMC=y + - CONFIG_BSP_USING_SDRAM=y + - CONFIG_FINSH_USING_MSH=y +peripheral.spi_flash: + kconfig: + - CONFIG_BSP_USING_SPI_FLASH=y diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/README.md b/bsp/hc32/ev_hc32f4a8_lqfp176/README.md index 258c8e3fe45..65d551688a7 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/README.md +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/README.md @@ -23,13 +23,13 @@ EV_F4A8_LQ176 是 XHSC 官方推出的开发板,搭载 HC32F4A8SITB 芯片, EV_F4A8_LQ176 开发板常用 **板载资源** 如下: - MCU:HC32F4A8SITB,主频240MHz,2048KB FLASH,512KB RAM -- 外部RAM:IS62WV51216(SRAM, 1MB) W9825G6KH(SDRAM, 8MB) -- 外部FLASH: MT29F2G08AB(Nand, 256MB) W25Q64(SPI NOR, 8MB) +- 外部RAM:IS62WV51216(SRAM,1MB) W9825G6KH(SDRAM,8MB) +- 外部FLASH: MT29F2G08AB(Nand,256MB) W25Q64(SPI NOR,8MB) - 常用外设 - - LED:3 个, user LED(LED0,LED1,LED2)。 + - LED:3 个,User LED(LED0、LED1、LED2)。 - 按键:6个,矩阵键盘(K1~K4)、WAKEUP(K5)、RESET(K0)。 -- 常用接口:USB转串口、SD卡接口、以太网接口、LCD接口、USB HS、USB FS、USB 3300、DVP接口、3.5mm耳机接口、Line in接口、喇叭接口 -- 调试接口:板载DAP调试器、标准JTAG/SWD。 +- 常用接口:SD卡接口、以太网接口、LCD接口、USB FS/HS接口、DVP接口、3.5mm耳机接口、Line in接口、CAN/MCAN接口、LIN接口、RS485接口。 +- 调试接口:板载DAP调试器(含USB转串口)、标准JTAG/SWD。 开发板更多详细信息请参考小华半导体半导体[EV_F4A8_LQ176](https://www.xhsc.com.cn) @@ -37,20 +37,35 @@ EV_F4A8_LQ176 开发板常用 **板载资源** 如下: 本 BSP 目前对外设的支持情况如下: -| **板载外设** | **支持情况** | **备注** | +| **板载外设** | **支持情况** | **备注** | | :------------ | :-----------: | :-----------------------------------: | -| USB 转串口 | 支持 | 使用 UART1 | -| LED | 支持 | LED | -| SDRAM | 支持 | IS42S16400J | +| ETH | 支持 | RTL8201F | +| Nand | 支持 | MT29F2G08AB | +| SDRAM | 支持 | W9825G6KH | +| USB 转串口 | 支持 | 使用 UART1 | -| **片上外设** | **支持情况** | **备注** | +| **片上外设** | **支持情况** | **备注** | | :------------ | :-----------: | :-----------------------------------: | -| CAN | 支持 | | -| GPIO | 支持 | PA0, PA1... PI13 ---> PIN: 0, 1...141 | -| WDT | 支持 | | -| SPI | 支持 | SPI1~6 | -| SDIO | 支持 | | -| UART V1 & V2 | 支持 | UART1~10 | +| ADC | 支持 | | +| CAN | 支持 | | +| Crypto | 支持 | AES,CRC,HASH,RNG | +| DAC | 支持 | | +| FLASH | 支持 | | +| GPIO | 支持 | PA0,PA1...PI13 ---> PIN:0,1...141 | +| HwTimer | 支持 | | +| I2C | 支持 | 软件、硬件 I2C | +| InputCapture | 支持 | | +| MCAN | 支持 | | +| PM | 支持 | | +| PulseEncoder | 支持 | | +| PWM | 支持 | | +| QSPI | 支持 | | +| RTC | 支持 | 闹钟精度为1分钟 | +| SDIO | 支持 | | +| SPI | 支持 | | +| UART V1 & V2 | 支持 | | +| USB | 支持 | USBFS/HS Core, device/host模式 | +| WDT | 支持 | | ## 使用说明 @@ -105,9 +120,24 @@ msh > 4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 +## 注意事项 + +| 板载外设 | 模式 | 协议栈 | 注意事项 | +| -------- | ------ | :------------: | ------------------------------------------------------------ | +| USB | device | ALL | 由于协议栈的设计,当配置为CDC设备时,打开USB虚拟串口,需使能流控的DTR信号。(如使用SSCOM串口助手打开USB虚拟串口时,勾选DTR选框) | +| USB | device | ALL | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需先通过J14连接到主机(如PC),再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | +| USB | ALL | ALL | 由于main()函数中的LED闪烁示例,使用的是USBFS主机的供电控制管脚,因而当配置为使用USBFS Core时,需要将main()函数中的LED示例代码手动屏蔽。 | +| USB | host | ALL | 为确保USB主机对外供电充足,建议通过J35外接5V电源供电,并短接J32对应跳帽。 | +| USB | host | ALL | 由于外部PHY管脚复用的原因,当配置使用USBHS Core并且使用外部PHY时,需通过J14先连接好OTG线,再复位MCU运行程序;或者将J24跳帽先短接,再复位MCU运行程序。 | +| USB | host | RTT legacy USB | 目前仅实现并测试了对U盘的支持。 | +| USB | host | RTT legacy USB | 若配置为U盘主机模式,出现部分U盘无法识别或者写入失败时,可以尝试将RTT抽象层中rt_udisk_run()函数的rt_usbh_storage_reset()操作注释掉,测试是否可以获得更好的兼容性。 | +| USB | ALL | ALL | 由于管脚复用的原因,当配置使用USBHS Core时,无法同时使用板载SPI FLASH。 | +| USB | ALL | ALL | CherryUSB 与 RTT legacy USB 组件不可同时使用;
CherryUSB与 ”On-Chip Peripheral Driver---> []Enable USB“ 不可同时使能及配置。 | +| USB | ALL | RTT legacy USB | 通过“board/config/usb_config/usb_app_conf.h” 进行应用个性化配置(主要为FIFO分配) | +| USB | ALL | CherryUSB | 通过“board/ports/usb_config.h”进行应用个性化配置(如FIFO分配、是否使用DMA[Device]、是否使用高速PHY等) | ## 联系人信息 维护人: -- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file +- [小华半导体MCU](https://www.xhsc.com.cn),邮箱: \ No newline at end of file diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig b/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig index a542cd175e1..cae9576d068 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/Kconfig @@ -738,16 +738,6 @@ menu "On-chip Peripheral Drivers" bool "Using Hardware AES" default n select RT_HWCRYPTO_USING_AES - if BSP_USING_AES - choice - prompt "Select AES Mode" - default BSP_USING_AES_ECB - - config BSP_USING_AES_ECB - bool "ECB mode" - select RT_HWCRYPTO_USING_AES_ECB - endchoice - endif config BSP_USING_HASH bool "Using Hardware Hash" @@ -842,6 +832,7 @@ menu "On-chip Peripheral Drivers" menuconfig BSP_USING_USB bool "Enable USB" default n + depends on !RT_USING_CHERRYUSB if BSP_USING_USB config BSP_USING_USBD bool diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board.c b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board.c index 1510d82e215..4a2e0ccce65 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board.c +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board.c @@ -40,7 +40,7 @@ void SystemClock_Config(void) { stc_clock_xtal_init_t stcXtalInit; stc_clock_pll_init_t stcPLLHInit; -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) stc_clock_pllx_init_t stcPLLAInit; #endif #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM) @@ -87,7 +87,7 @@ void SystemClock_Config(void) GPIO_SetReadWaitCycle(GPIO_RD_WAIT4); CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL); -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) /* PLLX for USB */ (void)CLK_PLLxStructInit(&stcPLLAInit); /* VCO = (8/2)*120 = 480MHz*/ @@ -134,7 +134,7 @@ void PeripheralClock_Config(void) CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK); #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP); #endif } diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.c b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.c index 85514577772..9aa7eb65d2a 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.c +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.c @@ -669,6 +669,83 @@ rt_err_t rt_hw_usbhs_board_init(void) } #endif +#if defined(RT_USING_CHERRYUSB) +rt_err_t rt_hw_usbfs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBF_DM_PORT, USBF_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBF_DP_PORT, USBF_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + GPIO_SetFunc(USBF_VBUS_PORT, USBF_VBUS_PIN, USBF_VBUS_FUNC); /* VBUS */ + } + else + { + GPIO_SetFunc(USBF_DRVVBUS_PORT, USBF_DRVVBUS_PIN, USBF_DRVVBUS_FUNC); /* DRV VBUS */ + } + return RT_EOK; +} + +rt_err_t rt_hw_usbhs_board_init(uint8_t devmode) +{ + stc_gpio_init_t stcGpioCfg; + (void)GPIO_StructInit(&stcGpioCfg); + +#if !defined(CONFIG_USB_HS) + /* USBHS work in embedded PHY */ + stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG; + (void)GPIO_Init(USBH_DM_PORT, USBH_DM_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_DP_PORT, USBH_DP_PIN, &stcGpioCfg); + if (0U != devmode) + { + GPIO_SetFunc(USBH_VBUS_PORT, USBH_VBUS_PIN, USBH_VBUS_FUNC); + } + else + { + GPIO_OutputCmd(USBH_DRVVBUS_PORT, USBH_DRVVBUS_PIN, ENABLE); + GPIO_SetPins(USBH_DRVVBUS_PORT, USBH_DRVVBUS_PIN); /* DRV VBUS with GPIO funciton */ + } +#else + /* Reset 3300 */ + TCA9539_WritePin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_PIN_SET); + TCA9539_ConfigPin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_DIR_OUT); + + (void)GPIO_StructInit(&stcGpioCfg); + /* High drive capability */ + stcGpioCfg.u16PinDrv = PIN_HIGH_DRV; + (void)GPIO_Init(USBH_ULPI_D0_PORT, USBH_ULPI_D0_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D1_PORT, USBH_ULPI_D1_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D2_PORT, USBH_ULPI_D2_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D3_PORT, USBH_ULPI_D3_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D4_PORT, USBH_ULPI_D4_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D5_PORT, USBH_ULPI_D5_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D6_PORT, USBH_ULPI_D6_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_D7_PORT, USBH_ULPI_D7_PIN, &stcGpioCfg); + (void)GPIO_Init(USBH_ULPI_STP_PORT, USBH_ULPI_STP_PIN, &stcGpioCfg); + + GPIO_SetFunc(USBH_ULPI_CLK_PORT, USBH_ULPI_CLK_PIN, USBH_ULPI_CLK_FUNC); + GPIO_SetFunc(USBH_ULPI_DIR_PORT, USBH_ULPI_DIR_PIN, USBH_ULPI_DIR_FUNC); + GPIO_SetFunc(USBH_ULPI_NXT_PORT, USBH_ULPI_NXT_PIN, USBH_ULPI_NXT_FUNC); + GPIO_SetFunc(USBH_ULPI_STP_PORT, USBH_ULPI_STP_PIN, USBH_ULPI_STP_FUNC); + GPIO_SetFunc(USBH_ULPI_D0_PORT, USBH_ULPI_D0_PIN, USBH_ULPI_D0_FUNC); + GPIO_SetFunc(USBH_ULPI_D1_PORT, USBH_ULPI_D1_PIN, USBH_ULPI_D1_FUNC); + GPIO_SetFunc(USBH_ULPI_D2_PORT, USBH_ULPI_D2_PIN, USBH_ULPI_D2_FUNC); + GPIO_SetFunc(USBH_ULPI_D3_PORT, USBH_ULPI_D3_PIN, USBH_ULPI_D3_FUNC); + GPIO_SetFunc(USBH_ULPI_D4_PORT, USBH_ULPI_D4_PIN, USBH_ULPI_D4_FUNC); + GPIO_SetFunc(USBH_ULPI_D5_PORT, USBH_ULPI_D5_PIN, USBH_ULPI_D5_FUNC); + GPIO_SetFunc(USBH_ULPI_D6_PORT, USBH_ULPI_D6_PIN, USBH_ULPI_D6_FUNC); + GPIO_SetFunc(USBH_ULPI_D7_PORT, USBH_ULPI_D7_PIN, USBH_ULPI_D7_FUNC); + + TCA9539_WritePin(TCA9539_IO_PORT1, USB_3300_RESET_PIN, TCA9539_PIN_RESET); +#endif + + return RT_EOK; +} +#endif + #if defined(BSP_USING_QSPI) rt_err_t rt_hw_qspi_board_init(void) { diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.h b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.h index 4543a1c5a44..4997929780e 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.h +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/board_config.h @@ -15,7 +15,9 @@ #include #include "hc32_ll.h" #include "drv_config.h" - +#if defined(RT_USING_CHERRYUSB) + #include "usb_config.h" +#endif /************************* XTAL port **********************/ #define XTAL_PORT (GPIO_PORT_H) @@ -585,8 +587,17 @@ #endif #endif -#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) - #if defined(BSP_USING_USBFS) +#if defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || \ + defined(BSP_USING_USBFS) || defined(BSP_USING_USBHS) || \ + defined(BSP_USING_USBHS_PHY_EMBED) || defined(BSP_USING_USBHS_PHY_EXTERN) || \ + defined(RT_USING_USB) + #error "When using CherryUSB, Please donot Enable 'On-Chip Peripheral Driver---> []Enable USB' or using USB legacy version!" + #endif +#endif + +#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH) || defined(RT_USING_CHERRYUSB) + #if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) /* USBFS Core*/ #define USBF_DP_PORT (GPIO_PORT_A) #define USBF_DP_PIN (GPIO_PIN_12) @@ -599,9 +610,9 @@ #define USBF_DRVVBUS_PIN (GPIO_PIN_09) #define USBF_DRVVBUS_FUNC (GPIO_FUNC_10) #endif - #if defined(BSP_USING_USBHS) + #if defined(BSP_USING_USBHS) || defined(RT_USING_CHERRYUSB) /* USBHS Core*/ - #if defined(BSP_USING_USBHS_PHY_EMBED) + #if defined(BSP_USING_USBHS_PHY_EMBED) || (defined(RT_USING_CHERRYUSB) && !defined(CONFIG_USB_HS)) #define USBH_DP_PORT (GPIO_PORT_B) #define USBH_DP_PIN (GPIO_PIN_15) #define USBH_DP_FUNC (GPIO_FUNC_10) diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/config/irq_config.h b/bsp/hc32/ev_hc32f4a8_lqfp176/board/config/irq_config.h index 01d2dda2af4..85ea6124400 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/config/irq_config.h +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/config/irq_config.h @@ -369,17 +369,11 @@ extern "C" { #if defined(BSP_USING_MCAN1) #define BSP_MCAN1_INT0_IRQ_NUM INT124_IRQn #define BSP_MCAN1_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN1_INT1_IRQ_NUM INT125_IRQn -#define BSP_MCAN1_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN1 */ #if defined(BSP_USING_MCAN2) #define BSP_MCAN2_INT0_IRQ_NUM INT126_IRQn #define BSP_MCAN2_INT0_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT - -#define BSP_MCAN2_INT1_IRQ_NUM INT127_IRQn -#define BSP_MCAN2_INT1_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_MCAN2 */ #if defined(BSP_USING_SDIO1) @@ -398,12 +392,12 @@ extern "C" { #endif/* RT_USING_ALARM */ -#if defined(BSP_USING_USBFS) +#if defined(BSP_USING_USBFS) || defined(RT_USING_CHERRYUSB) #define BSP_USBFS_GLB_IRQ_NUM INT003_IRQn #define BSP_USBFS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_USBFS */ -#if defined(BSP_USING_USBHS) +#if defined(BSP_USING_USBHS) || defined(RT_USING_CHERRYUSB) #define BSP_USBHS_GLB_IRQ_NUM INT000_IRQn #define BSP_USBHS_GLB_IRQ_PRIO DDL_IRQ_PRIO_DEFAULT #endif/* BSP_USING_USBHS */ diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.icf b/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.icf index d001ffd3bb0..2262402986a 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.icf +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.icf @@ -73,9 +73,9 @@ define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.ld b/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.ld index c620bc8170b..d97be4a677b 100644 --- a/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.ld +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/linker_scripts/link.ld @@ -88,6 +88,12 @@ SECTIONS __rt_init_end = .; . = ALIGN(4); + /* section for CherryUSB. */ + . = ALIGN(4); + __usbh_class_info_start__ = .; + KEEP(*(.usbh_class_info)) + __usbh_class_info_end__ = .; + . = ALIGN(4); _etext = .; } >FLASH diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/board/ports/usb_config.h b/bsp/hc32/ev_hc32f4a8_lqfp176/board/ports/usb_config.h new file mode 100644 index 00000000000..dd239502be3 --- /dev/null +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/board/ports/usb_config.h @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#ifndef CHERRYUSB_CONFIG_H +#define CHERRYUSB_CONFIG_H + +/* ================ USB common Configuration ================ */ + +#ifdef __RTTHREAD__ + #include + + #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) +#else + #define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) +#endif + +#ifndef CONFIG_USB_DBG_LEVEL + #define CONFIG_USB_DBG_LEVEL USB_DBG_INFO +#endif + +/* Enable print with color */ +#define CONFIG_USB_PRINTF_COLOR_ENABLE + +// #define CONFIG_USB_DCACHE_ENABLE + +/* data align size when use dma or use dcache */ +#ifdef CONFIG_USB_DCACHE_ENABLE + #define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 +#else + #define CONFIG_USB_ALIGN_SIZE 4 +#endif + +/* attribute data into no cache ram */ +#define USB_NOCACHE_RAM_SECTION __attribute__((section(".noncacheable"))) + +/* use usb_memcpy default for high performance but cost more flash memory. + * And, arm libc has a bug that memcpy() may cause data misalignment when the size is not a multiple of 4. +*/ +// #define CONFIG_USB_MEMCPY_DISABLE + +/* ================= USB Device Stack Configuration ================ */ + +/* Ep0 in and out transfer buffer */ +#ifndef CONFIG_USBDEV_REQUEST_BUFFER_LEN + #define CONFIG_USBDEV_REQUEST_BUFFER_LEN 512 +#endif + +/* Send ep0 in data from user buffer instead of copying into ep0 reqdata + * Please note that user buffer must be aligned with CONFIG_USB_ALIGN_SIZE +*/ +// #define CONFIG_USBDEV_EP0_INDATA_NO_COPY + +/* Check if the input descriptor is correct */ +// #define CONFIG_USBDEV_DESC_CHECK + +/* Enable test mode */ +// #define CONFIG_USBDEV_TEST_MODE + +/* enable advance desc register api */ +#define CONFIG_USBDEV_ADVANCE_DESC + +/* move ep0 setup handler from isr to thread */ +// #define CONFIG_USBDEV_EP0_THREAD + +#ifndef CONFIG_USBDEV_EP0_PRIO + #define CONFIG_USBDEV_EP0_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_EP0_STACKSIZE + #define CONFIG_USBDEV_EP0_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_LUN + #define CONFIG_USBDEV_MSC_MAX_LUN 1 +#endif + +#ifndef CONFIG_USBDEV_MSC_MAX_BUFSIZE + #define CONFIG_USBDEV_MSC_MAX_BUFSIZE 512 +#endif + +#ifndef CONFIG_USBDEV_MSC_MANUFACTURER_STRING + #define CONFIG_USBDEV_MSC_MANUFACTURER_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_PRODUCT_STRING + #define CONFIG_USBDEV_MSC_PRODUCT_STRING "" +#endif + +#ifndef CONFIG_USBDEV_MSC_VERSION_STRING + #define CONFIG_USBDEV_MSC_VERSION_STRING "0.01" +#endif + +/* move msc read & write from isr to while(1), you should call usbd_msc_polling in while(1) */ +// #define CONFIG_USBDEV_MSC_POLLING + +/* move msc read & write from isr to thread */ +// #define CONFIG_USBDEV_MSC_THREAD + +#ifndef CONFIG_USBDEV_MSC_PRIO + #define CONFIG_USBDEV_MSC_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MSC_STACKSIZE + #define CONFIG_USBDEV_MSC_STACKSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_BUFSIZE + #define CONFIG_USBDEV_MTP_MAX_BUFSIZE 2048 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_OBJECTS + #define CONFIG_USBDEV_MTP_MAX_OBJECTS 256 +#endif + +#ifndef CONFIG_USBDEV_MTP_MAX_PATHNAME + #define CONFIG_USBDEV_MTP_MAX_PATHNAME 256 +#endif + +#define CONFIG_USBDEV_MTP_THREAD + +#ifndef CONFIG_USBDEV_MTP_PRIO + #define CONFIG_USBDEV_MTP_PRIO 4 +#endif + +#ifndef CONFIG_USBDEV_MTP_STACKSIZE + #define CONFIG_USBDEV_MTP_STACKSIZE 4096 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE + #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 +#endif + +/* rndis transfer buffer size, must be a multiple of (1536 + 44)*/ +#ifndef CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE + #define CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE 1580 +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_ID + #define CONFIG_USBDEV_RNDIS_VENDOR_ID 0x0000ffff +#endif + +#ifndef CONFIG_USBDEV_RNDIS_VENDOR_DESC + #define CONFIG_USBDEV_RNDIS_VENDOR_DESC "CherryUSB" +#endif + +#define CONFIG_USBDEV_RNDIS_USING_LWIP +#define CONFIG_USBDEV_CDC_ECM_USING_LWIP + +/* ================ USB HOST Stack Configuration ================== */ + +#define CONFIG_USBHOST_MAX_RHPORTS 1 +#define CONFIG_USBHOST_MAX_EXTHUBS 1 +#define CONFIG_USBHOST_MAX_EHPORTS 4 +#define CONFIG_USBHOST_MAX_INTERFACES 8 +#define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 8 +#define CONFIG_USBHOST_MAX_ENDPOINTS 4 + +#define CONFIG_USBHOST_MAX_CDC_ACM_CLASS 4 +#define CONFIG_USBHOST_MAX_HID_CLASS 4 +#define CONFIG_USBHOST_MAX_MSC_CLASS 2 +#define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 +#define CONFIG_USBHOST_MAX_VIDEO_CLASS 1 + +#define CONFIG_USBHOST_DEV_NAMELEN 16 + +#ifndef CONFIG_USBHOST_PSC_PRIO + #define CONFIG_USBHOST_PSC_PRIO 0 +#endif +#ifndef CONFIG_USBHOST_PSC_STACKSIZE + #define CONFIG_USBHOST_PSC_STACKSIZE 2048 +#endif + +//#define CONFIG_USBHOST_GET_STRING_DESC + +// #define CONFIG_USBHOST_MSOS_ENABLE +#ifndef CONFIG_USBHOST_MSOS_VENDOR_CODE + #define CONFIG_USBHOST_MSOS_VENDOR_CODE 0x00 +#endif + +/* Ep0 max transfer buffer */ +#ifndef CONFIG_USBHOST_REQUEST_BUFFER_LEN + #define CONFIG_USBHOST_REQUEST_BUFFER_LEN 512 +#endif + +#ifndef CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT + #define CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 500 +#endif + +#ifndef CONFIG_USBHOST_MSC_TIMEOUT + #define CONFIG_USBHOST_MSC_TIMEOUT 5000 +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE (2048) +#endif + +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RNDIS_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_CDC_NCM_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_ASIX_ETH_MAX_TX_SIZE (2048) +#endif + +/* This parameter affects usb performance, and depends on (TCP_WND)tcp eceive windows size, + * you can change to 2K ~ 16K and must be larger than TCP RX windows size in order to avoid being overflow. + */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_RX_SIZE (2048) +#endif +/* Because lwip do not support multi pbuf at a time, so increasing this variable has no performance improvement */ +#ifndef CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE + #define CONFIG_USBHOST_RTL8152_ETH_MAX_TX_SIZE (2048) +#endif + +#define CONFIG_USBHOST_BLUETOOTH_HCI_H4 +// #define CONFIG_USBHOST_BLUETOOTH_HCI_LOG + +#ifndef CONFIG_USBHOST_BLUETOOTH_TX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_TX_SIZE 2048 +#endif +#ifndef CONFIG_USBHOST_BLUETOOTH_RX_SIZE + #define CONFIG_USBHOST_BLUETOOTH_RX_SIZE 2048 +#endif + +/* ================ USB Device Port Configuration ================*/ + +#ifndef CONFIG_USBDEV_MAX_BUS + #define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip +#endif + +#ifndef CONFIG_USBDEV_EP_NUM + #define CONFIG_USBDEV_EP_NUM 8 +#endif + +// #define CONFIG_USBDEV_SOF_ENABLE + +/* When your chip hardware supports high-speed and wants to initialize it in high-speed mode, + * the relevant IP will configure the internal or external high-speed PHY according to CONFIG_USB_HS. + * +*/ +//#define CONFIG_USB_HS + +/* ---------------- DWC2 Configuration ---------------- */ +/* enable dwc2 buffer dma mode for device +*/ +// #define CONFIG_USB_DWC2_DMA_ENABLE + +/* Defined FS Core device FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE (32) + +/* Defined FS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE (128) +#define CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE (32) +#define CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE (64) + +/* Defined FS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE (640) + +/* Defined HS Core Device FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE (1024) +#define CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE (0) +#define CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE (0) + +/* Defined HS Core host FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE (512) +#define CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE (128) +#define CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE (256) + +/* Defined HS Core total FIFO Size in words 32-bits */ +#define CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE (2048) + + +/* ================ USB Host Port Configuration ==================*/ +#ifndef CONFIG_USBHOST_MAX_BUS + #define CONFIG_USBHOST_MAX_BUS 1 +#endif + +#ifndef CONFIG_USBHOST_PIPE_NUM + #define CONFIG_USBHOST_PIPE_NUM 10 +#endif + + +#ifndef usb_phyaddr2ramaddr + #define usb_phyaddr2ramaddr(addr) (addr) +#endif + +#ifndef usb_ramaddr2phyaddr + #define usb_ramaddr2phyaddr(addr) (addr) +#endif + +#endif diff --git a/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat b/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat new file mode 100644 index 00000000000..b5b3bbe7468 --- /dev/null +++ b/bsp/hc32/ev_hc32f4a8_lqfp176/bsp_compile_ci.bat @@ -0,0 +1,136 @@ +scons --attach=devices.adc +scons -j4 +scons --attach=default + +scons --attach=devices.can +scons -j4 +scons --attach=default + +scons --attach=devices.crypto +scons -j4 +scons --attach=default + +scons --attach=devices.dac +scons -j4 +scons --attach=default + +scons --attach=devices.flash +scons -j4 +scons --attach=default + +scons --attach=devices.gpio +scons -j4 +scons --attach=default + +scons --attach=devices.hwtimer +scons -j4 +scons --attach=default + +scons --attach=devices.i2c +scons -j4 +scons --attach=default + +scons --attach=devices.input_capture +scons -j4 +scons --attach=default + +scons --attach=devices.mcan +scons -j4 +scons --attach=default + +scons --attach=devices.pm +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pulse_encoder_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr4 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmr6 +scons -j4 +scons --attach=default + +scons --attach=devices.pwm_tmra +scons -j4 +scons --attach=default + +scons --attach=devices.qspi +scons -j4 +scons --attach=default + +scons --attach=devices.rtc +scons -j4 +scons --attach=default + +scons --attach=devices.sdio +scons -j4 +scons --attach=default + +scons --attach=devices.soft_i2c +scons -j4 +scons --attach=default + +scons --attach=devices.spi +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v1 +scons -j4 +scons --attach=default + +scons --attach=devices.uart_v2 +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_hs_host +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_device +scons -j4 +scons --attach=default + +scons --attach=devices.usb_fs_host +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_swdt +scons -j4 +scons --attach=default + +scons --attach=devices.watchdog_wdt +scons -j4 +scons --attach=default + + +scons --attach=peripheral.eth_mii +scons -j4 +scons --attach=default + +scons --attach=peripheral.eth_rmii +scons -j4 +scons --attach=default + +scons --attach=peripheral.exmc_nand +scons -j4 +scons --attach=default + +scons --attach=peripheral.exmc_sdram +scons -j4 +scons --attach=default + +scons --attach=peripheral.spi_flash +scons -j4 +scons --attach=default diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/linker_scripts/link.icf b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/linker_scripts/link.icf index 863d995ff94..581b4dd2848 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/linker_scripts/link.icf +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/board/linker_scripts/link.icf @@ -86,9 +86,9 @@ define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; /*-Sizes-*/ -define symbol __ICFEDIT_size_cstack__ = 0x2000; +define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_proc_stack__ = 0x0; -define symbol __ICFEDIT_size_heap__ = 0x2000; +define symbol __ICFEDIT_size_heap__ = 0x0; /**** End of ICF editor section. ###ICF###*/ /******************************************************************************* diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/project.uvprojx b/bsp/hc32/lckfb-hc32f4a0-lqfp100/project.uvprojx index 626117540b1..629b5d18d32 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/project.uvprojx +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/project.uvprojx @@ -324,7 +324,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/lckfb-hc32f4a0-lqfp100/template.uvprojx b/bsp/hc32/lckfb-hc32f4a0-lqfp100/template.uvprojx index 591f3cb5cc4..95d7e9e8e41 100644 --- a/bsp/hc32/lckfb-hc32f4a0-lqfp100/template.uvprojx +++ b/bsp/hc32/lckfb-hc32f4a0-lqfp100/template.uvprojx @@ -327,7 +327,7 @@ 0 0 1 - 0 + 1 0 0 0 diff --git a/bsp/hc32/libraries/hc32_drivers/drv_adc.c b/bsp/hc32/libraries/hc32_drivers/drv_adc.c index 581872a1e72..e4de8623d9e 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_adc.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_adc.c @@ -87,7 +87,7 @@ static void _adc_internal_trigger0_set(adc_device *p_adc_dev) case (rt_uint32_t)CM_ADC2: u32TriggerSel = AOS_ADC2_0; break; -#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) +#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) || defined (HC32F334) case (rt_uint32_t)CM_ADC3: u32TriggerSel = AOS_ADC3_0; break; @@ -118,7 +118,7 @@ static void _adc_internal_trigger1_set(adc_device *p_adc_dev) case (rt_uint32_t)CM_ADC2: u32TriggerSel = AOS_ADC2_1; break; -#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) +#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) || defined (HC32F334) case (rt_uint32_t)CM_ADC3: u32TriggerSel = AOS_ADC3_1; break; diff --git a/bsp/hc32/libraries/hc32_drivers/drv_crypto.c b/bsp/hc32/libraries/hc32_drivers/drv_crypto.c index f1989f69443..720ddd25728 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_crypto.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_crypto.c @@ -7,6 +7,7 @@ * Date Author Notes * 2023-02-10 CDT first version * 2024-06-11 CDT Fix compiler warning + * 2025-07-29 CDT Support HC32F334 */ #include "board.h" @@ -92,9 +93,12 @@ static rt_uint32_t _crc_update(struct hwcrypto_crc *ctx, const rt_uint8_t *in, r LOG_E("crc width only support 16/32."); goto _exit; } - +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || \ + defined(HC32F334) stcCrcInit.u32InitValue = ctx->crc_cfg.last_val; - +#elif defined(HC32F4A8) + stcCrcInit.u64InitValue = ctx->crc_cfg.last_val; +#endif if (CRC_Init(&stcCrcInit) != LL_OK) { LOG_E("crc init error."); @@ -103,6 +107,16 @@ static rt_uint32_t _crc_update(struct hwcrypto_crc *ctx, const rt_uint8_t *in, r LOG_D("CRC_Init."); rt_memcpy(&crc_cfgbk, &ctx->crc_cfg, sizeof(struct hwcrypto_crc_cfg)); } +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F4A8) + if (16U == ctx->crc_cfg.width) + { + (void)CRC_CRC16_AccumulateData(CRC_DATA_WIDTH_8BIT, in, length, (uint16_t *)&result); + } + else /* CRC32 */ + { + (void)CRC_CRC32_AccumulateData(CRC_DATA_WIDTH_8BIT, in, length, &result); + } +#elif defined(HC32F448) || defined(HC32F472) || defined(HC32F334) if (16U == ctx->crc_cfg.width) { result = CRC_CRC16_AccumulateData(CRC_DATA_WIDTH_8BIT, in, length); @@ -111,7 +125,7 @@ static rt_uint32_t _crc_update(struct hwcrypto_crc *ctx, const rt_uint8_t *in, r { result = CRC_CRC32_AccumulateData(CRC_DATA_WIDTH_8BIT, in, length); } - +#endif _exit: rt_mutex_release(&hc32_hw_dev->mutex); @@ -225,25 +239,118 @@ static const struct hwcrypto_hash_ops hash_ops = #endif /* BSP_USING_HASH */ #if defined(BSP_USING_AES) +#if defined (HC32F4A8) +#define AES_KEY_SIZE_16BYTE (16U) +#define AES_KEY_SIZE_24BYTE (24U) +#define AES_KEY_SIZE_32BYTE (32U) +static stc_ske_init_t stcSkeInit = {0}; +static int32_t AES_Encrypt(const uint8_t *pu8Plaintext, uint32_t u32PlaintextSize, \ + const uint8_t *pu8Key, uint8_t u8KeySize, uint8_t *pu8Ciphertext) +{ + int32_t i32Ret = LL_ERR_INVD_PARAM; + stc_ske_crypto_t stcCrypto; + + if ((pu8Plaintext != NULL) && (u32PlaintextSize > 0UL) && (pu8Key != NULL) && (pu8Ciphertext != NULL)) + { + if (u8KeySize == AES_KEY_SIZE_16BYTE) + { + stcSkeInit.u32Alg = SKE_ALG_AES_128; + } + else if (u8KeySize == AES_KEY_SIZE_24BYTE) + { + stcSkeInit.u32Alg = SKE_ALG_AES_192; + } + else + { + stcSkeInit.u32Alg = SKE_ALG_AES_256; + } + stcSkeInit.u32Crypto = SKE_CRYPTO_ENCRYPT; + stcSkeInit.pu8Key = pu8Key; + /* Initialize SKE */ + i32Ret = SKE_Init(&stcSkeInit); + + stcCrypto.u32Alg = stcSkeInit.u32Alg; + stcCrypto.u32Mode = stcSkeInit.u32Mode; + stcCrypto.u32CryptoSize = u32PlaintextSize; + /* Encrypt blocks */ + stcCrypto.pu8In = pu8Plaintext; + stcCrypto.pu8Out = pu8Ciphertext; + i32Ret = SKE_CryptoBlocks(&stcCrypto); + } + + return i32Ret; +} + +static int32_t AES_Decrypt(const uint8_t *pu8Ciphertext, uint32_t u32CiphertextSize, \ + const uint8_t *pu8Key, uint8_t u8KeySize, uint8_t *pu8Plaintext) +{ + int32_t i32Ret = LL_ERR_INVD_PARAM; + stc_ske_crypto_t stcCrypto; + + if ((pu8Plaintext != NULL) && (u32CiphertextSize > 0UL) && (pu8Key != NULL) && (pu8Ciphertext != NULL)) + { + if (u8KeySize == AES_KEY_SIZE_16BYTE) + { + stcSkeInit.u32Alg = SKE_ALG_AES_128; + } + else if (u8KeySize == AES_KEY_SIZE_24BYTE) + { + stcSkeInit.u32Alg = SKE_ALG_AES_192; + } + else + { + stcSkeInit.u32Alg = SKE_ALG_AES_256; + } + stcSkeInit.u32Crypto = SKE_CRYPTO_DECRYPT; + stcSkeInit.pu8Key = pu8Key; + /* Initialize SKE */ + i32Ret = SKE_Init(&stcSkeInit); + + stcCrypto.u32Alg = stcSkeInit.u32Alg; + stcCrypto.u32Mode = stcSkeInit.u32Mode; + stcCrypto.u32CryptoSize = u32CiphertextSize; + /* Decrypt blocks */ + stcCrypto.pu8In = pu8Ciphertext; + stcCrypto.pu8Out = pu8Plaintext; + i32Ret = SKE_CryptoBlocks(&stcCrypto); + } + + return i32Ret; +} +#endif + static rt_err_t _cryp_crypt(struct hwcrypto_symmetric *ctx, struct hwcrypto_symmetric_info *info) { rt_err_t result = RT_EOK; struct hc32_hwcrypto_device *hc32_hw_dev = (struct hc32_hwcrypto_device *)ctx->parent.device->user_data; rt_mutex_take(&hc32_hw_dev->mutex, RT_WAITING_FOREVER); +#if defined (HC32F4A8) + SKE_StructInit(&stcSkeInit); switch (ctx->parent.type) { case HWCRYPTO_TYPE_AES_ECB: LOG_D("AES type is ECB."); + stcSkeInit.u32Mode = SKE_MD_ECB; break; case HWCRYPTO_TYPE_AES_CBC: + stcSkeInit.u32Mode = SKE_MD_CBC; + break; case HWCRYPTO_TYPE_AES_CTR: - case HWCRYPTO_TYPE_DES_ECB: - case HWCRYPTO_TYPE_DES_CBC: + stcSkeInit.u32Mode = SKE_MD_CTR; + break; + case HWCRYPTO_TYPE_AES_CFB: + stcSkeInit.u32Mode = SKE_MD_CFB; + break; + case HWCRYPTO_TYPE_AES_OFB: + stcSkeInit.u32Mode = SKE_MD_OFB; + break; default : LOG_E("not support cryp type: %x", ctx->parent.type); break; } + stcSkeInit.pu8Iv = ctx->iv; +#endif #if defined (HC32F460) if (ctx->key_bitlen != (AES_KEY_SIZE_16BYTE * 8U)) @@ -252,7 +359,7 @@ static rt_err_t _cryp_crypt(struct hwcrypto_symmetric *ctx, struct hwcrypto_symm result = -RT_ERROR; goto _exit; } -#elif defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) +#elif defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) if (ctx->key_bitlen != (AES_KEY_SIZE_16BYTE * 8U) && ctx->key_bitlen != (AES_KEY_SIZE_24BYTE * 8U) && \ ctx->key_bitlen != (AES_KEY_SIZE_32BYTE * 8U)) { @@ -365,9 +472,13 @@ static rt_err_t _crypto_create(struct rt_hwcrypto_ctx *ctx) case HWCRYPTO_TYPE_RC4: case HWCRYPTO_TYPE_GCM: { +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) /* Enable AES peripheral clock. */ FCG_Fcg0PeriphClockCmd(PWC_FCG0_AES, ENABLE); - +#elif defined(HC32F4A8) + /* Enable SKE peripheral clock */ + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SKE, ENABLE); +#endif ((struct hwcrypto_symmetric *)ctx)->ops = &cryp_ops; break; @@ -416,8 +527,13 @@ static void _crypto_destroy(struct rt_hwcrypto_ctx *ctx) case HWCRYPTO_TYPE_3DES: case HWCRYPTO_TYPE_RC4: case HWCRYPTO_TYPE_GCM: +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) AES_DeInit(); FCG_Fcg0PeriphClockCmd(PWC_FCG0_AES, DISABLE); +#elif defined(HC32F4A8) + SKE_DeInit(); + FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SKE, DISABLE); +#endif break; #endif /* BSP_USING_AES */ diff --git a/bsp/hc32/libraries/hc32_drivers/drv_dac.c b/bsp/hc32/libraries/hc32_drivers/drv_dac.c index afc1b4bd9c9..e2ef22abf49 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_dac.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_dac.c @@ -37,7 +37,7 @@ static dac_device _g_dac_dev_array[] = #ifdef BSP_USING_DAC1 { {0}, -#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) CM_DAC1, #elif defined (HC32F448) CM_DAC, @@ -148,7 +148,7 @@ static const struct rt_dac_ops g_dac_ops = static void _dac_clock_enable(void) { #if defined(BSP_USING_DAC1) -#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_DAC1, ENABLE); #elif defined (HC32F448) FCG_Fcg3PeriphClockCmd(FCG3_PERIPH_DAC, ENABLE); @@ -179,16 +179,24 @@ int rt_hw_dac_init(void) for (; i < dev_cnt; i++) { DAC_DeInit(_g_dac_dev_array[i].instance); - stcDacInit.enOutput = _g_dac_dev_array[i].init.ch1_output_enable; + stcDacInit.enOutput = (en_functional_state_t)_g_dac_dev_array[i].init.ch1_output_enable; #if defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) stcDacInit.u16Src = _g_dac_dev_array[i].init.ch1_data_src; #endif ll_ret = DAC_Init((void *)_g_dac_dev_array[i].instance, DAC_CH1, &stcDacInit); +#if defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) || defined (HC32F460) #if defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) stcDacInit.u16Src = _g_dac_dev_array[i].init.ch2_data_src; #endif stcDacInit.enOutput = _g_dac_dev_array[i].init.ch2_output_enable; ll_ret = DAC_Init((void *)_g_dac_dev_array[i].instance, DAC_CH2, &stcDacInit); +#elif defined (HC32F334) + if (CM_DAC1 == (void *)_g_dac_dev_array[i].instance) + { + stcDacInit.enOutput = (en_functional_state_t)_g_dac_dev_array[i].init.ch2_output_enable; + ll_ret = DAC_Init((void *)_g_dac_dev_array[i].instance, DAC_CH2, &stcDacInit); + } +#endif DAC_DataRegAlignConfig(_g_dac_dev_array[i].instance, _g_dac_dev_array[i].init.data_align); if (ll_ret != LL_OK) @@ -198,15 +206,21 @@ int rt_hw_dac_init(void) } DAC_ADCPrioConfig(_g_dac_dev_array[i].instance, _g_dac_dev_array[i].init.dac_adp_sel, ENABLE); - DAC_ADCPrioCmd(_g_dac_dev_array[i].instance, _g_dac_dev_array[i].init.dac_adp_enable); + DAC_ADCPrioCmd(_g_dac_dev_array[i].instance, (en_functional_state_t)_g_dac_dev_array[i].init.dac_adp_enable); #if defined (HC32F472) DAC_SetAmpGain(_g_dac_dev_array[i].instance, DAC_CH1, _g_dac_dev_array[i].init.ch1_amp_gain); DAC_SetAmpGain(_g_dac_dev_array[i].instance, DAC_CH2, _g_dac_dev_array[i].init.ch2_amp_gain); #endif - DAC_AMPCmd(_g_dac_dev_array[i].instance, DAC_CH1, _g_dac_dev_array[i].init.ch1_amp_enable); + DAC_AMPCmd(_g_dac_dev_array[i].instance, DAC_CH1, (en_functional_state_t)_g_dac_dev_array[i].init.ch1_amp_enable); +#if defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) || defined (HC32F460) DAC_AMPCmd(_g_dac_dev_array[i].instance, DAC_CH2, _g_dac_dev_array[i].init.ch2_amp_enable); - +#elif defined (HC32F334) + if (CM_DAC1 == (void *)_g_dac_dev_array[i].instance) + { + DAC_AMPCmd(_g_dac_dev_array[i].instance, DAC_CH2, (en_functional_state_t)_g_dac_dev_array[i].init.ch2_amp_enable); + } +#endif rt_hw_board_dac_init(_g_dac_dev_array[i].instance); ret = rt_hw_dac_register(&_g_dac_dev_array[i].rt_dac, \ (const char *)_g_dac_dev_array[i].init.name, \ diff --git a/bsp/hc32/libraries/hc32_drivers/drv_gpio.c b/bsp/hc32/libraries/hc32_drivers/drv_gpio.c index b2513c6e31f..a7217ec9e15 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_gpio.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_gpio.c @@ -573,6 +573,10 @@ static rt_base_t hc32_pin_get(const char *name) hw_pin_num *= 10; hw_pin_num += name[i] - '0'; } + if (hw_pin_num > 0xF) + { + return -RT_EINVAL; + } pin = PIN_NUM(hw_port_num, hw_pin_num); return pin; diff --git a/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c b/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c index 0f4c862032d..2cac51d01f1 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_hwtimer.c @@ -150,7 +150,7 @@ static void _timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) TMRA_IntCmd(tmr_device->tmr_handle, TMRA_INT_OVF, ENABLE); #if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F4A8) hc32_install_irq_handler(&irq_config, tmr_device->isr.irq_callback, RT_TRUE); -#elif defined (HC32F448) || defined (HC32F472) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F334) hc32_install_irq_handler(&irq_config, NULL, RT_TRUE); #endif } @@ -159,7 +159,7 @@ static void _timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) TMRA_DeInit(tmr_device->tmr_handle); #if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F4A8) hc32_install_irq_handler(&irq_config, tmr_device->isr.irq_callback, RT_FALSE); -#elif defined (HC32F448) || defined (HC32F472) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F334) hc32_install_irq_handler(&irq_config, NULL, RT_FALSE); #endif FCG_Fcg2PeriphClockCmd(tmr_device->clock, DISABLE); @@ -251,7 +251,7 @@ static void TMRA_1_callback(void) rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_1_INDEX].time_device); } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_1_Ovf_Udf_Handler(void) { TMRA_1_callback(); @@ -266,7 +266,7 @@ static void TMRA_2_callback(void) rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_2_INDEX].time_device); } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_2_Ovf_Udf_Handler(void) { TMRA_2_callback(); @@ -281,7 +281,7 @@ static void TMRA_3_callback(void) rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_3_INDEX].time_device); } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_3_Ovf_Udf_Handler(void) { TMRA_3_callback(); @@ -296,7 +296,7 @@ static void TMRA_4_callback(void) rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_4_INDEX].time_device); } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_4_Ovf_Udf_Handler(void) { TMRA_4_callback(); @@ -311,7 +311,7 @@ static void TMRA_5_callback(void) rt_device_hwtimer_isr(&hc32_hwtimer_obj[TMRA_5_INDEX].time_device); } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_5_Ovf_Udf_Handler(void) { TMRA_5_callback(); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_irq.c b/bsp/hc32/libraries/hc32_drivers/drv_irq.c index 32eb5fa7b91..501717d5d37 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_irq.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_irq.c @@ -67,13 +67,13 @@ rt_err_t hc32_install_irq_handler(struct hc32_irq_config *irq_config, stcIrqSignConfig.enIntSrc = irq_config->int_src; stcIrqSignConfig.pfnCallback = irq_hdr; if (LL_OK == INTC_IrqSignIn(&stcIrqSignConfig)) -nvic_config: #elif defined (HC32F460) || defined (HC32F4A0) || defined (HC32F4A8) stcIrqSignConfig.enIRQn = irq_config->irq_num; stcIrqSignConfig.enIntSrc = irq_config->int_src; stcIrqSignConfig.pfnCallback = irq_hdr; if (LL_OK == INTC_IrqSignIn(&stcIrqSignConfig)) #endif +nvic_config: { NVIC_ClearPendingIRQ(irq_config->irq_num); NVIC_SetPriority(irq_config->irq_num, irq_config->irq_prio); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_mcan.c b/bsp/hc32/libraries/hc32_drivers/drv_mcan.c index 6e88fde32ab..5dc0217c1f9 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_mcan.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_mcan.c @@ -26,11 +26,8 @@ typedef struct hc32_mcan_config_struct uint32_t int0_sel; struct hc32_irq_config int0_cfg; /* MCAN interrupt line 0 configuration */ - uint32_t int1_sel; - struct hc32_irq_config int1_cfg; /* MCAN interrupt line 1 configuration */ #if defined(HC32F4A8) func_ptr_t irq_callback0; - func_ptr_t irq_callback1; #endif } hc32_mcan_config_t; @@ -85,13 +82,12 @@ typedef struct mcan_baud_rate_struct #define MCAN_TX_INT (MCAN_INT_TX_CPLT) #define MCAN_ERR_INT (MCAN_INT_ARB_PHASE_ERROR | MCAN_INT_DATA_PHASE_ERROR | MCAN_INT_ERR_LOG_OVF | \ MCAN_INT_ERR_PASSIVE | MCAN_INT_ERR_WARNING | MCAN_INT_BUS_OFF) -#define MCAN_INT0_SEL (MCAN_RX_INT) -#define MCAN_INT1_SEL (MCAN_TX_INT | MCAN_ERR_INT) +#define MCAN_INT0_SEL (MCAN_RX_INT | MCAN_TX_INT | MCAN_ERR_INT) /**************************************************************************************** * Baud rate(bit timing) configuration based on 80MHz clock ****************************************************************************************/ -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) static const mcan_baud_rate_t m_mcan_fd_baud_rate[] = { {CAN500kBaud, CANFD_DATA_BAUD_1M, MCAN_FD_CFG_500K_1M}, @@ -127,9 +123,9 @@ static const uint8_t m_mcan_data_size[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20 static const rt_uint32_t m_mcan_tx_priv_mode[] = {MCAN_TX_FIFO_MD, MCAN_TX_QUEUE_MD}; -static const rt_uint32_t m_mcan_work_mode[] = {MCAN_MD_NORMAL, MCAN_MD_BUS_MON, MCAN_MD_EXTERN_LOOPBACK, MCAN_MD_RESTRICTED_OP}; +static const rt_uint32_t m_mcan_work_mode[] = {MCAN_MD_NORMAL, MCAN_MD_BUS_MON, MCAN_MD_EXTERN_LOOPBACK, MCAN_MD_INTERN_LOOPBACK}; -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) static const rt_uint32_t m_mcan_fd_mode[] = {MCAN_FRAME_CLASSIC, MCAN_FRAME_ISO_FD_NO_BRS, MCAN_FRAME_ISO_FD_BRS, \ MCAN_FRAME_NON_ISO_FD_NO_BRS, MCAN_FRAME_NON_ISO_FD_BRS }; @@ -140,10 +136,10 @@ static const rt_uint32_t m_mcan_fd_mode[] = {MCAN_FRAME_CLASSIC, MCAN_FRAME_ISO_ ****************************************************************************************/ enum { -#ifdef BSP_USING_MCAN1 +#if defined(BSP_USING_MCAN1) MCAN1_INDEX, #endif -#ifdef BSP_USING_MCAN2 +#if defined(BSP_USING_MCAN2) MCAN2_INDEX, #endif MCAN_DEV_CNT, @@ -151,7 +147,7 @@ enum static hc32_mcan_driver_t m_mcan_driver_list[] = { -#ifdef BSP_USING_MCAN1 +#if defined(BSP_USING_MCAN1) { { .name = MCAN1_NAME, @@ -159,12 +155,10 @@ static hc32_mcan_driver_t m_mcan_driver_list[] = .init_para = {.stcBitTime = MCAN1_BAUD_RATE_CFG}, .int0_sel = MCAN_INT0_SEL, .int0_cfg = {BSP_MCAN1_INT0_IRQ_NUM, BSP_MCAN1_INT0_IRQ_PRIO, INT_SRC_MCAN1_INT0}, - .int1_sel = MCAN_INT1_SEL, - .int1_cfg = {BSP_MCAN1_INT1_IRQ_NUM, BSP_MCAN1_INT0_IRQ_PRIO, INT_SRC_MCAN1_INT1}, } }, #endif -#ifdef BSP_USING_MCAN2 +#if defined(BSP_USING_MCAN2) { { .name = MCAN2_NAME, @@ -172,19 +166,17 @@ static hc32_mcan_driver_t m_mcan_driver_list[] = .init_para = {.stcBitTime = MCAN2_BAUD_RATE_CFG}, .int0_sel = MCAN_INT0_SEL, .int0_cfg = {BSP_MCAN2_INT0_IRQ_NUM, BSP_MCAN2_INT0_IRQ_PRIO, INT_SRC_MCAN2_INT0}, - .int1_sel = MCAN_INT1_SEL, - .int1_cfg = {BSP_MCAN2_INT1_IRQ_NUM, BSP_MCAN2_INT1_IRQ_PRIO, INT_SRC_MCAN2_INT1}, } }, #endif }; -#ifdef BSP_USING_MCAN1 +#if defined(BSP_USING_MCAN1) static stc_mcan_filter_t m_mcan1_std_filters[MCAN1_STD_FILTER_NUM]; static stc_mcan_filter_t m_mcan1_ext_filters[MCAN1_EXT_FILTER_NUM]; #endif -#ifdef BSP_USING_MCAN2 +#if defined(BSP_USING_MCAN2) static stc_mcan_filter_t m_mcan2_std_filters[MCAN2_STD_FILTER_NUM]; static stc_mcan_filter_t m_mcan2_ext_filters[MCAN2_EXT_FILTER_NUM]; #endif @@ -234,7 +226,7 @@ static rt_ssize_t mcan_sendmsg(struct rt_can_device *device, const void *buf, rt */ static rt_ssize_t mcan_recvmsg(struct rt_can_device *device, void *buf, rt_uint32_t boxno); -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) static void mcan_copy_bt_to_cfg(struct can_configure *cfg, const stc_mcan_bit_time_config_t *ll_bt); #endif @@ -269,7 +261,7 @@ static rt_err_t mcan_configure(struct rt_can_device *device, struct can_configur hard->init_para.u32Mode = m_mcan_work_mode[cfg->mode]; hard->init_para.u32FrameFormat = MCAN_FRAME_CLASSIC; hard->init_para.stcMsgRam.u32TxFifoQueueMode = m_mcan_tx_priv_mode[cfg->privmode]; -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) RT_ASSERT(IS_MCAN_FD_MODE(cfg->enable_canfd)); hard->init_para.u32FrameFormat = m_mcan_fd_mode[cfg->enable_canfd]; if (cfg->use_bit_timing) @@ -365,7 +357,7 @@ static rt_err_t mcan_configure(struct rt_can_device *device, struct can_configur driver->can_device.config.msgboxsz = pre_config.msgboxsz; driver->can_device.config.ticks = pre_config.ticks; } -#ifdef RT_CAN_USING_HDR +#if defined(RT_CAN_USING_HDR) driver->can_device.config.maxhdr = pre_config.maxhdr; #endif driver->can_device.config.sndboxnumber = pre_config.sndboxnumber; @@ -396,10 +388,6 @@ static void mcan_control_set_int(hc32_mcan_driver_t *driver, int cmd, void *arg) { MCAN_IntCmd(hard->instance, MCAN_RX_INT & hard->int0_sel, MCAN_INT_LINE0, new_state); } - if (MCAN_RX_INT & hard->int1_sel) - { - MCAN_IntCmd(hard->instance, MCAN_RX_INT & hard->int1_sel, MCAN_INT_LINE1, new_state); - } break; case RT_DEVICE_FLAG_INT_TX: tmp = hard->init_para.stcMsgRam.u32TxBufferNum + hard->init_para.stcMsgRam.u32TxFifoQueueNum; @@ -417,20 +405,12 @@ static void mcan_control_set_int(hc32_mcan_driver_t *driver, int cmd, void *arg) { MCAN_IntCmd(hard->instance, MCAN_TX_INT & hard->int0_sel, MCAN_INT_LINE0, new_state); } - if (MCAN_TX_INT & hard->int1_sel) - { - MCAN_IntCmd(hard->instance, MCAN_TX_INT & hard->int1_sel, MCAN_INT_LINE1, new_state); - } break; case RT_DEVICE_CAN_INT_ERR: if (MCAN_ERR_INT & hard->int0_sel) { MCAN_IntCmd(hard->instance, MCAN_ERR_INT & hard->int0_sel, MCAN_INT_LINE0, new_state); } - if (MCAN_ERR_INT & hard->int1_sel) - { - MCAN_IntCmd(hard->instance, MCAN_ERR_INT & hard->int1_sel, MCAN_INT_LINE1, new_state); - } break; default: break; @@ -536,7 +516,7 @@ static rt_err_t mcan_control_set_priv(hc32_mcan_driver_t *driver, int cmd, void return RT_EOK; } -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) static void mcan_copy_bt_to_cfg(struct can_configure *cfg, const stc_mcan_bit_time_config_t *ll_bt) { cfg->can_timing.prescaler = ll_bt->u32NominalPrescaler; @@ -556,12 +536,12 @@ static rt_err_t mcan_control_set_fd(hc32_mcan_driver_t *driver, int cmd, void *a { rt_uint32_t i, len; rt_uint32_t argval = (rt_uint32_t)arg; -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) struct rt_can_bit_timing_config *timing_configs = NULL; #endif switch (cmd) { -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) case RT_CAN_CMD_SET_BAUD: default: RT_ASSERT(IS_MCAN_NOMINAL_BAUD_RATE(argval)); @@ -713,7 +693,7 @@ static rt_err_t mcan_control(struct rt_can_device *device, int cmd, void *arg) break; case RT_CAN_CMD_SET_BAUD: -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) case RT_CAN_CMD_SET_CANFD: case RT_CAN_CMD_SET_BAUD_FD: case RT_CAN_CMD_SET_BITTIMING: @@ -759,7 +739,7 @@ static rt_ssize_t mcan_sendmsg(struct rt_can_device *device, const void *buf, rt /* Parameter validity check */ RT_ASSERT(IS_CAN_VALID_ID(tx_msg->ide, tx_msg->id)); -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) RT_ASSERT(tx_msg->len <= MCAN_DLC64); #else RT_ASSERT(tx_msg->len <= MCAN_DLC8); @@ -770,7 +750,7 @@ static rt_ssize_t mcan_sendmsg(struct rt_can_device *device, const void *buf, rt ll_tx_msg.IDE = tx_msg->ide; ll_tx_msg.RTR = tx_msg->rtr; ll_tx_msg.DLC = tx_msg->len; -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) ll_tx_msg.FDF = tx_msg->fd_frame; ll_tx_msg.BRS = tx_msg->brs; #endif @@ -824,22 +804,22 @@ static rt_ssize_t mcan_recvmsg(struct rt_can_device *device, void *buf, rt_uint3 rx_msg->id = ll_rx_msg.ID; rx_msg->ide = ll_rx_msg.IDE; rx_msg->rtr = ll_rx_msg.RTR; - rx_msg->len = ll_rx_msg.u32DataSize; + rx_msg->len = ll_rx_msg.DLC; rx_msg->priv = 0; -#ifdef RT_CAN_USING_HDR +#if defined(RT_CAN_USING_HDR) /* Hardware filter messages are valid */ rx_msg->hdr_index = ll_rx_msg.u32FilterIndex; device->hdr[rx_msg->hdr_index].connected = 1; #endif -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) rx_msg->fd_frame = ll_rx_msg.FDF; rx_msg->brs = ll_rx_msg.BRS; #endif if (rx_msg->len > 0) { - rt_memcpy(&rx_msg->data[0], &ll_rx_msg.au8Data[0], rx_msg->len); + rt_memcpy(&rx_msg->data[0], &ll_rx_msg.au8Data[0], m_mcan_data_size[ll_rx_msg.DLC]); } return RT_EOK; @@ -869,7 +849,11 @@ rt_inline void mcan_isr(hc32_mcan_driver_t *driver, uint32_t int_sel) uint32_t ndat2 = MCANx->NDAT2; int rx_buf_index; - MCAN_ClearStatus(MCANx, ir_status & int_sel); + int_sel &= ~(MCAN_FLAG_RX_FIFO0_NEW_MSG | MCAN_FLAG_RX_FIFO1_NEW_MSG | MCAN_FLAG_RX_BUF_NEW_MSG); + if (0U != (ir_status & int_sel)) + { + MCAN_ClearStatus(MCANx, ir_status & int_sel); + } /* Check normal status flag */ /* Transmission completed */ @@ -967,7 +951,7 @@ rt_inline void mcan_isr(hc32_mcan_driver_t *driver, uint32_t int_sel) /**************************************************************************************** * mcan irq handler ****************************************************************************************/ -#if defined(HC32F448) || defined(HC32F4A8) +#if defined(HC32F448) || defined(HC32F4A8) || defined(HC32F334) #if defined(BSP_USING_MCAN1) void MCAN1_INT0_Handler(void) { @@ -979,18 +963,7 @@ void MCAN1_INT0_Handler(void) /* leave interrupt */ rt_interrupt_leave(); } - -void MCAN1_INT1_Handler(void) -{ - /* enter interrupt */ - rt_interrupt_enter(); - - mcan_isr(&m_mcan_driver_list[MCAN1_INDEX], m_mcan_driver_list[MCAN1_INDEX].mcan.int1_sel); - - /* leave interrupt */ - rt_interrupt_leave(); -} -#endif /* #if defined(BSP_USING_MCAN1) */ +#endif /* BSP_USING_MCAN1 */ #if defined(BSP_USING_MCAN2) void MCAN2_INT0_Handler(void) @@ -1003,18 +976,7 @@ void MCAN2_INT0_Handler(void) /* leave interrupt */ rt_interrupt_leave(); } - -void MCAN2_INT1_Handler(void) -{ - /* enter interrupt */ - rt_interrupt_enter(); - - mcan_isr(&m_mcan_driver_list[MCAN2_INDEX], m_mcan_driver_list[MCAN2_INDEX].mcan.int1_sel); - - /* leave interrupt */ - rt_interrupt_leave(); -} -#endif /* #if defined(BSP_USING_MCAN2) */ +#endif /* BSP_USING_MCAN2 */ #endif /**************************************************************************************** @@ -1022,33 +984,16 @@ void MCAN2_INT1_Handler(void) ****************************************************************************************/ static void mcan_irq_config(hc32_mcan_config_t *hard) { -#if defined(HC32F448) +#if defined(HC32F448) || defined(HC32F334) if (hard->int0_sel != 0) { - INTC_IntSrcCmd(hard->int0_cfg.int_src, ENABLE); - - NVIC_ClearPendingIRQ(hard->int0_cfg.irq_num); - NVIC_SetPriority(hard->int0_cfg.irq_num, hard->int0_cfg.irq_prio); - NVIC_EnableIRQ(hard->int0_cfg.irq_num); - } - - if (hard->int1_sel != 0) - { - INTC_IntSrcCmd(hard->int1_cfg.int_src, ENABLE); - - NVIC_ClearPendingIRQ(hard->int1_cfg.irq_num); - NVIC_SetPriority(hard->int1_cfg.irq_num, hard->int1_cfg.irq_prio); - NVIC_EnableIRQ(hard->int1_cfg.irq_num); + hc32_install_irq_handler(&hard->int0_cfg, RT_NULL, RT_TRUE); } #elif defined(HC32F4A8) if (hard->int0_sel != 0) { hc32_install_irq_handler(&hard->int0_cfg, hard->irq_callback0, RT_TRUE); } - if (hard->int1_sel != 0) - { - hc32_install_irq_handler(&hard->int1_cfg, hard->irq_callback1, RT_TRUE); - } #endif } @@ -1061,9 +1006,7 @@ static void mcan_enable_periph_clock(void) #if defined(BSP_USING_MCAN2) FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_MCAN2, ENABLE); #endif -#endif - -#if defined(HC32F334) +#elif defined(HC32F334) #if defined(BSP_USING_MCAN1) || defined(BSP_USING_MCAN2) FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_MCAN1 | FCG1_PERIPH_MCAN2, ENABLE); #endif @@ -1166,10 +1109,10 @@ static void init_can_cfg(hc32_mcan_driver_t *driver) can_cfg.privmode = RT_CAN_MODE_NOPRIV; can_cfg.ticks = 50; -#ifdef RT_CAN_USING_HDR +#if defined(RT_CAN_USING_HDR) can_cfg.maxhdr = MCAN_TOTAL_FILTER_NUM; #endif -#ifdef RT_CAN_USING_CANFD +#if defined(RT_CAN_USING_CANFD) can_cfg.baud_rate_fd = CANFD_DATA_BAUD_4M; can_cfg.enable_canfd = MCAN_FD_SEL; #endif @@ -1185,20 +1128,18 @@ static void init_can_cfg(hc32_mcan_driver_t *driver) */ static void mcan_get_irq_callback(void) { -#ifdef BSP_USING_MCAN1 +#if defined(BSP_USING_MCAN1) m_mcan_driver_list[MCAN1_INDEX].mcan.irq_callback0 = MCAN1_INT0_Handler; - m_mcan_driver_list[MCAN1_INDEX].mcan.irq_callback1 = MCAN1_INT1_Handler; #endif -#ifdef BSP_USING_MCAN2 +#if defined(BSP_USING_MCAN2) m_mcan_driver_list[MCAN2_INDEX].mcan.irq_callback0 = MCAN2_INT0_Handler; - m_mcan_driver_list[MCAN2_INDEX].mcan.irq_callback1 = MCAN2_INT1_Handler; #endif } #endif extern rt_err_t rt_hw_board_mcan_init(CM_MCAN_TypeDef *MCANx); extern void CanPhyEnable(void); -static rt_err_t rt_hw_mcan_init(void) +static int rt_hw_mcan_init(void) { rt_uint32_t i, filter; rt_uint32_t tx_boxnum; @@ -1239,7 +1180,6 @@ static rt_err_t rt_hw_mcan_init(void) MCAN_TxBufferNotificationCmd(hard->instance, tx_boxnum, MCAN_INT_TX_CPLT, ENABLE); MCAN_IntCmd(hard->instance, hard->int0_sel, MCAN_INT_LINE0, ENABLE); - MCAN_IntCmd(hard->instance, hard->int1_sel, MCAN_INT_LINE1, ENABLE); if (i > 0) { diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.c b/bsp/hc32/libraries/hc32_drivers/drv_pm.c index 7d5a3308ac4..cc84e14200a 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.c @@ -58,46 +58,10 @@ static void _uart_console_reconfig(void) rt_device_control(rt_console_get_device(), RT_DEVICE_CTRL_CONFIG, &config); } -/** - * @brief Enter sleep mode. - * @param [in] u8SleepType specifies the type of enter sleep's command. - * @arg PWC_SLEEP_WFI Enter sleep mode by WFI, and wake-up by interrupt handle. - * @arg PWC_SLEEP_WFE_INT Enter sleep mode by WFE, and wake-up by interrupt request(SEVONPEND=1) - * @arg PWC_SLEEP_WFE_EVT Enter sleep mode by WFE, and wake-up by event(SEVONPEND=0). - - * @retval None - */ -__WEAKDEF void pwc_sleep_enter(uint8_t u8SleepType) -{ - DDL_ASSERT(IS_PWC_UNLOCKED()); - - CLR_REG16_BIT(CM_PWC->STPMCR, PWC_STPMCR_STOP); - CLR_REG8_BIT(CM_PWC->PWRC0, PWC_PWRC0_PWDN); - - if (PWC_SLEEP_WFI == u8SleepType) - { - __WFI(); - } - else - { - if (PWC_SLEEP_WFE_INT == u8SleepType) - { - SET_REG32_BIT(SCB->SCR, SCB_SCR_SEVONPEND_Msk); - } - else - { - CLR_REG32_BIT(SCB->SCR, SCB_SCR_SEVONPEND_Msk); - } - __SEV(); - __WFE(); - __WFE(); - } -} - static void _sleep_enter_idle(void) { struct pm_sleep_mode_idle_config sleep_idle_cfg = PM_SLEEP_IDLE_CFG; - pwc_sleep_enter(sleep_idle_cfg.pwc_sleep_type); + PWC_SLEEP_Enter(sleep_idle_cfg.pwc_sleep_type); } static void _sleep_enter_deep(void) diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pm.h b/bsp/hc32/libraries/hc32_drivers/drv_pm.h index 6ef620b1a83..cba3d8f0669 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pm.h +++ b/bsp/hc32/libraries/hc32_drivers/drv_pm.h @@ -91,13 +91,17 @@ struct pm_sleep_mode_shutdown_config ******************************************************************************/ #if defined(HC32F4A0) || defined(HC32F4A8) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET) && (EFM_GetStatus(EFM_FLAG_RDY1) == SET)) -#elif defined(HC32F460) || defined (HC32F448) || defined (HC32F472) +#elif defined(HC32F460) || defined (HC32F448) || defined (HC32F472) || defined (HC32F334) #define PM_CHECK_EFM() ((EFM_GetStatus(EFM_FLAG_RDY) == SET)) #endif #define PM_CHECK_XTAL() ((CM_CMU->XTALSTDCR & CLK_XTALSTD_ON) == 0) +#if defined(HC32F334) +#define PM_CHECK_DMA() (DMA_GetTransStatus(CM_DMA, DMA_STAT_TRANS_DMA) == RESET) +#elif defined(HC32F4A0) || defined(HC32F4A8) || defined(HC32F460) || defined (HC32F448) || defined (HC32F472) #define PM_CHECK_DMA() \ ( (DMA_GetTransStatus(CM_DMA1, DMA_STAT_TRANS_DMA) == RESET) && \ (DMA_GetTransStatus(CM_DMA2, DMA_STAT_TRANS_DMA) == RESET)) +#endif #define PM_CHECK_SWDT() \ ( ((CM_ICG->ICG0 & ICG_SWDT_RST_START) != ICG_SWDT_RST_START) || \ ((CM_ICG->ICG0 & ICG_SWDT_LPM_CNT_STOP) == ICG_SWDT_LPM_CNT_STOP)) @@ -124,24 +128,6 @@ struct pm_sleep_mode_shutdown_config ( (mode == PM_SLEEP_MODE_SHUTDOWN && PM_SLEEP_SHUTDOWN_CHECK()) || \ (mode == PM_SLEEP_MODE_DEEP && PM_SLEEP_DEEP_CHECK())|| \ (mode <= PM_SLEEP_MODE_IDLE))) - -/** - * @defgroup PWC_Sleep_Type PWC sleep mode type. - * @{ - */ -#ifndef PWC_SLEEP_WFI -#define PWC_SLEEP_WFI (0x00U) /*!< Enter sleep mode by WFI, and wake-up by interrupt handle. */ -#endif -#ifndef PWC_SLEEP_WFE_INT -#define PWC_SLEEP_WFE_INT (0x01U) /*!< Enter sleep mode by WFE, and wake-up by interrupt request(SEVONPEND=1). */ -#endif -#ifndef PWC_SLEEP_WFE_EVT -#define PWC_SLEEP_WFE_EVT (0x02U) /*!< Enter sleep mode by WFE, and wake-up by event(SEVONPEND=0). */ -#endif -/** - * @} - */ - /******************************************************************************* * Global function prototypes (definition in C source) ******************************************************************************/ diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pulse_encoder.c b/bsp/hc32/libraries/hc32_drivers/drv_pulse_encoder.c index c005e9aad68..fc825d52648 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pulse_encoder.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_pulse_encoder.c @@ -146,7 +146,7 @@ static void TMRA_1_Udf_callback(void) TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].tmr_handler, TMRA_FLAG_UDF); hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_1_Ovf_Udf_Handler(void) { CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].tmr_handler; @@ -173,7 +173,7 @@ static void TMRA_2_Udf_callback(void) TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler, TMRA_FLAG_UDF); hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_2_Ovf_Udf_Handler(void) { CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler; @@ -200,7 +200,7 @@ static void TMRA_3_Udf_callback(void) TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler, TMRA_FLAG_UDF); hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_3_Ovf_Udf_Handler(void) { CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler; @@ -227,7 +227,7 @@ static void TMRA_4_Udf_callback(void) TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler, TMRA_FLAG_UDF); hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_4_Ovf_Udf_Handler(void) { CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler; @@ -254,7 +254,7 @@ static void TMRA_5_Udf_callback(void) TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler, TMRA_FLAG_UDF); hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMRA_5_Ovf_Udf_Handler(void) { CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler; @@ -647,7 +647,7 @@ void TMR6_1_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMR6_1_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler; @@ -674,7 +674,7 @@ void TMR6_2_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F448) || defined (HC32F472) +#if defined (HC32F448) || defined (HC32F472) || defined (HC32F334) void TMR6_2_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler; @@ -701,7 +701,7 @@ void TMR6_3_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F472) +#if defined (HC32F472) || defined (HC32F334) void TMR6_3_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler; @@ -728,7 +728,7 @@ void TMR6_4_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F472) +#if defined (HC32F472) || defined (HC32F334) void TMR6_4_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler; @@ -755,7 +755,7 @@ void TMR6_5_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F472) +#if defined (HC32F472) || defined (HC32F334) void TMR6_5_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler; @@ -782,7 +782,7 @@ void TMR6_6_Udf_callback(void) TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler, TMR6_FLAG_UDF); hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].Over_Under_Flowcount--; } -#if defined (HC32F472) +#if defined (HC32F472) || defined (HC32F334) void TMR6_6_Ovf_Udf_Handler(void) { CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler; diff --git a/bsp/hc32/libraries/hc32_drivers/drv_pwm.c b/bsp/hc32/libraries/hc32_drivers/drv_pwm.c index 3573609540b..bfad2524123 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_pwm.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_pwm.c @@ -27,7 +27,7 @@ #if defined(HC32F460) || defined(HC32F448) #define TMRA_CHANNEL_NUM_MAX 8U -#elif defined(HC32F4A0) || defined(HC32F472) || defined(HC32F4A8) +#elif defined(HC32F4A0) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) #define TMRA_CHANNEL_NUM_MAX 4U #endif @@ -129,7 +129,7 @@ static rt_uint32_t tmra_get_clk_notdiv(CM_TMRA_TypeDef *TMRAx) rt_uint32_t u32clkFreq; rt_uint32_t u32BusName; -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) switch ((rt_uint32_t)TMRAx) { case (rt_uint32_t)CM_TMRA_1: @@ -682,8 +682,11 @@ static struct rt_pwm_ops _tmra_ops = #endif /* BSP_USING_PWM_TMRA */ #if defined(BSP_USING_PWM_TMR4) - -#define TMR4_CHANNEL_NUM_MAX 6U +#if defined (HC32F4A8) || defined (HC32F472) || defined (HC32F4A0) || defined (HC32F460) + #define TMR4_CHANNEL_NUM_MAX 6U +#elif defined (HC32F448) || defined (HC32F334) + #define TMR4_CHANNEL_NUM_MAX 8U +#endif enum { @@ -728,7 +731,7 @@ static struct hc32_pwm_tmr4 g_pwm_tmr4_array[] = static rt_uint32_t tmr4_get_clk_notdiv(CM_TMR4_TypeDef *TMR4x) { rt_uint32_t u32clkFreq; -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) u32clkFreq = CLK_GetBusClockFreq(CLK_BUS_PCLK0); #elif defined(HC32F460) u32clkFreq = CLK_GetBusClockFreq(CLK_BUS_PCLK1); @@ -932,7 +935,7 @@ static rt_err_t tmr4_pwm_set(struct rt_device_pwm *device, struct rt_pwm_configu static void enable_tmr4_unit_clk(void) { #ifdef BSP_USING_PWM_TMR4_1 -#if defined(HC32F472) +#if defined(HC32F472) || defined (HC32F334) FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4, ENABLE); #else FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_1, ENABLE); @@ -960,13 +963,13 @@ static rt_err_t pwm_tmr4_init(struct hc32_pwm_tmr4 *device) { TMR4_OC_Init(TMR4x, i, &device->stcTmr4OcInit); TMR4_PWM_Init(TMR4x, (i >> 1), &device->stcTmr4PwmInit); -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) TMR4_PWM_SetPortOutputMode(TMR4x, i, TMR4_PWM_PIN_OUTPUT_NORMAL); #endif tmr4_pwm_set_cmpmode(TMR4x, i); } } -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) TMR4_PWM_MainOutputCmd(TMR4x, ENABLE); #endif TMR4_Start(TMR4x); @@ -995,6 +998,14 @@ static void pwm_tmr4_get_channel(void) #ifdef BSP_USING_PWM_TMR4_1_OWL g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 5); #endif +#if defined (HC32F448) || defined (HC32F334) +#ifdef BSP_USING_PWM_TMR4_1_OXH + g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 6); +#endif +#ifdef BSP_USING_PWM_TMR4_1_OXL + g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 7); +#endif +#endif #endif #ifdef BSP_USING_PWM_TMR4_2 #ifdef BSP_USING_PWM_TMR4_2_OUH @@ -1196,7 +1207,7 @@ static rt_uint32_t tmr6_get_clk_bydiv(CM_TMR6_TypeDef *TMR6x) case (TMR6_CLK_DIV1024): u32clkFreq /= 1024; break; -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) case (TMR6_CLK_DIV32): u32clkFreq /= 32; break; @@ -1217,7 +1228,7 @@ static void tmr6_duyt100or0_output(CM_TMR6_TypeDef *TMR6x, rt_uint32_t channel, { if (compare_value <= 1) { -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_OVF, TMR6_PWM_LOW); #elif defined(HC32F460) TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_MATCH_PERIOD, TMR6_PWM_LOW); @@ -1225,7 +1236,7 @@ static void tmr6_duyt100or0_output(CM_TMR6_TypeDef *TMR6x, rt_uint32_t channel, } else { -#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_OVF, TMR6_PWM_HIGH); #elif defined(HC32F460) TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_MATCH_PERIOD, TMR6_PWM_HIGH); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_rtc.c b/bsp/hc32/libraries/hc32_drivers/drv_rtc.c index 179333ce30d..6896fb675c6 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_rtc.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_rtc.c @@ -186,7 +186,7 @@ static rt_err_t hc32_rtc_set_time_stamp(time_t time_stamp) #else #define RTC_CLK_SRC_SEL (RTC_CLK_SRC_LRC) #endif -#elif defined(HC32F472) +#elif defined(HC32F472) || defined (HC32F334) #if defined(BSP_RTC_USING_XTAL32) #define RTC_CLK_SRC_SEL (RTC_CLK_SRC_XTAL32) #elif defined(BSP_RTC_USING_XTAL_DIV) @@ -219,7 +219,7 @@ static rt_err_t _rtc_init(void) if ((SET == VBAT_PowerDownCheck()) || (LL_OK != _bakup_reg_check()) || (LL_OK != _hc32_rtc_rw_check())) #elif defined(HC32F4A0) if ((LL_OK != _bakup_reg_check()) || (LL_OK != _hc32_rtc_rw_check())) -#elif defined(HC32F460) || defined(HC32F448) || defined(HC32F472) +#elif defined(HC32F460) || defined(HC32F448) || defined(HC32F472) || defined (HC32F334) if (DISABLE == RTC_GetCounterState()) #endif { @@ -297,7 +297,7 @@ static void _rtc_alarm_irq_handler(void) rt_interrupt_leave(); } -#if defined(HC32F448) || defined(HC32F472) +#if defined(HC32F448) || defined(HC32F472) || defined (HC32F334) void RTC_Handler(void) { if (RTC_GetStatus(RTC_FLAG_ALARM) != RESET) diff --git a/bsp/hc32/libraries/hc32_drivers/drv_sdio.c b/bsp/hc32/libraries/hc32_drivers/drv_sdio.c index 4d49c721e88..85375e5832f 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_sdio.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_sdio.c @@ -987,7 +987,6 @@ static struct rt_mmcsd_host *_sdio_host_create(struct hc32_sdio_config *config, host->ops = &_mmcsd_host_ops; host->freq_min = 400 * 1000; host->freq_max = SDIO_MAX_FREQ; - host->valid_ocr = VDD_26_27 | VDD_27_28 | VDD_28_29 | VDD_29_30 | VDD_30_31 | VDD_31_32 | VDD_32_33 | VDD_33_34;/* The voltage range supported is 2.6v-3.4v */ host->valid_ocr = VDD_32_33 | VDD_33_34; #ifndef SDIO_USING_1_BIT host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; diff --git a/bsp/hc32/libraries/hc32_drivers/drv_spi.c b/bsp/hc32/libraries/hc32_drivers/drv_spi.c index 9c3d40e8c5e..2e4209106d4 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_spi.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_spi.c @@ -5,11 +5,12 @@ * * Change Logs: * Date Author Notes - * 2022-04-28 CDT first version + * 2022-04-28 CDT First version * 2023-09-30 CDT Delete dma transmit interrupt - * 2024-02-20 CDT support HC32F448 - * 2024-04-16 CDT support HC32F472 - * 2025-04-09 CDT support HC32F4A8 + * 2024-02-20 CDT Support HC32F448 + * 2024-04-16 CDT Support HC32F472 + * 2025-04-09 CDT Support HC32F4A8 + * 2025-07-18 CDT Support HC32F334 */ /******************************************************************************* @@ -40,7 +41,7 @@ /* SPI max division */ #if defined(HC32F4A0) || defined(HC32F460) #define SPI_MAX_DIV_VAL (0x7U) /* Div256 */ -#elif defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#elif defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) #define SPI_MAX_DIV_VAL (0x39U) #endif @@ -212,7 +213,7 @@ static rt_err_t hc32_spi_init(struct hc32_spi *spi_drv, struct rt_spi_configurat } #if defined(HC32F4A0) || defined(HC32F460) stcSpiInit.u32BaudRatePrescaler = (u32Cnt << SPI_CFG2_MBR_POS); -#elif defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) +#elif defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334) if (u32Cnt <= 15U) { stcSpiInit.u32BaudRatePrescaler = (u32Cnt << SPI_CFG1_CLKDIV_POS); @@ -328,7 +329,7 @@ static void hc32_spi_enable(CM_SPI_TypeDef *SPIx) { SPI_Cmd(SPIx, ENABLE); } -#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) if ((SPIx->CR & SPI_CR_SPE) != SPI_CR_SPE) { SPI_Cmd(SPIx, ENABLE); @@ -349,7 +350,7 @@ static void hc32_spi_set_trans_mode(CM_SPI_TypeDef *SPIx, uint32_t u32Mode) { CLR_REG32_BIT(SPIx->CR1, SPI_CR1_TXMDS); } -#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) if (SPI_SEND_ONLY == u32Mode) { SET_REG32_BIT(SPIx->CR, SPI_CR_TXMDS); @@ -368,7 +369,7 @@ static uint32_t hc32_spi_get_trans_mode(CM_SPI_TypeDef *SPIx) { #if defined (HC32F460) || defined (HC32F4A0) return READ_REG32_BIT(SPIx->CR1, SPI_CR1_TXMDS); -#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) return READ_REG32_BIT(SPIx->CR, SPI_CR_TXMDS); #else #error "Please select first the target HC32xxxx device used in your application." @@ -714,8 +715,12 @@ void SPI1_Handler(void) { hc32_spi1_err_irq_handler(); } -#endif /* HC32F448, HC32F472 */ - +#elif defined (HC32F334) +void SPI_Handler(void) +{ + hc32_spi1_err_irq_handler(); +} +#endif /* HC32F334 */ #endif /* BSP_USING_SPI1 */ #if defined(BSP_USING_SPI2) @@ -727,13 +732,13 @@ static void hc32_spi2_err_irq_handler(void) /* leave interrupt */ rt_interrupt_leave(); } + #if defined (HC32F448) ||defined (HC32F472) void SPI2_Handler(void) { hc32_spi2_err_irq_handler(); } #endif /* HC32F448, HC32F472 */ - #endif /* BSP_USING_SPI2 */ #if defined(BSP_USING_SPI3) @@ -745,13 +750,13 @@ static void hc32_spi3_err_irq_handler(void) /* leave interrupt */ rt_interrupt_leave(); } + #if defined (HC32F448) ||defined (HC32F472) void SPI3_Handler(void) { hc32_spi3_err_irq_handler(); } #endif /* HC32F448, HC32F472 */ - #endif /* BSP_USING_SPI3 */ #if defined(BSP_USING_SPI4) @@ -763,7 +768,7 @@ static void hc32_spi4_err_irq_handler(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* BSP_USING_SPI4 */ + #if defined (HC32F472) void SPI4_Handler(void) { @@ -771,6 +776,8 @@ void SPI4_Handler(void) } #endif /* HC32F472 */ +#endif /* BSP_USING_SPI4 */ + #if defined(BSP_USING_SPI5) static void hc32_spi5_err_irq_handler(void) { @@ -908,7 +915,7 @@ static int hc32_hw_spi_bus_init(void) /* register the handle */ #if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F4A8) hc32_install_irq_handler(&spi_config[i].err_irq.irq_config, spi_config[i].err_irq.irq_callback, RT_FALSE); -#elif defined (HC32F448) || defined (HC32F472) +#elif defined (HC32F448) || defined (HC32F472) || defined (HC32F334) INTC_IntSrcCmd(spi_config[i].err_irq.irq_config.int_src, DISABLE); NVIC_DisableIRQ(spi_config[i].err_irq.irq_config.irq_num); #endif diff --git a/bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.c b/bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.c index e908c379e83..16b70b13a02 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_tmr_capture.c @@ -12,8 +12,9 @@ #if defined(BSP_USING_INPUT_CAPTURE) #if defined(BSP_USING_INPUT_CAPTURE_TMR6_1) || defined(BSP_USING_INPUT_CAPTURE_TMR6_2) || defined(BSP_USING_INPUT_CAPTURE_TMR6_3) \ -|| defined(BSP_USING_INPUT_CAPTURE_TMR6_4) || defined(BSP_USING_INPUT_CAPTURE_TMR6_5) || defined(BSP_USING_INPUT_CAPTURE_TMR6_6) \ -|| defined(BSP_USING_INPUT_CAPTURE_TMR6_7) || defined(BSP_USING_INPUT_CAPTURE_TMR6_8) +|| defined(BSP_USING_INPUT_CAPTURE_TMR6_4) || defined(BSP_USING_INPUT_CAPTURE_TMR6_5) || defined(BSP_USING_INPUT_CAPTURE_TMR6_6) \ +|| defined(BSP_USING_INPUT_CAPTURE_TMR6_7) || defined(BSP_USING_INPUT_CAPTURE_TMR6_8) || defined(BSP_USING_INPUT_CAPTURE_TMR6_9) \ +|| defined(BSP_USING_INPUT_CAPTURE_TMR6_10) #include #include @@ -65,6 +66,12 @@ enum #endif #ifdef BSP_USING_INPUT_CAPTURE_TMR6_8 TMR_CAPTURE_IDX_TMR6_8, +#endif +#ifdef BSP_USING_INPUT_CAPTURE_TMR6_9 + TMR_CAPTURE_IDX_TMR6_9, +#endif +#ifdef BSP_USING_INPUT_CAPTURE_TMR6_10 + TMR_CAPTURE_IDX_TMR6_10, #endif TMR_CAPTURE_IDX_MAX, }; @@ -106,6 +113,14 @@ static rt_err_t _tmr_capture_get_pulsewidth(struct rt_inputcapture_device *input static void _tmr6_8_isr_ovf(void); static void _tmr6_8_isr_cap(void); #endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_9) + static void _tmr6_9_isr_ovf(void); + static void _tmr6_9_isr_cap(void); +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_10) + static void _tmr6_10_isr_ovf(void); + static void _tmr6_10_isr_cap(void); +#endif /* Private define ---------------------------------------------------------------*/ #define TMR6_INSTANCE_MIN ((uint32_t)CM_TMR6_1) @@ -113,6 +128,12 @@ static rt_err_t _tmr_capture_get_pulsewidth(struct rt_inputcapture_device *input #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_8) #elif defined (HC32F460) #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_3) +#elif defined (HC32F334) + #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_4) +#elif defined (HC32F448) + #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_2) +#elif defined (HC32F472) + #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_10) #endif #define TMR6_INSTANCE_ADDR_ALIGN (0x400UL) #define TMR6_PERIOD_VALUE_MAX (0xFFFFUL) @@ -120,24 +141,24 @@ static rt_err_t _tmr_capture_get_pulsewidth(struct rt_inputcapture_device *input #if defined (BSP_USING_INPUT_CAPTURE_TMR6) #define IS_CAPTURE_COND_RASING_EDGE(bit_pos) ((bit_pos) % 2U == 0U) - #if defined (HC32F4A0) || defined (HC32F4A8) + #if defined (HC32F4A0) || defined (HC32F4A8) || defined (HC32F334) || defined (HC32F472) #define VALID_CAPTURE_COND (TMR6_CAPT_COND_ALL & (~(TMR6_CAPT_COND_EVT0 | TMR6_CAPT_COND_EVT1 | TMR6_CAPT_COND_EVT2 | TMR6_CAPT_COND_EVT3))) - #elif defined (HC32F460) + #elif defined (HC32F460) || defined (HC32F448) #define VALID_CAPTURE_COND (TMR6_CAPT_COND_ALL & (~(TMR6_CAPT_COND_EVT0 | TMR6_CAPT_COND_EVT1))) #endif #endif -#define TMR6_ISR_OVF(U) \ +#define TMR6_ISR_OVF(U,N) \ static void _tmr6_##U##_isr_ovf(void)\ {\ - g_tmr_capturers[TMR_CAPTURE_IDX_TMR6_##U].ovf_cnt++;\ + g_tmr_capturers[N].ovf_cnt++;\ TMR6_ClearStatus(CM_TMR6_##U, TMR6_FLAG_OVF);\ } -#define TMR6_ISR_CAP(U) \ +#define TMR6_ISR_CAP(U,N) \ static void _tmr6_##U##_isr_cap(void)\ {\ - _tmr6_irq_cap_handler(&g_tmr_capturers[TMR_CAPTURE_IDX_TMR6_##U]);\ + _tmr6_irq_cap_handler(&g_tmr_capturers[N]);\ } #define TMR6_CAPTURE_CFG(U) \ @@ -172,6 +193,12 @@ static tmr_capture_t g_tmr_capturers[] = #if defined (BSP_USING_INPUT_CAPTURE_TMR6_8) TMR6_CAPTURE_CFG(8), #endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_9) + TMR6_CAPTURE_CFG(9), +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_10) + TMR6_CAPTURE_CFG(10), +#endif }; static struct rt_inputcapture_ops tmr_capture_ops = @@ -204,36 +231,44 @@ static void _tmr6_irq_cap_handler(tmr_capture_t *p_capture) } #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1) - TMR6_ISR_OVF(1) - TMR6_ISR_CAP(1) + TMR6_ISR_OVF(1, TMR_CAPTURE_IDX_TMR6_1) + TMR6_ISR_CAP(1, TMR_CAPTURE_IDX_TMR6_1) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2) - TMR6_ISR_OVF(2) - TMR6_ISR_CAP(2) + TMR6_ISR_OVF(2, TMR_CAPTURE_IDX_TMR6_2) + TMR6_ISR_CAP(2, TMR_CAPTURE_IDX_TMR6_2) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3) - TMR6_ISR_OVF(3) - TMR6_ISR_CAP(3) + TMR6_ISR_OVF(3, TMR_CAPTURE_IDX_TMR6_3) + TMR6_ISR_CAP(3, TMR_CAPTURE_IDX_TMR6_3) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_4) - TMR6_ISR_OVF(4) - TMR6_ISR_CAP(4) + TMR6_ISR_OVF(4, TMR_CAPTURE_IDX_TMR6_4) + TMR6_ISR_CAP(4, TMR_CAPTURE_IDX_TMR6_4) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_5) - TMR6_ISR_OVF(5) - TMR6_ISR_CAP(5) + TMR6_ISR_OVF(5, TMR_CAPTURE_IDX_TMR6_5) + TMR6_ISR_CAP(5, TMR_CAPTURE_IDX_TMR6_5) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_6) - TMR6_ISR_OVF(6) - TMR6_ISR_CAP(6) + TMR6_ISR_OVF(6, TMR_CAPTURE_IDX_TMR6_6) + TMR6_ISR_CAP(6, TMR_CAPTURE_IDX_TMR6_6) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_7) - TMR6_ISR_OVF(7) - TMR6_ISR_CAP(7) + TMR6_ISR_OVF(7, TMR_CAPTURE_IDX_TMR6_7) + TMR6_ISR_CAP(7, TMR_CAPTURE_IDX_TMR6_7) #endif #if defined (BSP_USING_INPUT_CAPTURE_TMR6_8) - TMR6_ISR_OVF(8) - TMR6_ISR_CAP(8) + TMR6_ISR_OVF(8, TMR_CAPTURE_IDX_TMR6_8) + TMR6_ISR_CAP(8, TMR_CAPTURE_IDX_TMR6_8) +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_9) + TMR6_ISR_OVF(9, TMR_CAPTURE_IDX_TMR6_9) + TMR6_ISR_CAP(9, TMR_CAPTURE_IDX_TMR6_9) +#endif +#if defined (BSP_USING_INPUT_CAPTURE_TMR6_10) + TMR6_ISR_OVF(10, TMR_CAPTURE_IDX_TMR6_10) + TMR6_ISR_CAP(10, TMR_CAPTURE_IDX_TMR6_10) #endif static void _tmr_irq_init_cap(tmr_capture_t *p_capture) @@ -323,7 +358,7 @@ static void _tmr_capture_init_tmr6(tmr_capture_t *p_capture, CM_TMR6_TypeDef *in uint32_t pin; uint32_t bit_pos = _get_capture_cond_bit_pos(init_params->first_edge); -#if defined (HC32F4A0) || defined (HC32F4A8) +#if defined (HC32F4A0) || defined (HC32F4A8) || defined (HC32F334) || defined (HC32F448) || defined (HC32F472) if (bit_pos <= TMR6_HCPAR_HCPA3_POS) { pin = TMR6_IO_PWMA + (bit_pos / 2U); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_usbd.c b/bsp/hc32/libraries/hc32_drivers/drv_usbd.c index b2347ae60c4..b1324771683 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_usbd.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_usbd.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2023-02-14 CDT first version + * 2025-07-25 CDT support HC32F4A8 */ /******************************************************************************* @@ -52,7 +53,7 @@ static struct ep_id _ep_pool[] = {0x4, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x5, USB_EP_ATTR_ISOC, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x5, USB_EP_ATTR_ISOC, USB_DIR_OUT, 64, ID_UNASSIGNED}, -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined(HC32F4A8) {0x6, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x6, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x7, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, @@ -399,7 +400,7 @@ static void usb_wrblanktxfifo(usb_core_instance *pdev, uint32_t epnum) } } -#if defined(HC32F4A0) || defined(HC32F460) +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F4A8) #ifdef VBUS_SENSING_ENABLED static void usb_sessionrequest_isr(usb_core_instance *pdev) { @@ -492,7 +493,6 @@ static void usb_inep_isr(usb_core_instance *pdev) if ((u32diepint & TXFEMP) != 0UL) { usb_wrblanktxfifo(pdev, u8epnum); - WRITE_REG32(pdev->regs.INEP_REGS[u8epnum]->DIEPINT, TXFEMP); } } u8epnum++; @@ -505,7 +505,7 @@ static void usb_outep_isr(usb_core_instance *pdev) uint32_t u32EpIntr; uint32_t u32doepint; uint8_t u8epnum = 0U; - uint32_t u8Xfer; + uint32_t u32Xfer; uint32_t u32ReadEpSize; u32EpIntr = usb_getalloepintr(&pdev->regs); @@ -520,8 +520,8 @@ static void usb_outep_isr(usb_core_instance *pdev) if (pdev->basic_cfgs.dmaen == 1U) { u32ReadEpSize = (READ_REG32(pdev->regs.OUTEP_REGS[u8epnum]->DOEPTSIZ) & USBFS_DOEPTSIZ_XFRSIZ); - u8Xfer = LL_MIN(pdev->dev.out_ep[u8epnum].maxpacket, pdev->dev.out_ep[u8epnum].xfer_len); - pdev->dev.out_ep[u8epnum].xfer_count = u8Xfer - u32ReadEpSize; + u32Xfer = LL_MIN(pdev->dev.out_ep[u8epnum].maxpacket, pdev->dev.out_ep[u8epnum].xfer_len); + pdev->dev.out_ep[u8epnum].xfer_count = u32Xfer - u32ReadEpSize; if (u8epnum != 0U) { pdev->dev.out_ep[u8epnum].xfer_count = pdev->dev.out_ep[u8epnum].xfer_len - u32ReadEpSize; @@ -585,6 +585,7 @@ static void usb_rxstsqlvl_isr(usb_core_instance *pdev) case STS_DATA_UPDT: if (0U != u16ByteCnt) { + RT_ASSERT(RT_IS_ALIGN((uint32_t)ep->xfer_buff, 4UL)); usb_rdpkt(&pdev->regs, ep->xfer_buff, u16ByteCnt); ep->xfer_buff += u16ByteCnt; ep->xfer_count += u16ByteCnt; @@ -717,7 +718,7 @@ static void usb_isr_handler(usb_core_instance *pdev) { usb_isooutincomplt_isr(pdev); } -#if defined(HC32F4A0) || defined(HC32F460) +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F4A8) #ifdef VBUS_SENSING_ENABLED if ((u32gintsts & VBUSV_INT) != 0UL) { @@ -851,7 +852,7 @@ static rt_err_t _usbd_init(rt_device_t device) #else stcPortIdentify.u8CoreID = USBHS_CORE_ID; #endif -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined(HC32F4A8) #if !defined(BSP_USING_USBHS_PHY_EXTERN) stcPortIdentify.u8PhyType = USBHS_PHY_EMBED; #else diff --git a/bsp/hc32/libraries/hc32_drivers/drv_usbh.c b/bsp/hc32/libraries/hc32_drivers/drv_usbh.c index 47d47bf775e..8c0b11c6d85 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_usbh.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_usbh.c @@ -112,7 +112,7 @@ static void usb_host_chx_out_isr(usb_core_instance *pdev, uint8_t chnum) { usb_host_clrint(pdev, chnum, USBFS_HCINT_ACK); } -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) else if (0UL != (u32hcint & USBFS_HCINT_AHBERR)) { usb_host_clrint(pdev, chnum, USBFS_HCINT_AHBERR); @@ -236,7 +236,7 @@ static void usb_host_chx_in_isr(usb_core_instance *pdev, uint8_t chnum) { usb_host_clrint(pdev, chnum, USBFS_HCINT_ACK); } -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) else if (0UL != (u32hcint & USBFS_HCINT_AHBERR)) { usb_host_clrint(pdev, chnum, USBFS_HCINT_AHBERR); @@ -1106,7 +1106,7 @@ static rt_err_t _usbh_init(rt_device_t device) #else stcPortIdentify.u8CoreID = USBHS_CORE_ID; #endif -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined (HC32F4A8) #if !defined(BSP_USING_USBHS_PHY_EXTERN) stcPortIdentify.u8PhyType = USBHS_PHY_EMBED; #else diff --git a/bsp/hc32/libraries/hc32_drivers/drv_wktm.c b/bsp/hc32/libraries/hc32_drivers/drv_wktm.c index 549b698c63e..8b8b9ed3e59 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_wktm.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_wktm.c @@ -30,7 +30,7 @@ #else #if defined(HC32F4A0) || defined(HC32F4A8) #define PWC_WKT_CLK_SRC (PWC_WKT_CLK_SRC_RTCLRC) - #elif defined(HC32F460) || defined(HC32F448) || defined(HC32F472) + #elif defined(HC32F460) || defined(HC32F448) || defined(HC32F472) || defined(HC32F334) #define PWC_WKT_CLK_SRC (PWC_WKT_CLK_SRC_LRC) #endif #define PWC_WKT_COUNT_FRQ (32768UL) diff --git a/bsp/hc32/platform/cherryusb/SConscript b/bsp/hc32/platform/cherryusb/SConscript new file mode 100644 index 00000000000..317440a1b70 --- /dev/null +++ b/bsp/hc32/platform/cherryusb/SConscript @@ -0,0 +1,18 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = [] +path = [cwd] + +if GetDepend(['RT_USING_CHERRYUSB']): + src += Glob('cherryusb_port.c') + +group = DefineGroup('Platform', src, depend = ['RT_USING_CHERRYUSB'], CPPPATH = path) + +Return('group') diff --git a/bsp/hc32/platform/cherryusb/cherryusb_port.c b/bsp/hc32/platform/cherryusb/cherryusb_port.c new file mode 100644 index 00000000000..a5adc74b06d --- /dev/null +++ b/bsp/hc32/platform/cherryusb/cherryusb_port.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ + +#include "usb_config.h" +#include "usbd_core.h" +#include "usbh_core.h" +#include "port/dwc2/usb_dwc2_param.h" + +#include "board_config.h" + +#if defined(RT_CHERRYUSB_HOST) && defined(RT_CHERRYUSB_DEVICE) + #if defined(HC32F460) || defined(HC32F472) + #error "Only one USB role can be selected!" + #endif +#endif + +const struct dwc2_user_params param_fs_core = +{ + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_FS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_FS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_FS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_FS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_FS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_FS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_FS_CORE_DEVICE_TX5_FIFO_SIZE, +#if defined(HC32F4A0) || defined(HC32F4A8) + [6] = CONFIG_USB_FS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_FS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_FS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_FS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_FS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_FS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_FS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_FS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_FS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_FS_CORE_DEVICE_TX15_FIFO_SIZE +#elif defined(HC32F460) || defined(HC32F472) + [6] = 0, + [7] = 0, + [8] = 0, + [9] = 0, + [10] = 0, + [11] = 0, + [12] = 0, + [13] = 0, + [14] = 0, + [15] = 0 +#endif + }, + .total_fifo_size = CONFIG_USB_FS_CORE_TOTAL_FIFO_SIZE, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_FS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_FS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, +#if defined(HC32F4A0) || defined(HC32F4A8) || defined(HC32F460) + .b_session_valid_override = false, +#elif defined(HC32F472) + .b_session_valid_override = true, +#endif +}; + +#if defined(HC32F4A0) || defined(HC32F4A8) +const struct dwc2_user_params param_hs_core = +{ +#ifdef CONFIG_USB_HS + .phy_type = DWC2_PHY_TYPE_PARAM_UTMI, +#else + .phy_type = DWC2_PHY_TYPE_PARAM_FS, +#endif +#ifdef CONFIG_USB_DWC2_DMA_ENABLE + .device_dma_enable = true, +#else + .device_dma_enable = false, +#endif + .device_dma_desc_enable = false, + .device_rx_fifo_size = CONFIG_USB_HS_CORE_DEVICE_RX_FIFO_SIZE, + .device_tx_fifo_size = { + [0] = CONFIG_USB_HS_CORE_DEVICE_TX0_FIFO_SIZE, + [1] = CONFIG_USB_HS_CORE_DEVICE_TX1_FIFO_SIZE, + [2] = CONFIG_USB_HS_CORE_DEVICE_TX2_FIFO_SIZE, + [3] = CONFIG_USB_HS_CORE_DEVICE_TX3_FIFO_SIZE, + [4] = CONFIG_USB_HS_CORE_DEVICE_TX4_FIFO_SIZE, + [5] = CONFIG_USB_HS_CORE_DEVICE_TX5_FIFO_SIZE, + [6] = CONFIG_USB_HS_CORE_DEVICE_TX6_FIFO_SIZE, + [7] = CONFIG_USB_HS_CORE_DEVICE_TX7_FIFO_SIZE, + [8] = CONFIG_USB_HS_CORE_DEVICE_TX8_FIFO_SIZE, + [9] = CONFIG_USB_HS_CORE_DEVICE_TX9_FIFO_SIZE, + [10] = CONFIG_USB_HS_CORE_DEVICE_TX10_FIFO_SIZE, + [11] = CONFIG_USB_HS_CORE_DEVICE_TX11_FIFO_SIZE, + [12] = CONFIG_USB_HS_CORE_DEVICE_TX12_FIFO_SIZE, + [13] = CONFIG_USB_HS_CORE_DEVICE_TX13_FIFO_SIZE, + [14] = CONFIG_USB_HS_CORE_DEVICE_TX14_FIFO_SIZE, + [15] = CONFIG_USB_HS_CORE_DEVICE_TX15_FIFO_SIZE + }, + .total_fifo_size = CONFIG_USB_HS_CORE_TOTAL_FIFO_SIZE, + + .host_dma_desc_enable = false, + .host_rx_fifo_size = CONFIG_USB_HS_CORE_HOST_RX_FIFO_SIZE, + .host_nperio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_NP_FIFO_SIZE, + .host_perio_tx_fifo_size = CONFIG_USB_HS_CORE_HOST_PE_FIFO_SIZE, + .device_gccfg = 0, + .host_gccfg = 0, + .b_session_valid_override = false, +}; +#endif + +#ifndef CONFIG_USB_DWC2_CUSTOM_PARAM +void dwc2_get_user_params(uint32_t reg_base, struct dwc2_user_params *params) +{ +#if defined(HC32F4A0) || defined(HC32F4A8) + if (reg_base == CM_USBHS_BASE) + { + memcpy(params, ¶m_hs_core, sizeof(struct dwc2_user_params)); + } + else +#endif + { + memcpy(params, ¶m_fs_core, sizeof(struct dwc2_user_params)); + } +#ifdef CONFIG_USB_DWC2_CUSTOM_FIFO + struct usb_dwc2_user_fifo_config s_dwc2_fifo_config; + + dwc2_get_user_fifo_config(reg_base, &s_dwc2_fifo_config); + + params->device_rx_fifo_size = s_dwc2_fifo_config.device_rx_fifo_size; + for (uint8_t i = 0; i < MAX_EPS_CHANNELS; i++) + { + params->device_tx_fifo_size[i] = s_dwc2_fifo_config.device_tx_fifo_size[i]; + } +#endif +} +#endif + +#define BOARD_INIT_USB_HOST_MODE (0U) +#define BOARD_INIT_USB_DEVICE_MODE (1U) +extern rt_err_t rt_hw_usbfs_board_init(uint8_t devmode); +static uint8_t g_usb_fs_busid = 0U; +#if defined(HC32F4A0) || defined(HC32F4A8) + extern rt_err_t rt_hw_usbhs_board_init(uint8_t devmode); + static uint8_t g_usb_hs_busid = 0U; +#endif + +#if defined(RT_CHERRYUSB_HOST) +static void usbh_fs_irq_handler(void) +{ + USBH_IRQHandler(g_usb_fs_busid); +} + +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbh_hs_irq_handler(void) +{ + USBH_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbh_fs_irq_handler(); +} +#endif + +void usb_hc_low_level_init(struct usbh_bus *bus) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (bus->hcd.reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = bus->hcd.hcd_id; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = bus->hcd.hcd_id; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_HOST_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbh_fs_irq_handler, + RT_TRUE); + } + +} +#endif + +#if defined(RT_CHERRYUSB_DEVICE) +static void usbd_fs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_fs_busid); +} + +#if defined(HC32F4A0) || defined(HC32F4A8) +static void usbd_hs_irq_handler(void) +{ + USBD_IRQHandler(g_usb_hs_busid); +} +#endif + +#if defined(HC32F472) +void USBFS_Handler(void) +{ + usbd_fs_irq_handler(); +} +#endif + +void usb_dc_low_level_init(uint8_t busid) +{ + struct hc32_irq_config irq_config; + +#if defined(HC32F4A0) || defined(HC32F4A8) + if (g_usbdev_bus[busid].reg_base == CM_USBHS_BASE) + { + g_usb_hs_busid = busid; + + rt_hw_usbhs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBHS, ENABLE); + +#ifndef CONFIG_USB_HS + /* enable the embedded PHY in USBHS mode */ + CM_PERIC->USB_SYCTLREG |= PERIC_USB_SYCTLREG_USBHS_FSPHYE; +#endif + + irq_config.irq_num = BSP_USBHS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBHS_GLB; + irq_config.irq_prio = BSP_USBHS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_hs_irq_handler, + RT_TRUE); + } + else +#endif + { + g_usb_fs_busid = busid; + + rt_hw_usbfs_board_init(BOARD_INIT_USB_DEVICE_MODE); + FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE); + + irq_config.irq_num = BSP_USBFS_GLB_IRQ_NUM; + irq_config.int_src = INT_SRC_USBFS_GLB; + irq_config.irq_prio = BSP_USBFS_GLB_IRQ_PRIO; + /* register interrupt */ + hc32_install_irq_handler(&irq_config, + usbd_fs_irq_handler, + RT_TRUE); + } +} + +void usb_dc_low_level_deinit(uint8_t busid) +{ + (void)busid; + /* reserved */ +} + +#endif diff --git a/bsp/hc32/platform/sfud/drv_spi_flash.c b/bsp/hc32/platform/sfud/drv_spi_flash.c index 9e2a58af7f2..70ccd18f715 100644 --- a/bsp/hc32/platform/sfud/drv_spi_flash.c +++ b/bsp/hc32/platform/sfud/drv_spi_flash.c @@ -38,6 +38,11 @@ #define SPI_FLASH_DEVICE_NAME "spi10" #define SPI_FLASH_CHIP "w25q64" #define SPI_FLASH_SS_PIN GET_PIN(B,12) +#elif defined(HC32F334) + #define SPI_BUS_NAME "spi1" + #define SPI_FLASH_DEVICE_NAME "spi10" + #define SPI_FLASH_CHIP "w25q64" + #define SPI_FLASH_SS_PIN GET_PIN(C,1) #endif #define SPI_FLASH_CMD_ENABLE_RESET 0x66 #define SPI_FLASH_CMD_RESET_DEVICE 0x99 diff --git a/bsp/hc32/tests/SConscript b/bsp/hc32/tests/SConscript index 5f775d21553..fd00268e783 100644 --- a/bsp/hc32/tests/SConscript +++ b/bsp/hc32/tests/SConscript @@ -91,6 +91,9 @@ if GetDepend(['BSP_USING_ON_CHIP_FLASH']): if GetDepend(['BSP_USING_GPIO']): src += ['test_gpio.c'] +if GetDepend(['RT_USING_CHERRYUSB']): + src += ['test_cherryusb.c'] + path = [cwd] group = DefineGroup('Tests', src, depend = [''], CPPPATH = path) diff --git a/bsp/hc32/tests/test_adc.c b/bsp/hc32/tests/test_adc.c index 101bbce90fa..abe95b0c9da 100644 --- a/bsp/hc32/tests/test_adc.c +++ b/bsp/hc32/tests/test_adc.c @@ -41,6 +41,10 @@ #define ADC1_CH_MAX (16U) #define ADC2_CH_MAX (8U) #define ADC3_CH_MAX (12U) +#elif defined (HC32F334) + #define ADC1_CH_MAX (16U) + #define ADC2_CH_MAX (12U) + #define ADC3_CH_MAX (10U) #endif @@ -55,7 +59,7 @@ rt_err_t adc_dma_trig_config(void) { stc_tmr0_init_t stcTmr0Init; -#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F472) || defined(HC32F448) || defined(HC32F4A8) +#if defined(HC32F460) || defined(HC32F4A0) || defined(HC32F472) || defined(HC32F448) || defined(HC32F4A8) || defined (HC32F334) FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_1, ENABLE); #endif (void)TMR0_StructInit(&stcTmr0Init); @@ -101,7 +105,7 @@ static int adc_vol_sample(int argc, char **argv) rt_strcpy(adc_device, "adc2"); adc_max_channel = ADC2_CH_MAX; } -#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) +#if defined (HC32F472) || defined (HC32F4A0) || defined (HC32F448) || defined (HC32F4A8) || defined (HC32F334) else if (0 == rt_strcmp(argv[1], "adc3")) { rt_strcpy(adc_device, "adc3"); diff --git a/bsp/hc32/tests/test_can.c b/bsp/hc32/tests/test_can.c index 4424c265276..b96471eacae 100644 --- a/bsp/hc32/tests/test_can.c +++ b/bsp/hc32/tests/test_can.c @@ -70,6 +70,10 @@ static struct rt_semaphore can_rx_sem; static rt_mutex_t can_mutex = RT_NULL; static rt_thread_t rx_thread; +#ifdef RT_CAN_USING_CANFD +static const uint8_t mcan_data_size[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64}; +#endif + #define CAN_IF_INIT() do { \ if (can_dev == RT_NULL || can_mutex == RT_NULL) { \ rt_kprintf("failed! please first execute can_sample cmd!\n"); \ @@ -99,10 +103,27 @@ static void _set_default_filter(void) #endif } +static uint8_t _get_can_data_bytes_len(uint32_t dlc) +{ + uint8_t data_bytes = 0; + + dlc &= 0xFU; + if (dlc <= 8U) + { + data_bytes = dlc; + } +#ifdef RT_CAN_USING_CANFD + data_bytes = mcan_data_size[dlc]; +#endif + + return data_bytes; +} + static void can_rx_thread(void *parameter) { struct rt_can_msg rxmsg = {0}; rt_size_t size; + uint8_t data_len; while (1) { @@ -115,7 +136,8 @@ static void can_rx_thread(void *parameter) rt_device_read(can_dev, 0, &rxmsg, sizeof(rxmsg)); /* 打印数据 ID 及内容 */ rt_kprintf("ID:%x Data:", rxmsg.id); - for (int i = 0; i < rxmsg.len; i++) + data_len = _get_can_data_bytes_len(rxmsg.len); + for (int i = 0; i < data_len; i++) { rt_kprintf("%2x ", rxmsg.data[i]); } diff --git a/bsp/hc32/tests/test_cherryusb.c b/bsp/hc32/tests/test_cherryusb.c new file mode 100644 index 00000000000..d8223826e70 --- /dev/null +++ b/bsp/hc32/tests/test_cherryusb.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2025-08-08 CDT first version + */ +#include +#include +#include + +/* 请关注并阅读bsp/hc32/ev_hc32xxxx/README.md中,关于USB使用的相关注意事项 +*/ + +#if defined(RT_CHERRYUSB_HOST) && defined(RT_CHERRYUSB_DEVICE) + #if defined(HC32F4A0) || defined(HC32F4A8) + #define TEST_USBH_CORE_BASE (CM_USBFS_BASE) + #define TEST_USBD_CORE_BASE (CM_USBHS_BASE) + #else + #error "Only one USB role can be selected" + #endif +#else + #if defined(RT_CHERRYUSB_HOST) + #define TEST_USBH_CORE_BASE (CM_USBFS_BASE) + #elif defined(RT_CHERRYUSB_DEVICE) + #define TEST_USBD_CORE_BASE (CM_USBFS_BASE) + #endif +#endif + +#if defined(RT_CHERRYUSB_HOST) +#include "usbh_core.h" +#if defined(RT_CHERRYUSB_HOST_CDC_ECM) || defined(RT_CHERRYUSB_HOST_CDC_RNDIS) || defined(RT_CHERRYUSB_HOST_MSC) +/* 使用USB Host 时,应确保主机对设备供电充足 + + menuconfig: ECM 关键配置 + + RT-Thread Kernel --->[*] Enable soft timer with a timer thread + (4096) The stack size of timer thread + + RT-Thread Components--->Devicee Drivers--->[*] Using USB with CherryUSB + [*] Enable usb host mode + Selectot usb host ip.... ---> + [*]dwc2_hc + [*] Enable usb cdc ecm driver + + RT-Thread Components--->Network---> lwIP--->lwIP version ---> v2.1.2 + ... + [*] Enable alloc ip address through DHCP + ... + (4096) the stack size of lwIP thread + [*] Not use Rx thread + [*] Not use Tx thread + ... + [*] Enable ping features + + 备注:CherryUSB Host枚举设备时,默认选择Configuration 1,若指定设备(如CH397A模组CDC-ECM模式)需要选择Configuration 2,需在 + components/drivers/usb/cherryusb/core/usbh_core.c文件中usbh_enumerate()函数内添加如下代码: + int usbh_enumerate(struct usbh_hubport *hport) + { + ... + config_index = 0; + // Add code start + if((0x1A86 == ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idVendor) && \ + (0x5397 == ((struct usb_device_descriptor *)ep0_request_buffer[hport->bus->busid])->idProduct)) { + config_index = 1; // For CH397, we need to select configuration 2 + } + // Add code end + USB_LOG_DBG("The device selects config %d\r\n", config_index); + ... + } + + + menuconfig: MSC 关键配置 + + RT-Thread Kernel --->[*] Enable soft timer with a timer thread + (4096) The stack size of timer thread + + RT-Thread Components--->Devicee Drivers--->[*] Using USB with CherryUSB + [*] Enable usb host mode + Selectot usb host ip.... ---> + [*]dwc2_hc + [*] Enable usb msc driver + ... + (/)usb host dfs mount point + +*/ + + +/* ECM 测试 +msh />ipconfig + network interface: u0 (Default) + MTU: 1500 + MAC: 4e 61 e9 06 9b ff + FLAGS: UP LINK_UP ETHARP BROADCAST IGMP + ip address: 192.168.225.29 + gw address: 192.168.225.1 + net mask : 255.255.255.0 + dns server #0: 108.7.254.31 + dns server #1: 112.7.254.31 +msh />ping www.baidu.com + 60 bytes from 183.2.172.177 icmp_seq=0 ttl=51 time=149 ms + 60 bytes from 183.2.172.177 icmp_seq=1 ttl=51 time=69 ms + 60 bytes from 183.2.172.177 icmp_seq=2 ttl=51 time=51 ms + 60 bytes from 183.2.172.177 icmp_seq=3 ttl=51 time=52 ms +*/ +static int cherryusb_host_init(void) +{ + usbh_initialize(0, TEST_USBH_CORE_BASE); + return 0; +} +INIT_APP_EXPORT(cherryusb_host_init); + +#if defined(RT_CHERRYUSB_HOST_CDC_ECM) || defined(RT_CHERRYUSB_HOST_CDC_RNDIS) +void ipconfig(void) +{ + extern void list_if(void); + list_if(); +} +MSH_CMD_EXPORT(ipconfig, list network interface information); +#endif + +#endif +#endif + +#if defined(RT_CHERRYUSB_DEVICE) +#if defined(RT_CHERRYUSB_DEVICE_TEMPLATE_CDC_ACM) +/* + menuconfig:关键配置 + + RT-Thread Components--->Devicee Drivers--->[*] Using USB with CherryUSB + [*] Enable usb device mode + Selectot usb host ip.... ---> + [*]dwc2_hc + [*] Enable usb cdc acm device + Select usb device template...---> + [*] cdc acm +*/ + +static int cherryusb_device_cdc_acm_init(void) +{ + extern void cdc_acm_init(uint8_t busid, uint32_t reg_base); + cdc_acm_init(0, TEST_USBD_CORE_BASE); + return 0; +} +INIT_APP_EXPORT(cherryusb_device_cdc_acm_init); + +static void cherryusb_cdc_send(int argc, char **argv) +{ + extern void cdc_acm_data_send_with_dtr_test(uint8_t busid); + cdc_acm_data_send_with_dtr_test(0); +} +MSH_CMD_EXPORT(cherryusb_cdc_send, cdc acm data send with dtr test); + +#endif +#endif diff --git a/bsp/hc32/tests/test_crypto.c b/bsp/hc32/tests/test_crypto.c index 79744f441a6..439433723af 100644 --- a/bsp/hc32/tests/test_crypto.c +++ b/bsp/hc32/tests/test_crypto.c @@ -11,6 +11,7 @@ #include #include #include +#include #if defined(BSP_USING_HWCRYPTO) @@ -43,7 +44,7 @@ static void _crypto_cmd_print_usage(void) rt_kprintf(" aes: test aes module. \n"); #if defined(HC32F460) rt_kprintf(" e.g. msh >crypto_sample aes 128 \n"); -#elif defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) +#elif defined (HC32F4A0) || defined (HC32F448) || defined (HC32F472) || defined (HC32F4A8) rt_kprintf(" e.g. msh >crypto_sample aes 128/192/256 \n"); #endif #endif @@ -56,6 +57,14 @@ static void _crypto_cmd_print_usage(void) } #if defined(BSP_USING_CRC) +/* menuconfig: + Hardware Drivers Config--->On-Chip Peripheral Driver--->Using Hardware Crypto ---> + [*]Enable Hardeware CRC + * CRC16命令调用:crypto_sample crc 16 + * CRC32命令调用:crypto_sample crc 32 + * 程序功能:打印CRC输入数据和计数结果,使用第三方软件计算数据,再做比较 + */ + #define CRC16_WIDTH 16U #define CRC32_WIDTH 32U static void crc_test(rt_uint32_t width) @@ -125,65 +134,91 @@ static void aes_test(rt_uint16_t key_bitlen) const char *key192 = "1234567890abcdefghijklmn"; const char *key256 = "1234567890abcdefghijklmnopqrstuv"; const char *key; - - ctx = rt_hwcrypto_symmetric_create(rt_hwcrypto_dev_default(), HWCRYPTO_TYPE_AES_ECB); - if (ctx == RT_NULL) + rt_uint8_t type_max = 1U; + hwcrypto_type types[] = { - rt_kprintf("create AES-CBC context err!"); - return; - } - switch (key_bitlen) + HWCRYPTO_TYPE_AES_ECB, + HWCRYPTO_TYPE_AES_CBC, + HWCRYPTO_TYPE_AES_CTR, + HWCRYPTO_TYPE_AES_CFB, + HWCRYPTO_TYPE_AES_OFB, + }; + const char *type_str[] = { - case 128: - key = key128; - break; - case 192: - key = key192; - break; - case 256: - key = key256; - break; - default: - key = key128; - break; - } - result = rt_hwcrypto_symmetric_setkey(ctx, (rt_uint8_t *)key, key_bitlen); - if (result == RT_EOK) + "aes_ecb", + "aes_cbc", + "aes_ctr", + "aes_cfb", + "aes_ofb", + }; +#if defined (HC32F4A8) + type_max = 5U; +#endif + for (int i = 0; i < type_max; i++) { - result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_ENCRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_in, enc_out); - if (result != RT_EOK) + ctx = rt_hwcrypto_symmetric_create(rt_hwcrypto_dev_default(), types[i]); + if (ctx == RT_NULL) { - goto _exit; + rt_kprintf("create AES context err!"); + return; } - - rt_kprintf("aes src data:"); - for (int i = 0; i < AES_DATA_LEN; i++) + switch (key_bitlen) { - rt_kprintf("%c", enc_in[i]); + case 128: + key = key128; + break; + case 192: + key = key192; + break; + case 256: + key = key256; + break; + default: + key = key128; + break; } - rt_kprintf("\n"); - - rt_kprintf("aes enc data:"); - for (int i = 0; i < AES_DATA_LEN; i++) + result = rt_hwcrypto_symmetric_setkey(ctx, (rt_uint8_t *)key, key_bitlen); +#if defined (HC32F4A8) + const char *iv = "1234567812345678"; + result = rt_hwcrypto_symmetric_setiv(ctx, (const rt_uint8_t *)iv, strlen(iv)); +#endif + if (result == RT_EOK) { - rt_kprintf("%x ", enc_out[i]); - } - rt_kprintf("\n"); + result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_ENCRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_in, enc_out); + if (result != RT_EOK) + { + goto _exit; + } - result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_DECRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_out, dec_out); - if (result != RT_EOK) - { - goto _exit; - } - rt_kprintf("aes dec data:"); - for (int i = 0; i < AES_DATA_LEN; i++) - { - rt_kprintf("%c", dec_out[i]); - } - rt_kprintf("\n"); + rt_kprintf("%s src data:", type_str[i]); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%c", enc_in[i]); + } + rt_kprintf("\n"); + + rt_kprintf("%s enc data:", type_str[i]); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%02x ", enc_out[i]); + } + rt_kprintf("\n"); + + result = rt_hwcrypto_symmetric_crypt(ctx, HWCRYPTO_MODE_DECRYPT, AES_DATA_LEN, (rt_uint8_t *)enc_out, dec_out); + if (result != RT_EOK) + { + goto _exit; + } + rt_kprintf("%s dec data:", type_str[i]); + for (int i = 0; i < AES_DATA_LEN; i++) + { + rt_kprintf("%c", dec_out[i]); + } + rt_kprintf("\n"); _exit: - rt_hwcrypto_symmetric_destroy(ctx); + rt_hwcrypto_symmetric_destroy(ctx); + } } } #endif diff --git a/bsp/hc32/tests/test_dac.c b/bsp/hc32/tests/test_dac.c index 36e3e134bff..9821993bfa6 100644 --- a/bsp/hc32/tests/test_dac.c +++ b/bsp/hc32/tests/test_dac.c @@ -32,6 +32,7 @@ static int dac_vol_sample(int argc, char *argv[]) { char dac_device_name[] = "dac1"; rt_uint8_t channel = 1; + rt_uint8_t max_channel = 2; rt_dac_device_t dac_dev; rt_uint32_t value = 1365; /* 默认1.1V */ rt_uint32_t convertBits; @@ -44,21 +45,29 @@ static int dac_vol_sample(int argc, char *argv[]) if (0 == rt_strcmp(argv[1], "dac1")) { rt_strcpy(dac_device_name, "dac1"); + max_channel = 2; } -#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) || defined (HC32F334) else if (0 == rt_strcmp(argv[1], "dac2")) { rt_strcpy(dac_device_name, "dac2"); +#if defined (HC32F4A0) || defined (HC32F472) || defined (HC32F4A8) + max_channel = 2; +#elif defined (HC32F334) + max_channel = 1; +#endif } #endif #if defined (HC32F472) else if (0 == rt_strcmp(argv[1], "dac3")) { rt_strcpy(dac_device_name, "dac3"); + max_channel = 2; } else if (0 == rt_strcmp(argv[1], "dac4")) { rt_strcpy(dac_device_name, "dac4"); + max_channel = 2; } #endif else @@ -84,7 +93,7 @@ static int dac_vol_sample(int argc, char *argv[]) return -RT_ERROR; } convertBits = (1 << (rt_uint8_t)convertBits); - for (channel = 1; channel < 3; channel++) + for (channel = 1; channel <= max_channel; channel++) { /* 打开通道 */ ret = rt_dac_enable(dac_dev, channel); diff --git a/bsp/hc32/tests/test_fal.c b/bsp/hc32/tests/test_fal.c index dce299a5230..6acb246a4ad 100644 --- a/bsp/hc32/tests/test_fal.c +++ b/bsp/hc32/tests/test_fal.c @@ -29,6 +29,7 @@ #define FAL_PART_NAME "app" #define TEST_BUF_SIZE 1024UL #define TEST_RW_CNT 32UL + #define TEST_RW_START_ADDR HC32_FLASH_END_ADDRESS - (TEST_BUF_SIZE * TEST_RW_CNT) diff --git a/bsp/hc32/tests/test_pfc8563_i2c.c b/bsp/hc32/tests/test_pfc8563_i2c.c deleted file mode 100644 index 93b29ac5e45..00000000000 --- a/bsp/hc32/tests/test_pfc8563_i2c.c +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2024-12-30 CDT first version - */ - -/* - * 程序清单:这是一个 I2C 设备使用例程 - * 例程导出了 pcf8563 命令到控制终端 - * 命令调用格式:i2c_pcf8563_sample i2c1 - * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 - * 程序功能:通过 I2C 设备读取时间信息并打印 -*/ - -#include -#include - -#if defined(BSP_USING_I2C) - -#define PFC8563_I2C_BUS_NAME "i2c1" /* I2C总线设备名称 */ -#define PFC8563_ADDR 0x51 /* 从机地址 */ -#define PFC8563_REG_SEC 0x02 /* 校准命令 */ -#define PFC8563_REG_CTRL_SR1 0x00 /* 校准命令 */ - -#define PFC8563_TIME_LEN 0x7 /* 获取数据长度 */ - - -#define RTC_DEC2BCD(__DATA__) ((((__DATA__) / 10U) << 4U) + ((__DATA__) % 10U)) -#define RTC_BCD2DEC(__DATA__) ((((__DATA__) >> 4U) * 10U) + ((__DATA__) & 0x0FU)) - - -static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ -static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 */ - -/* 写传感器寄存器 */ -static rt_err_t write_regs(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint8_t len) -{ - rt_uint8_t buf[16 + 1]; - struct rt_i2c_msg msgs; - rt_uint32_t buf_size = 1; - - buf[0] = reg; // cmd - if (data != RT_NULL) - { - memcpy(&buf[1], data, len); - buf_size += len; - } - - msgs.addr = PFC8563_ADDR; - msgs.flags = RT_I2C_WR; - msgs.buf = buf; - msgs.len = buf_size; - - /* 调用I2C设备接口传输数据 */ - if (rt_i2c_transfer(bus, &msgs, 1) == 1) - { - return RT_EOK; - } - else - { - rt_kprintf("write regs failed!\n"); - return -RT_ERROR; - } -} - -/* 读传感器寄存器数据 */ -static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data, rt_uint8_t len) -{ - struct rt_i2c_msg msgs[2]; - rt_uint8_t buf[16 + 1]; - rt_uint32_t buf_size = 1; - - buf[0] = reg; // cmd - msgs[0].addr = PFC8563_ADDR; - msgs[0].flags = RT_I2C_WR; - msgs[0].buf = buf; - msgs[0].len = buf_size; - - msgs[1].addr = PFC8563_ADDR; - msgs[1].flags = RT_I2C_RD; - msgs[1].buf = data; - msgs[1].len = len; - - /* 调用I2C设备接口传输数据 */ - if (rt_i2c_transfer(bus, &msgs[0], 2) == 2) - { - return RT_EOK; - } - else - { - rt_kprintf("read regs failed!\n"); - return -RT_ERROR; - } -} - -static void pcf8563_init(const char *name) -{ - rt_uint8_t temp[16]; - - /* 查找I2C总线设备,获取I2C总线设备句柄 */ - i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); - - if (i2c_bus == RT_NULL) - { - rt_kprintf("can't find %s device!\n", name); - } - else - { - rt_thread_mdelay(500); - temp[0] = 0x28U; - write_regs(i2c_bus, PFC8563_REG_CTRL_SR1, temp, 1); - rt_thread_mdelay(100); - temp[0] = 0x08U; - write_regs(i2c_bus, PFC8563_REG_CTRL_SR1, temp, 1); - rt_thread_mdelay(100); - - temp[0] = RTC_DEC2BCD(55); - temp[1] = RTC_DEC2BCD(59); - temp[2] = RTC_DEC2BCD(23); - temp[3] = RTC_DEC2BCD(1); - temp[4] = RTC_DEC2BCD(3); - temp[5] = RTC_DEC2BCD(1); - temp[6] = RTC_DEC2BCD(20); - write_regs(i2c_bus, PFC8563_REG_SEC, temp, PFC8563_TIME_LEN); - rt_thread_mdelay(100); - initialized = RT_TRUE; - } -} - -static void serial_thread_entry(void *parameter) -{ - rt_uint8_t time[16]; - - memset(time, 0, 16); - rt_thread_mdelay(500); - rt_thread_mdelay(500); - - while (1) - { - // if (RT_EOK == read_regs(i2c_bus, PFC8563_REG_SEC, time, PFC8563_TIME_LEN)) - if (RT_EOK == read_regs(i2c_bus, PFC8563_REG_SEC, time, 1)) - { - time[0] &= 0x7FU; - time[1] &= 0x7FU; - time[2] &= 0x3FU; - time[3] &= 0x3FU; - time[4] &= 0x7U; - time[5] &= 0x1FU; - time[6] &= 0xFFU; - /* Print current date and time */ - rt_kprintf("Time: 20%02d/%02d/%02d %02d:%02d:%02d\n", RTC_BCD2DEC(time[6]), RTC_BCD2DEC(time[5]), - RTC_BCD2DEC(time[3]), RTC_BCD2DEC(time[2]), RTC_BCD2DEC(time[1]), RTC_BCD2DEC(time[0])); - } - else - { - rt_kprintf("Get time failed!\n"); - } - rt_thread_mdelay(100); - } -} - -void i2c_pcf8563_sample(int argc, char *argv[]) -{ - char bus_name[RT_NAME_MAX]; - - if (argc == 2) - { - rt_strncpy(bus_name, argv[1], RT_NAME_MAX); - } - else - { - rt_strncpy(bus_name, PFC8563_I2C_BUS_NAME, RT_NAME_MAX); - } - - if (!initialized) - { - /* 传感器初始化 */ - pcf8563_init(bus_name); - } - if (initialized) - { - /* 创建 serial 线程 */ - rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); - /* 创建成功则启动线程 */ - if (thread != RT_NULL) - { - rt_thread_startup(thread); - } - else - { - rt_kprintf("startup thread failed!\n"); - } - } - else - { - rt_kprintf("initialize sensor failed!\n"); - } -} -/* 导出到 msh 命令列表中 */ -MSH_CMD_EXPORT(i2c_pcf8563_sample, i2c aht10 sample); - -#endif diff --git a/bsp/hc32/tests/test_pm.c b/bsp/hc32/tests/test_pm.c index 8b41616363f..cb334e2b55d 100644 --- a/bsp/hc32/tests/test_pm.c +++ b/bsp/hc32/tests/test_pm.c @@ -113,6 +113,20 @@ #define LED_GREEN_PORT (GPIO_PORT_C) #define LED_GREEN_PIN (GPIO_PIN_09) +#elif defined (HC32F334) + #define PLL_SRC ((CM_CMU->PLLHCFGR & CMU_PLLHCFGR_PLLSRC) >> CMU_PLLHCFGR_PLLSRC_POS) + #define BSP_KEY_PORT (GPIO_PORT_B) /* Key5 */ + #define BSP_KEY_PIN (GPIO_PIN_09) + #define BSP_KEY_EXTINT (EXTINT_CH09) + #define BSP_KEY_INT_SRC (INT_SRC_PORT_EIRQ9) + #define BSP_KEY_IRQn (INT001_IRQn) + #define BSP_KEY_INTC_STOP_WKUP_EXTINT (INTC_STOP_WKUP_EXTINT_CH9) + #define BSP_KEY_EVT (EVT_SRC_PORT_EIRQ9) + #define BSP_KEY_PWC_PD_WKUP_TRIG_WKUP (PWC_PD_WKUP_TRIG_WKUP2) + #define BSP_KEY_PWC_PD_WKUP_WKUP (PWC_PD_WKUP_WKUP21) + + #define LED_GREEN_PORT (GPIO_PORT_C) + #define LED_GREEN_PIN (GPIO_PIN_13) #endif #define KEYCNT_BACKUP_ADDR (uint32_t *)(0x200F0010) @@ -421,7 +435,7 @@ static void _vbat_init(void) rt_thread_delay(10); } FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMB, ENABLE); -#elif defined (HC32F448) +#elif defined (HC32F448) || defined (HC32F334) FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMB, ENABLE); #elif defined (HC32F460) FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_SRAMRET, ENABLE); diff --git a/bsp/hc32/tests/test_pulse_encoder.c b/bsp/hc32/tests/test_pulse_encoder.c index 000699e85e2..641e45d00f0 100644 --- a/bsp/hc32/tests/test_pulse_encoder.c +++ b/bsp/hc32/tests/test_pulse_encoder.c @@ -30,7 +30,7 @@ #ifdef BSP_USING_PULSE_ENCODER -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined (HC32F4A8) #define TEST_IO_A_PIN GET_PIN(A, 5) #define TEST_IO_B_PIN GET_PIN(A, 6) #else @@ -42,7 +42,7 @@ static rt_device_t pulse_encoder_dev = RT_NULL; static void printf_connect(void) { -#if defined (HC32F4A0) +#if defined (HC32F4A0) || defined (HC32F4A8) #if defined(BSP_USING_PULSE_ENCODER_TMRA_1) rt_kprintf(" [tmra]*connect PA5-->PA8 PA6-->PA9\n"); #endif @@ -74,6 +74,14 @@ static void printf_connect(void) rt_kprintf(" [tmr6]*connect PB0-->PA3 PB1-->PA7\n"); #endif #endif +#if defined (HC32F334) +#if defined(BSP_USING_PULSE_ENCODER_TMRA_1) + rt_kprintf(" [tmra]*connect PB0-->PA0 PB1-->PA1\n"); +#endif +#if defined(BSP_USING_PULSE_ENCODER_TMR6_1) + rt_kprintf(" [tmr6]*connect PB0-->PA7 PB1-->PA3\n"); +#endif +#endif } static void _pulse_cmd_print_usage(void) diff --git a/bsp/hc32/tests/test_spi.c b/bsp/hc32/tests/test_spi.c index eebc16b94d0..171c70da8d4 100644 --- a/bsp/hc32/tests/test_spi.c +++ b/bsp/hc32/tests/test_spi.c @@ -37,7 +37,11 @@ #define W25Q_MAX_ADDR (0x800000UL) #define W25Q_SPI_WR_RD_ADDR 0x4000 -#define W25Q_SPI_DATA_BUF_LEN 0x2000 +#if defined (HC32F460) || defined (HC32F4A0) || defined (HC32F472) || defined (HC32F448) || defined (HC32F4A8) + #define W25Q_SPI_DATA_BUF_LEN 0x2000 +#elif defined (HC32F334) + #define W25Q_SPI_DATA_BUF_LEN 0x1000 +#endif #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F4A8) @@ -61,6 +65,13 @@ #define W25Q_SPI_BUS_NAME "spi3" #define W25Q_SPI_DEVICE_NAME "spi30" +#elif defined(HC32F334) + #define SPI_CS_PORT SPI1_CS_PORT + #define SPI_CS_PIN SPI1_CS_PIN + #define SPI_CS_PORT_PIN GET_PIN(C, 1) + + #define W25Q_SPI_BUS_NAME "spi1" + #define W25Q_SPI_DEVICE_NAME "spi10" #endif diff --git a/bsp/hc32/tests/test_tmr_capture.c b/bsp/hc32/tests/test_tmr_capture.c index 96929389683..2a94e5aee78 100644 --- a/bsp/hc32/tests/test_tmr_capture.c +++ b/bsp/hc32/tests/test_tmr_capture.c @@ -10,14 +10,13 @@ /* * 功能 -* 展示捕获单元 ic1、ic2、ic3 的捕获输入功能 +* 展示捕获单元 icx (x=1~IC_DEV_CNT) 的捕获输入功能 * 当捕获单元捕获到设定数量(watermark)的数据(电平宽度-单位为us)后,终端将输出这些已捕获的数据 * * 默认配置 * input pin: -* ic1: INPUT_CAPTURE_TMR6_1_PORT, INPUT_CAPTURE_TMR6_1_PIN -* ic2: INPUT_CAPTURE_TMR6_2_PORT, INPUT_CAPTURE_TMR6_2_PIN -* ic3: INPUT_CAPTURE_TMR6_3_PORT, INPUT_CAPTURE_TMR6_3_PIN +* icx: INPUT_CAPTURE_TMR6_x_PORT, INPUT_CAPTURE_TMR6_x_PIN (x=1~IC_DEV_CNT) + 注:该引脚配置位于 board_config.h,若测试单元的input pin未配置,需测试人员自行添加 * watermark: * 默认值为 5 * @@ -63,8 +62,13 @@ #define IC_DEV_CNT (8) #elif defined (HC32F460) #define IC_DEV_CNT (3) +#elif defined (HC32F334) + #define IC_DEV_CNT (4) +#elif defined (HC32F448) + #define IC_DEV_CNT (2) +#elif defined (HC32F472) + #define IC_DEV_CNT (10) #endif -#define IC_NAME_LEN (3) #define DEFAULT_WATER_MARK (5) #ifdef BSP_USING_INPUT_CAPTURE @@ -107,20 +111,22 @@ static void ic_rx_thread(void *parameter) { rt_size_t size; rt_device_t ic_dev; - rt_uint32_t id = *(uint32_t *)parameter; - test_ic_t *p_test_ic = &g_arr_test_ic[id]; + test_ic_t *p_test_ic = parameter; ic_dev = p_test_ic->ic_dev; struct rt_inputcapture_data *pData = RT_NULL; struct rt_inputcapture_data *pItem = RT_NULL; int i = 0; + char *p_thrd_name = rt_thread_self()->parent.name; + while (1) { rt_sem_take((p_test_ic->rx_sem), RT_WAITING_FOREVER); - pData = (struct rt_inputcapture_data *)rt_malloc(sizeof(struct rt_inputcapture_data) * p_test_ic->ic_data_size); + size = p_test_ic->ic_data_size; + pData = (struct rt_inputcapture_data *)rt_malloc(sizeof(struct rt_inputcapture_data) * size); if (pData) { rt_mutex_take(p_test_ic->mutex, RT_WAITING_FOREVER); - size = rt_device_read(ic_dev, 0, pData, p_test_ic->ic_data_size); + size = rt_device_read(ic_dev, 0, pData, size); rt_mutex_release(p_test_ic->mutex); if (size == 0) { @@ -128,7 +134,7 @@ static void ic_rx_thread(void *parameter) pData = RT_NULL; continue; } - rt_kprintf("ic%d captured %d data:\n", id + 1, size); + rt_kprintf("%s captured %d data:\n", p_thrd_name, size); for (i = 0; i < size; i++) { pItem = pData + i; @@ -147,9 +153,13 @@ static rt_int32_t _ic_test_open(rt_int32_t id) uint32_t def_wm = DEFAULT_WATER_MARK; rt_device_t ic_dev; - - char ic_name[IC_NAME_LEN] = "ic"; - ic_name[IC_NAME_LEN - 1] = 0x30 + id + 1; + char ic_name[RT_NAME_MAX] = "ic"; + uint32_t name_idx = 2; + if (id >= 9 && id < 100) + { + ic_name[name_idx++] = 0x30 + (id + 1) / 10; + } + ic_name[name_idx++] = 0x30 + (id + 1) % 10; ic_dev = rt_device_find(ic_name); RT_ASSERT(ic_dev != RT_NULL); @@ -161,14 +171,14 @@ static rt_int32_t _ic_test_open(rt_int32_t id) RT_ASSERT(ret == RT_EOK); rt_device_set_rx_indicate(ic_dev, ic_rx_all); - g_arr_test_ic[id].thread = rt_thread_create(ic_name, ic_rx_thread, &id, 2048, 5, 10); + g_arr_test_ic[id].thread = rt_thread_create(ic_name, ic_rx_thread, &g_arr_test_ic[id], 2048, 5, 10); RT_ASSERT(g_arr_test_ic[id].thread != RT_NULL); rt_thread_startup(g_arr_test_ic[id].thread); - ret = rt_device_open(ic_dev, 0); - RT_ASSERT(ret == RT_EOK); ret = rt_device_control(ic_dev, INPUTCAPTURE_CMD_SET_WATERMARK, &def_wm); RT_ASSERT(ret == RT_EOK); + ret = rt_device_open(ic_dev, 0); + RT_ASSERT(ret == RT_EOK); return RT_EOK; } diff --git a/bsp/hc32/tests/test_uart_v2.c b/bsp/hc32/tests/test_uart_v2.c index 1aafab95297..11ab6c466de 100644 --- a/bsp/hc32/tests/test_uart_v2.c +++ b/bsp/hc32/tests/test_uart_v2.c @@ -20,8 +20,8 @@ * 输出输入的字符 * * 命令调用格式: - * uart1 中断,命令调用格式:uart_sample_v1 uart1 int - * uart1 DMA,命令调用格式:uart_sample_v1 uart1 dma + * uart1 中断,命令调用格式:uart_sample_v2 uart1 int + * uart1 DMA,命令调用格式:uart_sample_v2 uart1 dma * * 中断方式,rtconfig.h修改如下 * #define BSP_USING_GPIO diff --git a/bsp/hc32/tests/test_usbd.c b/bsp/hc32/tests/test_usbd.c index 11cb23851fd..5a4a19027bd 100644 --- a/bsp/hc32/tests/test_usbd.c +++ b/bsp/hc32/tests/test_usbd.c @@ -49,7 +49,7 @@ static int cdc_sample(void) rt_err_t ret = RT_EOK; rt_device_t cdc_dev = RT_NULL; /* usb device设备句柄 */ rt_uint8_t str_write[] = "This is a usb cdc device test!\r\n"; - + rt_size_t str_len = rt_strlen((const char *)str_write); /* 查找USB虚拟串口设备 */ cdc_dev = rt_device_find(USBD_DEV_NAME); @@ -71,7 +71,7 @@ static int cdc_sample(void) for (i = 1; i < 4; i++) { rt_kprintf("Start to send test message 3 timers :%d.\n", i); - if (rt_device_write(cdc_dev, 0, str_write, sizeof(str_write)) != sizeof(str_write)) + if (rt_device_write(cdc_dev, 0, str_write, str_len) != str_len) { rt_kprintf("send test message failed\n"); return -RT_ERROR; @@ -91,7 +91,7 @@ MSH_CMD_EXPORT(cdc_sample, usbd cdc sample); #if defined(RT_USB_DEVICE_MSTORAGE) /* F4A0 only FS can used with spi flash */ -#if (defined(HC32F4A0) && defined(BSP_USING_USBFS)) || \ +#if ((defined(HC32F4A0) || defined(HC32F4A8)) && defined(BSP_USING_USBFS)) || \ defined(HC32F460) || defined(HC32F472) /* Enable spibus1, SFUD, usb msc */ @@ -117,7 +117,7 @@ MSH_CMD_EXPORT(cdc_sample, usbd cdc sample); #include "dev_spi_flash_sfud.h" #define SPI_FLASH_CHIP RT_USB_MSTORAGE_DISK_NAME /* msc class disk name */ -#if defined(HC32F4A0) +#if defined(HC32F4A0) || defined(HC32F4A8) #define SPI_FLASH_SS_PORT GPIO_PORT_C #define SPI_FLASH_SS_PIN GPIO_PIN_07 #define SPI_BUS_NAME "spi1" @@ -157,7 +157,7 @@ static void rt_hw_spi_flash_reset(char *spi_dev_name) static int rt_hw_spi_flash_with_sfud_init(void) { -#if defined(HC32F4A0) || defined(HC32F460) +#if defined(HC32F4A0) || defined(HC32F460) || defined(HC32F4A8) rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, GET_PIN(C, 7)); #elif defined(HC32F472) rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_FLASH_DEVICE_NAME, GET_PIN(B, 12)); @@ -201,7 +201,7 @@ INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init); */ #define USBD_DEV_NAME "hidd" /* 名称 */ -#if defined(HC32F4A0) +#if defined(HC32F4A0) || defined(HC32F4A8) #define KEY_PIN_NUM GET_PIN(A,0) /* PA0 */ #elif defined(HC32F460) #define KEY_PIN_NUM GET_PIN(B,1) /* PB1 */ @@ -270,11 +270,11 @@ MSH_CMD_EXPORT(hid_sample, usbd hid sample); * 命令调用格式:winusb_sample * 软件:llcom.exe * 程序功能:MSH命令发送winusb_sample,运行测试程序。 - * 打开llcom.exe软件,选择小工具-WinUSB设备-选择对应RTT Win USB设备-打开-勾选Hex发送-发送数据。 + * 打开llcom.exe软件,选择小工具-WinUSB设备-选择对应RTT Win USB设备-打开-勾选Hex发送-发送数据(注意:每次发送数据长度为4的整数倍)。 * 通过llcom.exe可发送bulk数据(100字符以内)到设备,设备收到后会回发给主机(llcom.exe),同时通过MSH终端显示收到的HEX数据。 * 注意:1、llcom.exe中的GUID与驱动程序中设定保持一致(通过设备管理器选择RTT Win USB设备的属性来查看); - * 2、win_usb_read()函数中的UIO_REQUEST_READ_FULL改为UIO_REQUEST_READ_BEST,实现数据即读即取; - * 否则需要接满传入的size数量,才会回调接收函数。 + * 2、win_usb_read()函数中的UIO_REQUEST_READ_FULL改为UIO_REQUEST_READ_BEST,实现数据即读即取; + * 否则需要接满传入的size数量,才会回调接收函数。 * */ #define WINUSB_DEV_NAME "winusb" /* 名称 */ diff --git a/bsp/hc32/tests/test_usbh.c b/bsp/hc32/tests/test_usbh.c index c4877b59761..e5cddafc61d 100644 --- a/bsp/hc32/tests/test_usbh.c +++ b/bsp/hc32/tests/test_usbh.c @@ -22,9 +22,10 @@ (/) Udisk mount dir 2. RT-Thread Components ---> DFS: device virtual files system ---> ...... - [*] Enable elm0chan fatfs + [*] Enable elm-chan fatfs ...... 3.如果命令执行不成功,需参考对应Board目录下的README.md文件(注意事项中的USB Host部分) + 4.命令成功创建文件后,可以通过ls命令查看、通过cat命令查看文件内容、通过rm命令删除文件等操作 */ /* diff --git a/bsp/hc32/tests/test_wdt.c b/bsp/hc32/tests/test_wdt.c index 5827be269b7..c3c17151427 100644 --- a/bsp/hc32/tests/test_wdt.c +++ b/bsp/hc32/tests/test_wdt.c @@ -50,7 +50,7 @@ static void _wdt_cmd_print_usage(void) static int wdt_sample(int argc, char *argv[]) { - rt_err_t ret = RT_EOK; + int ret = RT_EOK; rt_uint32_t timeleft; rt_uint32_t timeout = atoi(argv[2]); @@ -114,7 +114,7 @@ static int wdt_sample(int argc, char *argv[]) else { _wdt_cmd_print_usage(); - return -RT_ERROR; + ret = -RT_ERROR; } return ret; diff --git a/bsp/hc32/tools/sdk_dist.py b/bsp/hc32/tools/sdk_dist.py index 4bbeb459505..300e66ab528 100644 --- a/bsp/hc32/tools/sdk_dist.py +++ b/bsp/hc32/tools/sdk_dist.py @@ -13,8 +13,9 @@ def dist_do_building(BSP_ROOT, dist_dir): print("=> copy hc32 bsp library") library_dir = os.path.join(dist_dir, 'libraries') library_path = os.path.join(os.path.dirname(BSP_ROOT), 'libraries') - bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), - os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) + if rtconfig.BSP_LIBRARY_TYPE is not None: + bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), + os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) print("=> copy bsp drivers") bsp_copy_files(os.path.join(library_path, 'hc32_drivers'), os.path.join(library_dir, 'hc32_drivers'))