Subversion Repositories EngineBay2

Rev

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

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