cmem7_gpio.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /**
  2. *****************************************************************************
  3. * @file cmem7_gpio.c
  4. *
  5. * @brief CMEM7 GPIO source file
  6. *
  7. *
  8. * @version V1.0
  9. * @date 3. September 2013
  10. *
  11. * @note
  12. *
  13. *****************************************************************************
  14. * @attention
  15. *
  16. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  17. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  18. * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  19. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  20. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  21. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  22. *
  23. * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
  24. *****************************************************************************
  25. */
  26. #include "cmem7_gpio.h"
  27. #define GPIO_GROUP_GPIO_H (GPIO_GROUP_GPIO + 1)
  28. #define GPIO_GROUP_GPIO_N (GPIO_GROUP_GPIO + 2)
  29. #define IS_INNER_GPIO_GROUP(GROUP) (((GROUP) == GPIO_GROUP_GPIO) || \
  30. ((GROUP) == GPIO_GROUP_GPIO_H) || \
  31. ((GROUP) == GPIO_GROUP_GPIO_N))
  32. #define GPIO_PWM_CHANNEL_GPIO_H_9 (GPIO_PWM_CHANNEL_GPIO_31 + 1)
  33. #define GPIO_PWM_CHANNEL_GPIO_H_19 (GPIO_PWM_CHANNEL_GPIO_31 + 2)
  34. #define GPIO_PWM_CHANNEL_GPIO_H_20 (GPIO_PWM_CHANNEL_GPIO_31 + 3)
  35. #define IS_INNER_GPIO_PWM_CHANNEL(CHANNEL) (((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_31) || \
  36. ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_9) || \
  37. ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_19) || \
  38. ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_20))
  39. static uint32_t gpio_GetClock() {
  40. return SYSTEM_CLOCK_FREQ / (1 << (GLOBAL_CTRL->CLK_SEL_0_b.GPIO_CLK + 1));
  41. }
  42. void GPIO_Init(uint8_t Group, uint32_t PositiveTrigger) {
  43. assert_param(IS_GPIO_GROUP(Group));
  44. if (Group == GPIO_GROUP_GPIO) {
  45. GPIO->GPIO_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
  46. } else if (Group == GPIO_GROUP_GPIO_H) {
  47. GPIO->GPIO_H_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
  48. } else {
  49. GPIO->GPIO_N_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
  50. }
  51. }
  52. void GPIO_EnableOutput(uint8_t Group, uint32_t Enable) {
  53. assert_param(IS_GPIO_GROUP(Group));
  54. if (Group == GPIO_GROUP_GPIO) {
  55. GPIO->GPIO_OE = Enable;
  56. } else if (Group == GPIO_GROUP_GPIO_H) {
  57. GPIO->GPIO_H_OE = Enable;
  58. } else {
  59. GPIO->GPIO_N_OE = Enable;
  60. }
  61. }
  62. void GPIO_EnableInt(uint8_t Group, uint32_t Enable) {
  63. assert_param(IS_GPIO_GROUP(Group));
  64. if (Group == GPIO_GROUP_GPIO) {
  65. GPIO->GPIO_INT_MASK = ~Enable;
  66. } else if (Group == GPIO_GROUP_GPIO_H) {
  67. GPIO->GPIO_H_INT_MASK = ~Enable;
  68. } else {
  69. GPIO->GPIO_N_INT_MASK = ~Enable;
  70. }
  71. }
  72. uint32_t GPIO_GetIntStatus(uint8_t Group) {
  73. assert_param(IS_GPIO_GROUP(Group));
  74. if (Group == GPIO_GROUP_GPIO) {
  75. return GPIO->GPIO_INT_STATUS;
  76. } else if (Group == GPIO_GROUP_GPIO_H) {
  77. return GPIO->GPIO_H_INT_STATUS;
  78. }
  79. return GPIO->GPIO_N_INT_STATUS;
  80. }
  81. void GPIO_ClearInt(uint8_t Group, uint32_t Clear) {
  82. assert_param(IS_GPIO_GROUP(Group));
  83. if (Group == GPIO_GROUP_GPIO) {
  84. GPIO->GPIO_INT_STATUS = Clear;
  85. } else if (Group == GPIO_GROUP_GPIO_H) {
  86. GPIO->GPIO_H_INT_STATUS = Clear;
  87. } else {
  88. GPIO->GPIO_N_INT_STATUS = Clear;
  89. }
  90. }
  91. uint32_t GPIO_Read(uint8_t Group) {
  92. uint32_t data;
  93. assert_param(IS_GPIO_GROUP(Group));
  94. if (Group == GPIO_GROUP_GPIO) {
  95. data = GPIO->GPIO_IN;
  96. } else if (Group == GPIO_GROUP_GPIO_H) {
  97. data = GPIO->GPIO_H_IN;
  98. } else {
  99. data = GPIO->GPIO_N_IN;
  100. }
  101. return data;
  102. }
  103. void GPIO_Write(uint8_t Group, uint32_t Unmask, uint32_t data) {
  104. assert_param(IS_GPIO_GROUP(Group));
  105. if (Group == GPIO_GROUP_GPIO) {
  106. GPIO->GPIO_OUT_UNMASK = Unmask;
  107. GPIO->GPIO_OUT_DATA = data;
  108. } else if (Group == GPIO_GROUP_GPIO_H) {
  109. GPIO->GPIO_H_OUT_UNMASK = Unmask;
  110. GPIO->GPIO_H_OUT_DATA = data;
  111. } else {
  112. GPIO->GPIO_N_OUT_UNMASK = Unmask;
  113. GPIO->GPIO_N_OUT_DATA = data;
  114. }
  115. }
  116. void GPIO_InitPwm(uint8_t Channel, uint32_t HighLevelNanoSecond, uint32_t LowLevelNanoSecond) {
  117. uint16_t lowTick, highTick;
  118. assert_param(IS_GPIO_PWM_CHANNEL(Channel));
  119. lowTick = LowLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
  120. highTick = HighLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
  121. lowTick = (lowTick < 1) ? lowTick : lowTick - 1;
  122. highTick = (highTick < 1) ? highTick : highTick - 1;
  123. if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
  124. GPIO->PWM_OUT0_LEN_b.LOW_LEVEL_TICK = lowTick;
  125. GPIO->PWM_OUT0_LEN_b.HIGH_LEVEL_TICK = highTick;
  126. } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
  127. GPIO->PWM_OUT1_LEN_b.LOW_LEVEL_TICK = lowTick;
  128. GPIO->PWM_OUT1_LEN_b.HIGH_LEVEL_TICK = highTick;
  129. } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
  130. GPIO->PWM_OUT2_LEN_b.LOW_LEVEL_TICK = lowTick;
  131. GPIO->PWM_OUT2_LEN_b.HIGH_LEVEL_TICK = highTick;
  132. } else {
  133. GPIO->PWM_OUT3_LEN_b.LOW_LEVEL_TICK = lowTick;
  134. GPIO->PWM_OUT3_LEN_b.HIGH_LEVEL_TICK = highTick;
  135. }
  136. }
  137. void GPIO_EnablePwm(uint8_t Channel, BOOL Enable) {
  138. assert_param(IS_GPIO_PWM_CHANNEL(Channel));
  139. if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
  140. GPIO->PWM_OUT_EN_b.GPIO_31 = Enable;
  141. GPIO->PWM_OUT_SEL_b.GPIO_31 = Enable;
  142. } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
  143. GPIO->PWM_OUT_EN_b.GPIO_H_9 = Enable;
  144. GPIO->PWM_OUT_SEL_b.GPIO_H_9 = Enable;
  145. } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
  146. GPIO->PWM_OUT_EN_b.GPIO_H_19 = Enable;
  147. GPIO->PWM_OUT_SEL_b.GPIO_H_19 = Enable;
  148. } else {
  149. GPIO->PWM_OUT_EN_b.GPIO_H_20 = Enable;
  150. GPIO->PWM_OUT_SEL_b.GPIO_H_20 = Enable;
  151. }
  152. }
  153. /**
  154. xjf 20150324
  155. **/
  156. void GPIO_SetBits(uint32_t mask)
  157. {
  158. static uint32_t g_GPIO_OUT_UNMASK;
  159. static uint32_t g_GPIO_OUT_DATA;
  160. static uint32_t g_GPIO_OE;
  161. g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
  162. g_GPIO_OUT_DATA = GPIO->GPIO_OUT_DATA ;
  163. g_GPIO_OE = GPIO->GPIO_OE ;
  164. g_GPIO_OUT_UNMASK |=mask;
  165. g_GPIO_OE |=mask;
  166. g_GPIO_OUT_DATA |=mask;
  167. GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
  168. GPIO->GPIO_OUT_DATA =g_GPIO_OUT_DATA ;
  169. GPIO->GPIO_OE =g_GPIO_OE ;
  170. }
  171. void GPIO_clrBits(uint32_t mask)
  172. {
  173. static uint32_t g_GPIO_OUT_UNMASK;
  174. static uint32_t g_GPIO_OUT_DATA;
  175. static uint32_t g_GPIO_OE;
  176. g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
  177. g_GPIO_OUT_DATA = GPIO->GPIO_OUT_DATA ;
  178. g_GPIO_OE = GPIO->GPIO_OE ;
  179. g_GPIO_OUT_UNMASK |=mask;
  180. g_GPIO_OE |=mask;
  181. g_GPIO_OUT_DATA &=(~ mask);
  182. GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
  183. GPIO->GPIO_OUT_DATA =g_GPIO_OUT_DATA ;
  184. GPIO->GPIO_OE =g_GPIO_OE ;
  185. }
  186. uint32_t GPIO_getBits(uint32_t mask)
  187. {
  188. static uint32_t g_GPIO_OUT_UNMASK;
  189. //static uint32_t g_GPIO_OUT_DATA;
  190. static uint32_t g_GPIO_OE;
  191. uint32_t get_delay = 0;
  192. uint32_t saved_mask;
  193. saved_mask=mask;
  194. g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
  195. g_GPIO_OE = GPIO->GPIO_OE ;
  196. g_GPIO_OUT_UNMASK &=(~mask);
  197. g_GPIO_OE &=(~mask);
  198. GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
  199. GPIO->GPIO_OE =g_GPIO_OE ;
  200. for(get_delay=0;get_delay<100;get_delay++)
  201. {
  202. }
  203. //get_delay=(GPIO->GPIO_IN)&saved_mask;
  204. if(((GPIO->GPIO_IN)&saved_mask)==saved_mask)
  205. {
  206. return(1);
  207. }
  208. else
  209. {
  210. return(0);
  211. }
  212. }
  213. /**
  214. xjf 20150324
  215. **/