From 692b24f898b31b95e639c0f43f225ed1726719d3 Mon Sep 17 00:00:00 2001 From: arighi Date: Wed, 31 Mar 2010 14:41:53 +0000 Subject: [PATCH] lm3s1968: introduce a distinct inline function to evaluate SYSDIV divisor. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3354 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/cpu/cortex-m3/drv/clock_lm3s.c | 29 ++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/bertos/cpu/cortex-m3/drv/clock_lm3s.c b/bertos/cpu/cortex-m3/drv/clock_lm3s.c index 2f2dfe6c..8790b0e6 100644 --- a/bertos/cpu/cortex-m3/drv/clock_lm3s.c +++ b/bertos/cpu/cortex-m3/drv/clock_lm3s.c @@ -67,6 +67,24 @@ unsigned long clock_get_rate(void) PLL_VCO / 2 / RCC_TO_DIV(rcc) : PLL_VCO; } +/* + * Try to evaluate the correct SYSDIV value depending on the desired CPU + * frequency. + */ +INLINE int evaluate_sysdiv(unsigned long freq) +{ + int i; + + /* + * NOTE: with BYPASS=0, SYSDIV < 3 are reserved values (see LM3S1968 + * Microcontroller DATASHEET, p.78). + */ + for (i = 3; i < 16; i++) + if (freq >= (PLL_VCO / 2 / (i + 1))) + break; + return i; +} + void clock_set_rate(void) { reg32_t rcc, rcc2; @@ -125,19 +143,12 @@ void clock_set_rate(void) */ rcc &= ~(SYSCTL_RCC_SYSDIV_M | SYSCTL_RCC_USESYSDIV); - /* - * Try to evaluate the correct SYSDIV value depending on the desired - * CPU frequency. - * - * NOTE: with BYPASS=0, SYSDIV < 3 are reserved values (see LM3S1968 - * Microcontroller DATASHEET, p.78). - */ clk = PLL_VCO / 2; for (i = 3; i < 16; i++) if (CPU_FREQ >= (clk / (i + 1))) break; - if (i) - rcc |= SYSCTL_RCC_USESYSDIV | (i << SYSCTL_RCC_SYSDIV_SHIFT); + rcc |= SYSCTL_RCC_USESYSDIV | + (evaluate_sysdiv(CPU_FREQ) << SYSCTL_RCC_SYSDIV_SHIFT); /* * Step #4: wait for the PLL to lock by polling the PLLLRIS bit in the -- 2.25.1