From 6cb6382aebf2a865d469eddfccfb068904475088 Mon Sep 17 00:00:00 2001 From: imi415 Date: Mon, 2 May 2022 22:13:35 +0800 Subject: [PATCH] Fixed PFIC handling. --- BSP/Startup/startup_ch32v30x_D8C.S | 242 +++++++++++++---------------- src/freertos_helper.c | 6 +- src/main.c | 4 +- 3 files changed, 111 insertions(+), 141 deletions(-) diff --git a/BSP/Startup/startup_ch32v30x_D8C.S b/BSP/Startup/startup_ch32v30x_D8C.S index daa53cc..bf5708e 100644 --- a/BSP/Startup/startup_ch32v30x_D8C.S +++ b/BSP/Startup/startup_ch32v30x_D8C.S @@ -18,110 +18,110 @@ _start: .option push .option norvc _vectors: - j Exception_Handler /* 0: Exception */ - j Default_Handler /* 1: Reserved */ - j NMI_Handler /* 2: NMI */ - j Default_Handler /* 3: Reserved */ - j Default_Handler /* 4: Reserved */ - j Ecall_M_Handler /* 5: M mode Ecall */ - j Default_Handler /* 6: Reserved */ - j Default_Handler /* 7: Reserved */ - j Ecall_U_Handler /* 8: U mode Ecall */ - j Default_Handler /* 9: Reserved */ - j Default_Handler /* 10: Reserved */ - j Default_Handler /* 11: Reserved */ - j SysTick_Handler /* 12: SysTick */ - j Default_Handler /* 13: Reserved */ - j SW_Handler /* 14: Software */ - j Default_Handler /* 15: Reserved */ - j WWDG_IRQHandler /* 16: Window Watchdog */ - j PVD_IRQHandler /* 17: PVD through EXTI Line detect */ - j TAMPER_IRQHandler /* 18: TAMPER */ - j RTC_IRQHandler /* 19: RTC */ - j FLASH_IRQHandler /* 20: Flash */ - j RCC_IRQHandler /* 21: RCC */ - j EXTI0_IRQHandler /* 22: EXTI Line 0 */ - j EXTI1_IRQHandler /* 23: EXTI Line 1 */ - j EXTI2_IRQHandler /* 24: EXTI Line 2 */ - j EXTI3_IRQHandler /* 25: EXTI Line 3 */ - j EXTI4_IRQHandler /* 26: EXTI Line 4 */ - j DMA1_Channel1_IRQHandler /* 27: DMA1 Channel 1 */ - j DMA1_Channel2_IRQHandler /* 28: DMA1 Channel 2 */ - j DMA1_Channel3_IRQHandler /* 29: DMA1 Channel 3 */ - j DMA1_Channel4_IRQHandler /* 30: DMA1 Channel 4 */ - j DMA1_Channel5_IRQHandler /* 31: DMA1 Channel 5 */ - j DMA1_Channel6_IRQHandler /* 32: DMA1 Channel 6 */ - j DMA1_Channel7_IRQHandler /* 33: DMA1 Channel 7 */ - j ADC1_2_IRQHandler /* 34: ADC1_2 */ - j USB_HP_CAN1_TX_IRQHandler /* 35: USB HP and CAN1 TX */ - j USB_LP_CAN1_RX0_IRQHandler /* 36: USB LP and CAN1RX0 */ - j CAN1_RX1_IRQHandler /* 37: CAN1 RX1 */ - j CAN1_SCE_IRQHandler /* 38: CAN1 SCE */ - j EXTI9_5_IRQHandler /* 39: EXTI Line 9..5 */ - j TIM1_BRK_IRQHandler /* 40: TIM1 Break */ - j TIM1_UP_IRQHandler /* 41: TIM1 Update */ - j TIM1_TRG_COM_IRQHandler /* 42: TIM1 Trigger and Commutation */ - j TIM1_CC_IRQHandler /* 43: TIM1 Capture Compare */ - j TIM2_IRQHandler /* 44: TIM2 */ - j TIM3_IRQHandler /* 45: TIM3 */ - j TIM4_IRQHandler /* 46: TIM4 */ - j I2C1_EV_IRQHandler /* 47: I2C1 Event */ - j I2C1_ER_IRQHandler /* 48: I2C1 Error */ - j I2C2_EV_IRQHandler /* 49: I2C2 Event */ - j I2C2_ER_IRQHandler /* 50: I2C2 Error */ - j SPI1_IRQHandler /* 51: SPI1 */ - j SPI2_IRQHandler /* 52: SPI2 */ - j USART1_IRQHandler /* 53: USART1 */ - j USART2_IRQHandler /* 54: USART2 */ - j USART3_IRQHandler /* 55: USART3 */ - j EXTI15_10_IRQHandler /* 56: EXTI Line 15..10 */ - j RTCAlarm_IRQHandler /* 57: RTC Alarm through EXTI Line */ - j USBWakeUp_IRQHandler /* 58: USB Wakeup from suspend */ - j TIM8_BRK_IRQHandler /* 59: TIM8 Break */ - j TIM8_UP_IRQHandler /* 60: TIM8 Update */ - j TIM8_TRG_COM_IRQHandler /* 61: TIM8 Trigger and Commutation */ - j TIM8_CC_IRQHandler /* 62: TIM8 Capture Compare */ - j RNG_IRQHandler /* 63: RNG */ - j FSMC_IRQHandler /* 64: FSMC */ - j SDIO_IRQHandler /* 65: SDIO */ - j TIM5_IRQHandler /* 66: TIM5 */ - j SPI3_IRQHandler /* 67: SPI3 */ - j UART4_IRQHandler /* 68: UART4 */ - j UART5_IRQHandler /* 69: UART5 */ - j TIM6_IRQHandler /* 70: TIM6 */ - j TIM7_IRQHandler /* 71: TIM7 */ - j DMA2_Channel1_IRQHandler /* 72: DMA2 Channel 1 */ - j DMA2_Channel2_IRQHandler /* 73: DMA2 Channel 2 */ - j DMA2_Channel3_IRQHandler /* 74: DMA2 Channel 3 */ - j DMA2_Channel4_IRQHandler /* 75: DMA2 Channel 4 */ - j DMA2_Channel5_IRQHandler /* 76: DMA2 Channel 5 */ - j ETH_IRQHandler /* 77: ETH */ - j ETH_WKUP_IRQHandler /* 78: ETH WakeUp */ - j CAN2_TX_IRQHandler /* 79: CAN2 TX */ - j CAN2_RX0_IRQHandler /* 80: CAN2 RX0 */ - j CAN2_RX1_IRQHandler /* 81: CAN2 RX1 */ - j CAN2_SCE_IRQHandler /* 82: CAN2 SCE */ - j OTG_FS_IRQHandler /* 83: OTGFS */ - j USBHSWakeup_IRQHandler /* 84: USBHS Wakeup */ - j USBHS_IRQHandler /* 85: USBHS */ - j DVP_IRQHandler /* 86: DVP */ - j UART6_IRQHandler /* 87: UART6 */ - j UART7_IRQHandler /* 88: UART7 */ - j UART8_IRQHandler /* 89: UART8 */ - j TIM9_BRK_IRQHandler /* 90: TIM9 Break */ - j TIM9_UP_IRQHandler /* 91: TIM9 Update */ - j TIM9_TRG_COM_IRQHandler /* 92: TIM9 Trigger and Commutation */ - j TIM9_CC_IRQHandler /* 93: TIM9 Capture Compare */ - j TIM10_BRK_IRQHandler /* 94: TIM10 Break */ - j TIM10_UP_IRQHandler /* 95: TIM10 Update */ - j TIM10_TRG_COM_IRQHandler /* 96: TIM10 Trigger and Commutation */ - j TIM10_CC_IRQHandler /* 97: TIM10 Capture Compare */ - j DMA2_Channel6_IRQHandler /* 98: DMA2 Channel 6 */ - j DMA2_Channel7_IRQHandler /* 99: DMA2 Channel 7 */ - j DMA2_Channel8_IRQHandler /* 100: DMA2 Channel 8 */ - j DMA2_Channel9_IRQHandler /* 101: DMA2 Channel 9 */ - j DMA2_Channel10_IRQHandler /* 102: DMA2 Channel 10 */ - j DMA2_Channel11_IRQHandler /* 103: DMA2 Channel 11 */ + .word Fault_Handler /* 0: Exception */ + .word Default_Handler /* 1: Reserved */ + .word NMI_Handler /* 2: NMI */ + .word Default_Handler /* 3: Reserved */ + .word Default_Handler /* 4: Reserved */ + .word Ecall_M_Handler /* 5: M mode Ecall */ + .word Default_Handler /* 6: Reserved */ + .word Default_Handler /* 7: Reserved */ + .word Ecall_U_Handler /* 8: U mode Ecall */ + .word Default_Handler /* 9: Reserved */ + .word Default_Handler /* 10: Reserved */ + .word Default_Handler /* 11: Reserved */ + .word SysTick_Handler /* 12: SysTick */ + .word Default_Handler /* 13: Reserved */ + .word SW_Handler /* 14: Software */ + .word Default_Handler /* 15: Reserved */ + .word WWDG_IRQHandler /* 16: Window Watchdog */ + .word PVD_IRQHandler /* 17: PVD through EXTI Line detect */ + .word TAMPER_IRQHandler /* 18: TAMPER */ + .word RTC_IRQHandler /* 19: RTC */ + .word FLASH_IRQHandler /* 20: Flash */ + .word RCC_IRQHandler /* 21: RCC */ + .word EXTI0_IRQHandler /* 22: EXTI Line 0 */ + .word EXTI1_IRQHandler /* 23: EXTI Line 1 */ + .word EXTI2_IRQHandler /* 24: EXTI Line 2 */ + .word EXTI3_IRQHandler /* 25: EXTI Line 3 */ + .word EXTI4_IRQHandler /* 26: EXTI Line 4 */ + .word DMA1_Channel1_IRQHandler /* 27: DMA1 Channel 1 */ + .word DMA1_Channel2_IRQHandler /* 28: DMA1 Channel 2 */ + .word DMA1_Channel3_IRQHandler /* 29: DMA1 Channel 3 */ + .word DMA1_Channel4_IRQHandler /* 30: DMA1 Channel 4 */ + .word DMA1_Channel5_IRQHandler /* 31: DMA1 Channel 5 */ + .word DMA1_Channel6_IRQHandler /* 32: DMA1 Channel 6 */ + .word DMA1_Channel7_IRQHandler /* 33: DMA1 Channel 7 */ + .word ADC1_2_IRQHandler /* 34: ADC1_2 */ + .word USB_HP_CAN1_TX_IRQHandler /* 35: USB HP and CAN1 TX */ + .word USB_LP_CAN1_RX0_IRQHandler /* 36: USB LP and CAN1RX0 */ + .word CAN1_RX1_IRQHandler /* 37: CAN1 RX1 */ + .word CAN1_SCE_IRQHandler /* 38: CAN1 SCE */ + .word EXTI9_5_IRQHandler /* 39: EXTI Line 9..5 */ + .word TIM1_BRK_IRQHandler /* 40: TIM1 Break */ + .word TIM1_UP_IRQHandler /* 41: TIM1 Update */ + .word TIM1_TRG_COM_IRQHandler /* 42: TIM1 Trigger and Commutation */ + .word TIM1_CC_IRQHandler /* 43: TIM1 Capture Compare */ + .word TIM2_IRQHandler /* 44: TIM2 */ + .word TIM3_IRQHandler /* 45: TIM3 */ + .word TIM4_IRQHandler /* 46: TIM4 */ + .word I2C1_EV_IRQHandler /* 47: I2C1 Event */ + .word I2C1_ER_IRQHandler /* 48: I2C1 Error */ + .word I2C2_EV_IRQHandler /* 49: I2C2 Event */ + .word I2C2_ER_IRQHandler /* 50: I2C2 Error */ + .word SPI1_IRQHandler /* 51: SPI1 */ + .word SPI2_IRQHandler /* 52: SPI2 */ + .word USART1_IRQHandler /* 53: USART1 */ + .word USART2_IRQHandler /* 54: USART2 */ + .word USART3_IRQHandler /* 55: USART3 */ + .word EXTI15_10_IRQHandler /* 56: EXTI Line 15..10 */ + .word RTCAlarm_IRQHandler /* 57: RTC Alarm through EXTI Line */ + .word USBWakeUp_IRQHandler /* 58: USB Wakeup from suspend */ + .word TIM8_BRK_IRQHandler /* 59: TIM8 Break */ + .word TIM8_UP_IRQHandler /* 60: TIM8 Update */ + .word TIM8_TRG_COM_IRQHandler /* 61: TIM8 Trigger and Commutation */ + .word TIM8_CC_IRQHandler /* 62: TIM8 Capture Compare */ + .word RNG_IRQHandler /* 63: RNG */ + .word FSMC_IRQHandler /* 64: FSMC */ + .word SDIO_IRQHandler /* 65: SDIO */ + .word TIM5_IRQHandler /* 66: TIM5 */ + .word SPI3_IRQHandler /* 67: SPI3 */ + .word UART4_IRQHandler /* 68: UART4 */ + .word UART5_IRQHandler /* 69: UART5 */ + .word TIM6_IRQHandler /* 70: TIM6 */ + .word TIM7_IRQHandler /* 71: TIM7 */ + .word DMA2_Channel1_IRQHandler /* 72: DMA2 Channel 1 */ + .word DMA2_Channel2_IRQHandler /* 73: DMA2 Channel 2 */ + .word DMA2_Channel3_IRQHandler /* 74: DMA2 Channel 3 */ + .word DMA2_Channel4_IRQHandler /* 75: DMA2 Channel 4 */ + .word DMA2_Channel5_IRQHandler /* 76: DMA2 Channel 5 */ + .word ETH_IRQHandler /* 77: ETH */ + .word ETH_WKUP_IRQHandler /* 78: ETH WakeUp */ + .word CAN2_TX_IRQHandler /* 79: CAN2 TX */ + .word CAN2_RX0_IRQHandler /* 80: CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* 81: CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* 82: CAN2 SCE */ + .word OTG_FS_IRQHandler /* 83: OTGFS */ + .word USBHSWakeup_IRQHandler /* 84: USBHS Wakeup */ + .word USBHS_IRQHandler /* 85: USBHS */ + .word DVP_IRQHandler /* 86: DVP */ + .word UART6_IRQHandler /* 87: UART6 */ + .word UART7_IRQHandler /* 88: UART7 */ + .word UART8_IRQHandler /* 89: UART8 */ + .word TIM9_BRK_IRQHandler /* 90: TIM9 Break */ + .word TIM9_UP_IRQHandler /* 91: TIM9 Update */ + .word TIM9_TRG_COM_IRQHandler /* 92: TIM9 Trigger and Commutation */ + .word TIM9_CC_IRQHandler /* 93: TIM9 Capture Compare */ + .word TIM10_BRK_IRQHandler /* 94: TIM10 Break */ + .word TIM10_UP_IRQHandler /* 95: TIM10 Update */ + .word TIM10_TRG_COM_IRQHandler /* 96: TIM10 Trigger and Commutation */ + .word TIM10_CC_IRQHandler /* 97: TIM10 Capture Compare */ + .word DMA2_Channel6_IRQHandler /* 98: DMA2 Channel 6 */ + .word DMA2_Channel7_IRQHandler /* 99: DMA2 Channel 7 */ + .word DMA2_Channel8_IRQHandler /* 100: DMA2 Channel 8 */ + .word DMA2_Channel9_IRQHandler /* 101: DMA2 Channel 9 */ + .word DMA2_Channel10_IRQHandler /* 102: DMA2 Channel 10 */ + .word DMA2_Channel11_IRQHandler /* 103: DMA2 Channel 11 */ .option pop .section .text,"ax",@progbits @@ -174,41 +174,11 @@ setup_interrupts: csrs mstatus, t0 la t0, _vectors - ori t0, t0, 1 /* Non-vectored exception handling */ - csrw mtvec, t0 /* Use standard RISC-V exception model. */ + ori t0, t0, 3 /* PFIC exception handling */ + csrw mtvec, t0 jal SystemInit jal main dead_loop: j dead_loop - -Exception_Handler: - addi sp, sp, -8 - sw t0, 4(sp) - sw t1, 8(sp) - - csrr t0, mcause - li t1, 11 /* Find an M mode ecall (11) */ - beq t1, t0, ecall_m_handler - li t1, 8 - beq t1, t0, ecall_u_handler - j fault_handler - -ecall_m_handler: - lw t0, 4(sp) - lw t1, 8(sp) - addi sp, sp, 8 - j Ecall_M_Handler - -ecall_u_handler: - lw t0, 4(sp) - lw t1, 8(sp) - addi sp, sp, 8 - j Ecall_U_Handler - -fault_handler: - lw t0, 4(sp) - lw t1, 8(sp) - addi sp, sp, 8 - j Fault_Handler diff --git a/src/freertos_helper.c b/src/freertos_helper.c index 66290ab..4aca7db 100644 --- a/src/freertos_helper.c +++ b/src/freertos_helper.c @@ -4,8 +4,6 @@ #include "ch32v30x.h" #include "system_ch32v30x.h" -extern void freertos_risc_v_mtimer_interrupt_handler(void); - /** * @brief Initialize SysTick interrupt. * @@ -18,8 +16,8 @@ void vPortSetupTimerInterrupt(void) { NVIC_EnableIRQ(SysTicK_IRQn); - SysTick->CMP = (uint64_t)((SystemCoreClock / configTICK_RATE_HZ) - 1); - SysTick->CTLR = 0x1E; /* COUNTDOWN | AUTO RELOAD | HCLK | INT */ + SysTick->CMP = (uint64_t)((SystemCoreClock / (configTICK_RATE_HZ * 8)) - 1); + SysTick->CTLR = 0x1A; /* COUNTDOWN | AUTO RELOAD | HCLK/8 | INT */ SysTick->CTLR |= 0x20; /* INIT */ SysTick->CTLR |= 0x01; /* EN */ diff --git a/src/main.c b/src/main.c index 6eb9836..71ce83d 100644 --- a/src/main.c +++ b/src/main.c @@ -9,6 +9,8 @@ #include "FreeRTOS.h" #include "task.h" +const char *compile_dt = __DATE__ " " __TIME__; + void vTaskHello(void *pvParameters); int main(void) { @@ -20,7 +22,7 @@ int main(void) { /* Initialize UART for libc function calls. */ USART_Printf_Init(115200); - printf("Hello world, FreeRTOS?\r\n"); + printf("FreeRTOS demo compiled AT %s\r\n", compile_dt); xTaskCreate(vTaskHello, "HELLO", 256, NULL, 4, NULL);