OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [cortexm/] [stm32/] [var/] [current/] [src/] [stm32_misc.c] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
/*==========================================================================
2
//
3
//      stm32_misc.c
4
//
5
//      Cortex-M STM32 HAL functions
6
//
7
//==========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####
9
// -------------------------------------------
10
// This file is part of eCos, the Embedded Configurable Operating System.
11
// Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free
15
// Software Foundation; either version 2 or (at your option) any later
16
// version.
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
// for more details.
22
//
23
// You should have received a copy of the GNU General Public License
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
//
27
// As a special exception, if other files instantiate templates or use
28
// macros or inline functions from this file, or you compile this file
29
// and link it with other works to produce a work based on this file,
30
// this file does not by itself cause the resulting work to be covered by
31
// the GNU General Public License. However the source code for this file
32
// must still be made available in accordance with section (3) of the GNU
33
// General Public License v2.
34
//
35
// This exception does not invalidate any other reasons why a work based
36
// on this file might be covered by the GNU General Public License.
37
// -------------------------------------------
38
// ####ECOSGPLCOPYRIGHTEND####
39
//==========================================================================
40
//#####DESCRIPTIONBEGIN####
41
//
42
// Author(s):    nickg
43
// Contributors: jld
44
// Date:         2008-07-30
45
// Description:
46
//
47
//####DESCRIPTIONEND####
48
//
49
//========================================================================*/
50
 
51
#include <pkgconf/hal.h>
52
#include <pkgconf/hal_cortexm.h>
53
#include <pkgconf/hal_cortexm_stm32.h>
54
#ifdef CYGPKG_KERNEL
55
#include <pkgconf/kernel.h>
56
#endif
57
 
58
#include <cyg/infra/diag.h>
59
#include <cyg/infra/cyg_type.h>
60
#include <cyg/infra/cyg_trac.h>         // tracing macros
61
#include <cyg/infra/cyg_ass.h>          // assertion macros
62
 
63
#include <cyg/hal/hal_arch.h>           // HAL header
64
#include <cyg/hal/hal_intr.h>           // HAL header
65
#include <cyg/hal/hal_if.h>             // HAL header
66
 
67
#ifdef CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER
68
#include <cyg/hal/drv_api.h>            // CYG_ISR_HANDLED
69
#include <cyg/profile/profile.h>        // __profile_hit()
70
#endif
71
 
72
//==========================================================================
73
// Clock Initialization values
74
 
75
#if CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 1
76
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_1
77
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 2
78
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_2
79
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 4
80
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_4
81
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 8
82
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_8
83
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 16
84
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_16
85
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 64
86
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_64
87
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 128
88
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_128
89
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 256
90
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_256
91
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV == 512
92
# define CYGHWR_HAL_STM32_RCC_CFGR_HPRE CYGHWR_HAL_STM32_RCC_CFGR_HPRE_512
93
#endif
94
 
95
#if CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 1
96
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1 CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_1
97
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 2
98
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1 CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_2
99
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 4
100
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1 CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_4
101
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 8
102
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1 CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_8
103
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 16
104
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1 CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_16
105
#endif
106
 
107
#if CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 1
108
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2 CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_1
109
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 2
110
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2 CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_2
111
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 4
112
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2 CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_4
113
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 8
114
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2 CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_8
115
#elif CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 16
116
# define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2 CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_16
117
#endif
118
 
119
 
120
//==========================================================================
121
// Clock frequencies
122
//
123
// These are set to the frequencies of the various system clocks.
124
 
125
cyg_uint32 hal_stm32_sysclk;
126
cyg_uint32 hal_stm32_hclk;
127
cyg_uint32 hal_stm32_pclk1;
128
cyg_uint32 hal_stm32_pclk2;
129
cyg_uint32 hal_cortexm_systick_clock;
130
 
131
void hal_start_clocks( void );
132
cyg_uint32 hal_exti_isr( cyg_uint32 vector, CYG_ADDRWORD data );
133
 
134
//==========================================================================
135
 
