Subversion Repositories DashDisplay

Rev

Rev 50 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
77 mjames 1
/**
2
  ******************************************************************************
3
  * @file    stm32l1xx_hal_cortex.c
4
  * @author  MCD Application Team
5
  * @brief   CORTEX HAL module driver.
6
  *
7
  *          This file provides firmware functions to manage the following
8
  *          functionalities of the CORTEX:
9
  *           + Initialization and de-initialization functions
10
  *           + Peripheral Control functions
11
  *          
12
  *  @verbatim    
13
  ==============================================================================
14
                        ##### How to use this driver #####
15
  ==============================================================================
16
 
17
    [..]  
18
    *** How to configure Interrupts using Cortex HAL driver ***
19
    ===========================================================
20
    [..]    
21
    This section provide functions allowing to configure the NVIC interrupts (IRQ).
22
    The Cortex-M3 exceptions are managed by CMSIS functions.
23
 
24
    (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() function
25
 
26
     (#)  Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority()
27
 
28
     (#)  Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ()
29
 
30
 
31
     -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ pre-emption is no more possible.
32
         The pending IRQ priority will be managed only by the sub priority.
33
 
34
     -@- IRQ priority order (sorted by highest to lowest priority):
35
        (+@) Lowest pre-emption priority
36
        (+@) Lowest sub priority
37
        (+@) Lowest hardware priority (IRQ number)
38
 
39
    [..]  
40
    *** How to configure Systick using Cortex HAL driver ***
41
    ========================================================
42
    [..]
43
    Setup SysTick Timer for 1 msec interrupts.
44
 
45
   (+) The HAL_SYSTICK_Config()function calls the SysTick_Config() function which
46
       is a CMSIS function that:
47
        (++) Configures the SysTick Reload register with value passed as function parameter.
48
        (++) Configures the SysTick IRQ priority to the lowest value (0x0F).
49
        (++) Resets the SysTick Counter register.
50
        (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK).
51
        (++) Enables the SysTick Interrupt.
52
        (++) Starts the SysTick Counter.
53
 
54
   (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro
55
       __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the
56
       HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined
57
       inside the stm32l1xx_hal_cortex.h file.
58
 
59
   (+) You can change the SysTick IRQ priority by calling the
60
       HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function
61
       call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function.
62
 
63
   (+) To adjust the SysTick time base, use the following formula:
64
 
65
       Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)
66
       (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function
67
       (++) Reload Value should not exceed 0xFFFFFF
68
 
69
  @endverbatim
70
  ******************************************************************************
71
  * @attention
72
  *
73
  * Copyright (c) 2017 STMicroelectronics.
74
  * All rights reserved.
75
  *
76
  * This software is licensed under terms that can be found in the LICENSE file in
77
  * the root directory of this software component.
78
  * If no LICENSE file comes with this software, it is provided AS-IS.
79
  *
80
  ******************************************************************************
81
  */
82
 
83
/*
84
  Additional Tables: CORTEX_NVIC_Priority_Table
85
     The table below gives the allowed values of the pre-emption priority and subpriority according
86
     to the Priority Grouping configuration performed by HAL_NVIC_SetPriorityGrouping() function.
87
       ==========================================================================================================================
88
         NVIC_PriorityGroup   | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority  |       Description
89
       ==========================================================================================================================
90
        NVIC_PRIORITYGROUP_0  |                0                  |            0-15             | 0 bits for pre-emption priority
91
                              |                                   |                             | 4 bits for subpriority
92
       --------------------------------------------------------------------------------------------------------------------------
93
        NVIC_PRIORITYGROUP_1  |                0-1                |            0-7              | 1 bits for pre-emption priority
94
                              |                                   |                             | 3 bits for subpriority
95
       --------------------------------------------------------------------------------------------------------------------------    
96
        NVIC_PRIORITYGROUP_2  |                0-3                |            0-3              | 2 bits for pre-emption priority
97
                              |                                   |                             | 2 bits for subpriority
98
       --------------------------------------------------------------------------------------------------------------------------    
99
        NVIC_PRIORITYGROUP_3  |                0-7                |            0-1              | 3 bits for pre-emption priority
100
                              |                                   |                             | 1 bits for subpriority
101
       --------------------------------------------------------------------------------------------------------------------------    
102
        NVIC_PRIORITYGROUP_4  |                0-15               |            0                | 4 bits for pre-emption priority
103
                              |                                   |                             | 0 bits for subpriority                      
104
       ==========================================================================================================================
105
*/
106
 
