123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /*!
- \file main.c
- \brief enet demo
- \version 2017-02-10, V1.0.0, firmware for GD32F30x
- \version 2018-10-10, V1.1.0, firmware for GD32F30x
- \version 2018-12-25, V2.0.0, firmware for GD32F30x
- */
- /*
- Copyright (c) 2018, GigaDevice Semiconductor Inc.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holder nor the names of its contributors
- may be used to endorse or promote products derived from this software without
- specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- OF SUCH DAMAGE.
- */
- #include "gd32f30x.h"
- #include "hd_eth.h"
- #include "main.h"
- #include "tcpip.h"
- #include "hello_gigadevice.h"
- #include "tcp_client.h"
- #include "led.h"
- #include "usart.h"
- #include "string.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include "netconf.h"
- #include "sys_mqtt.h"
- #include "tcp_server.h"
- #include "log.h"
- #include "gd32_flash.h"
- #include "timer.h"
- #include "wwdgt.h"
- #include "sys_http.h"
- #include "data_task.h"
- #include "mmodbus.h"
- /*
- *freertos优先级管理
- *管理启动流程任务 init_task 优先级 1
- *freertos时间任务 prvTimerTask 优先级 2
- *上位机交互任务 tcp_server 优先级 1
- *可能会开启的任务 dhcp_task 优先级 4
- *mqtt通信任务 mqtt_publish_task 优先级 4
- *以太网输入任务 ethernetif_input 优先级 5
- *数据处理任务 data_task 优先级 3
- *OTA升级任务 updata_task 优先级 5
- */
- #define INIT_TASK_PRIO ( tskIDLE_PRIORITY + 1 )
- #define DHCP_TASK_PRIO ( tskIDLE_PRIORITY + 4 )
- #define LED_TASK_PRIO ( tskIDLE_PRIORITY + 2 )
-
- void led_task(void * pvParameters);
- void init_task(void * pvParameters);
- void readID(char *strId);
- char gatewayId[11];
- /*!
- \brief main function
- \param[in] none
- \param[out] none
- \retval none
- */
- int main(void)
- {
- readID(gatewayId);
- /* remap PB3 PB4 */
- rcu_periph_clock_enable(RCU_AF);// 使能映射功能的时钟
- gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);// 重映射PB3、PB4
-
- /* LED init */
- gd_eval_led_init(LED_DEV); // 状态灯
- gd_eval_led_init(LED_485RX); // 485 RX 通信灯
- gd_eval_led_init(LED_485TX); // 485 TX 通信灯
-
- /* configure 4 bits pre-emption priority */
- nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
-
- /* 485 init */
- gd_485_DE_pin_init();
- config_485_port(COM_485,9600,8,1,0);
- printf("start\n");
-
- /* timer init */
- timer5_init();
- // 02设备直连电源时需要延迟
- //delay_ms(50);
- /* FWDGT init */
- watchdog_init();
-
- /* LED_DEV open */
- gd_eval_led_on(LED_DEV);
-
- /* init task */
- xTaskCreate(init_task, "INIT",256, NULL, INIT_TASK_PRIO, NULL);
-
- /* start scheduler */
- vTaskStartScheduler();
- while(1)
- {
-
- }
- }
- /*!
- \brief init task
- \param[in] pvParameters not used
- \param[out] none
- \retval none
- */
- void init_task(void * pvParameters)
- {
- /* configure ethernet (GPIOs, clocks, MAC, DMA) */
- enet_system_setup();
- /* initilaize the LwIP stack */
- lwip_stack_init();
- log_init();
- /* initilaize the tcp server: telnet 8000 */
- // hello_gigadevice_init();
- // /* initilaize the tcp client: echo 1026 */
- // tcp_client_init();
- /* initilaize the udp: echo 1025 */
- tcp_server_init();
- #ifdef USE_DHCP
- /* start DHCP client */
- xTaskCreate(dhcp_task, "DHCP", 512, NULL, DHCP_TASK_PRIO, NULL);
- #endif /* USE_DHCP */
-
- /* start toogle LED task every 250ms */
- // xTaskCreate(led_task, "LED", 512, NULL, LED_TASK_PRIO, NULL);
- char* buf = pvPortMalloc(10);
- while(read_data_from_flash(buf)){};
- vPortFree(buf);
- http_getDemo();
- xTaskCreate(data_task, "DATA",512, NULL, DATA_TASK_PRIO, NULL);
- mqtt_task_creat();
- for( ;; ){
- vTaskDelete(NULL);
- }
- }
- /*!
- \brief led task
- \param[in] pvParameters not used
- \param[out] none
- \retval none
- */
- // 为了看到闪烁的效果,把485的一些数据丢掉
- void led_task(void * pvParameters)
- {
- for( ;; ){
- // /* toggle LED3 each 250ms */
- // gd_eval_led_toggle(LED_DEV);
- vTaskDelay(100);
- }
- }
- void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName )
- {
- LogPrint(LOG_ERROR,__FILE__,__FUNCTION__,__LINE__,"task :%s 栈溢出\r\n",pcTaskName);
- }
- void vApplicationHeapOverflowHook(TaskHandle_t xTask, char *pcTaskName )
- {
- LogPrint(LOG_ERROR,__FILE__,__FUNCTION__,__LINE__,"task :%s 堆溢出\r\n",pcTaskName);
- }
- void vApplicationMallocFailedHook()
- {
- LogPrint(LOG_ERROR,__FILE__,__FUNCTION__,__LINE__,"malloc error");
- }
- /*
- * 函数名:void readID(char *strId)
- * 输入参数:无
- * 输出参数:strId
- * 返回值:无
- * 函数作用:读取长度12的芯片Id并组合从中取出对应字符防止其重复
- */
- void readID(char *strId)
- {
- static const char *hex_table = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN";
- uint32_t CpuID1, CpuID2, CpuID3;
- CpuID1 = *(volatile uint32_t *)(0x1FFFF7E8);
- CpuID2 = *(volatile uint32_t *)(0x1FFFF7EC);
- CpuID3 = *(volatile uint32_t *)(0x1FFFF7F0);
- strId[0] = 'D';
- strId[1] = 'T';
-
- for (uint8_t i = 0, j = 0; i < 8; i += 2)
- {
- uint32_t sum1 = (CpuID1 >> ((j % 4) * 8)) & 0xFF; // 按字节取出
- uint8_t index1 = sum1 / 16;
- uint8_t remainder1 = sum1 % 16;
- uint32_t sum2 = (CpuID2 >> ((j % 4) * 8)) & 0xFF; // 按字节取出
- uint8_t index2 = sum2 / 16;
- uint8_t remainder2 = sum2 % 16;
- uint32_t sum3 = (CpuID3 >> ((j % 4) * 8)) & 0xFF; // 按字节取出
- uint8_t index3 = sum3 / 16;
- uint8_t remainder3 = sum3 % 16;
- strId[i + 2] = hex_table[index1 + index2 + index3];
- strId[i + 1 + 2] = hex_table[remainder1 + remainder2 + remainder3];
- j++;
- }
- strId[10] = '\0';
- }
|