stm8l15x_itc.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. /**
  2. ******************************************************************************
  3. * @file stm8l15x_itc.c
  4. * @author MCD Application Team
  5. * @version V1.6.1
  6. * @date 30-September-2014
  7. * @brief This file provides firmware functions to manage the following
  8. * functionality of the Interrupt controller (ITC) peripheral:
  9. * - Configuration and management
  10. ******************************************************************************
  11. * @attention
  12. *
  13. * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
  14. *
  15. * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  16. * You may not use this file except in compliance with the License.
  17. * You may obtain a copy of the License at:
  18. *
  19. * http://www.st.com/software_license_agreement_liberty_v2
  20. *
  21. * Unless required by applicable law or agreed to in writing, software
  22. * distributed under the License is distributed on an "AS IS" BASIS,
  23. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  24. * See the License for the specific language governing permissions and
  25. * limitations under the License.
  26. *
  27. ******************************************************************************
  28. */
  29. /* Includes ------------------------------------------------------------------*/
  30. #include "stm8l15x_itc.h"
  31. /** @addtogroup STM8L15x_StdPeriph_Driver
  32. * @{
  33. */
  34. /** @defgroup ITC
  35. * @brief ITC driver modules
  36. * @{
  37. */
  38. /* Private typedef -----------------------------------------------------------*/
  39. /* Private define ------------------------------------------------------------*/
  40. /* Private macro -------------------------------------------------------------*/
  41. /* Private function prototypes -----------------------------------------------*/
  42. /* Private functions ---------------------------------------------------------*/
  43. /** @defgroup ITC_Private_Functions
  44. * @{
  45. */
  46. /**
  47. * @brief Utility function used to read CC register.
  48. * @param None
  49. * @retval CPU CC register value
  50. */
  51. uint8_t ITC_GetCPUCC(void)
  52. {
  53. #ifdef _COSMIC_
  54. _asm("push cc");
  55. _asm("pop a");
  56. return; /* Ignore compiler warning, the returned value is in A register */
  57. #elif defined _RAISONANCE_ /* _RAISONANCE_ */
  58. return _getCC_();
  59. #else /* _IAR_ */
  60. asm("push cc");
  61. asm("pop a"); /* Ignore compiler warning, the returned value is in A register */
  62. #endif /* _COSMIC_*/
  63. }
  64. /** @defgroup ITC_Group1 ITC configuration and management functions
  65. * @brief ITC configuration and management functions
  66. *
  67. @verbatim
  68. ===============================================================================
  69. ITC configuration and management functions
  70. ===============================================================================
  71. @endverbatim
  72. * @{
  73. */
  74. /**
  75. * @brief Deinitializes the ITC registers to their default reset value.
  76. * @param None
  77. * @retval None
  78. */
  79. void ITC_DeInit(void)
  80. {
  81. ITC->ISPR1 = ITC_SPRX_RESET_VALUE;
  82. ITC->ISPR2 = ITC_SPRX_RESET_VALUE;
  83. ITC->ISPR3 = ITC_SPRX_RESET_VALUE;
  84. ITC->ISPR4 = ITC_SPRX_RESET_VALUE;
  85. ITC->ISPR5 = ITC_SPRX_RESET_VALUE;
  86. ITC->ISPR6 = ITC_SPRX_RESET_VALUE;
  87. ITC->ISPR7 = ITC_SPRX_RESET_VALUE;
  88. ITC->ISPR8 = ITC_SPRX_RESET_VALUE;
  89. }
  90. /**
  91. * @brief Gets the interrupt software priority bits (I1, I0) value from CPU CC register.
  92. * @param None
  93. * @retval The interrupt software priority bits value.
  94. */
  95. uint8_t ITC_GetSoftIntStatus(void)
  96. {
  97. return ((uint8_t)(ITC_GetCPUCC() & CPU_SOFT_INT_DISABLED));
  98. }
  99. /**
  100. * @brief Gets the software priority of the specified interrupt source.
  101. * @param IRQn : Specifies the peripheral interrupt source.
  102. * @retval Specifies the software priority of the interrupt source.
  103. */
  104. ITC_PriorityLevel_TypeDef ITC_GetSoftwarePriority(IRQn_TypeDef IRQn)
  105. {
  106. uint8_t Value = 0;
  107. uint8_t Mask = 0;
  108. /* Check function parameters */
  109. assert_param(IS_ITC_IRQ(IRQn));
  110. /* Define the mask corresponding to the bits position in the SPR register */
  111. Mask = (uint8_t)(0x03U << ((IRQn % 4U) * 2U));
  112. switch (IRQn)
  113. {
  114. case FLASH_IRQn:
  115. case DMA1_CHANNEL0_1_IRQn:
  116. case DMA1_CHANNEL2_3_IRQn:
  117. Value = (uint8_t)(ITC->ISPR1 & Mask); /* Read software priority */
  118. break;
  119. case EXTIE_F_PVD_IRQn:
  120. #if defined (STM8L15X_MD) || defined (STM8L05X_MD_VL) || defined (STM8AL31_L_MD)
  121. case RTC_IRQn:
  122. case EXTIB_IRQn:
  123. case EXTID_IRQn:
  124. #elif defined (STM8L15X_LD) || defined (STM8L05X_LD_VL)
  125. case RTC_CSSLSE_IRQn:
  126. case EXTIB_IRQn:
  127. case EXTID_IRQn:
  128. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  129. case RTC_CSSLSE_IRQn:
  130. case EXTIB_G_IRQn:
  131. case EXTID_H_IRQn:
  132. #endif /* STM8L15X_MD */
  133. Value = (uint8_t)(ITC->ISPR2 & Mask); /* Read software priority */
  134. break;
  135. case EXTI0_IRQn:
  136. case EXTI1_IRQn:
  137. case EXTI2_IRQn:
  138. case EXTI3_IRQn:
  139. Value = (uint8_t)(ITC->ISPR3 & Mask); /* Read software priority */
  140. break;
  141. case EXTI4_IRQn:
  142. case EXTI5_IRQn:
  143. case EXTI6_IRQn:
  144. case EXTI7_IRQn:
  145. Value = (uint8_t)(ITC->ISPR4 & Mask); /* Read software priority */
  146. break;
  147. #if defined (STM8L15X_LD) || defined (STM8L05X_LD_VL)
  148. case SWITCH_CSS_IRQn:
  149. #else
  150. case SWITCH_CSS_BREAK_DAC_IRQn:
  151. #endif /* STM8L15X_LD */
  152. case ADC1_COMP_IRQn:
  153. #if defined (STM8L15X_MD) || defined (STM8L05X_MD_VL) || defined (STM8AL31_L_MD)
  154. case LCD_IRQn:
  155. case TIM2_UPD_OVF_TRG_BRK_IRQn:
  156. #elif defined (STM8L15X_LD) || defined (STM8L05X_LD_VL)
  157. case TIM2_UPD_OVF_TRG_BRK_IRQn:
  158. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  159. case LCD_AES_IRQn:
  160. case TIM2_UPD_OVF_TRG_BRK_USART2_TX_IRQn:
  161. #endif /* STM8L15X_MD */
  162. Value = (uint8_t)(ITC->ISPR5 & Mask); /* Read software priority */
  163. break;
  164. #if !defined (STM8L15X_LD) && !defined (STM8L05X_LD_VL)
  165. case TIM1_UPD_OVF_TRG_IRQn:
  166. #endif /* STM8L15X_LD */
  167. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  168. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  169. case TIM2_CC_IRQn:
  170. case TIM3_UPD_OVF_TRG_BRK_IRQn :
  171. case TIM3_CC_IRQn:
  172. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  173. case TIM2_CC_USART2_RX_IRQn:
  174. case TIM3_UPD_OVF_TRG_BRK_USART3_TX_IRQn :
  175. case TIM3_CC_USART3_RX_IRQn:
  176. #endif /* STM8L15X_MD */
  177. Value = (uint8_t)(ITC->ISPR6 & Mask); /* Read software priority */
  178. break;
  179. #if !defined (STM8L15X_LD) && !defined (STM8L05X_LD_VL)
  180. case TIM1_CC_IRQn:
  181. #endif /* STM8L15X_LD */
  182. case TIM4_UPD_OVF_TRG_IRQn:
  183. case SPI1_IRQn:
  184. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  185. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  186. case USART1_TX_IRQn:
  187. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  188. case USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQn:
  189. #endif /* STM8L15X_MD || STM8L15X_LD */
  190. Value = (uint8_t)(ITC->ISPR7 & Mask); /* Read software priority */
  191. break;
  192. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  193. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  194. case USART1_RX_IRQn:
  195. case I2C1_IRQn:
  196. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  197. case USART1_RX_TIM5_CC_IRQn:
  198. case I2C1_SPI2_IRQn:
  199. #endif /* STM8L15X_MD || STM8L15X_LD*/
  200. Value = (uint8_t)(ITC->ISPR8 & Mask); /* Read software priority */
  201. break;
  202. default:
  203. break;
  204. }
  205. Value >>= (uint8_t)((IRQn % 4u) * 2u);
  206. return((ITC_PriorityLevel_TypeDef)Value);
  207. }
  208. /**
  209. * @brief Sets the software priority of the specified interrupt source.
  210. * @note The modification of the software priority is only possible when
  211. * the interrupts are disabled.
  212. * @note The normal behavior is to disable the interrupt before calling
  213. * this function, and re-enable it after.
  214. * @note The priority level 0 cannot be set (see product specification
  215. * for more details).
  216. * @param IRQn : Specifies the peripheral interrupt source.
  217. * @param ITC_PriorityLevel : Specifies the software priority value to set
  218. * This parameter can be one of the following values:
  219. * @arg ITC_PriorityLevel_0: Software priority level 0 (cannot be written)
  220. * @arg ITC_PriorityLevel_1: Software priority level 1
  221. * @arg ITC_PriorityLevel_2: Software priority level 2
  222. * @arg ITC_PriorityLevel_3: Software priority level 3
  223. * @retval None
  224. */
  225. void ITC_SetSoftwarePriority(IRQn_TypeDef IRQn, ITC_PriorityLevel_TypeDef ITC_PriorityLevel)
  226. {
  227. uint8_t Mask = 0;
  228. uint8_t NewPriority = 0;
  229. /* Check function parameters */
  230. assert_param(IS_ITC_IRQ(IRQn));
  231. assert_param(IS_ITC_PRIORITY(ITC_PriorityLevel));
  232. /* Check if interrupts are disabled */
  233. assert_param(IS_ITC_INTERRUPTS_DISABLED);
  234. /* Define the mask corresponding to the bits position in the SPR register */
  235. /* The mask is reversed in order to clear the 2 bits after more easily */
  236. Mask = (uint8_t)(~(uint8_t)(0x03U << ((IRQn % 4U) * 2U)));
  237. /* Define the new priority to write */
  238. NewPriority = (uint8_t)((uint8_t)(ITC_PriorityLevel) << ((IRQn % 4U) * 2U));
  239. switch (IRQn)
  240. {
  241. case FLASH_IRQn:
  242. case DMA1_CHANNEL0_1_IRQn:
  243. case DMA1_CHANNEL2_3_IRQn:
  244. ITC->ISPR1 &= Mask;
  245. ITC->ISPR1 |= NewPriority;
  246. break;
  247. case EXTIE_F_PVD_IRQn:
  248. #if defined (STM8L15X_MD) || defined (STM8L05X_MD_VL) || defined (STM8AL31_L_MD)
  249. case RTC_IRQn:
  250. case EXTIB_IRQn:
  251. case EXTID_IRQn:
  252. #elif defined (STM8L15X_LD) || defined (STM8L05X_LD_VL)
  253. case RTC_CSSLSE_IRQn:
  254. case EXTIB_IRQn:
  255. case EXTID_IRQn:
  256. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  257. case RTC_CSSLSE_IRQn:
  258. case EXTIB_G_IRQn:
  259. case EXTID_H_IRQn:
  260. #endif /* STM8L15X_MD */
  261. ITC->ISPR2 &= Mask;
  262. ITC->ISPR2 |= NewPriority;
  263. break;
  264. case EXTI0_IRQn:
  265. case EXTI1_IRQn:
  266. case EXTI2_IRQn:
  267. case EXTI3_IRQn:
  268. ITC->ISPR3 &= Mask;
  269. ITC->ISPR3 |= NewPriority;
  270. break;
  271. case EXTI4_IRQn:
  272. case EXTI5_IRQn:
  273. case EXTI6_IRQn:
  274. case EXTI7_IRQn:
  275. ITC->ISPR4 &= Mask;
  276. ITC->ISPR4 |= NewPriority;
  277. break;
  278. #if !defined (STM8L15X_LD) && !defined (STM8L05X_LD_VL)
  279. case SWITCH_CSS_BREAK_DAC_IRQn:
  280. #else
  281. case SWITCH_CSS_IRQn:
  282. #endif /* STM8L15X_LD */
  283. case ADC1_COMP_IRQn:
  284. #if defined (STM8L15X_MD) || defined (STM8L05X_MD_VL) || defined (STM8AL31_L_MD)
  285. case LCD_IRQn:
  286. case TIM2_UPD_OVF_TRG_BRK_IRQn:
  287. #elif defined (STM8L15X_LD) || defined (STM8L05X_LD_VL)
  288. case TIM2_UPD_OVF_TRG_BRK_IRQn:
  289. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  290. case LCD_AES_IRQn:
  291. case TIM2_UPD_OVF_TRG_BRK_USART2_TX_IRQn:
  292. #endif /* STM8L15X_MD */
  293. ITC->ISPR5 &= Mask;
  294. ITC->ISPR5 |= NewPriority;
  295. break;
  296. #if !defined (STM8L15X_LD) && !defined (STM8L05X_LD_VL)
  297. case TIM1_UPD_OVF_TRG_IRQn:
  298. #endif /* STM8L15X_LD */
  299. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  300. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  301. case TIM2_CC_IRQn:
  302. case TIM3_UPD_OVF_TRG_BRK_IRQn :
  303. case TIM3_CC_IRQn:
  304. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  305. case TIM2_CC_USART2_RX_IRQn:
  306. case TIM3_UPD_OVF_TRG_BRK_USART3_TX_IRQn :
  307. case TIM3_CC_USART3_RX_IRQn:
  308. #endif /* STM8L15X_MD */
  309. ITC->ISPR6 &= Mask;
  310. ITC->ISPR6 |= NewPriority;
  311. break;
  312. #if !defined (STM8L15X_LD) && !defined (STM8L05X_LD_VL)
  313. case TIM1_CC_IRQn:
  314. #endif /* STM8L15X_LD */
  315. case TIM4_UPD_OVF_TRG_IRQn:
  316. case SPI1_IRQn:
  317. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  318. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  319. case USART1_TX_IRQn:
  320. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  321. case USART1_TX_TIM5_UPD_OVF_TRG_BRK_IRQn:
  322. #endif /* STM8L15X_MD */
  323. ITC->ISPR7 &= Mask;
  324. ITC->ISPR7 |= NewPriority;
  325. break;
  326. #if defined (STM8L15X_MD) || defined (STM8L15X_LD) || defined (STM8L05X_MD_VL) ||\
  327. defined (STM8AL31_L_MD) || defined (STM8L05X_LD_VL)
  328. case USART1_RX_IRQn:
  329. case I2C1_IRQn:
  330. #elif defined (STM8L15X_HD) || defined (STM8L15X_MDP) || defined (STM8L05X_HD_VL)
  331. case USART1_RX_TIM5_CC_IRQn:
  332. case I2C1_SPI2_IRQn:
  333. #endif /* STM8L15X_MD */
  334. ITC->ISPR8 &= Mask;
  335. ITC->ISPR8 |= NewPriority;
  336. break;
  337. default:
  338. break;
  339. }
  340. }
  341. /**
  342. * @}
  343. */
  344. /**
  345. * @}
  346. */
  347. /**
  348. * @}
  349. */
  350. /**
  351. * @}
  352. */
  353. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/