main.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: main
  4. * 功能说明: c程序入口
  5. * 形 参:无
  6. * 返 回 值: 错误代码(无需处理)
  7. *********************************************************************************************************
  8. */
  9. #include "main.h"
  10. #include "net.h"
  11. #include "os_cpu.h"
  12. int32_t g_recv_msg_flag = 0;
  13. void dump_hex(uint8_t *buffer, uint32_t len)
  14. {
  15. uint32_t i;
  16. printf("[DumpHEX]Length:%d ", len);
  17. for (i = 0; i < len; i++)
  18. {
  19. if (i % 16 == 0)
  20. printf("\r\n");
  21. else if (i % 8 == 0)
  22. printf(" ");
  23. else
  24. printf(":");
  25. printf("%02x", buffer[i]);
  26. }
  27. printf("\r\n");
  28. }
  29. int main(void)
  30. {
  31. #if 0
  32. /* 打开GOIOI 端口时钟 */
  33. *(unsigned int *)(0x40023800 + 0x30) |= (1 << 8);
  34. /* PI10 为输出 */
  35. *(unsigned int *)(0x40022000 + 0x00) &= ~((0x03) << (2 * 10));
  36. *(unsigned int *)(0x40022000 + 0x00) |= (1 << (2 * 10));
  37. /* PI10 输出高电平 */
  38. *(unsigned int *)(0x40022000 + 0x14) |= (1 << 10);
  39. /* PI10 输出低电平 */
  40. *(unsigned int *)(0x40022000 + 0x14) &= ~(1 << 10);
  41. #elif 0
  42. bsp_init();
  43. while (1)
  44. {
  45. GPIO_ResetBits(GPIOI, GPIO_Pin_10);
  46. Delay(0xFFFFFFFF);
  47. // GPIO_SetBits(GPIOI, GPIO_Pin_10);
  48. // Delay(0xFFFFFFFF);
  49. GPIO_ResetBits(GPIOF, GPIO_Pin_7);
  50. Delay(0xFFFFFF);
  51. // GPIO_SetBits(GPIOF, GPIO_Pin_7);
  52. // Delay(0xFFFFFF);
  53. GPIO_ResetBits(GPIOF, GPIO_Pin_8);
  54. Delay(0xFFFFFF);
  55. // GPIO_SetBits(GPIOF, GPIO_Pin_8);
  56. // Delay(0xFFFFFF);
  57. GPIO_ResetBits(GPIOC, GPIO_Pin_2);
  58. Delay(0xFFFFFF);
  59. // GPIO_SetBits(GPIOC, GPIO_Pin_2);
  60. // Delay(0xFFFFFF);
  61. };
  62. #elif 1
  63. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  64. OSInit();
  65. bsp_init();
  66. ftp_server_init();
  67. iec10x_regist();
  68. /* init task */
  69. /* 创建一个启动任务(也就是主任务)。启动任务会创建所有的应用程序任务 */
  70. OSTaskCreateExt(init_task, /* 启动任务函数指针 */
  71. (void *)0, /* 传递给任务的参数 */
  72. (OS_STK *)&init_task_stk[INIT_STK_SIZE - 1], /* 指向任务栈栈顶的指针 */
  73. INIT_TASK_PRIO, /* 任务的优先级,必须唯一,数字越低优先级越高 */
  74. INIT_TASK_PRIO, /* 任务ID,一般和任务优先级相同 */
  75. (OS_STK *)&init_task_stk[0], /* 指向任务栈栈底的指针。OS_STK_GROWTH
  76. 决定堆栈增长方向 */
  77. INIT_STK_SIZE, /* 任务栈大小 */
  78. (void *)0, /* 一块用户内存区的指针,用于任务控制块TCB的扩展功能
  79. (如任务切换时保存CPU浮点寄存器的数据)。一般不用,填0即可 */
  80. OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 任务选项字 */
  81. OSStart();
  82. #endif
  83. }
  84. /*!
  85. \brief init task
  86. \param[in] pvParameters not used
  87. \param[out] none
  88. \retval none
  89. */
  90. void init_task(void *pvParameters)
  91. {
  92. uint8_t *p;
  93. p = pvParameters;
  94. SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC);
  95. /* configure the systick handler priority */
  96. NVIC_SetPriority(SysTick_IRQn, 0x00U);
  97. OSTaskCreateExt((void (*)(void *))misc_task, /* 启动任务函数指针 */
  98. (void *)0, /* 传递给任务的参数 */
  99. (OS_STK *)&misc_task_stk[MISC_TASK_STK_SIZE - 1], /* 指向任务栈栈顶的指针 */
  100. (INT8U)MISC_PRIO, /* 任务的优先级,必须唯一,数字越低优先级越高 */
  101. (INT16U)MISC_PRIO, /* 任务ID,一般和任务优先级相同 */
  102. (OS_STK *)&misc_task_stk[0], /* 指向任务栈栈底的指针。OS_STK_GROWTH 决定堆栈增长方向 */
  103. (INT32U)MISC_TASK_STK_SIZE, /* 任务栈大小 */
  104. (void *)0, /* 一块用户内存区的指针,用于任务控制块TCB的扩展功能
  105. (如任务切换时保存CPU浮点寄存器的数据)。一般不用,填0即可 */
  106. (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP); /* 任务选项字 */
  107. // OSTaskCreateExt((void (*)(void *))modbus_master_task,
  108. // (void *)0,
  109. // (OS_STK *)&uart1_task_stk[UART1_TASK_STK_SIZE - 1],
  110. // (INT8U)UART1_TASK_PRIO,
  111. // (INT16U)UART1_TASK_PRIO,
  112. // (OS_STK *)&uart1_task_stk[0],
  113. // (INT32U)UART1_TASK_STK_SIZE,
  114. // (void *)0,
  115. // (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  116. /* 485 modbus从机模式 */
  117. // OSTaskCreateExt((void (*)(void *))modbus_slave_task,
  118. // (void *)0,
  119. // (OS_STK *)&uart3_task_stk[UART3_TASK_STK_SIZE - 1],
  120. // (INT8U)UART3_TASK_PRIO,
  121. // (INT16U)UART3_TASK_PRIO,
  122. // (OS_STK *)&uart3_task_stk[0],
  123. // (INT32U)UART3_TASK_STK_SIZE,
  124. // (void *)0,
  125. // (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  126. OSTaskCreateExt((void (*)(void *))iec104_task,
  127. (void *)0,
  128. (OS_STK *)&iec104_task_stk[IEC_TASK_STK_SIZE - 1],
  129. (INT8U)IEC_PRIO,
  130. (INT16U)IEC_PRIO,
  131. (OS_STK *)&iec104_task_stk[0],
  132. (INT32U)IEC_TASK_STK_SIZE,
  133. (void *)0,
  134. (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  135. OSTaskCreateExt((void (*)(void *))ftp_server_cmd_task,
  136. (void *)0,
  137. (OS_STK *)&ftp_server_cmd_task_stk[FTP_CMD_TASK_STK_SIZE - 1],
  138. (INT8U)FTP_CMD_PRIO,
  139. (INT16U)FTP_CMD_PRIO,
  140. (OS_STK *)&ftp_server_cmd_task_stk[0],
  141. (INT32U)FTP_CMD_TASK_STK_SIZE,
  142. (void *)0,
  143. (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  144. OSTaskCreateExt((void (*)(void *))ftp_server_data_task,
  145. (void *)0,
  146. (OS_STK *)&ftp_server_data_task_stk[FTP_DATA_TASK_STK_SIZE - 1],
  147. (INT8U)FTP_DATA_PRIO,
  148. (INT16U)FTP_DATA_PRIO,
  149. (OS_STK *)&ftp_server_data_task_stk[0],
  150. (INT32U)FTP_DATA_TASK_STK_SIZE,
  151. (void *)0,
  152. (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  153. // OSTaskCreateExt((void (*)(void *))modbus_tcp_task,
  154. // (void *)0,
  155. // (OS_STK *)&tcp_task_stk[TCP_TASK_STK_SIZE - 1],
  156. // (INT8U)TCP_PRIO,
  157. // (INT16U)TCP_PRIO,
  158. // (OS_STK *)&tcp_task_stk[0],
  159. // (INT32U)TCP_TASK_STK_SIZE,
  160. // (void *)0,
  161. // (INT16U)OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR | OS_TASK_OPT_SAVE_FP);
  162. }
  163. void misc_task(void)
  164. {
  165. INT8U cnt = 0;
  166. INT16U save_cnt = 0;
  167. INT8U temperature;
  168. INT8U humidity;
  169. INT8U ret;
  170. // INT8U key_state;
  171. AD7606_SetOS(AD_OS_NO); /* 无过采样 */
  172. AD7606_SetInputRange(0); /* 0表示输入量程为正负5V, 1表示正负10V */
  173. // bsp_StartAutoTimer(0, 500); /* 启动1个200ms的自动重装的定时器 */
  174. AD7606_ReadNowAdc(); /* 读取采样结果 */
  175. AD7606_StartConvst(); /* 启动1次转换 */
  176. while (1)
  177. {
  178. iwdg_feed(MISC_DOG);
  179. // key_scan();
  180. USBH_Process(&USB_OTG_Core, &USB_Host);
  181. // key_state = key_get();
  182. // if (key_state != KEY_NONE)
  183. // {
  184. // switch (key_state)
  185. // {
  186. // case KEY_1_UP:
  187. // printf("1111111\r\n");
  188. // break;
  189. // case KEY_1_DOWN:
  190. // printf("wwwwwwwwwwww\r\n");
  191. // break;
  192. // case KEY_1_LONG:
  193. // printf("333333333\r\n");
  194. // break;
  195. // default:
  196. // printf("44444444\r\n");
  197. // break;
  198. // }
  199. // }
  200. if ((cnt % 10 == 0) && (cnt != 0))
  201. {
  202. // printf("%ld\r\n", NAND_ReadID());
  203. // printf("%c\r\n", NOR_ReadByte(0x4000));
  204. }
  205. if ((cnt % 25 == 0) && (cnt != 0))
  206. {
  207. // printf("%ld\r\n", NAND_ReadID());
  208. LED2_RUN_TOGGLE;
  209. }
  210. if ((cnt % 15 == 0) && (cnt != 0))
  211. {
  212. // if (NOR_EraseSector(0x4000) == 0)
  213. // {
  214. // NOR_WriteByte(0x4000, 0xFF);
  215. // }
  216. }
  217. if (cnt == 10)
  218. {
  219. // if (am2303_init())
  220. // {
  221. // printf("error\r\n");
  222. // }
  223. // else
  224. // {
  225. ret = am2303_read_data(&temperature, &humidity); // 读取温湿度值
  226. // if (ret == 1)
  227. // {
  228. // printf("Temp: (%d).\n", temperature);
  229. // printf("Humi: (%d).\n", humidity);
  230. // }
  231. // else
  232. // {
  233. // printf("\r\n未发现DHT11温湿度传感器\r\n");
  234. // }
  235. // }
  236. }
  237. if (cnt >= 25)
  238. {
  239. /* 每隔500ms 进来一次. 由软件启动转换 */
  240. AD7606_ReadNowAdc(); /* 读取采样结果 */
  241. AD7606_StartConvst(); /* 启动下次转换 */
  242. cnt = 0; /* 刷新显示 */
  243. }
  244. else
  245. {
  246. cnt++;
  247. }
  248. if (save_cnt >= 25)
  249. {
  250. save_cnt = 0;
  251. }
  252. else
  253. {
  254. save_cnt++;
  255. }
  256. if (g_iec104_socket > 0)
  257. {
  258. iec104_scheduled(g_iec104_socket);
  259. }
  260. iec104_state_machine();
  261. OSTimeDly(20);
  262. };
  263. }
  264. // void iec104_task(void)
  265. // {
  266. // INT8U buf[MAX_RECV_SIZE] = {0};
  267. // INT32S ret = 0;
  268. // INT32U len = 0;
  269. // while (1)
  270. // {
  271. // if (g_iec104_socket < 0)
  272. // {
  273. // ret = iec104_connect_module();
  274. // if (ret < 0)
  275. // {
  276. // goto TASK_DELAY;
  277. // }
  278. // g_data_req_flag = 0;
  279. // }
  280. // else
  281. // {
  282. // ret = iec104_rec_master(buf);
  283. // if (ret <= 0)
  284. // {
  285. // closesocket(g_iec104_socket);
  286. // goto TASK_DELAY;
  287. // }
  288. // }
  289. // TASK_DELAY:
  290. // OSTimeDly(100);
  291. // }
  292. // }
  293. void modbus_tcp_task(void)
  294. {
  295. INT8U buf[MAX_RECV_SIZE] = {0};
  296. INT32S ret = 0;
  297. INT16U temp_buf_len;
  298. INT16U msg_data_len;
  299. INT32U len;
  300. while (1)
  301. {
  302. if (g_modbus_tcp_socket < 0)
  303. {
  304. ret = modbus_tcp_connect_module();
  305. if (ret < 0)
  306. {
  307. goto TASK_DELAY;
  308. }
  309. g_data_req_flag = 0;
  310. }
  311. else
  312. {
  313. ret = modbus_tcp_rec_module(buf);
  314. if (ret < 2)
  315. {
  316. if (g_recv_msg_flag == 1)
  317. {
  318. fly_mosbus_init_flag();
  319. closesocket(g_iec104_socket);
  320. g_recv_msg_flag = 0;
  321. }
  322. goto TASK_DELAY;
  323. }
  324. g_recv_msg_flag = 0;
  325. temp_buf_len = 0;
  326. while (temp_buf_len < ret)
  327. {
  328. len = 0;
  329. msg_data_len = ((buf[temp_buf_len + 1] & 0xff) | ((buf[temp_buf_len + 2] << 8) & 0xff00));
  330. len = msg_data_len + 3;
  331. if (fly_test_process(&(buf[temp_buf_len]), len) != 0)
  332. {
  333. goto TASK_DELAY;
  334. }
  335. temp_buf_len += msg_data_len + 3;
  336. }
  337. }
  338. TASK_DELAY:
  339. OSTimeDly(100);
  340. }
  341. }