136
void hal_variant_init( void )
137
{
138
    CYG_ADDRESS rcc = CYGHWR_HAL_STM32_RCC;
139
 
140
    // Enable all devices in RCC
141
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_APB2ENR, 0xFFFFFFFF );
142
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_APB1ENR, 0xFFFFFFFF );
143
 
144
#if 1 //!defined(CYG_HAL_STARTUP_RAM)
145
    hal_start_clocks();
146
#endif
147
 
148
    // Attach EXTI springboard to interrupt vectors
149
    HAL_INTERRUPT_ATTACH( CYGNUM_HAL_INTERRUPT_EXTI9_5,   hal_exti_isr, 0, 0 );
150
    HAL_INTERRUPT_ATTACH( CYGNUM_HAL_INTERRUPT_EXTI15_10, hal_exti_isr, 0, 0 );
151
 
152
#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT
153
    hal_if_init();
154
#endif
155
}
156
 
157
//==========================================================================
158
// Setup up system clocks
159
//
160
// Set up clocks from configuration. In the future this should be extended so
161
// that clock rates can be changed at runtime.
162
 
163
void hal_start_clocks( void )
164
{
165
    CYG_ADDRESS rcc = CYGHWR_HAL_STM32_RCC;
166
    cyg_uint32 cr, cfgr;
167
 
168
    // Reset RCC
169
 
170
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, 0x00000001 );
171
 
172
    // Start up HSE clock
173
 
174
    HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
175
    cr &= ~(CYGHWR_HAL_STM32_RCC_CR_HSEON|CYGHWR_HAL_STM32_RCC_CR_HSEBYP);
176
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
177
 
178
    HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
179
    cr |= CYGHWR_HAL_STM32_RCC_CR_HSEON;
180
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
181
 
182
    // Wait for HSE clock to startup
183
 
184
    do
185
    {
186
        HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
187
    } while( !(cr & CYGHWR_HAL_STM32_RCC_CR_HSERDY) );
188
 
189
    // Configure clocks
190
 
191
    hal_stm32_sysclk = CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK;
192
 
193
    cfgr = 0;
194
 
195
#if defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSE)
196
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLSRC_HSE;
197
#elif defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSE_HALF)
198
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLSRC_HSE |
199
            CYGHWR_HAL_STM32_RCC_CFGR_PLLXTPRE;
200
    hal_stm32_sysclk /= 2;
201
#elif defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSI_HALF)
202
    hal_stm32_sysclk /= 2;
203
#endif
204
 
205
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLMUL(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL);
206
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_HPRE;
207
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE1;
208
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE2;
209
 
210
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CFGR, cfgr );
211
 
212
    // Enable the PLL and wait for it to lock
213
 
214
    cr |= CYGHWR_HAL_STM32_RCC_CR_PLLON;
215
 
216
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
217
    do
218
    {
219
        HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
220
    } while( !(cr & CYGHWR_HAL_STM32_RCC_CR_PLLRDY) );
221
 
222
    // Now switch to use PLL as SYSCLK
223
 
224
    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_SW_PLL;
225
 
226
    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CFGR, cfgr );
227
    do
228
    {
229
        HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CFGR, cfgr );
230
    } while( (cfgr & CYGHWR_HAL_STM32_RCC_CFGR_SWS_XXX) !=
231
             CYGHWR_HAL_STM32_RCC_CFGR_SWS_PLL );
232
 
233
    // Calculate clocks from configuration
234
 
235
    hal_stm32_sysclk *= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL;
236
    hal_stm32_hclk = hal_stm32_sysclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV;
237
    hal_stm32_pclk1 = hal_stm32_hclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV;
238
    hal_stm32_pclk2 = hal_stm32_hclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV;
239
#ifdef CYGHWR_HAL_CORTEXM_SYSTICK_CLK_SOURCE_INTERNAL
240
    hal_cortexm_systick_clock = hal_stm32_hclk;
241
#else
242
    hal_cortexm_systick_clock = hal_stm32_hclk / 8;