107
/* Includes ------------------------------------------------------------------*/
108
#include "stm32l1xx_hal.h"
109
 
110
/** @addtogroup STM32L1xx_HAL_Driver
111
  * @{
112
  */
113
 
114
/** @defgroup CORTEX CORTEX
115
  * @brief CORTEX HAL module driver
116
  * @{
117
  */
118
 
119
#ifdef HAL_CORTEX_MODULE_ENABLED
120
 
121
/* Private typedef -----------------------------------------------------------*/
122
/* Private define ------------------------------------------------------------*/
123
/* Private macro -------------------------------------------------------------*/
124
/* Private variables ---------------------------------------------------------*/
125
/* Private function prototypes -----------------------------------------------*/
126
/* Private functions ---------------------------------------------------------*/
127
 
128
/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions
129
  * @{
130
  */
131
 
132
 
133
/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions
134
 *  @brief    Initialization and Configuration functions
135
 *
136
@verbatim    
137
  ==============================================================================
138
              ##### Initialization and de-initialization functions #####
139
  ==============================================================================
140
    [..]
141
      This section provide the Cortex HAL driver functions allowing to configure Interrupts
142
      Systick functionalities
143
 
144
@endverbatim
145
  * @{
146
  */
147
 
148
 
149
/**
150
  * @brief  Sets the priority grouping field (pre-emption priority and subpriority)
151
  *         using the required unlock sequence.
152
  * @param  PriorityGroup The priority grouping bits length.
153
  *         This parameter can be one of the following values:
154
  *         @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority
155
  *                                    4 bits for subpriority
156
  *         @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority
157
  *                                    3 bits for subpriority
158
  *         @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority
159
  *                                    2 bits for subpriority
160
  *         @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority
161
  *                                    1 bits for subpriority
162
  *         @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority
163
  *                                    0 bits for subpriority
164
  * @note   When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible.
165
  *         The pending IRQ priority will be managed only by the subpriority.
166
  * @retval None
167
  */
168
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
169
{
170
  /* Check the parameters */
171
  assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
172
 
173
  /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
174
  NVIC_SetPriorityGrouping(PriorityGroup);
175
}
176
 
177
/**
178
  * @brief  Sets the priority of an interrupt.
179
  * @param  IRQn External interrupt number
180
  *         This parameter can be an enumerator of IRQn_Type enumeration
181
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xx.h))
182
  * @param  PreemptPriority The pre-emption priority for the IRQn channel.
183
  *         This parameter can be a value between 0 and 15
184
  *         A lower priority value indicates a higher priority
185
  * @param  SubPriority the subpriority level for the IRQ channel.
186
  *         This parameter can be a value between 0 and 15
187
  *         A lower priority value indicates a higher priority.          
188
  * @retval None
189
  */
190
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
191
{
192
  uint32_t prioritygroup = 0x00;
193
 
194
  /* Check the parameters */
195
  assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
196
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
197
 
198
  prioritygroup = NVIC_GetPriorityGrouping();
199
 
200
  NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
201
}
202
 
203
/**
204
  * @brief  Enables a device specific interrupt in the NVIC interrupt controller.
205
  * @note   To configure interrupts priority correctly, the NVIC_PriorityGroupConfig()
206
  *         function should be called before.
207
  * @param  IRQn External interrupt number
208
  *         This parameter can be an enumerator of IRQn_Type enumeration
209
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xx.h))
210
  * @retval None
211
  */
212
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
213
{
214
  /* Check the parameters */
215
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
216
 
217
  /* Enable interrupt */
218
  NVIC_EnableIRQ(IRQn);
219
}
220
 
221
/**
222
  * @brief  Disables a device specific interrupt in the NVIC interrupt controller.
223
  * @param  IRQn External interrupt number
224
  *         This parameter can be an enumerator of IRQn_Type enumeration
225
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))  
226
  * @retval None
227
  */
228
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
229
{
230
  /* Check the parameters */
231
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
232
 
233
  /* Disable interrupt */
234
  NVIC_DisableIRQ(IRQn);
235
}
236
 
237
/**
238
  * @brief  Initiates a system reset request to reset the MCU.
239
  * @retval None
240
  */
241
void HAL_NVIC_SystemReset(void)
242
{
243
  /* System Reset */
244
  NVIC_SystemReset();
245
}
246
 
247
/**
248
  * @brief  Initializes the System Timer and its interrupt, and starts the System Tick Timer.
249
  *         Counter is in free running mode to generate periodic interrupts.
250
  * @param  TicksNumb Specifies the ticks Number of ticks between two interrupts.
251
  * @retval status:  - 0  Function succeeded.
252
  *                  - 1  Function failed.
253
  */
254
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
255
{
256
   return SysTick_Config(TicksNumb);
257
}
258
/**
259
  * @}
260
  */
261
 
262
/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions
263
 *  @brief    Cortex control functions
264
 *
265
@verbatim  
266
  ==============================================================================
267
                      ##### Peripheral Control functions #####
268
  ==============================================================================
269
    [..]
270
      This subsection provides a set of functions allowing to control the CORTEX
271
      (NVIC, SYSTICK, MPU) functionalities.
272
 
273
 
274
@endverbatim
275
  * @{
276
  */
277
 
278
#if (__MPU_PRESENT == 1)
279
/**
280
  * @brief  Enable the MPU.
281
  * @param  MPU_Control Specifies the control mode of the MPU during hard fault,
282
  *          NMI, FAULTMASK and privileged accessto the default memory
283
  *          This parameter can be one of the following values:
284
  *            @arg MPU_HFNMI_PRIVDEF_NONE
285
  *            @arg MPU_HARDFAULT_NMI
286
  *            @arg MPU_PRIVILEGED_DEFAULT
287
  *            @arg MPU_HFNMI_PRIVDEF
288
  * @retval None
289
  */
290
void HAL_MPU_Enable(uint32_t MPU_Control)
291
{
292
  /* Enable the MPU */
293
  MPU->CTRL = (MPU_Control | MPU_CTRL_ENABLE_Msk);
294
 
295
  /* Ensure MPU setting take effects */
296
  __DSB();
297
  __ISB();
298
}
299
 
300
/**
301
  * @brief  Disable the MPU.
302
  * @retval None
303
  */
304
void HAL_MPU_Disable(void)
305
{
306
  /* Make sure outstanding transfers are done */
307
  __DMB();
308
 
309
  /* Disable the MPU and clear the control register*/
310
  MPU->CTRL  = 0;
311
}
312
 
313
/**
314
  * @brief  Initializes and configures the Region and the memory to be protected.
315
  * @param  MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains
316
  *                the initialization and configuration information.
317
  * @retval None
318
  */
319
void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init)
320
{
321
  /* Check the parameters */
322
  assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number));
323
  assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable));
