stm32f0xx_hal_irda_ex.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /**
  2. ******************************************************************************
  3. * @file stm32f0xx_hal_irda_ex.h
  4. * @author MCD Application Team
  5. * @brief Header file of IRDA HAL Extended module.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2016 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* Define to prevent recursive inclusion -------------------------------------*/
  19. #ifndef STM32F0xx_HAL_IRDA_EX_H
  20. #define STM32F0xx_HAL_IRDA_EX_H
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. #if defined(USART_IRDA_SUPPORT)
  25. /* Includes ------------------------------------------------------------------*/
  26. #include "stm32f0xx_hal_def.h"
  27. /** @addtogroup STM32F0xx_HAL_Driver
  28. * @{
  29. */
  30. /** @defgroup IRDAEx IRDAEx
  31. * @brief IRDA Extended HAL module driver
  32. * @{
  33. */
  34. /* Exported types ------------------------------------------------------------*/
  35. /* Exported constants --------------------------------------------------------*/
  36. /** @defgroup IRDAEx_Extended_Exported_Constants IRDAEx Extended Exported Constants
  37. * @{
  38. */
  39. /** @defgroup IRDAEx_Word_Length IRDAEx Word Length
  40. * @{
  41. */
  42. #if defined(USART_CR1_M1)&&defined(USART_CR1_M0)
  43. #define IRDA_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long frame */
  44. #define IRDA_WORDLENGTH_8B 0x00000000U /*!< 8-bit long frame */
  45. #define IRDA_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long frame */
  46. #else
  47. #if defined(USART_CR1_M)
  48. #define IRDA_WORDLENGTH_8B (0x00000000U) /*!< 8-bit long frame */
  49. #define IRDA_WORDLENGTH_9B USART_CR1_M /*!< 9-bit long frame */
  50. #endif /* USART_CR1_M1 */
  51. #endif /* USART_CR1_M1 && USART_CR1_M0 */
  52. /**
  53. * @}
  54. */
  55. /**
  56. * @}
  57. */
  58. /* Exported macros -----------------------------------------------------------*/
  59. /* Private macros ------------------------------------------------------------*/
  60. /** @defgroup IRDAEx_Private_Macros IRDAEx Private Macros
  61. * @{
  62. */
  63. /** @brief Report the IRDA clock source.
  64. * @param __HANDLE__ specifies the IRDA Handle.
  65. * @param __CLOCKSOURCE__ output variable.
  66. * @retval IRDA clocking source, written in __CLOCKSOURCE__.
  67. */
  68. #if defined(STM32F031x6) || defined(STM32F038xx)
  69. #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  70. do { \
  71. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  72. { \
  73. case RCC_USART1CLKSOURCE_PCLK1: \
  74. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  75. break; \
  76. case RCC_USART1CLKSOURCE_HSI: \
  77. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  78. break; \
  79. case RCC_USART1CLKSOURCE_SYSCLK: \
  80. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  81. break; \
  82. case RCC_USART1CLKSOURCE_LSE: \
  83. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  84. break; \
  85. default: \
  86. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  87. break; \
  88. } \
  89. } while(0)
  90. #elif defined (STM32F042x6) || defined (STM32F048xx) || defined (STM32F051x8) || defined (STM32F058xx)
  91. #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  92. do { \
  93. if((__HANDLE__)->Instance == USART1) \
  94. { \
  95. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  96. { \
  97. case RCC_USART1CLKSOURCE_PCLK1: \
  98. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  99. break; \
  100. case RCC_USART1CLKSOURCE_HSI: \
  101. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  102. break; \
  103. case RCC_USART1CLKSOURCE_SYSCLK: \
  104. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  105. break; \
  106. case RCC_USART1CLKSOURCE_LSE: \
  107. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  108. break; \
  109. default: \
  110. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  111. break; \
  112. } \
  113. } \
  114. else if((__HANDLE__)->Instance == USART2) \
  115. { \
  116. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  117. } \
  118. else \
  119. { \
  120. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  121. } \
  122. } while(0)
  123. #elif defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx)
  124. #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  125. do { \
  126. if((__HANDLE__)->Instance == USART1) \
  127. { \
  128. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  129. { \
  130. case RCC_USART1CLKSOURCE_PCLK1: \
  131. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  132. break; \
  133. case RCC_USART1CLKSOURCE_HSI: \
  134. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  135. break; \
  136. case RCC_USART1CLKSOURCE_SYSCLK: \
  137. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  138. break; \
  139. case RCC_USART1CLKSOURCE_LSE: \
  140. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  141. break; \
  142. default: \
  143. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  144. break; \
  145. } \
  146. } \
  147. else if((__HANDLE__)->Instance == USART2) \
  148. { \
  149. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  150. { \
  151. case RCC_USART2CLKSOURCE_PCLK1: \
  152. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  153. break; \
  154. case RCC_USART2CLKSOURCE_HSI: \
  155. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  156. break; \
  157. case RCC_USART2CLKSOURCE_SYSCLK: \
  158. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  159. break; \
  160. case RCC_USART2CLKSOURCE_LSE: \
  161. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  162. break; \
  163. default: \
  164. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  165. break; \
  166. } \
  167. } \
  168. else if((__HANDLE__)->Instance == USART3) \
  169. { \
  170. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  171. } \
  172. else if((__HANDLE__)->Instance == USART4) \
  173. { \
  174. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  175. } \
  176. else \
  177. { \
  178. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  179. } \
  180. } while(0)
  181. #elif defined(STM32F091xC) || defined(STM32F098xx)
  182. #define IRDA_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \
  183. do { \
  184. if((__HANDLE__)->Instance == USART1) \
  185. { \
  186. switch(__HAL_RCC_GET_USART1_SOURCE()) \
  187. { \
  188. case RCC_USART1CLKSOURCE_PCLK1: \
  189. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  190. break; \
  191. case RCC_USART1CLKSOURCE_HSI: \
  192. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  193. break; \
  194. case RCC_USART1CLKSOURCE_SYSCLK: \
  195. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  196. break; \
  197. case RCC_USART1CLKSOURCE_LSE: \
  198. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  199. break; \
  200. default: \
  201. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  202. break; \
  203. } \
  204. } \
  205. else if((__HANDLE__)->Instance == USART2) \
  206. { \
  207. switch(__HAL_RCC_GET_USART2_SOURCE()) \
  208. { \
  209. case RCC_USART2CLKSOURCE_PCLK1: \
  210. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  211. break; \
  212. case RCC_USART2CLKSOURCE_HSI: \
  213. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  214. break; \
  215. case RCC_USART2CLKSOURCE_SYSCLK: \
  216. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  217. break; \
  218. case RCC_USART2CLKSOURCE_LSE: \
  219. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  220. break; \
  221. default: \
  222. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  223. break; \
  224. } \
  225. } \
  226. else if((__HANDLE__)->Instance == USART3) \
  227. { \
  228. switch(__HAL_RCC_GET_USART3_SOURCE()) \
  229. { \
  230. case RCC_USART3CLKSOURCE_PCLK1: \
  231. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  232. break; \
  233. case RCC_USART3CLKSOURCE_HSI: \
  234. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_HSI; \
  235. break; \
  236. case RCC_USART3CLKSOURCE_SYSCLK: \
  237. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_SYSCLK; \
  238. break; \
  239. case RCC_USART3CLKSOURCE_LSE: \
  240. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_LSE; \
  241. break; \
  242. default: \
  243. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  244. break; \
  245. } \
  246. } \
  247. else if((__HANDLE__)->Instance == USART4) \
  248. { \
  249. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  250. } \
  251. else if((__HANDLE__)->Instance == USART5) \
  252. { \
  253. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  254. } \
  255. else if((__HANDLE__)->Instance == USART6) \
  256. { \
  257. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  258. } \
  259. else if((__HANDLE__)->Instance == USART7) \
  260. { \
  261. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  262. } \
  263. else if((__HANDLE__)->Instance == USART8) \
  264. { \
  265. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_PCLK1; \
  266. } \
  267. else \
  268. { \
  269. (__CLOCKSOURCE__) = IRDA_CLOCKSOURCE_UNDEFINED; \
  270. } \
  271. } while(0)
  272. #endif /* defined(STM32F031x6) || defined(STM32F038xx) */
  273. /** @brief Compute the mask to apply to retrieve the received data
  274. * according to the word length and to the parity bits activation.
  275. * @note If PCE = 1, the parity bit is not included in the data extracted
  276. * by the reception API().
  277. * This masking operation is not carried out in the case of
  278. * DMA transfers.
  279. * @param __HANDLE__ specifies the IRDA Handle.
  280. * @retval None, the mask to apply to the associated UART RDR register is stored in (__HANDLE__)->Mask field.
  281. */
  282. #if defined(USART_CR1_M1)&&defined(USART_CR1_M0)
  283. #define IRDA_MASK_COMPUTATION(__HANDLE__) \
  284. do { \
  285. if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B) \
  286. { \
  287. if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \
  288. { \
  289. (__HANDLE__)->Mask = 0x01FFU ; \
  290. } \
  291. else \
  292. { \
  293. (__HANDLE__)->Mask = 0x00FFU ; \
  294. } \
  295. } \
  296. else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B) \
  297. { \
  298. if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \
  299. { \
  300. (__HANDLE__)->Mask = 0x00FFU ; \
  301. } \
  302. else \
  303. { \
  304. (__HANDLE__)->Mask = 0x007FU ; \
  305. } \
  306. } \
  307. else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_7B) \
  308. { \
  309. if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \
  310. { \
  311. (__HANDLE__)->Mask = 0x007FU ; \
  312. } \
  313. else \
  314. { \
  315. (__HANDLE__)->Mask = 0x003FU ; \
  316. } \
  317. } \
  318. else \
  319. { \
  320. (__HANDLE__)->Mask = 0x0000U; \
  321. } \
  322. } while(0U)
  323. #else
  324. #if defined(USART_CR1_M)
  325. #define IRDA_MASK_COMPUTATION(__HANDLE__) \
  326. do { \
  327. if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_9B) \
  328. { \
  329. if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \
  330. { \
  331. (__HANDLE__)->Mask = 0x01FFU ; \
  332. } \
  333. else \
  334. { \
  335. (__HANDLE__)->Mask = 0x00FFU ; \
  336. } \
  337. } \
  338. else if ((__HANDLE__)->Init.WordLength == IRDA_WORDLENGTH_8B) \
  339. { \
  340. if ((__HANDLE__)->Init.Parity == IRDA_PARITY_NONE) \
  341. { \
  342. (__HANDLE__)->Mask = 0x00FFU ; \
  343. } \
  344. else \
  345. { \
  346. (__HANDLE__)->Mask = 0x007FU ; \
  347. } \
  348. } \
  349. } while(0U)
  350. #endif /* USART_CR1_M */
  351. #endif /* USART_CR1_M && USART_CR1_M0 */
  352. /** @brief Ensure that IRDA frame length is valid.
  353. * @param __LENGTH__ IRDA frame length.
  354. * @retval SET (__LENGTH__ is valid) or RESET (__LENGTH__ is invalid)
  355. */
  356. #if defined(USART_CR1_M1)&&defined(USART_CR1_M0)
  357. #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_7B) || \
  358. ((__LENGTH__) == IRDA_WORDLENGTH_8B) || \
  359. ((__LENGTH__) == IRDA_WORDLENGTH_9B))
  360. #else
  361. #if defined(USART_CR1_M)
  362. #define IS_IRDA_WORD_LENGTH(__LENGTH__) (((__LENGTH__) == IRDA_WORDLENGTH_8B) || \
  363. ((__LENGTH__) == IRDA_WORDLENGTH_9B))
  364. #endif /* USART_CR1_M */
  365. #endif /* USART_CR1_M && USART_CR1_M0 */
  366. /**
  367. * @}
  368. */
  369. /* Exported functions --------------------------------------------------------*/
  370. /**
  371. * @}
  372. */
  373. /**
  374. * @}
  375. */
  376. #endif /* USART_IRDA_SUPPORT */
  377. #ifdef __cplusplus
  378. }
  379. #endif
  380. #endif /* STM32F0xx_HAL_IRDA_EX_H */