243
#endif
244
}
245
 
246
//==========================================================================
247
// ISR springboard
248
//
249
// This is attached to the ISR table entries for EXTI9_5 and EXTI15_10
250
// to decode the contents of the EXTI registers and deliver the
251
// interrupt to the correct ISR.
252
 
253
cyg_uint32 hal_exti_isr( cyg_uint32 vector, CYG_ADDRWORD data )
254
{
255
    CYG_ADDRESS base = CYGHWR_HAL_STM32_EXTI;
256
    cyg_uint32 imr, pr;
257
 
258
    // Get EXTI pending and interrupt mask registers
259
    HAL_READ_UINT32( base+CYGHWR_HAL_STM32_EXTI_IMR, imr );
260
    HAL_READ_UINT32( base+CYGHWR_HAL_STM32_EXTI_PR, pr );
261
 
262
    // Mask PR by IMR and lose ls 5 bits
263
    pr &= imr;
264
    pr &= 0xFFFFFFE0;
265
 
266
    // Isolate LS pending bit and translate into interrupt vector
267
    // number.
268
    HAL_LSBIT_INDEX( vector, pr );
269
    vector += CYGNUM_HAL_INTERRUPT_EXTI5 - 5;
270
 
271
    // Deliver it
272
    hal_deliver_interrupt( vector );
273
 
274
    return 0;
275
}
276
 
277
//==========================================================================
278
// GPIO support
279
//
280
// These functions provide configuration and IO for GPIO pins.
281
 
282
__externC void hal_stm32_gpio_set( cyg_uint32 pin )
283
{
284
    cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
285
    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
286
    cyg_uint32 cm = CYGHWR_HAL_STM32_GPIO_CFG(pin);
287
    cyg_uint32 cr;
288
 
289
    if( pin == CYGHWR_HAL_STM32_GPIO_NONE )
290
        return;
291
 
292
    if( bit > 7 ) port += 4, bit -= 8;
293
    HAL_READ_UINT32( port, cr );
294
    cr &= ~(0xF<<(bit*4));
295
    cr |= cm<<(bit*4);
296
    HAL_WRITE_UINT32( port, cr );
297
 
298
    // If this is a pullup/down input, set the ODR bit to switch on
299
    // the appropriate pullup/down resistor.
300
    if( cm == (CYGHWR_HAL_STM32_GPIO_MODE_IN|CYGHWR_HAL_STM32_GPIO_CNF_PULL) )
301
    {
302
        cyg_uint32 odr;
303
        port = CYGHWR_HAL_STM32_GPIO_PORT( pin );
304
        bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
305
        HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_ODR, odr );
306
        if( pin & CYGHWR_HAL_STM32_GPIO_PULLUP )
307
            odr |= (1<<bit);
308
        else
309
            odr &= ~(1<<bit);
310
        HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_ODR, odr );
311
    }
312
}
313
 
314
__externC void hal_stm32_gpio_out( cyg_uint32 pin, int val )
315
{
316
    cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
317
    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
318
 
319
    port += CYGHWR_HAL_STM32_GPIO_BSRR;
320
    if( (val&1) == 0 ) port += 4;
321
    HAL_WRITE_UINT32( port, 1<<bit );
322
}
323
 
324
__externC void hal_stm32_gpio_in ( cyg_uint32 pin, int *val )
325
{
326
    cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
327
    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
328
    cyg_uint32 pd;
329
 
330
    HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_IDR, pd );
331
    *val = (pd>>bit)&1;
332
}
333
 
334
//==========================================================================
335
// Backup domain
336
 
337
void hal_stm32_bd_protect( int protect )
338
{
339
    CYG_ADDRESS pwr = CYGHWR_HAL_STM32_PWR;
340
    cyg_uint32 cr;
341
 
342
    HAL_READ_UINT32( pwr+CYGHWR_HAL_STM32_PWR_CR, cr );
343
    if( protect )
344
        cr &= ~CYGHWR_HAL_STM32_PWR_CR_DBP;
345
    else
346
        cr |= CYGHWR_HAL_STM32_PWR_CR_DBP;
347
 
348
    HAL_WRITE_UINT32( pwr+CYGHWR_HAL_STM32_PWR_CR, cr );
349
}
350
 