324
 
325
  /* Set the Region number */
326
  MPU->RNR = MPU_Init->Number;
327
 
328
  if ((MPU_Init->Enable) != RESET)
329
  {
330
    /* Check the parameters */
331
    assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec));
332
    assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission));
333
    assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField));
334
    assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable));
335
    assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable));
336
    assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable));
337
    assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable));
338
    assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size));
339
 
340
    MPU->RBAR = MPU_Init->BaseAddress;
341
    MPU->RASR = ((uint32_t)MPU_Init->DisableExec             << MPU_RASR_XN_Pos)   |
342
                ((uint32_t)MPU_Init->AccessPermission        << MPU_RASR_AP_Pos)   |
343
                ((uint32_t)MPU_Init->TypeExtField            << MPU_RASR_TEX_Pos)  |
344
                ((uint32_t)MPU_Init->IsShareable             << MPU_RASR_S_Pos)    |
345
                ((uint32_t)MPU_Init->IsCacheable             << MPU_RASR_C_Pos)    |
346
                ((uint32_t)MPU_Init->IsBufferable            << MPU_RASR_B_Pos)    |
347
                ((uint32_t)MPU_Init->SubRegionDisable        << MPU_RASR_SRD_Pos)  |
348
                ((uint32_t)MPU_Init->Size                    << MPU_RASR_SIZE_Pos) |
349
                ((uint32_t)MPU_Init->Enable                  << MPU_RASR_ENABLE_Pos);
350
  }
351
  else
352
  {
353
    MPU->RBAR = 0x00;
354
    MPU->RASR = 0x00;
355
  }
356
}
357
#endif /* __MPU_PRESENT */
358
 
359
/**
360
  * @brief  Gets the priority grouping field from the NVIC Interrupt Controller.
361
  * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field)
362
  */
