Driver.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. /*--------------------------------------------------------------------------------------
  2. * @file Driver.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief 硬件驱动
  7. ---------------------------------------------------------------------------------------*/
  8. #include "stm32f10x_rcc.h"
  9. #include "stm32f10x_gpio.h"
  10. #include "stm32f10x.h"
  11. #include "stm32f10x_exti.h"
  12. #include "stm32f10x_dma.h"
  13. #include "stm32f10x_adc.h"
  14. #include "stm32f10x_tim.h"
  15. #include "stm32f10x_pwr.h"
  16. #include "stm32f10x_rtc.h"
  17. #include "stm32f10x_bkp.h"
  18. #include "TypeDefine.h"
  19. #include "TimerSetup.h"
  20. #include "IICSetup.h"
  21. #include "IIC2Setup.h"
  22. #include "ADS1110Setup.h"
  23. #include "ADS1110ASetup.h"
  24. #include "ADCSetup.h"
  25. #include "SPISetup.h"
  26. #include "USARTSetup.h"
  27. #include "RTCSetup.h"
  28. #include "HostSlaveHandle.h"
  29. #include "Driver.h"
  30. #include "lorawan.h"
  31. #include <stdio.h>
  32. #include "Bubble_ADCSetup.h"
  33. #include "delay.h"
  34. #include "ControlSystem.h"
  35. extern uint8_t Recive_lorawanID_flag; //接收LORAWAN ID号
  36. uint8_t mcu_id[8]; //mcu ID号缓冲区
  37. extern uint16_t random_cont; //随机数种子值
  38. /*************************************************************************************
  39. * Function: DriverSpeakerInit
  40. * Object: Configures SPEAKER GPIO.
  41. * 输入: 无
  42. * 输出: 无
  43. * 备注: PB14
  44. **************************************************************************************/
  45. void DriverSpeakerInit( void )
  46. {
  47. /*定义一个GPIO_InitTypeDef类型的结构体*/
  48. GPIO_InitTypeDef GPIO_InitStructure;
  49. /* Enable the GPIO_SPEAKER Clock */
  50. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  51. /*选择要控制的GPIOC引脚*/
  52. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  53. /*设置引脚模式为通用推挽输出*/
  54. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  55. /*设置引脚速率为50MHz */
  56. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57. /*调用库函数,初始化GPIOB*/
  58. GPIO_Init(GPIOB, &GPIO_InitStructure);
  59. /* 关闭锋鸣器 */
  60. // GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  61. }
  62. /*************************************************************************************
  63. * Function: DriverLCDPWRInit
  64. * Object: Configures LCD Power GPIO.
  65. * 输入: 无
  66. * 输出: 无
  67. * 备注: PB6
  68. **************************************************************************************/
  69. void DriverLCDPWRInit( void )
  70. {
  71. /*定义一个GPIO_InitTypeDef类型的结构体*/
  72. GPIO_InitTypeDef GPIO_InitStructure;
  73. /* Enable the GPIO_SPEAKER Clock */
  74. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  75. /*选择要控制的GPIOC引脚*/
  76. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  77. /*设置引脚模式为通用推挽输出*/
  78. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  79. /*设置引脚速率为50MHz */
  80. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  81. /*调用库函数,初始化GPIOB*/
  82. GPIO_Init(GPIOB, &GPIO_InitStructure);
  83. /* 主机关闭LCD电源 */
  84. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  85. /* Enable the GPIO_SPEAKER Clock */
  86. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  87. /*选择要控制的GPIOC引脚*/
  88. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  89. /*设置引脚模式为通用推挽输出*/
  90. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  91. /*设置引脚速率为50MHz */
  92. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  93. /*调用库函数,初始化GPIOB*/
  94. GPIO_Init(GPIOA, &GPIO_InitStructure);
  95. /* 主机关闭LCD电源 */
  96. // GPIO_SetBits(GPIOA,GPIO_Pin_11);
  97. }
  98. /*************************************************************************************
  99. * Function: DriverZigbeePWRInit
  100. * Object: Configures Zigbee PWR GPIO.
  101. * 输入: 无
  102. * 输出: 无
  103. * 备注: PB12
  104. **************************************************************************************/
  105. void DriverZigbeePWRInit( void )
  106. {
  107. /*定义一个GPIO_InitTypeDef类型的结构体*/
  108. GPIO_InitTypeDef GPIO_InitStructure;
  109. /* Enable the GPIO_SPEAKER Clock */
  110. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  111. /*选择要控制的GPIOC引脚*/
  112. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  113. /*设置引脚模式为通用推挽输出*/
  114. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  115. /*设置引脚速率为50MHz */
  116. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  117. /*调用库函数,初始化GPIOB*/
  118. GPIO_Init(GPIOB, &GPIO_InitStructure);
  119. /* 主机关闭zigbee电源 */
  120. //GPIO_SetBits(GPIOB,GPIO_Pin_12);
  121. //开电源
  122. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  123. /* 将控制zigbee板的电源引脚设置为悬空 */
  124. /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  125. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  126. GPIO_Init(GPIOC, &GPIO_InitStructure);*/
  127. // /* Enable the GPIO_SPEAKER Clock */
  128. // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  129. //
  130. // /*选择要控制的GPIOC引脚*/
  131. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  132. // /*设置引脚模式为通用推挽输出*/
  133. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  134. // /*调用库函数,初始化GPIOB*/
  135. // GPIO_Init(GPIOA, &GPIO_InitStructure);
  136. }
  137. /*************************************************************************************
  138. * Function: DriverKeyInit
  139. * Object: Configures KEY GPIO.
  140. * 初始化按键,包括中断
  141. * 输入: 无
  142. * 输出: 无
  143. * 备注: PE8 PE9 PE10 PE11 PE12 PE13 PE14 PE15
  144. EXTI9_5_IRQn、EXTI15_10_IRQn要分开初始化
  145. **************************************************************************************/
  146. void DriverKeyInit( void )
  147. {
  148. /*定义一个GPIO_InitTypeDef类型的结构体*/
  149. GPIO_InitTypeDef GPIO_InitStructure;
  150. EXTI_InitTypeDef EXTI_InitStructure;
  151. NVIC_InitTypeDef NVIC_InitStructure;
  152. /* Enable the GPIO_KEY Clock */
  153. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
  154. /* Configyre P[A|B|C|D|E]0 NIVC */
  155. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  156. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  157. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  158. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  159. NVIC_Init(&NVIC_InitStructure);
  160. /* Configyre P[A|B|C|D|E]0 NIVC */
  161. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  162. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  163. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  164. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  165. NVIC_Init(&NVIC_InitStructure);
  166. /* 选择要控制的GPIOE引脚,IO配置 PE8/PE9/PE10/PE11/PE12/PE13/PE14/PE15 下拉输入 */
  167. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  168. | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  169. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  170. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  171. GPIO_Init(GPIOE, &GPIO_InitStructure);
  172. /* 选择要控制的GPIOB引脚,IO配置 PB15 下拉输入 */
  173. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  174. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  175. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  176. GPIO_Init(GPIOB, &GPIO_InitStructure);
  177. /*外部中断模式设置 EXTI line(PB15) mode config */
  178. // GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource15);
  179. // EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  180. // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  181. // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  182. // EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  183. // EXTI_Init(&EXTI_InitStructure);
  184. /*外部中断模式设置 EXTI line(PE8) mode config */
  185. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource8);
  186. EXTI_InitStructure.EXTI_Line = EXTI_Line8;
  187. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  188. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  189. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  190. EXTI_Init(&EXTI_InitStructure);
  191. /*外部中断模式设置 EXTI line(PE9) mode config */
  192. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource9);
  193. EXTI_InitStructure.EXTI_Line = EXTI_Line9;
  194. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  195. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  196. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  197. EXTI_Init(&EXTI_InitStructure);
  198. /*外部中断模式设置 EXTI line(PE10) mode config */
  199. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource10);
  200. EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  201. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  202. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  203. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  204. EXTI_Init(&EXTI_InitStructure);
  205. /*外部中断模式设置 EXTI line(PE11) mode config */
  206. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource11);
  207. EXTI_InitStructure.EXTI_Line = EXTI_Line11;
  208. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  209. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  210. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  211. EXTI_Init(&EXTI_InitStructure);
  212. /*外部中断模式设置 EXTI line(PE12) mode config */
  213. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource12);
  214. EXTI_InitStructure.EXTI_Line = EXTI_Line12;
  215. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  216. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  217. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  218. EXTI_Init(&EXTI_InitStructure);
  219. /*外部中断模式设置 EXTI line(PE13) mode config */
  220. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource13);
  221. EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  222. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  223. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  224. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  225. EXTI_Init(&EXTI_InitStructure);
  226. /*外部中断模式设置 EXTI line(PE14) mode config */
  227. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource14);
  228. EXTI_InitStructure.EXTI_Line = EXTI_Line14;
  229. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  230. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  231. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  232. EXTI_Init(&EXTI_InitStructure);
  233. /*外部中断模式设置 EXTI line(PE15) mode config */
  234. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource15);
  235. EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  236. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  237. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  238. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  239. EXTI_Init(&EXTI_InitStructure);
  240. }
  241. /*************************************************************************************
  242. * Function: PowerKeySave
  243. * Object: Configures POWER GPIO Save Mode.
  244. * 仅配置了电源控制引脚完全关闭
  245. * 输入: 无
  246. * 输出: 无
  247. * 备注: PE15
  248. **************************************************************************************/
  249. void PowerKeySave( void )
  250. {
  251. /*定义一个GPIO_InitTypeDef类型的结构体*/
  252. GPIO_InitTypeDef GPIO_InitStructure;
  253. /* 选择要控制的GPIOA引脚,IO配置 PE9/PE10/PE11/PE12/PE13/PE14/PE8 下拉输入 */
  254. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  255. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  256. GPIO_Init(GPIOE, &GPIO_InitStructure);
  257. }
  258. /*************************************************************************************
  259. * Function: DriverMotorInit
  260. * Object: Configures MOTOR GPIO.
  261. * 仅配置了电机控制引脚
  262. * 输入: 无
  263. * 输出: 无
  264. * 备注: PB13
  265. **************************************************************************************/
  266. void DriverMotorInit( void )
  267. {
  268. /*定义一个GPIO_InitTypeDef类型的结构体*/
  269. GPIO_InitTypeDef GPIO_InitStructure;
  270. //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);
  271. /* 启动GPIO */
  272. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  273. /* 启动AFIO */
  274. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  275. /* 启动TIM1 */
  276. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  277. /* PB.13口设置为TIM1_CH1N */
  278. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  279. /*设置引脚模式为通用推挽输出*/
  280. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;
  281. /*设置引脚速率为50MHz */
  282. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  283. /*调用库函数,初始化GPIOB*/
  284. GPIO_Init(GPIOB, &GPIO_InitStructure);
  285. /* 关闭电机 */
  286. // GPIO_SetBits(GPIOB,GPIO_Pin_13);
  287. }
  288. /*************************************************************************************
  289. * Function: DriverHallInit
  290. * Object: Configures Hall GPIO.
  291. * 输入: 无
  292. * 输出: 无
  293. * 备注: PA1/PA6
  294. **************************************************************************************/
  295. void DriverHallInit( void )
  296. {
  297. /*定义一个GPIO_InitTypeDef类型的结构体*/
  298. GPIO_InitTypeDef GPIO_InitStructure;
  299. EXTI_InitTypeDef EXTI_InitStructure;
  300. NVIC_InitTypeDef NVIC_InitStructure;
  301. /* Enable the GPIO_KEY Clock */
  302. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  303. /* Configyre P[A|B|C|D|E]0 NIVC */
  304. /*NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  305. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  306. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  307. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  308. NVIC_Init(&NVIC_InitStructure); */
  309. /* Configyre P[A|B|C|D|E]0 NIVC */
  310. NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  311. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//1
  312. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;// 1
  313. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  314. NVIC_Init(&NVIC_InitStructure);
  315. /* 选择要控制的GPIOE引脚,IO配置 PA1/PA6 上拉输入 */
  316. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  317. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  318. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPD
  319. GPIO_Init(GPIOA, &GPIO_InitStructure);
  320. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  321. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  322. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_Out_PP
  323. GPIO_Init(GPIOA, &GPIO_InitStructure);
  324. /*外部中断模式设置 EXTI line(PA1) mode config */
  325. /*GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
  326. EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  327. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  328. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  329. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  330. EXTI_Init(&EXTI_InitStructure); */
  331. /*外部中断模式设置 EXTI line(PA6) mode config */
  332. GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
  333. EXTI_InitStructure.EXTI_Line = EXTI_Line6;
  334. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  335. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  336. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  337. EXTI_Init(&EXTI_InitStructure);
  338. }
  339. /*************************************************************************************
  340. * Function: DriverSavePinInit
  341. * Object: 配置除电源控制键外所有用的引脚全部不可用,用来做节能模式
  342. * 输入: 无
  343. * 输出: 无
  344. * 备注: PE15电源键 PE9/10/11/12/13/14/15
  345. **************************************************************************************/
  346. void DriverSavePinInit( void )
  347. {
  348. // /*定义一个GPIO_InitTypeDef类型的结构体*/
  349. // GPIO_InitTypeDef GPIO_InitStructure;
  350. // /* 选择要控制的GPIOA引脚,IO配置成低功耗模式 */
  351. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
  352. // | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  353. // | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  354. // | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  355. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  356. // GPIO_Init(GPIOA, &GPIO_InitStructure);
  357. //
  358. // /* 选择要控制的GPIOB引脚,IO配置成低功耗模式 */
  359. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
  360. // | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  361. // | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  362. // | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  363. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  364. // GPIO_Init(GPIOB, &GPIO_InitStructure);
  365. //
  366. // /* 选择要控制的GPIOC引脚,IO配置成低功耗模式 */
  367. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
  368. // | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  369. // | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  370. // | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  371. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  372. // GPIO_Init(GPIOC, &GPIO_InitStructure);
  373. //
  374. // /* 选择要控制的GPIOD引脚,IO配置成低功耗模式 */
  375. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
  376. // | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  377. // | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  378. // | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  379. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  380. // GPIO_Init(GPIOD, &GPIO_InitStructure);
  381. //
  382. // /* 选择要控制的GPIOE引脚,IO配置成低功耗模式 */
  383. // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3
  384. // | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7
  385. // | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
  386. // | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
  387. // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  388. // GPIO_Init(GPIOE, &GPIO_InitStructure);
  389. }
  390. /*********************************************************************************
  391. * Function: SpeakerCtl
  392. * Object: 蜂鸣器控制
  393. * 输入: 蜂鸣器控制状态
  394. * 输出: 无
  395. * 备注: uint8_t driverState:DRIVER_ON蜂鸣器打开,DRIVER_OFF蜂鸣器关闭
  396. **********************************************************************************/
  397. void SpeakerCtl( uint8_t driverState )
  398. {
  399. if( driverState == DRIVER_ON )
  400. {
  401. GPIO_SetBits(GPIOB,GPIO_Pin_14);
  402. }
  403. else
  404. {
  405. GPIO_ResetBits(GPIOB,GPIO_Pin_14);
  406. }
  407. }
  408. /*********************************************************************************
  409. * Function: SensorPWRCtl
  410. * Object: Sensor电源控制
  411. * 输入: Sensor控制状态
  412. * 输出: 无
  413. * 备注: uint8_t driverState:DRIVER_ON传感器电源打开;DRIVER_OFF传感器电源关闭
  414. **********************************************************************************/
  415. void SensorPWRCtl( uint8_t driverState )
  416. {
  417. if( driverState == DRIVER_ON )
  418. {
  419. GPIO_ResetBits(GPIOB,GPIO_Pin_6); //打开红外检测传感器电源
  420. GPIO_SetBits(GPIOA,GPIO_Pin_1); //使能红外检测传感器
  421. }
  422. else
  423. {
  424. GPIO_SetBits(GPIOB,GPIO_Pin_6);
  425. GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  426. }
  427. }
  428. /********************************************************************************************************
  429. * Function: Power_GPIOInit
  430. * Object: 单片机引动初始化
  431. * 输入: 无
  432. * 输出: 无
  433. * 备注: PA8电机电路电源芯片使能脚
  434. PD5主控电源控制管脚
  435. ********************************************************************************************************/
  436. void Power_GPIOInit(void)
  437. {
  438. GPIO_InitTypeDef GPIO_InitStructure;
  439. /* Enable the GPIOA/GPIOB Clock */
  440. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  441. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  442. /* Configure the GPIO_MainPOWER pin */
  443. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  444. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  445. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  446. GPIO_Init(GPIOD, &GPIO_InitStructure);
  447. /* 打开总电源(MCU 电源) */
  448. GPIO_ResetBits(GPIOD,GPIO_Pin_5);
  449. /* Configure the GPIO_ENMotorPower pin */
  450. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  451. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  452. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  453. GPIO_Init(GPIOA, &GPIO_InitStructure);
  454. /* 使能电源芯片 TPS73633DBVT */
  455. GPIO_SetBits(GPIOA,GPIO_Pin_8);
  456. }
  457. /********************************************************************************************************
  458. * Function: Power_GPIOInit
  459. * Object: LED指示灯初始化
  460. * 输入: 无
  461. * 输出: 无
  462. * 备注: PB1 GREEN LED
  463. PB8 RED LED
  464. PB9 YELLOW LED
  465. ********************************************************************************************************/
  466. void LedInit(void)
  467. {
  468. /*定义一个GPIO_InitTypeDef类型的结构体*/
  469. GPIO_InitTypeDef GPIO_InitStructure;
  470. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  471. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9) ;
  472. /*设置引脚模式为通用推挽输出*/
  473. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;
  474. /*设置引脚速率为50MHz */
  475. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  476. /*调用库函数,初始化GPIOB*/
  477. GPIO_Init(GPIOB, &GPIO_InitStructure);
  478. GPIO_ResetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_1);
  479. }
  480. /********************************************************************************************************
  481. * Function: WatchDogInit
  482. * Object: 看门狗初始化
  483. * 输入: 无
  484. * 输出: 无
  485. * 备注: PC0 WDI
  486. PC1 WDT-EN
  487. ********************************************************************************************************/
  488. void WatchDogInit(void)
  489. {
  490. /*定义一个GPIO_InitTypeDef类型的结构体*/
  491. GPIO_InitTypeDef GPIO_InitStructure;
  492. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  493. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1) ;
  494. /*设置引脚模式为通用推挽输出*/
  495. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;
  496. /*设置引脚速率为50MHz */
  497. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  498. /*调用库函数,初始化GPIOB*/
  499. GPIO_Init(GPIOC, &GPIO_InitStructure);
  500. // GPIO_ResetBits(GPIOC,GPIO_Pin_1); //开启看门狗
  501. }
  502. /*********************************************************************************
  503. * Function: LCDBLACtl
  504. * Object: LCD背光控制
  505. * 输入: LCD背光控制状态
  506. * 输出: 无
  507. * 备注: uint8_t driverState:DRIVER_ON背光电源打开;DRIVER_OFF背光电源关闭
  508. **********************************************************************************/
  509. void LCDBLACtl( uint8_t driverState )
  510. {
  511. if( driverState == DRIVER_ON )
  512. {
  513. GPIO_SetBits(GPIOA,GPIO_Pin_11);
  514. }
  515. else
  516. {
  517. GPIO_ResetBits(GPIOA,GPIO_Pin_11);
  518. }
  519. }
  520. /*********************************************************************************
  521. * Function: ZigbeePWRCtl
  522. * Object: zigbee电源控制
  523. * 输入: zigbee电源控制状态
  524. * 输出: 无
  525. * 备注: uint8_t driverState:DRIVER_ON zigbee电源打开,DRIVER_OFF zigbee电源关闭
  526. **********************************************************************************/
  527. void ZigbeePWRCtl( uint8_t driverState )
  528. {
  529. /*定义一个GPIO_InitTypeDef类型的结构体*/
  530. // GPIO_InitTypeDef GPIO_InitStructure;
  531. if( driverState == DRIVER_ON )
  532. {
  533. /* 重新初始化一下通信口 */
  534. // USART2_Init( 9600 );
  535. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  536. }
  537. /* else
  538. {
  539. GPIO_SetBits(GPIOB,GPIO_Pin_12);
  540. // 将zigbee通信口设置为低功耗模式
  541. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  542. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  543. GPIO_Init(GPIOA, &GPIO_InitStructure);
  544. }*/
  545. }
  546. /*********************************************************************************
  547. * Function: MotorPWRCtl
  548. * Object: Motor电源控制
  549. * 输入: Motor电源控制状态
  550. * 输出: 无
  551. * 备注: uint8_t driverState: DRIVER_ON电机电源打开,DRIVER_OFF电机电源关闭
  552. **********************************************************************************/
  553. void MotorPWRCtl( uint8_t driverState )
  554. {
  555. if( driverState == DRIVER_ON )
  556. {
  557. GPIO_ResetBits(GPIOB,GPIO_Pin_13);
  558. }
  559. else
  560. {
  561. GPIO_SetBits(GPIOB,GPIO_Pin_13);
  562. }
  563. }
  564. /*********************************************************************************
  565. * Function: SpeakerInit
  566. * Object: 功放管脚初始化
  567. * 输入: 五
  568. * 输出: 无
  569. * 备注: data PC10.BUSY PC9
  570. **********************************************************************************/
  571. void SpeakerInit(void)
  572. {
  573. /*定义一个GPIO_InitTypeDef类型的结构体*/
  574. GPIO_InitTypeDef GPIO_InitStructure;
  575. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  576. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_15 ) ;
  577. /*设置引脚模式为通用推挽输出*/
  578. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_AF_PP;
  579. GPIO_InitStructure.GPIO_Pin = ( GPIO_Pin_12) ;
  580. /*设置引脚模式为通用推挽输出*/
  581. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO_Mode_AF_PP;
  582. /*设置引脚速率为50MHz */
  583. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  584. /*调用库函数,初始化GPIOB*/
  585. GPIO_Init(GPIOA, &GPIO_InitStructure);
  586. GPIO_SetBits(GPIOA, GPIO_Pin_12);
  587. Delay_ms(120);
  588. HornWorkStatus(HornMaxSound);//初始化最大音量
  589. Delay_ms(5);
  590. }
  591. /*********************************************************************************
  592. * Function: SpeakerResetInit
  593. * Object: 功放管脚复位
  594. * 输入: 五
  595. * 输出: 无
  596. * 备注: data PC10.BUSY PC9 设置成浮空输入
  597. **********************************************************************************/
  598. void SpeakerResetInit(void)
  599. {
  600. /*定义一个GPIO_InitTypeDef类型的结构体*/
  601. GPIO_InitTypeDef GPIO_InitStructure;
  602. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  603. GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_15) ;
  604. /*设置引脚模式为浮空输入*/
  605. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  606. GPIO_InitStructure.GPIO_Pin = ( GPIO_Pin_12) ;
  607. /*设置引脚模式为浮空输入*/
  608. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  609. /*调用库函数,初始化GPIOB*/
  610. GPIO_Init(GPIOA, &GPIO_InitStructure);
  611. }
  612. /*************************************************************************************
  613. * Function: CntAlarmSpeaker
  614. * Object: 控制喇叭工作
  615. * 输入: uint16_t pwmSetValue
  616. * 输出: 无
  617. * 备注: pwmSetValue 0:停止工作 其它值:开启电机
  618. **************************************************************************************/
  619. void CntAlarmSpeaker(uint8_t AlarmData)
  620. {
  621. uint8_t S_DATA,j;
  622. uint8_t B_DATA;
  623. S_DATA = AlarmData;
  624. SpeakerDataGPIOLow;
  625. Delay_ms(5); //延时 5ms
  626. B_DATA = S_DATA&0X01;
  627. for(j=0;j<8;j++)
  628. {
  629. if(B_DATA == 1)
  630. {
  631. SpeakerDataGPIOHight;
  632. delay_us(6); //延时 600us
  633. SpeakerDataGPIOLow;
  634. delay_us(2); //延时 200us
  635. }
  636. else
  637. {
  638. SpeakerDataGPIOHight;
  639. delay_us(2); //延时 200us
  640. SpeakerDataGPIOLow;
  641. delay_us(6); //延时 600us
  642. }
  643. S_DATA = S_DATA>>1;
  644. B_DATA = S_DATA&0X01;
  645. }
  646. SpeakerDataGPIOHight;
  647. }
  648. /*************************************************************************************
  649. * Function: CntOpenHornInit
  650. * Object: 控制打开喇叭管脚初始化
  651. * 输入:
  652. * 输出: 无
  653. * 备注:
  654. **************************************************************************************/
  655. void CntOpenHornInit()
  656. {
  657. if((SysHornToneType != SoundWate)&&(TaskSchedulerFlag.AlarmInitFlag == TASK_FLAG_CLEAR))
  658. {
  659. // TIM3_Int_Init(100-1,800-1);
  660. SpeakerInit();//喇叭初始化
  661. TaskSchedulerFlag.AlarmInitFlag = TASK_FLAG_SET;//报警管脚初始化完成标志
  662. }
  663. else if((SysHornToneType == SoundWate)&&(TaskSchedulerFlag.AlarmInitFlag == TASK_FLAG_SET))
  664. {
  665. TaskSchedulerFlag.AlarmInitFlag = TASK_FLAG_CLEAR;
  666. SpeakerResetInit();//喇叭管脚复位
  667. }
  668. }
  669. /*********************************************************************************
  670. * Function: MCU_ID
  671. * Object: ID读取
  672. * 输入: 无
  673. * 输出: 无
  674. * 备注: 96位ID,12个字节,低6位求和整理为2个字节
  675. **********************************************************************************/
  676. void MCU_ID( void )
  677. {
  678. u32 mcuID[3];
  679. u32 check_id=0;
  680. //--------------读取mcu ID号------------------
  681. mcuID[0] = *(__IO u32*)(0x1FFFF7E8);
  682. mcuID[1] = *(__IO u32*)(0X1FFFF7EC);
  683. mcuID[2] = *(__IO u32*)(0x1FFFF7F0);
  684. check_id = (uint32_t)((uint8_t)mcuID[0]+(uint8_t)(mcuID[0]>>8)+(uint8_t)(mcuID[0]>>16)+(uint8_t)(mcuID[0]>>24)+(uint8_t)mcuID[1]+(uint8_t)(mcuID[1]>>8));
  685. mcu_id[7] = (uint8_t)check_id;
  686. mcu_id[6] = (uint8_t)(check_id>>8); //低位
  687. mcu_id[5] = (uint8_t)(mcuID[1]>>16);
  688. mcu_id[4] = (uint8_t)(mcuID[1]>>24);
  689. mcu_id[3] = (uint8_t)mcuID[2];
  690. mcu_id[2] = (uint8_t)(mcuID[2]>>8);
  691. mcu_id[1] = (uint8_t)(mcuID[2]>>16);
  692. mcu_id[0] = (uint8_t)(mcuID[2]>>24); //高位
  693. random_cont=(uint16_t)(mcuID[0]+mcuID[1]+mcuID[2]);
  694. Recive_lorawanID_flag=1;
  695. /* printf("%x\r\n",mcuID[0]);
  696. printf("%x\r\n",mcuID[1]);
  697. printf("%x\r\n",mcuID[2]);*/
  698. }
  699. /*********************************************************************************
  700. * Function: HWSetup
  701. * Object: 硬件初始化
  702. * 输入: 无
  703. * 输出: 无
  704. * 备注: SystemCoreClock:((uint32_t)8000000) !< Value of the External oscillator in Hz
  705. **********************************************************************************/
  706. void HWSetup( void )
  707. {
  708. SystemInit();
  709. /* Setup SysTick Timer for 1 msec interrupts */
  710. SysTick_Config(SystemCoreClock / 1000);
  711. DriverMotorInit();
  712. DriverHallInit();
  713. DriverSpeakerInit();
  714. DriverLCDPWRInit();
  715. DriverZigbeePWRInit();
  716. DriverKeyInit();
  717. LedInit();
  718. Power_GPIOInit();
  719. USART1_Init(115200);
  720. USART2_Init(115200); // update by wulianwei
  721. //USART3_Init(9600);
  722. SPIInit();
  723. IICInit();
  724. //IIC2Init();
  725. ADS1110Config();
  726. //ADS1110AConfig();
  727. //LoraNode_GPIO_Init(); //comment by wulianwei
  728. //--------------------------- OPEN DMA CLK -------------------------
  729. //开DMA时钟 用于ADC模式
  730. //DriverADCInit();
  731. OPB350L_ADCInit();//红外检测气泡传感器初始化
  732. //板端电源设置-关闭
  733. MotorPWRCtl( DRIVER_OFF );
  734. SpeakerCtl( DRIVER_OFF );//蜂鸣器
  735. TIM3_Int_Init(100-1,800-1);
  736. // SpeakerInit();//喇叭初始化
  737. SensorPWRCtl( DRIVER_ON );//Sensor电源
  738. LCDBLACtl( DRIVER_OFF );//LCD背光
  739. // ZigbeePWRCtl( DRIVER_ON );//zigbee电源
  740. MCU_ID();//读取mcu的ID号
  741. WatchDogInit();//看门狗IO口初始化*/
  742. }