You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

224 lines
6.6 KiB

3 years ago
  1. /**
  2. ****************************************************************************************************
  3. * @file freertos_demo.c
  4. * @author (ALIENTEK)
  5. * @version V1.0
  6. * @date 2022-01-11
  7. * @brief lwIP SOCKET UDP广播
  8. * @license Copyright (c) 2020-2032, 广
  9. ****************************************************************************************************
  10. * @attention
  11. *
  12. * : F407开发板
  13. * 线:www.yuanzige.com
  14. * :www.openedv.com
  15. * :www.alientek.com
  16. * :openedv.taobao.com
  17. *
  18. ****************************************************************************************************
  19. */
  20. #include "freertos_demo.h"
  21. #include "./BSP/LED/led.h"
  22. #include "./BSP/LCD/lcd.h"
  23. #include "./SYSTEM/usart/usart.h"
  24. #include "./SYSTEM/delay/delay.h"
  25. #include "./MALLOC/malloc.h"
  26. #include "./BSP/KEY/key.h"
  27. #include "lwip_comm.h"
  28. #include "lwip_demo.h"
  29. #include "lwipopts.h"
  30. #include "stdio.h"
  31. #include "string.h"
  32. #include "FreeRTOS.h"
  33. #include "task.h"
  34. #include "queue.h"
  35. /******************************************************************************************************/
  36. /*FreeRTOS配置*/
  37. /* START_TASK 任务 配置
  38. * :
  39. */
  40. #define START_TASK_PRIO 5 /* 任务优先级 */
  41. #define START_STK_SIZE 128 /* 任务堆栈大小 */
  42. TaskHandle_t StartTask_Handler; /* 任务句柄 */
  43. void start_task(void *pvParameters); /* 任务函数 */
  44. /* LWIP_DEMO 任务 配置
  45. * :
  46. */
  47. #define LWIP_DMEO_TASK_PRIO 11 /* 任务优先级 */
  48. #define LWIP_DMEO_STK_SIZE 1024 /* 任务堆栈大小 */
  49. TaskHandle_t LWIP_Task_Handler; /* 任务句柄 */
  50. void lwip_demo_task(void *pvParameters); /* 任务函数 */
  51. /* LED_TASK 任务 配置
  52. * :
  53. */
  54. #define LED_TASK_PRIO 10 /* 任务优先级 */
  55. #define LED_STK_SIZE 128 /* 任务堆栈大小 */
  56. TaskHandle_t LEDTask_Handler; /* 任务句柄 */
  57. void led_task(void *pvParameters); /* 任务函数 */
  58. /******************************************************************************************************/
  59. /**
  60. * @breif UI
  61. * @param mode : bit0:0,;1,UI
  62. * bit1:0,;1,UI
  63. * @retval
  64. */
  65. void lwip_test_ui(uint8_t mode)
  66. {
  67. uint8_t speed;
  68. uint8_t buf[30];
  69. if (mode & 1<< 0)
  70. {
  71. lcd_fill(5, 30, lcddev.width,110, WHITE);
  72. lcd_show_string(5, 30, 200, 16, 16, "STM32", RED);
  73. lcd_show_string(5, 50, 400, 16, 16, "lwIP UDPBroadcastTest", RED);
  74. lcd_show_string(5, 70, 200, 16, 16, "ATOM@ALIENTEK", RED);
  75. }
  76. if (mode & 1 << 1)
  77. {
  78. lcd_fill(5, 110, lcddev.width,lcddev.height, WHITE);
  79. lcd_show_string(5, 110, 200, 16, 16, "lwIP Init Successed", BLUE);
  80. if (g_lwipdev.dhcpstatus == 2)
  81. {
  82. sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]); /* 显示动态IP地址 */
  83. }
  84. else
  85. {
  86. sprintf((char*)buf,"Static IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]); /* 打印静态IP地址 */
  87. }
  88. lcd_show_string(5, 130, 200, 16, 16, (char*)buf, BLUE);
  89. speed = ethernet_chip_get_speed(); /* 得到网速 */
  90. if (speed)
  91. {
  92. lcd_show_string(5, 150, 200, 16, 16, "Ethernet Speed:100M", BLUE);
  93. }
  94. else
  95. {
  96. lcd_show_string(5, 150, 200, 16, 16, "Ethernet Speed:10M", BLUE);
  97. }
  98. }
  99. }
  100. /**
  101. * @breif freertos_demo
  102. * @param
  103. * @retval
  104. */
  105. void freertos_demo(void)
  106. {
  107. /* start_task任务 */
  108. xTaskCreate((TaskFunction_t )start_task,
  109. (const char * )"start_task",
  110. (uint16_t )START_STK_SIZE,
  111. (void * )NULL,
  112. (UBaseType_t )START_TASK_PRIO,
  113. (TaskHandle_t * )&StartTask_Handler);
  114. vTaskStartScheduler(); /* 开启任务调度 */
  115. }
  116. /**
  117. * @brief start_task
  118. * @param pvParameters : ()
  119. * @retval
  120. */
  121. void start_task(void *pvParameters)
  122. {
  123. pvParameters = pvParameters;
  124. g_lwipdev.lwip_display_fn = lwip_test_ui;
  125. lwip_test_ui(1); /* 加载后前部分UI */
  126. while (lwip_comm_init() != 0)
  127. {
  128. lcd_show_string(30, 110, 200, 16, 16, "lwIP Init failed!!", RED);
  129. delay_ms(500);
  130. lcd_fill(30, 50, 200 + 30, 50 + 16, WHITE);
  131. lcd_show_string(30, 110, 200, 16, 16, "Retrying... ", RED);
  132. delay_ms(500);
  133. LED1_TOGGLE();
  134. }
  135. while (!ethernet_read_phy(PHY_SR)) /* 检查MCU与PHY芯片是否通信成功 */
  136. {
  137. printf("MCU与PHY芯片通信失败,请检查电路或者源码!!!!\r\n");
  138. }
  139. while ((g_lwipdev.dhcpstatus != 2) && (g_lwipdev.dhcpstatus != 0XFF)) /* 等待DHCP获取成功/超时溢出 */
  140. {
  141. vTaskDelay(5);
  142. }
  143. taskENTER_CRITICAL(); /* 进入临界区 */
  144. /* 创建lwIP任务 */
  145. xTaskCreate((TaskFunction_t )lwip_demo_task,
  146. (const char* )"lwip_demo_task",
  147. (uint16_t )LWIP_DMEO_STK_SIZE,
  148. (void* )NULL,
  149. (UBaseType_t )LWIP_DMEO_TASK_PRIO,
  150. (TaskHandle_t* )&LWIP_Task_Handler);
  151. /* LED测试任务 */
  152. xTaskCreate((TaskFunction_t )led_task,
  153. (const char* )"led_task",
  154. (uint16_t )LED_STK_SIZE,
  155. (void* )NULL,
  156. (UBaseType_t )LED_TASK_PRIO,
  157. (TaskHandle_t* )&LEDTask_Handler);
  158. vTaskDelete(StartTask_Handler); /* 删除开始任务 */
  159. taskEXIT_CRITICAL(); /* 退出临界区 */
  160. }
  161. /**
  162. * @brief lwIP运行例程
  163. * @param pvParameters : ()
  164. * @retval
  165. */
  166. void lwip_demo_task(void *pvParameters)
  167. {
  168. pvParameters = pvParameters;
  169. lwip_demo(); /* lwip测试代码 */
  170. while (1)
  171. {
  172. vTaskDelay(5);
  173. }
  174. }
  175. /**
  176. * @brief
  177. * @param pvParameters : ()
  178. * @retval
  179. */
  180. void led_task(void *pvParameters)
  181. {
  182. pvParameters = pvParameters;
  183. while (1)
  184. {
  185. LED1_TOGGLE();
  186. vTaskDelay(100);
  187. }
  188. }