HAL_OPA.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. ******************************************************************************
  3. * @file HAL_OPA.c
  4. * @version V1.0.0
  5. * @date 2020
  6. * @brief OPA HAL module driver.
  7. * This file provides firmware functions to manage the following
  8. * functionalities of the Operational Amplifier (OPA).
  9. * @ Initialization and de-initialization functions
  10. * @ IO operation functions
  11. * @ Peripheral Control functions
  12. ******************************************************************************
  13. */
  14. #include "ACM32Fxx_HAL.h"
  15. /************************************************************************
  16. * function : HAL_OPA_MspInit
  17. * Description: OPA MCU specific initiation, such as IO share, module clock, ...
  18. * input :
  19. * OPA_HandleTypeDef *hopa: pointer to opa handle structure
  20. * return: none
  21. ************************************************************************/
  22. __weak void HAL_OPA_MspInit(OPA_HandleTypeDef* hopa)
  23. {
  24. /*
  25. NOTE : This function should be modified by the user.
  26. */
  27. /* For Example */
  28. GPIO_InitTypeDef GPIO_OPA;
  29. /* Enable Clock */
  30. System_Module_Enable(EN_OPA);
  31. if(hopa->Init.OpaX == OPA1)
  32. {
  33. /* OPA1 GPIO inition VINP:PB6*/
  34. /* OPA1 GPIO inition VINM:PB5*/
  35. /* OPA1 GPIO inition OPA1_VOUT:PC5*/
  36. GPIO_OPA.Pin = GPIO_PIN_5 | GPIO_PIN_6;
  37. GPIO_OPA.Mode = GPIO_MODE_ANALOG;
  38. GPIO_OPA.Pull = GPIO_NOPULL;
  39. HAL_GPIO_Init(GPIOB, &GPIO_OPA);
  40. GPIO_OPA.Pin = GPIO_PIN_5;
  41. GPIO_OPA.Mode = GPIO_MODE_ANALOG;
  42. GPIO_OPA.Pull = GPIO_NOPULL;
  43. HAL_GPIO_Init(GPIOC, &GPIO_OPA);
  44. }
  45. else if(hopa->Init.OpaX == OPA2)
  46. {
  47. /* OPA2 GPIO inition VINP:PB3*/
  48. /* OPA2 GPIO inition VINM:PB1*/
  49. /* OPA2 GPIO inition OPA2_VOUT:PB0*/
  50. GPIO_OPA.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_3;
  51. GPIO_OPA.Mode = GPIO_MODE_ANALOG;
  52. GPIO_OPA.Pull = GPIO_NOPULL;
  53. HAL_GPIO_Init(GPIOB, &GPIO_OPA);
  54. }
  55. else if(hopa->Init.OpaX == OPA3)
  56. {
  57. /* OPA3 GPIO inition VINP:PA7*/
  58. /* OPA3 GPIO inition VINM:PA5*/
  59. /* OPA3 GPIO inition OPA2_VOUT:PA6*/
  60. GPIO_OPA.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
  61. GPIO_OPA.Mode = GPIO_MODE_ANALOG;
  62. GPIO_OPA.Pull = GPIO_NOPULL;
  63. HAL_GPIO_Init(GPIOA, &GPIO_OPA);
  64. }
  65. }
  66. /************************************************************************
  67. * function : HAL_OPA_MspDeInit
  68. * Description: OPA MCU De-initiation, such as IO share, module clock, ...
  69. * input :
  70. * OPA_HandleTypeDef *hopa: pointer to opa handle structure
  71. * return: none
  72. ************************************************************************/
  73. __weak void HAL_OPA_MspDeInit(OPA_HandleTypeDef* hopa)
  74. {
  75. /*
  76. NOTE : This function should be modified by the user.
  77. */
  78. /* For Example */
  79. /* Reset the OPA */
  80. System_Module_Reset(RST_OPA);
  81. /* Disable Clock */
  82. System_Module_Disable(EN_OPA);
  83. }
  84. /************************************************************************
  85. * function : HAL_OPA_Init
  86. * Description: opa initial with parameters.
  87. * input :
  88. * OPA_HandleTypeDef *hopa: pointer to opa handle structure
  89. ************************************************************************/
  90. HAL_StatusTypeDef HAL_OPA_Init(OPA_HandleTypeDef* hopa)
  91. {
  92. __IO uint32_t *gu32RegCrx;
  93. uint8_t trim_value;
  94. uint32_t u32NvrTrimValue;
  95. /* Check the OPA handle allocation */
  96. if (hopa == NULL)
  97. {
  98. return HAL_ERROR;
  99. }
  100. /* Check the parameters */
  101. if(!IS_OPA_ALL_INSTANCE(hopa->Instance)) return HAL_ERROR;
  102. if(!IS_OPA_ALL_OPAX(hopa->Init.OpaX)) return HAL_ERROR;
  103. if(!IS_OPA_ALL_VINP(hopa->Init.VinPSel)) return HAL_ERROR;
  104. if(!IS_OPA_ALL_VINM(hopa->Init.VinMSel)) return HAL_ERROR;
  105. if(!IS_OPA_ALL_TRIM(hopa->Init.TrimEn)) return HAL_ERROR;
  106. if(hopa->Init.OpaX == OPA1)
  107. gu32RegCrx = &hopa->Instance->OPA1_CSR;
  108. else if(hopa->Init.OpaX == OPA2)
  109. gu32RegCrx = &hopa->Instance->OPA2_CSR;
  110. else if(hopa->Init.OpaX == OPA3)
  111. gu32RegCrx = &hopa->Instance->OPA3_CSR;
  112. /* Init the low level hardware : GPIO, CLOCK */
  113. HAL_OPA_MspInit(hopa);
  114. /* Select the Vin P */
  115. MODIFY_REG(*gu32RegCrx, OPA_CSR_VINPSEL_MASK, (hopa->Init.VinPSel)<<OPA_CSR_VINPSEL_POS);
  116. /* Select the Vin M */
  117. MODIFY_REG(*gu32RegCrx, OPA_CSR_VINMSEL_MASK, (hopa->Init.VinMSel)<<OPA_CSR_VINMSEL_POS);
  118. /* Enable the opa */
  119. SET_BIT(*gu32RegCrx, OPA_CSR_EN);
  120. /* Trim the opa */
  121. if(hopa->Init.TrimEn == OPA_CSR_TRIM_ENABLE)
  122. {
  123. /* Trim the OPA_CSR_CAL_H N channel */
  124. SET_BIT(*gu32RegCrx, OPA_CSR_CAL_H);
  125. CLEAR_BIT(*gu32RegCrx, OPA_CSR_CAL_L);
  126. for(trim_value=0;trim_value<32;trim_value++)
  127. {
  128. MODIFY_REG(*gu32RegCrx,OPA_CSR_TRIM_HIGH_MASK,(trim_value)<<OPA_CSR_TRIM_HIGH_POS);
  129. System_Delay(1000);
  130. if(READ_BIT(*gu32RegCrx,OPA_CSR_CAL_OUT)) break;
  131. }
  132. /* Trim the OPA_CSR_CAL_L P channel */
  133. SET_BIT(*gu32RegCrx, OPA_CSR_CAL_L);
  134. CLEAR_BIT(*gu32RegCrx, OPA_CSR_CAL_H);
  135. for(trim_value=0;trim_value<32;trim_value++)
  136. {
  137. MODIFY_REG(*gu32RegCrx,OPA_CSR_TRIM_LOW_MASK,(trim_value)<<OPA_CSR_TRIM_LOW_POS);
  138. System_Delay(1000);
  139. if(READ_BIT(*gu32RegCrx,OPA_CSR_CAL_OUT)) break;
  140. }
  141. }
  142. else
  143. {
  144. /* Use the Trim value */
  145. u32NvrTrimValue = *(volatile uint32_t*)(0x0008024C+(hopa->Init.OpaX-1)*4); //Read the OPA trim value;
  146. if(((~(u32NvrTrimValue>>16))&0xFFFF) != (u32NvrTrimValue&0xFFFF)) return HAL_ERROR;
  147. u32NvrTrimValue = u32NvrTrimValue & 0xFFFF;
  148. MODIFY_REG(*gu32RegCrx,OPA_CSR_TRIM_HIGH_MASK,((u32NvrTrimValue&0x1F)<<OPA_CSR_TRIM_HIGH_POS));
  149. MODIFY_REG(*gu32RegCrx,OPA_CSR_TRIM_LOW_MASK,(((u32NvrTrimValue>>5)&0x1F)<<OPA_CSR_TRIM_LOW_POS));
  150. System_Delay(1000);
  151. }
  152. /* After rim enable the opa*/
  153. SET_BIT(*gu32RegCrx, OPA_CSR_CAL_L);
  154. SET_BIT(*gu32RegCrx, OPA_CSR_CAL_H);
  155. return HAL_OK;
  156. }
  157. /************************************************************************
  158. * function : HAL_OPA_Enable
  159. * Description: opa enable.
  160. * input :
  161. * OPA_HandleTypeDef *hopa: pointer to opa handle structure
  162. ************************************************************************/
  163. HAL_StatusTypeDef HAL_OPA_Enable(OPA_HandleTypeDef* hopa)
  164. {
  165. __IO uint32_t *gu32RegCrx;
  166. /* Check the OPA handle allocation */
  167. if (hopa == NULL)
  168. {
  169. return HAL_ERROR;
  170. }
  171. /* Check the parameters */
  172. if(!IS_OPA_ALL_INSTANCE(hopa->Instance)) return HAL_ERROR;
  173. if(!IS_OPA_ALL_OPAX(hopa->Init.OpaX)) return HAL_ERROR;
  174. if(hopa->Init.OpaX == OPA1)
  175. gu32RegCrx = &hopa->Instance->OPA1_CSR;
  176. else if(hopa->Init.OpaX == OPA2)
  177. gu32RegCrx = &hopa->Instance->OPA2_CSR;
  178. else if(hopa->Init.OpaX == OPA3)
  179. gu32RegCrx = &hopa->Instance->OPA3_CSR;
  180. /* Enable the opa */
  181. SET_BIT(*gu32RegCrx, OPA_CSR_EN);
  182. return HAL_OK;
  183. }
  184. /************************************************************************
  185. * function : HAL_OPA_Disable
  186. * Description: opa disable.
  187. * input :
  188. * OPA_HandleTypeDef *hopa: pointer to opa handle structure
  189. ************************************************************************/
  190. HAL_StatusTypeDef HAL_OPA_Disable(OPA_HandleTypeDef* hopa)
  191. {
  192. __IO uint32_t *gu32RegCrx;
  193. /* Check the OPA handle allocation */
  194. if (hopa == NULL)
  195. {
  196. return HAL_ERROR;
  197. }
  198. /* Check the parameters */
  199. if(!IS_OPA_ALL_INSTANCE(hopa->Instance)) return HAL_ERROR;
  200. if(!IS_OPA_ALL_OPAX(hopa->Init.OpaX)) return HAL_ERROR;
  201. if(hopa->Init.OpaX == OPA1)
  202. gu32RegCrx = &hopa->Instance->OPA1_CSR;
  203. else if(hopa->Init.OpaX == OPA2)
  204. gu32RegCrx = &hopa->Instance->OPA2_CSR;
  205. else if(hopa->Init.OpaX == OPA3)
  206. gu32RegCrx = &hopa->Instance->OPA3_CSR;
  207. /* Disable the opa */
  208. CLEAR_BIT(*gu32RegCrx, OPA_CSR_EN);
  209. return HAL_OK;
  210. }