363
uint32_t HAL_NVIC_GetPriorityGrouping(void)
364
{
365
  /* Get the PRIGROUP[10:8] field value */
366
  return NVIC_GetPriorityGrouping();
367
}
368
 
369
/**
370
  * @brief  Gets the priority of an interrupt.
371
  * @param  IRQn External interrupt number
372
  *         This parameter can be an enumerator of IRQn_Type enumeration
373
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))
374
  * @param  PriorityGroup the priority grouping bits length.
375
  *         This parameter can be one of the following values:
376
  *           @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority
377
  *                                      4 bits for subpriority
378
  *           @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority
379
  *                                      3 bits for subpriority
380
  *           @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority
381
  *                                      2 bits for subpriority
382
  *           @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority
383
  *                                      1 bits for subpriority
384
  *           @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority
385
  *                                      0 bits for subpriority
386
  * @param  pPreemptPriority Pointer on the Preemptive priority value (starting from 0).
387
  * @param  pSubPriority Pointer on the Subpriority value (starting from 0).
388
  * @retval None
389
  */
390
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority)
391
{
392
  /* Check the parameters */
393
  assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
394
 /* Get priority for Cortex-M system or device specific interrupts */
395
  NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority);
396
}
397
 
398
/**
399
  * @brief  Sets Pending bit of an external interrupt.
400
  * @param  IRQn External interrupt number
401
  *         This parameter can be an enumerator of IRQn_Type enumeration
402
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))  
403
  * @retval None
404
  */
405
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
406
{
407
  /* Set interrupt pending */
408
  NVIC_SetPendingIRQ(IRQn);
409
}
410
 
411
/**
412
  * @brief Gets Pending Interrupt (reads the pending register in the NVIC
413
  *         and returns the pending bit for the specified interrupt).
414
  * @param IRQn External interrupt number
415
  *         This parameter can be an enumerator of IRQn_Type enumeration
416
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))  
417
  * @retval status: - 0  Interrupt status is not pending.
418
  *                 - 1  Interrupt status is pending.
419
  */
420
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn)
421
{
422
  /* Return 1 if pending else 0 */
423
  return NVIC_GetPendingIRQ(IRQn);
424
}
425
 
426
/**
427
  * @brief Clears the pending bit of an external interrupt.
428
  * @param IRQn External interrupt number
429
  *         This parameter can be an enumerator of IRQn_Type enumeration
430
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))  
431
  * @retval None
432
  */
433
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)
434
{
435
  /* Clear pending interrupt */
436
  NVIC_ClearPendingIRQ(IRQn);
437
}
438
 
439
/**
440
  * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit).
441
  * @param IRQn External interrupt number
442
  *         This parameter can be an enumerator of IRQn_Type enumeration
443
  *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32l1xxxx.h))  
444
  * @retval status: - 0  Interrupt status is not pending.
445
  *                 - 1  Interrupt status is pending.
446
  */
447
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn)
448
{
449
  /* Return 1 if active else 0 */
450
  return NVIC_GetActive(IRQn);
451
}
452
 
453
/**
454
  * @brief  Configures the SysTick clock source.
455
  * @param  CLKSource specifies the SysTick clock source.
456
  *         This parameter can be one of the following values:
457
  *             @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source.
458
  *             @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source.
459
  * @retval None
460
  */
461
void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
462
{
463
  /* Check the parameters */
464
  assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));
465
  if (CLKSource == SYSTICK_CLKSOURCE_HCLK)
466
  {
467
    SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;
468
  }
469
  else
470
  {
471
    SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;
472
  }
473
}
474
 
475
/**
476
  * @brief  This function handles SYSTICK interrupt request.
477
  * @retval None
478
  */
479
void HAL_SYSTICK_IRQHandler(void)
480
{
481
  HAL_SYSTICK_Callback();
482
}
483
 
484
/**
485
  * @brief  SYSTICK callback.
486
  * @retval None
487
  */
488
__weak void HAL_SYSTICK_Callback(void)
489
{
490
  /* NOTE : This function Should not be modified, when the callback is needed,
491
            the HAL_SYSTICK_Callback could be implemented in the user file
492
   */
493
}
494
 
495
/**
496
  * @}
497
  */
498
 
499
/**
500
  * @}
501
  */
502
 
503
#endif /* HAL_CORTEX_MODULE_ENABLED */
504
/**
505
  * @}
506
  */
507
 
508
/**
509
  * @}
510
  */
511