From 8dcf01180cee0453a9be83d92e3a4ad1914172e8 Mon Sep 17 00:00:00 2001 From: oxlm <343550004@qq.com> Date: Sat, 16 May 2026 11:26:21 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=A1=AC=E4=BB=B6?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libraries/HAL_Drivers/drivers/SConscript | 3 + .../libraries/HAL_Drivers/drivers/drv_timer.c | 230 ++++++++++++++++++ .../ns800/ns800rt7p65-nssinepad/board/Kconfig | 19 ++ components/drivers/clock_time/SConscript | 8 +- 4 files changed, 253 insertions(+), 7 deletions(-) create mode 100644 bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/SConscript b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/SConscript index 6f2f6c5427a..994c5dcf632 100644 --- a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/SConscript +++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/SConscript @@ -19,6 +19,9 @@ if GetDepend('BSP_USING_CAN'): if GetDepend('BSP_USING_ECAP'): src += ['drv_ecap.c'] +if GetDepend('BSP_USING_TIM'): + src += ['drv_timer.c'] + group = DefineGroup('HAL_Drivers', src, depend = [''], CPPPATH = path) Return('group') diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c new file mode 100644 index 00000000000..abc64604eb4 --- /dev/null +++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2006-2025, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * Author: oxlm + */ + +#include +#include +#include +#include "drv_config.h" + +#ifdef BSP_USING_TIM + +struct ns800_clock_timer +{ + rt_clock_timer_t timer; + void *instance; + IRQn_Type irqno; + void (*irq_handler)(void); + char *name; + rt_clock_timer_mode_t mode; +}; + + +enum +{ +#ifdef BSP_USING_TIM1 + TIM1_INDEX, +#endif +#ifdef BSP_USING_TIM2 + TIM2_INDEX, +#endif +}; + + +#ifdef BSP_USING_TIM1 +void TIM1_IRQHandler(void); +#endif +#ifdef BSP_USING_TIM2 +void TIM2_IRQHandler(void); +#endif + +static struct ns800_clock_timer ns800_timers[] = +{ +#ifdef BSP_USING_TIM1 + {.instance = TIM1, .irqno = TIM1_IRQn, .irq_handler = TIM1_IRQHandler, .name = "timer1"}, +#endif +#ifdef BSP_USING_TIM2 + {.instance = TIM2, .irqno = TIM2_IRQn, .irq_handler = TIM2_IRQHandler, .name = "timer2"}, +#endif +}; + +#define NS800_TIMER_NUM (sizeof(ns800_timers) / sizeof(ns800_timers[0])) + +static void ns800_clock_timer_isr(void *param) +{ + rt_interrupt_enter(); + + struct ns800_clock_timer *tim = (struct ns800_clock_timer *)param; + + TIM_TypeDef *htim = (TIM_TypeDef *)tim->instance; + if (TIM_getFlags(htim, TIM_FLAG_UPDATE)) + { + TIM_clearFlags(htim, TIM_FLAG_UPDATE); + rt_clock_timer_isr(&tim->timer); + + if (tim->mode == CLOCK_TIMER_MODE_ONESHOT) + TIM_disableCounter(htim); + } + + rt_interrupt_leave(); + __DSB(); +} + + +#ifdef BSP_USING_TIM1 +void TIM1_IRQHandler(void) { ns800_clock_timer_isr(&ns800_timers[TIM1_INDEX]); } +#endif +#ifdef BSP_USING_TIM2 +void TIM2_IRQHandler(void) { ns800_clock_timer_isr(&ns800_timers[TIM2_INDEX]); } +#endif + +static void ns800_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) +{ + struct ns800_clock_timer *tim = (struct ns800_clock_timer *)timer->parent.user_data; + + __IO uint32_t cfg = + TIM_PWMMODE_ONEPOINT | + TIM_CLOCKDIVISION_DIV1 | + TIM_AUTORELOADPRELOAD_ENABLE | + TIM_COUNTERMODE_UP | + TIM_ONEPULSEMODE_REPETITIVE; + + TIM_configTimeBase((TIM_TypeDef *)tim->instance, 200-1, 100-1, cfg); + TIM_clearFlags((TIM_TypeDef *)tim->instance, TIM_FLAG_UPDATE); + TIM_enableInterruptSource((TIM_TypeDef *)tim->instance, TIM_IT_UPDATE); +} + +static rt_err_t ns800_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) +{ + struct ns800_clock_timer *tim = (struct ns800_clock_timer *)timer->parent.user_data; + tim->mode = mode; + + TIM_TypeDef *htim = (TIM_TypeDef *)tim->instance; + + if (cnt > 0xFFFF) cnt = 0xFFFF; + TIM_setAutoReload(htim, cnt-1); + TIM_setCounter(htim, 0); + TIM_enableCounter(htim); + return RT_EOK; +} + +static void ns800_clock_timer_stop(rt_clock_timer_t *timer) +{ + struct ns800_clock_timer *tim = (struct ns800_clock_timer *)timer->parent.user_data; + + TIM_disableCounter((TIM_TypeDef *)tim->instance); +} + +static rt_uint32_t ns800_clock_timer_count_get(rt_clock_timer_t *timer) +{ + struct ns800_clock_timer *tim = (struct ns800_clock_timer *)timer->parent.user_data; + + return TIM_getCounter((TIM_TypeDef *)tim->instance); +} + +static rt_err_t __set_timerx_freq(rt_clock_timer_t *timer, uint32_t freq) +{ + #define TIM_SRC_CLK 200000000UL + struct ns800_clock_timer *tim = timer->parent.user_data; + + rt_uint32_t psc = (TIM_SRC_CLK / freq ) - 1; + TIM_setPrescaler(tim->instance, psc); + + return RT_EOK; +} + +static rt_err_t ns800_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd, void *args) +{ + rt_err_t err = RT_EOK; + rt_int32_t freq; + + switch (cmd) + { + case CLOCK_TIMER_CTRL_FREQ_SET: + freq = *(rt_uint32_t *)args; + __set_timerx_freq(timer, freq); + break; + break; + case CLOCK_TIMER_CTRL_INFO_GET: + *(struct rt_clock_timer_info*)args = *timer->info; + err = RT_EOK; + break; + + case CLOCK_TIMER_CTRL_MODE_SET: + timer->mode = *(rt_uint32_t *)args; + break; + + case CLOCK_TIMER_CTRL_STOP: + ns800_clock_timer_stop(timer); + break; + } + return err; +} + + +static const struct rt_clock_timer_info ns800_clock_timer_info[] = +{ +#ifdef BSP_USING_TIM1 + { + .maxfreq = 200000000UL, + .minfreq = 1UL, + .maxcnt = 0xFFFF, + .cntmode = CLOCK_TIMER_CNTMODE_UP, + }, +#endif +#ifdef BSP_USING_TIM2 + { + .maxfreq = 200000000UL, + .minfreq = 1UL, + .maxcnt = 0xFFFF, + .cntmode = CLOCK_TIMER_CNTMODE_UP, + }, +#endif +}; + + +static const struct rt_clock_timer_ops ns800_clock_timer_ops = +{ + .init = ns800_clock_timer_init, + .start = ns800_clock_timer_start, + .stop = ns800_clock_timer_stop, + .count_get = ns800_clock_timer_count_get, + .control = ns800_clock_timer_control, +}; + +int rt_hw_clock_timer_init(void) +{ + if (NS800_TIMER_NUM == 0) + return RT_EOK; + + uint8_t i; + IRQn_Type last_irq = (IRQn_Type)0; + + for (i = 0; i < NS800_TIMER_NUM; i++) + { + ns800_timers[i].timer.info = &ns800_clock_timer_info[i]; + ns800_timers[i].timer.ops = &ns800_clock_timer_ops; + + rt_clock_timer_register(&ns800_timers[i].timer, + ns800_timers[i].name, + &ns800_timers[i]); + + if (ns800_timers[i].irqno != last_irq) + { + Interrupt_register(ns800_timers[i].irqno, ns800_timers[i].irq_handler); + Interrupt_enable(ns800_timers[i].irqno); + last_irq = ns800_timers[i].irqno; + } + + rt_kprintf("[%s] register ok\n", ns800_timers[i].name); + } + + return RT_EOK; +} + +INIT_DEVICE_EXPORT(rt_hw_clock_timer_init); + +#endif /* BSP_USING_TIM */ \ No newline at end of file diff --git a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig index c4bbdf3080b..6bbe97f103f 100644 --- a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig +++ b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig @@ -105,4 +105,23 @@ menu "On-chip Peripheral Drivers" endif + menuconfig BSP_USING_TIM + bool "Enable TIM (Hardware Timer)" + select RT_USING_CLOCK_TIME + default n + help + Enable hardware timer TIM driver + + if BSP_USING_TIM + menu "TIM Timer Configuration" + config BSP_USING_TIM1 + bool "Enable TIM1" + default n + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + endmenu + + endif + endmenu diff --git a/components/drivers/clock_time/SConscript b/components/drivers/clock_time/SConscript index 111449276a0..c1d2cb22793 100644 --- a/components/drivers/clock_time/SConscript +++ b/components/drivers/clock_time/SConscript @@ -31,12 +31,6 @@ if os.path.isdir(arch_dir): src += Glob("arch/%s/*.c" % rtconfig.ARCH) CPPPATH = [cwd, os.path.join(cwd, '..', 'include')] -LOCAL_CCFLAGS = '' -if rtconfig.PLATFORM in ['gcc', 'armclang']: - LOCAL_CCFLAGS += ' -std=gnu99' -elif rtconfig.PLATFORM in ['armcc']: - LOCAL_CCFLAGS += ' --c99 --gnu' - -group = DefineGroup('DeviceDrivers', src, depend=[''], CPPPATH=CPPPATH, LOCAL_CCFLAGS=LOCAL_CCFLAGS) +group = DefineGroup('DeviceDrivers', src, depend=[''], CPPPATH=CPPPATH) Return('group') From afd2d114250ebb750ac5d03d99d5366d1f63ec00 Mon Sep 17 00:00:00 2001 From: oxlm <343550004@qq.com> Date: Sat, 16 May 2026 22:22:39 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8C=89=E7=85=A7GitHub=20AI=20=E7=9A=84PR?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=201.=20=E5=A2=9E=E5=8A=A0=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8=E5=AE=9E=E7=8E=B0=202.=20=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E5=A4=9A=E4=BD=99=E7=9A=84break=E5=85=A5=E5=8F=A3=203?= =?UTF-8?q?.=20KConfig=E7=BC=A9=E8=BF=9B=E4=BF=9D=E6=8C=81=E4=B8=8E?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=B7=B2=E6=9C=89=E7=9A=84=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libraries/HAL_Drivers/drivers/drv_timer.c | 30 ++++++++++------ .../ns800/ns800rt7p65-nssinepad/board/Kconfig | 36 +++++++++---------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c index abc64604eb4..2e38be78c27 100644 --- a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c +++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c @@ -84,17 +84,26 @@ void TIM2_IRQHandler(void) { ns800_clock_timer_isr(&ns800_timers[TIM2_INDEX]); } static void ns800_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) { struct ns800_clock_timer *tim = (struct ns800_clock_timer *)timer->parent.user_data; + TIM_TypeDef *htim = (TIM_TypeDef *)tim->instance; - __IO uint32_t cfg = - TIM_PWMMODE_ONEPOINT | - TIM_CLOCKDIVISION_DIV1 | - TIM_AUTORELOADPRELOAD_ENABLE | - TIM_COUNTERMODE_UP | - TIM_ONEPULSEMODE_REPETITIVE; - - TIM_configTimeBase((TIM_TypeDef *)tim->instance, 200-1, 100-1, cfg); - TIM_clearFlags((TIM_TypeDef *)tim->instance, TIM_FLAG_UPDATE); - TIM_enableInterruptSource((TIM_TypeDef *)tim->instance, TIM_IT_UPDATE); + if(state) + { + __IO uint32_t cfg = + TIM_PWMMODE_ONEPOINT | + TIM_CLOCKDIVISION_DIV1 | + TIM_AUTORELOADPRELOAD_ENABLE | + TIM_COUNTERMODE_UP | + TIM_ONEPULSEMODE_REPETITIVE; + + TIM_configTimeBase(htim, 200-1, 100-1, cfg); + TIM_clearFlags(htim, TIM_FLAG_UPDATE); + TIM_enableInterruptSource(htim, TIM_IT_UPDATE); + } + else + { + TIM_disableInterruptSource(htim, TIM_IT_UPDATE); + TIM_disableCounter(htim, TIM_FLAG_UPDATE); + } } static rt_err_t ns800_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt, rt_clock_timer_mode_t mode) @@ -146,7 +155,6 @@ static rt_err_t ns800_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t c case CLOCK_TIMER_CTRL_FREQ_SET: freq = *(rt_uint32_t *)args; __set_timerx_freq(timer, freq); - break; break; case CLOCK_TIMER_CTRL_INFO_GET: *(struct rt_clock_timer_info*)args = *timer->info; diff --git a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig index 6bbe97f103f..e3ca09b5736 100644 --- a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig +++ b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig @@ -105,23 +105,23 @@ menu "On-chip Peripheral Drivers" endif - menuconfig BSP_USING_TIM - bool "Enable TIM (Hardware Timer)" - select RT_USING_CLOCK_TIME - default n - help - Enable hardware timer TIM driver - - if BSP_USING_TIM - menu "TIM Timer Configuration" - config BSP_USING_TIM1 - bool "Enable TIM1" - default n - config BSP_USING_TIM2 - bool "Enable TIM2" - default n - endmenu - - endif + menuconfig BSP_USING_TIM + bool "Enable TIM (Hardware Timer)" + select RT_USING_CLOCK_TIME + default n + help + Enable hardware timer TIM driver + + if BSP_USING_TIM + menu "TIM Timer Configuration" + config BSP_USING_TIM1 + bool "Enable TIM1" + default n + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + endmenu + + endif endmenu From 77f34859c6cf0bd31b287bf4010221efb9b82c00 Mon Sep 17 00:00:00 2001 From: oxlm <343550004@qq.com> Date: Sat, 16 May 2026 23:21:58 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=8C=89=E7=85=A7github=20AI=E5=BB=BA?= =?UTF-8?q?=E8=AE=AE=201.=20=E6=B3=A8=E5=86=8C=E5=AE=9A=E6=97=B6=E5=99=A8?= =?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E8=BF=94=E5=9B=9E=E5=80=BC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=BE=9D=E6=8D=AE=E6=98=AF=E5=90=A6=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=88=90=E5=8A=9F=E5=86=B3=E5=AE=9A=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=B8=AD=E6=96=AD=E5=90=91=E9=87=8F=E8=A1=A8?= =?UTF-8?q?=202.=20=E5=8F=82=E8=80=83=E5=85=B6=E4=BB=96=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=EF=BC=8C=E9=A9=B1=E5=8A=A8=E9=83=A8=E5=88=86=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=B6=88=E6=81=AF=E5=AE=8F=E5=BC=80=E5=85=B3?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E4=B8=8D=E4=B8=BB=E5=8A=A8=E5=8A=A0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=203.=20=E4=B8=8A=E4=B8=80=E7=89=88=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9A=84=E9=AA=8C=E8=AF=81=E4=B8=8D=E5=85=85?= =?UTF-8?q?=E5=88=86=E9=83=A8=E5=88=86=EF=BC=8C=E5=85=B3=E9=97=AD=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E5=99=A8=E5=87=BD=E6=95=B0=E9=94=99=E8=AF=AF=E4=BC=A0?= =?UTF-8?q?=E9=80=922=E4=B8=AA=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../libraries/HAL_Drivers/drivers/drv_timer.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c index 2e38be78c27..cc4dd9ab001 100644 --- a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c +++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_timer.c @@ -12,6 +12,10 @@ #ifdef BSP_USING_TIM +#define DRV_DEBUG +#define LOG_TAG "drv.timer" +#include + struct ns800_clock_timer { rt_clock_timer_t timer; @@ -102,7 +106,7 @@ static void ns800_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state) else { TIM_disableInterruptSource(htim, TIM_IT_UPDATE); - TIM_disableCounter(htim, TIM_FLAG_UPDATE); + TIM_disableCounter(htim); } } @@ -205,6 +209,8 @@ static const struct rt_clock_timer_ops ns800_clock_timer_ops = int rt_hw_clock_timer_init(void) { + rt_err_t ret = RT_EOK; + if (NS800_TIMER_NUM == 0) return RT_EOK; @@ -216,18 +222,16 @@ int rt_hw_clock_timer_init(void) ns800_timers[i].timer.info = &ns800_clock_timer_info[i]; ns800_timers[i].timer.ops = &ns800_clock_timer_ops; - rt_clock_timer_register(&ns800_timers[i].timer, + ret = rt_clock_timer_register(&ns800_timers[i].timer, ns800_timers[i].name, &ns800_timers[i]); - if (ns800_timers[i].irqno != last_irq) + if ((ret == RT_EOK) && (ns800_timers[i].irqno != last_irq)) { Interrupt_register(ns800_timers[i].irqno, ns800_timers[i].irq_handler); Interrupt_enable(ns800_timers[i].irqno); last_irq = ns800_timers[i].irqno; } - - rt_kprintf("[%s] register ok\n", ns800_timers[i].name); } return RT_EOK;