boardinit.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. #include "boardinit.h"
  2. #include "../App/public.h"
  3. #include "../App/xspDataOpt.h"
  4. TestInitConut testcount;
  5. extiMsg_t g_extimsg; // 中断信息
  6. Identity g_iDentity; // 身份信息 主或从
  7. DevResetMsg g_devResetMsg;
  8. DevPtMsg g_devPtMsg;
  9. PortMsg g_portMsg[4] = {
  10. {GPIOD,GPIO_PIN_5, GPIO_PIN_1, GPIO_PIN_3, GPIO_PIN_2},
  11. {GPIOE,GPIO_PIN_5, GPIO_PIN_1, GPIO_PIN_3, GPIO_PIN_2},
  12. {GPIOD,GPIO_PIN_13,GPIO_PIN_9, GPIO_PIN_11,GPIO_PIN_10},
  13. {GPIOE,GPIO_PIN_14,GPIO_PIN_10,GPIO_PIN_12,GPIO_PIN_11},
  14. };
  15. void EXTI5_9_IRQHandler(void)
  16. {
  17. volatile uint8_t status = 0;
  18. if(RESET != exti_interrupt_flag_get(g_extimsg.extiLine)){ //
  19. #if (0)
  20. if(testcount.btestStart==1){
  21. status = gpio_input_bit_get(GPIOE,g_extimsg.extiPin);
  22. testcount.exittest[testcount.count].tick = gTimer_tickt;
  23. testcount.exittest[testcount.count].status = status;
  24. testcount.count++;
  25. if(testcount.count >=22) testcount.count = 0;
  26. }
  27. else {
  28. g_timeInfo.bExit = 1;
  29. g_timeInfo.exitTick = gTimer_tickt;
  30. }
  31. #else
  32. if((0==g_timeInfo.bRead) &&(RESET==gpio_input_bit_get(g_extimsg.csGroup,g_extimsg.csPin))){
  33. delay_ms(1);
  34. reset_port_all_pin(PLN,PORT_ALL);
  35. //reset_port_pin(PLN,3);
  36. delay_ms(1);//延时
  37. if(RESET==gpio_input_bit_get(g_extimsg.csGroup,g_extimsg.csPin)){
  38. set_port_all_pin(PLN,PORT_ALL);
  39. //set_port_pin(PLN,3);
  40. g_timeInfo.bRead = 1;
  41. }
  42. }
  43. #endif
  44. exti_interrupt_flag_clear(g_extimsg.extiLine);
  45. }
  46. }
  47. void set_port_pin(uint8_t cmd,uint8_t index)
  48. {
  49. switch(cmd){
  50. case CEN:
  51. gpio_bit_set(g_portMsg[index].group, g_portMsg[index].cePin);
  52. break;
  53. case CLK:
  54. gpio_bit_set(g_portMsg[index].group, g_portMsg[index].cpPin);
  55. break;
  56. case PLN:
  57. gpio_bit_set(g_portMsg[index].group, g_portMsg[index].plPin);
  58. break;
  59. }
  60. }
  61. void set_port_all_pin(uint8_t cmd,uint8_t index)//0x01 02 04 08
  62. {
  63. uint8_t i=0;
  64. for(i=0;i<4;i++){
  65. if(0x00 ==((index>>i)&0x01)) continue;
  66. set_port_pin(cmd,i);
  67. }
  68. }
  69. void reset_port_pin(uint8_t cmd,uint8_t index)
  70. {
  71. switch(cmd){
  72. case CEN:
  73. gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].cePin);
  74. break;
  75. case CLK:
  76. gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].cpPin);
  77. break;
  78. case PLN:
  79. gpio_bit_reset(g_portMsg[index].group, g_portMsg[index].plPin);
  80. break;
  81. }
  82. }
  83. void reset_port_all_pin(uint8_t cmd,uint8_t index)//0x01 02 04 08
  84. {
  85. uint8_t i=0;
  86. for(i=0;i<4;i++){
  87. if(0x00 ==((index>>i)&0x01)) continue;
  88. reset_port_pin(cmd,i);
  89. }
  90. }
  91. uint8_t read_daout_pin(uint8_t index)
  92. {
  93. uint8_t ret;
  94. ret = gpio_input_bit_get(g_portMsg[index].group, g_portMsg[index].doutPin);
  95. return ret;
  96. }
  97. /*------------------------------------------------------------------
  98. * 根据配置表,初始化片选 以及外部中断
  99. * Port1: CS0-PD0, CS6-PD6
  100. * Port2: AD0-PE0, AD6-PE6
  101. * Port3: CS15-PD8 CS9-PD14
  102. * Port4: AD9-PE9 AD15-PE15
  103. * -----------------------------------------------------------------*/
  104. void exti_msg_init(void)
  105. {
  106. // uint8_t port = 0;
  107. epprom_read_com_config();
  108. return;
  109. // switch (port){
  110. // case 0: // CS6
  111. // g_extimsg.csGroup = GPIOD;
  112. // g_extimsg.csPin = GPIO_PIN_6;
  113. // g_extimsg.extiIRQn = EXTI5_9_IRQn;
  114. // g_extimsg.extiLine = EXTI_6;
  115. // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6;
  116. // g_extimsg.extiPin = GPIO_PIN_6;
  117. // g_extimsg.outputPort = 3;
  118. // break;
  119. // case 1:
  120. // break;
  121. // case 2: // AD6
  122. // g_extimsg.csGroup = GPIOE;
  123. // g_extimsg.csPin = GPIO_PIN_6;
  124. // g_extimsg.extiIRQn = EXTI5_9_IRQn;
  125. // g_extimsg.extiLine = EXTI_6;
  126. // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6;
  127. // g_extimsg.extiPin = GPIO_PIN_6;
  128. // g_extimsg.outputPort = 4;
  129. // break;
  130. // case 3: // CS15--PD8
  131. // g_extimsg.csGroup = GPIOD;
  132. // g_extimsg.csPin = GPIO_PIN_8;
  133. // g_extimsg.extiIRQn = EXTI5_9_IRQn;
  134. // g_extimsg.extiLine = EXTI_8;
  135. // g_extimsg.extiPinSource = GPIO_PIN_SOURCE_8;
  136. // g_extimsg.extiPin = GPIO_PIN_8;
  137. // g_extimsg.outputPort = 3;
  138. // break;
  139. // default:
  140. // break;
  141. // }
  142. }
  143. /*-----------------------------------------------------------------
  144. * 初始化GPIO管脚
  145. * 版选模式:
  146. * PD0~PD15,PC0~PC9 PB3~PB5:CS片选,设置为输出;
  147. * PE0~PE15:DATA信号,输出为输入
  148. * PE8:设置为外部中断, 上升沿下降沿中断 ,在片选CS8(PD15)上
  149. * 串转并模式:
  150. * PD0 PD1 PD6 PD8 PD9 PD14 设置为输入 (PD1 PD9为DOUT,其它为COM端) 0x4343
  151. * PE0 PE1 PE6 PE9 PE10 PE15 设置为输入 (PE1 PE10为DOUT,其它为COM端)0x8643
  152. * 其它的PE、PD端口都设置为输出 PD:0xBCBC PE:0x79BC
  153. * ----------------------------------------------------------------*/
  154. void exti_gpio_init(void)
  155. {
  156. #if SEL_74CH165
  157. rcu_periph_clock_enable(RCU_GPIOD);// PD
  158. rcu_periph_clock_enable(RCU_GPIOE); // PE
  159. gpio_bit_set(GPIOD, 0xBCBC);
  160. gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0xBCBC); // 设置输出
  161. gpio_bit_set(GPIOE, 0x79BC);
  162. gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0x79BC); // PE 设置输出
  163. gpio_init(GPIOD, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,0x4343);
  164. gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,0x8643);
  165. rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */
  166. nvic_irq_enable(g_extimsg.extiIRQn, 2U, 0U); /* 设置优先级 */
  167. /* connect key EXTI line to key GPIO pin */
  168. gpio_exti_source_select(g_extimsg.outputPort,g_extimsg.extiPinSource); /* 设置EXTI的触发源 */
  169. exti_deinit();
  170. exti_init(g_extimsg.extiLine, EXTI_INTERRUPT, EXTI_TRIG_FALLING); /*触发方式:上升沿 下降沿触发*/
  171. exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */
  172. exti_interrupt_enable(g_extimsg.extiLine);
  173. #else
  174. rcu_periph_clock_enable(RCU_GPIOD);// PD设置为输出
  175. gpio_bit_set(GPIOD, GPIO_PIN_ALL);
  176. gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_ALL);
  177. rcu_periph_clock_enable(RCU_GPIOC);// PC设置为输出 PC0~PC9
  178. gpio_bit_set(GPIOC, 0x3FF);
  179. gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,0x3FF);
  180. rcu_periph_clock_enable(RCU_GPIOB);// PB设置为输出 PB3~PB5
  181. gpio_bit_set(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
  182. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
  183. rcu_periph_clock_enable(RCU_GPIOE); // PE设置为输入
  184. gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ,GPIO_PIN_ALL);
  185. rcu_periph_clock_enable(RCU_AF); /* AFIO时钟使能 */
  186. /* enable and set key EXTI interrupt priority */
  187. nvic_irq_enable(g_extimsg.extiIRQn, 2U, 0U); /* 设置优先级 */
  188. /* connect key EXTI line to key GPIO pin */
  189. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE,g_extimsg.extiPinSource); /* 设置EXTI的触发源 */
  190. exti_init(g_extimsg.extiLine, EXTI_INTERRUPT, EXTI_TRIG_BOTH); /*触发方式:上升沿 下降沿触发*/
  191. exti_interrupt_flag_clear(g_extimsg.extiLine); /* 清除中断 */
  192. exti_interrupt_enable(g_extimsg.extiLine);
  193. #endif
  194. }
  195. /*----------------------------------------------------------------
  196. * 初始化板级控制管脚
  197. * PC13: led_green PA0:leg_red
  198. * PA8: cs_en_all 所有片选使能
  199. * PB8: LTE_DC 4G模块是否插入 配置为输入上拉
  200. * ---------------------------------------------------------------*/
  201. void board_gpio_init(void)
  202. {
  203. rcu_periph_clock_enable(RCU_GPIOC);
  204. rcu_periph_clock_enable(RCU_GPIOA);
  205. rcu_periph_clock_enable(RCU_GPIOB);
  206. gpio_bit_set(GPIOC, GPIO_PIN_13);
  207. gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13); //初始化LED管脚 PC13
  208. gpio_bit_set(GPIOA, GPIO_PIN_0);
  209. gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_0); //初始化LED管脚 PA0
  210. gpio_bit_reset(GPIOA, GPIO_PIN_8);
  211. gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8); //CS_EN_ALL PA8
  212. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_8); //PB8 LTE_DC 配置上拉
  213. gpio_bit_reset(GPIOB, GPIO_PIN_9); // set :上电 reset:断电
  214. gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9); //PB9 4G断电
  215. // 初始化抬枪信号
  216. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_15); //PB15 IN1 抬枪信号1
  217. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_14); //PB14 IN2 抬枪信号2
  218. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_13); //PB13 IN3 抬枪信号3
  219. gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ,GPIO_PIN_12); //PB12 IN4 抬枪信号4
  220. }
  221. void init_fwdgt_timer(void)
  222. {
  223. // fwdgt_counter_reload();
  224. }
  225. void fwdgt_feed(uint32_t tickt)
  226. {
  227. if((tickt%2000)==0)
  228. fwdgt_counter_reload();
  229. }
  230. void board_init(void)
  231. {
  232. board_gpio_init();
  233. i2c_init();
  234. usart0_config();
  235. //exti_msg_init();
  236. //exti_gpio_init();
  237. // init_gun_status();
  238. timer4_init();
  239. timer5_init();
  240. key_init();
  241. g_iDentity = IDENTITY_MASTER; //
  242. if(!gpio_input_bit_get(GPIOB,GPIO_PIN_8))
  243. g_devMsg.bHave4G = B4G_HAVE;// 有4G模块
  244. else g_devMsg.bHave4G = B4G_NOHAVE; // 无4G模块
  245. printf(" dev have 4g :%d\r\n", g_devMsg.bHave4G);
  246. }
  247. /*--------------------------------------------------------------------------------
  248. * 上电时读取复位类型
  249. * -------------------------------------------------------------------------------*/
  250. uint32_t power_up_system_resettype(void)
  251. {
  252. uint32_t RestFlag = 0;
  253. if(RESET != rcu_flag_get(RCU_FLAG_EPRST)){ // 复位引脚复位 external PIN reset flag
  254. RestFlag |= RESET_PINRST;
  255. }
  256. if(RESET != rcu_flag_get(RCU_FLAG_PORRST)){ // 掉电复位 : power reset flag
  257. RestFlag |= RESET_PORRSTF;
  258. }
  259. if(RESET != rcu_flag_get(RCU_FLAG_SWRST)) { // 软件复位 : software reset flag
  260. RestFlag |= RESET_SFTRSTF;
  261. }
  262. if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)){// 独立看门狗复位 : free watchdog timer reset flag
  263. RestFlag |= RESET_IWDGRSTF;//
  264. }
  265. if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST)) { //窗口看门狗复位 : window watchdog timer reset flag
  266. RestFlag |= RESET_IWDGRSTF;//
  267. }
  268. if(RESET != rcu_flag_get(RCU_FLAG_LPRST)){ // 低功耗复位: low-power reset flag
  269. RestFlag |= RESET_LPWRRSTF;//
  270. }
  271. rcu_all_reset_flag_clear();
  272. printf("复位类型 : %x\r\n",RestFlag);
  273. //存储复位 类型
  274. return RestFlag;
  275. }
  276. void uart_init(void)
  277. {
  278. dam_init_uart_485();
  279. usart_485_dma_init();
  280. if(B4G_HAVE == g_devMsg.bHave4G){ // 初始化4G串口
  281. dma_init_uart_4G();
  282. usart_4G_dma_init();
  283. gpio_bit_set(GPIOB, GPIO_PIN_9); // set :上电 reset:断电
  284. }
  285. }
  286. /*------------------------------------------------------
  287. * 4g 模块断电上电
  288. * -----------------------------------------------------*/
  289. void init_4g_power_up(void)
  290. {
  291. gpio_bit_reset(GPIOB, GPIO_PIN_9); // set :上电 reset:断电
  292. start_delay_ms(2000);
  293. while(!g_iDelayfinish);
  294. stop_delay_ms();
  295. gpio_bit_set(GPIOB, GPIO_PIN_9); // set :上电 reset:断电
  296. }