351
//==========================================================================
352
// UART baud rate
353
//
354
// Set the baud rate divider of a UART based on the requested rate and
355
// the current APB clock settings.
356
 
357
void hal_stm32_uart_setbaud( cyg_uint32 base, cyg_uint32 baud )
358
{
359
    cyg_uint32 apbclk = hal_stm32_pclk1;
360
    cyg_uint32 int_div, frac_div;
361
    cyg_uint32 brr;
362
 
363
    if( base == CYGHWR_HAL_STM32_UART1 )
364
        apbclk = hal_stm32_pclk2;
365
 
366
    int_div = (25 * apbclk ) / (4 * baud );
367
    brr = ( int_div / 100 ) << 4;
368
    frac_div = int_div - (( brr >> 4 ) * 100 );
369
 
370
    brr |= (((frac_div * 16 ) + 50 ) / 100) & 0xF;
371
 
372
    HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_UART_BRR, brr );
373
}
374
 
375
//==========================================================================
376
// Timer clock rate
377
//
378
// Returns the current timer clock rate of a timer.
379
 
380
cyg_uint32 hal_stm32_timer_clock( CYG_ADDRESS base )
381
{
382
    if( base == CYGHWR_HAL_STM32_TIM1 ||
383
        base == CYGHWR_HAL_STM32_TIM8 )
384
    {
385
#if CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV == 1
386
        return hal_stm32_pclk2;
387
#else
388
        return hal_stm32_pclk2 << 1;
389
#endif
390
    } else {
391
#if CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV == 1
392
        return hal_stm32_pclk1;
393
#else
394
        return hal_stm32_pclk1 << 1;
395
#endif
396
    }
397
}
398
 
399
//==========================================================================
400
// Profiling timer
401
//
402
// Implementation of profiling support using general-purpose timer TIM2.
403
 
404
#ifdef CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER
405
// Use TIM2 for profiling
406
#define STM32_TIMER_PROFILE CYGHWR_HAL_STM32_TIM2
407
#define HAL_INTERRUPT_PROFILE CYGNUM_HAL_INTERRUPT_TIM2
408
 
409
// Profiling timer ISR
410
static cyg_uint32 profile_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
411
{
412
    extern HAL_SavedRegisters *hal_saved_interrupt_state;
413
 
414
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_SR, 0); // clear interrupt pending flag
415
    HAL_INTERRUPT_ACKNOWLEDGE(HAL_INTERRUPT_PROFILE);
416
    __profile_hit(hal_saved_interrupt_state->u.interrupt.pc);
417
    return CYG_ISR_HANDLED;
418
}
419
 
420
// Profiling timer setup
421
int hal_enable_profile_timer(int resolution)
422
{
423
    CYG_ASSERT(resolution < 0x10000, "Invalid profile timer resolution"); // 16 bits only
424
 
425
    // Attach ISR
426
    HAL_INTERRUPT_ATTACH(HAL_INTERRUPT_PROFILE, &profile_isr, 0x1111, 0);
427
    HAL_INTERRUPT_UNMASK(HAL_INTERRUPT_PROFILE);
428
 
429
    // Setup timer
430
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_PSC,
431
        (hal_stm32_timer_clock(STM32_TIMER_PROFILE) / 1000000) - 1); // prescale to microseconds
432
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_CR2, 0);
433
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_DIER, CYGHWR_HAL_STM32_TIM_DIER_UIE);
434
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_ARR, resolution);
435
    HAL_WRITE_UINT32(STM32_TIMER_PROFILE+CYGHWR_HAL_STM32_TIM_CR1, CYGHWR_HAL_STM32_TIM_CR1_CEN);
436
 
437
    return resolution;
438
}
439
 
440
#endif // CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER
441
 
442
//==========================================================================
443
// EOF stm32_misc.c

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.