Relay.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*********************************************************************************************************
  2. * 模块名称:Relay.c
  3. * 摘 要:Relay模块
  4. * 当前版本:1.0.0
  5. * 作 者:anycrying
  6. * 完成日期:2024年04月11日
  7. * 内 容:
  8. * 注 意:
  9. **********************************************************************************************************
  10. * 取代版本:
  11. * 作 者:
  12. * 完成日期:
  13. * 修改内容:
  14. * 修改文件:
  15. *********************************************************************************************************/
  16. /*********************************************************************************************************
  17. * 包含头文件
  18. *********************************************************************************************************/
  19. #include "Relay.h"
  20. #include "Sn74hc573.h"
  21. #include "stdbool.h"
  22. /*********************************************************************************************************
  23. * 宏定义
  24. *********************************************************************************************************/
  25. /*********************************************************************************************************
  26. * 枚举结构体
  27. *********************************************************************************************************/
  28. /*********************************************************************************************************
  29. * 内部变量定义
  30. *********************************************************************************************************/
  31. /*********************************************************************************************************
  32. * 内部函数声明
  33. *********************************************************************************************************/
  34. static void ConfigRelayGPIO(void); //配置Relay的GPIO
  35. /*********************************************************************************************************
  36. * 内部函数实现
  37. *********************************************************************************************************/
  38. /*********************************************************************************************************
  39. * 函数名称:ConfigRelayGPIO
  40. * 函数功能:配置Relay的GPIO
  41. * 输入参数:void
  42. * 输出参数:void
  43. * 返 回 值:void
  44. * 创建日期:2024年04月11日
  45. * 注 意:
  46. *********************************************************************************************************/
  47. static void ConfigRelayGPIO(void)
  48. {
  49. //使能RCU相关时钟
  50. rcu_periph_clock_enable(RELAY_RCU);
  51. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_1); //设置GPIO模式
  52. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_1); //设置GPIO输出模式及速度
  53. gpio_bit_reset(RELAY_IO, RELAY_1); //将Relay_1默认状态设置为关闭
  54. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_2); //设置GPIO模式
  55. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_2); //设置GPIO输出模式及速度
  56. gpio_bit_reset(RELAY_IO, RELAY_2); //将Relay_2默认状态设置为关闭
  57. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_3); //设置GPIO模式
  58. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_3); //设置GPIO输出模式及速度
  59. gpio_bit_reset(RELAY_IO, RELAY_3); //将Relay_3默认状态设置为关闭
  60. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_4); //设置GPIO模式
  61. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_4); //设置GPIO输出模式及速度
  62. gpio_bit_reset(RELAY_IO, RELAY_4); //将Relay_4默认状态设置为关闭
  63. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_5); //设置GPIO模式
  64. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_5); //设置GPIO输出模式及速度
  65. gpio_bit_reset(RELAY_IO, RELAY_5); //将Relay_5默认状态设置为关闭
  66. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_6); //设置GPIO模式
  67. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_6); //设置GPIO输出模式及速度
  68. gpio_bit_reset(RELAY_IO, RELAY_6); //将Relay_6默认状态设置为关闭
  69. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_7); //设置GPIO模式
  70. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_7); //设置GPIO输出模式及速度
  71. gpio_bit_reset(RELAY_IO, RELAY_7); //将Relay_7默认状态设置为关闭
  72. gpio_mode_set(RELAY_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, RELAY_8); //设置GPIO模式
  73. gpio_output_options_set(RELAY_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_8); //设置GPIO输出模式及速度
  74. gpio_bit_reset(RELAY_IO, RELAY_8);
  75. //将Relay_8默认状态设置为关闭
  76. }
  77. /*********************************************************************************************************
  78. * API函数实现
  79. *********************************************************************************************************/
  80. /*********************************************************************************************************
  81. * 函数名称:InitRelay
  82. * 函数功能:初始化LED模块
  83. * 输入参数:void
  84. * 输出参数:void
  85. * 返 回 值:void
  86. * 创建日期:2024年04月11日
  87. * 注 意:
  88. *********************************************************************************************************/
  89. void InitRelay(void)
  90. {
  91. ConfigRelayGPIO(); //配置RELAY的GPIO
  92. }
  93. /*********************************************************************************************************
  94. * 函数名称:Relay1State
  95. * 函数功能:Relay1State模块,控制继电器和更新通道状态
  96. * 输入参数:RLx:第x路继电器,st:继电器状态
  97. * 输出参数:void
  98. * 返 回 值:void
  99. * 创建日期:2024年04月11日
  100. * 注 意:
  101. *********************************************************************************************************/
  102. void Relayx_Onoff_state(uint8_t RLx,uint8_t st)
  103. {
  104. switch(RLx)
  105. {
  106. case RELAY1:
  107. {
  108. if(st == RELAY_ON)
  109. {
  110. RELAY_1_ON;
  111. }
  112. else
  113. {
  114. RELAY_1_OFF;
  115. }
  116. break;
  117. }
  118. case RELAY2:
  119. {
  120. if(st == RELAY_ON)
  121. {
  122. RELAY_2_ON;
  123. }
  124. else
  125. {
  126. RELAY_2_OFF;
  127. }
  128. break;
  129. }
  130. case RELAY3:
  131. {
  132. if(st == RELAY_ON)
  133. {
  134. RELAY_3_ON;
  135. }
  136. else
  137. {
  138. RELAY_3_OFF;
  139. }
  140. break;
  141. }
  142. case RELAY4:
  143. {
  144. if(st == RELAY_ON)
  145. {
  146. RELAY_4_ON;
  147. }
  148. else
  149. {
  150. RELAY_4_OFF;
  151. }
  152. break;
  153. }
  154. case RELAY5:
  155. {
  156. if(st == RELAY_ON)
  157. {
  158. RELAY_5_ON;
  159. }
  160. else
  161. {
  162. RELAY_5_OFF;
  163. }
  164. break;
  165. }
  166. case RELAY6:
  167. {
  168. if(st == RELAY_ON)
  169. {
  170. RELAY_6_ON;
  171. }
  172. else
  173. {
  174. RELAY_6_OFF;
  175. }
  176. break;
  177. }
  178. case RELAY7:
  179. {
  180. if(st == RELAY_ON)
  181. {
  182. RELAY_7_ON;
  183. }
  184. else
  185. {
  186. RELAY_7_OFF;
  187. }
  188. break;
  189. }
  190. case RELAY8:
  191. {
  192. if(st == RELAY_ON)
  193. {
  194. RELAY_8_ON;
  195. }
  196. else
  197. {
  198. RELAY_8_OFF;
  199. }
  200. break;
  201. }
  202. default:
  203. {
  204. RELAY_1_OFF;
  205. RELAY_2_OFF;
  206. RELAY_3_OFF;
  207. RELAY_4_OFF;
  208. RELAY_5_OFF;
  209. RELAY_6_OFF;
  210. RELAY_7_OFF;
  211. RELAY_8_OFF;
  212. break;
  213. }
  214. }
  215. }
  216. void IoInit(void)
  217. {
  218. rcu_periph_clock_enable(RCU_GPIOB);
  219. rcu_periph_clock_enable(RCU_GPIOC);
  220. gpio_mode_set(IO_RCU_C, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, IO_RST);
  221. gpio_mode_set(IO_RCU_B, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, IO_TEST);
  222. }
  223. bool get_rst()
  224. {
  225. FlagStatus status = SET;
  226. bool ret = false;
  227. uint32_t count = 50;
  228. if((status = gpio_input_bit_get(IO_RCU_C,IO_RST)) == RESET)
  229. {
  230. while(count--);
  231. if((status = gpio_input_bit_get(IO_RCU_C,IO_RST)) == RESET)
  232. {
  233. ret = true;
  234. }
  235. }
  236. return ret;
  237. }
  238. bool get_test()
  239. {
  240. FlagStatus status = SET;
  241. bool ret = false;
  242. uint32_t count = 50;
  243. if((status = gpio_input_bit_get(IO_RCU_B,IO_TEST)) == RESET)
  244. {
  245. while(count--);
  246. if((status = gpio_input_bit_get(IO_RCU_B,IO_TEST)) == RESET)
  247. {
  248. ret = true;
  249. }
  250. }
  251. return ret;
  252. }