流行科技

  • 2024-03-24
  • 发表了主题帖: 【得捷电子Follow me第4期】基础任务二(补充):RA-08H板子做显示

    我是申请了第二块板子,作为开发用的,有些可能买了模块,我觉得模块没啥性价比,选开发板,然后通过串口接受数据,进行显示。   RA-08H也是树莓派RP2040的芯片,驱动了一个1.8寸的显示屏幕。所以从开发上来说,和W5500-PICO是一样的。 #include <Adafruit_GFX.h>    // Core graphics library #include <Adafruit_ST7735.h> // Hardware-specific library for ST7735 #include <SPI.h> // #include "SoftwareSerial.h" // SoftwareSerial uart1(8,9);//串口定义 #include <SerialPIO.h> #define  txpin   0  #define  rxpin   1  #define  fifosize  32 SerialPIO mySerial(0, 1); // 创建SerialPIO对象 #define TFT_CS        17 #define TFT_RST        22 // Or set to -1 and connect to Arduino RESET pin #define TFT_DC         16 #define TFT_MOSI 19   // Data out #define TFT_SCLK 18  // Clock out #define TFT_BL 23 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); void setup() {   Serial.begin(9600);   // uart1.begin(115200);   Serial.print(F("Hello! ST77xx TFT Test"));   pinMode(TFT_BL, OUTPUT);   // put your setup code here, to run once:   // OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:    tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, green tab   digitalWrite(TFT_BL, HIGH);       mySerial.begin(115200);    tft.setTextWrap(false);    tft.fillScreen(ST77XX_BLACK); } String receivedData; // 存储接收到的字符流 void loop() {   // put your main code here, to run repeatedly:   // tft.setTextWrap(false);   // tft.fillScreen(ST77XX_BLACK);   static unsigned long startTime = millis(); // 记录起始时间   while (mySerial.available()) { // 检查是否有可用数据     char data = mySerial.read(); // 读取串口接收到的数据     receivedData += data; // 将数据添加到接收到的字符流中     startTime = millis(); // 重置起始时间   }   // 检查超时   if (millis() - startTime >= 2000) {     if (receivedData.length() > 0) {       // Serial.print("Received: "); // 通过USB CDC打印接收到的数据       // Serial.println(receivedData);             tft.setCursor(0, 30);       tft.setTextColor(ST77XX_RED);       tft.setTextWrap(false);       tft.fillScreen(ST77XX_BLACK);       tft.setTextSize(1);       tft.println(receivedData);       receivedData = ""; // 清空接收到的字符流     }     startTime = millis(); // 重置起始时间   } } 我们先做好这边的驱动。   红色框是串口0,我们通过初始化,完成其接收数据功能,然后加入屏幕驱动,接收到的数据让其显示到屏幕上。 #include <Ethernet.h> #include <EthernetUdp.h> #include <SerialPIO.h> // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 2, 177); unsigned int localPort = 8888;      // local port to listen on // buffers for receiving and sending data char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // buffer to hold incoming packet, char ReplyBuffer[] = "acknowledged";        // a string to send back // An EthernetUDP instance to let us send and receive packets over UDP EthernetUDP Udp; #define  txpin   0  #define  rxpin   1  #define  fifosize  32 SerialPIO mySerial(0, 1); // 创建SerialPIO对象 void setup() {   // You can use Ethernet.init(pin) to configure the CS pin   //Ethernet.init(10);  // Most Arduino shields   //Ethernet.init(5);   // MKR ETH shield   //Ethernet.init(0);   // Teensy 2.0   //Ethernet.init(20);  // Teensy++ 2.0   //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet   //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet   Ethernet.init(17);  // WIZnet W5100S-EVB-Pico W5500-EVB-Pico W6100-EVB-Pico   // start the Ethernet   Ethernet.begin(mac, ip);   // Open serial communications and wait for port to open:   Serial.begin(9600);   while (!Serial) {     ; // wait for serial port to connect. Needed for native USB port only   }   // Check for Ethernet hardware present   if (Ethernet.hardwareStatus() == EthernetNoHardware) {     Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");     while (true) {       delay(1); // do nothing, no point running without Ethernet hardware     }   }   if (Ethernet.linkStatus() == LinkOFF) {     Serial.println("Ethernet cable is not connected.");   }   // start UDP   Udp.begin(localPort);    mySerial.begin(115200); } String SenddData; // 存储接收到的字符流 void loop() {   // if there's data available, read a packet   int packetSize = Udp.parsePacket();   if (packetSize) {     Serial.print("Received packet of size ");     SenddData += "Received size:";     Serial.println(packetSize);     SenddData += packetSize;     SenddData += "\r\n";     Serial.print("From ");     SenddData += "From:";     IPAddress remote = Udp.remoteIP();     for (int i=0; i < 4; i++) {       Serial.print(remote[i], DEC);       SenddData += remote[i];       if (i < 3) {         Serial.print(".");         SenddData += ".";       }     }     Serial.print(", port ");     SenddData += ", \r\nport ";     SenddData += "\r\n";     Serial.println(Udp.remotePort());         SenddData += Udp.remotePort();     SenddData += "\r\n";         // read the packet into packetBufffer     Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);     Serial.println("Contents:");     Serial.println(packetBuffer);     SenddData += "Contents:\r\n";     SenddData += packetBuffer;     mySerial.println(SenddData);     SenddData="";     // send a reply to the IP address and port that sent us the packet we received     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());     Udp.write(ReplyBuffer);     Udp.endPacket();   }   delay(10); } 同样修改w5500这边的代码,这边代码主要就是添加了串口0初始化,以及串口数据的一个整理发送。   完成后效果就是他可以接受到UDP数据,然后通过串口发送,内容是UDP发送端的信息,IP和端口,然后发送的内容,发送内容中间加了那个换行有点问题,显示的。   从这边接受到显示的内容其实就是乱码的。所以屏幕上显示的也是乱码的。   除了这个功能,也可以直接用串口发送数据显示。也算便携串口显示了,没电脑的时候可以看下,不过目前没有支持中文显示。

  • 2024-03-20
  • 发表了主题帖: 【复旦微车规MCU FM33FT0A 系列】+TSI触摸软件使用

    复旦微有关于这款芯片的触摸专门的资料。同时也配了一款专门的软件可以进行调试,方便参数调试。     我们自己生成一个工程,目前根据板子我只是简单的用了下按键。   可以看到我们使用的接口都是专门留出来了,在画板子时候注意下即可。   然后进行模块配置有时钟和电流DAC补偿设置。   同时配置数字滤波器,这些都先根据官方的文档来进行。   生成工程,我们可以选择我们板子仿真器的串口进行测试。调试用这个软件进行。   工程还是和案例一致的,如果我们没选择生成调试串口和时钟的话我们还需要添加自己代码,现在我们只需要编译下载调试即可。   软件进入调试界面,然后端口配置,点击开始,右上角的观察点开,然后操作触摸即可。   按下就会显示绿灯,然后会开始计时,到时间就会强制中断信号,防止一直触摸的发生。   同时这款软件也是有曲线显示功能,把传感器数据都传输上去了,比较方便我们去调试这个触摸。         用户想用他按下的状态,可以直接在循环中添加上述代码即可完成状态获取。   看下他的打印是对的。 总结:复旦微在单独设计了这么一个库,同时给了我们一个生成软件简化我们去调试这个代码,同时图形界面也是非常直观的显示数据,和调试参数的配置。

  • 2024-03-16
  • 发表了主题帖: 【雅特力车规级MCU开发板AT-START-A403A】+Flash读写案例

    在一些场合我们需要用到内部Flash简单的去存储一些参数,这就需要用到我们的Flash读写,通过本案例我们就像读取EEPROM一样去读取内部Flash。 首先明确一个概念,就是内部Flash是和EEPROM这种外部存储器件是不一样的,就是只能写0不能写1的,所以我们想改写某个位置的数据就需要进行区域擦除,这样一块区域全恢复为1了。   所以我们每次操作的都是操作一个扇区或者多个扇区的擦除。     我们看案例是复制一个很大的数组到Flash中的,通知地址也是给了,注意地址不是奇数即可。   雅特力的案例,会建立一个数组,写的时候先读取地址里面不是0xFFFF的数据给保存下来,目前应该是半字读取所以是0xFFFF。   他是比ST芯片多支持了一个字节的读取,其他是一样的。   要擦出的扇区在前面已经计算过来,所以我们直接去擦除,然后往里写入即可。   读取简单点就是地址指针转数据。   进入仿真就可以看到对应地址的数值,也是对的。

  • 2024-03-15
  • 发表了主题帖: 【安信可BW16-Kit】+WS2812B点灯

    WS2812B是一种级联的LED三色灯,其内部有芯片,外部通过发送指令,可以控制其三基色亮度,从而配合完成各种颜色的变换。然后占用IO也很少比较好用。 我们在Arduino中可以打开例程。   我们把我们有多少LED灯珠输入进去,然后底层的接口是固定的。对应不同板子去接就行了。    调用了两个函数,操作不一样,一个是对应每个LED数,来设定每个灯颜色,一个是全局的。多少数量的灯亮啥颜色。 void setPixelColor(uint16_t led_Number, uint8_t rColour, uint8_t bColour, uint8_t gColour); void fill(uint8_t rColor, uint8_t gColor, uint8_t bColor, uint16_t first = 0, uint16_t count = 0);  

  • 2024-03-13
  • 回复了主题帖: 颁奖礼:平头哥玄铁杯第三届获奖名单揭晓,纪念一起对AI进行小小探索的你们

    个人信息无误,可安排邮寄。

  • 2024-03-10
  • 发表了主题帖: 【雅特力车规级MCU开发板AT-START-A403A】+读取温湿度OLED显示

    我们驱动一个OLED显示屏之后我们就可以通用下了,因为读取和写都是类似的,我们再增加一个设备就是SHT20温湿度传感器。 在这个基础上我们还需要再操作下,改下IIC初始化,变化下管脚。   因为我们的PB6,7是有其他用途的,所以我们需要修改下,我们改到PB8,9的引脚重映射上。   代码上我们增加一个重映射的配置,这样就能顺利的修改到PB8,9上。   然后添加SHT20读取函数,先软复位下,然后进行寄存器读。   显示用Sprintf转换下。  

  • 发表了主题帖: 【雅特力车规级MCU开发板AT-START-A403A】+IIC应用OLED屏幕显示

    对于一些常见外设,雅特力做了很多的封装,我们可以直接拿到驱动其他设备。   本次用IIC案例进行驱动我们的OLED屏幕。   IIC依赖雅特力的一个中间库,进行了对IIC库的再次封装,这样只留了一个接口,我们通过调用非常的方便就能跑起来了。   修改下OLED驱动的发送数据函数即可,模拟IIC部分全部删除。这部分区分下发送数据和发送命令。   主循环进行调用测试即可。  

  • 2024-03-09
  • 发表了主题帖: 【雅特力车规级MCU开发板AT-START-A403A】+USB虚拟串口应用控制点灯

        我们在有了虚拟串口基础上我就可以像传统串口一样进行一些命令解析,我们可以通过其来进行LED灯的简单控制。 我们对接受到的buff进行解析,分别控制三个LED灯。   当虚拟串口接收到数据后就会打开LED灯。   效果是对的。可以控制开关。

  • 发表了主题帖: 【雅特力车规级MCU开发板AT-START-A403A】+USB虚拟串口测试

      雅特力官方是给了比较多的USB案例我们可以去学习的。有些案例还是复合案例。我们就找下我们最常用的。   虚拟串口,这个在一些cmsis-dap的仿真器中有用到就是既可以仿真同时也有接口可以进行串口打印测试信息。   板载了USB接口,只需要连接上既可。   主函数就是USB虚拟的串口和串口2进行相互间发送接收数据。   需要通过雅特力官方一个软件进行驱动安装。   接线后测试发送互发数据。     测试发现大数据量是没问题的。

  • 2024-02-27
  • 发表了主题帖: 【安信可BW16-Kit】+蓝牙串口发送读取数据

    WiFi试用了之后我们就可以开始我们的蓝牙测试了,我们选择简单的串口蓝牙发送读取数据。   主要是创建我们的一个串口服务,下面两个是特征,根据这个特征我们可以进行一些操作,如发送数据,接收数据。   下面就是初始化,第一个是蓝牙设备名称,名称下面是我们的主要服务的UUID。   找到我们设备,然后进行连接,联机上之后就能看到我们的服务了。     可以发送数据,我们的串口终端可以收到数据,同时在串口终端发送数据,蓝牙端也是可以收到的。   使能接收通知既可快速收到数据,不用点击读取了。

  • 发表了主题帖: 【安信可BW16-Kit】+TCPServer连接发送数据

    日常TCP连接发送还是比较常用的,所以我们用他创建一个TCP Server让电脑去连接它。   修改WiFi,查看其端口使用的是5003。   连接时会提示IP地址。   网络调试助手上用client进行连接测试,发现可以连接同时一直打印数据。   串口也可以看到收到的数据。

  • 发表了主题帖: 【安信可BW16-Kit】+NTP服务器获取当前时间

      本身是有一个NTP案例的,但是还需要稍微修改下我们才可以使用,首先就是WIFI要修改成可以联网的。 其次就是这个NTP服务是封装了的,需要修改下才能符合我们使用。   封装文件在这个位置。   这个我们修改成我们当前的北京时间。   把我们的获取网站地址端口更改。   获取到时间就是对的了。

  • 回复了主题帖: 【得捷Follow me第4期】+ 任务汇总

    【得捷电子Follow me第4期】基础任务二(补充):TCP使用购买的板子通信 https://bbs.eeworld.com.cn/thread-1272768-1-1.html

  • 发表了主题帖: 【得捷电子Follow me第4期】基础任务二(补充):TCP使用购买的板子通信

    在前面开箱我是有购买其他的开发板的,所以任务二中的TCP通信我就用这个来做下两端通信测试。 树莓派PICO作为TCP sever,购买的M5StampC3作为 TCP client 连接他。   直接使用案例即可。   他循环中不仅接受了,还回传了。   在Arduino中也是一样,主要是clinet进行发送,然后会获取发送回来的数据。   效果就是这样。两个来回收发。  

  • 2024-02-26
  • 发表了主题帖: 【得捷Follow me第4期】+ 任务汇总

    本帖最后由 流行科技 于 2024-2-27 11:36 编辑   视频说明 任务介绍 基础任务一:完成主控板W5500初始化 初始化其本身是有例程的主要还是库的选择,我们在Arduino下选择库还需要注意。   最开始可能是这样的Ping库,这个还需要自己去修改了,很麻烦。 有老哥提供了一个可以ping的库,地址是: https://github.com/masterx1981/Ethernet/tree/master/   如果看官方的里面,目前更新到了2.02版本。里面是没有这个库的。   有人提交了问题,但是目前好像没有回应。测试时候可以参考ICMP_PING这个库给的案例。 #include <SPI.h>         #include <Dns.h>  #include <Ethernet.h> #include <EthernetICMP.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // max address for ethernet shield IPAddress ip(192,168,1,155); // ip address for ethernet shield IPAddress pingAddr(192,168,1,3); // ip address to ping DNSClient dnClient; SOCKET pingSocket = 0; EthernetICMPPing  ping(pingSocket, (uint16_t)random(0, 255)); void ping_ip(const IPAddress &pingAddr1) {   EthernetICMPEchoReply  echoReply = ping(pingAddr1, 4);   char buffer [256];   if (echoReply.status == SUCCESS)   {     sprintf(buffer,             "Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d",             echoReply.data.seq,             echoReply.addr[0],             echoReply.addr[1],             echoReply.addr[2],             echoReply.addr[3],             REQ_DATASIZE,             millis() - echoReply.data.time,             echoReply.ttl);   }   else   {     sprintf(buffer, "Echo request failed; %d", echoReply.status);   }   Serial.println(buffer);   delay(500); } void ping_site() {   dnClient.begin(Ethernet.dnsServerIP());   const char domains[20] = { "www.baidu.com"};   IPAddress dstip;   if (dnClient.getHostByName(domains, dstip) == 1) {     Serial.print(domains);     Serial.print(" = ");     Serial.println(dstip);     ping_ip(dstip);   } else{     Serial.println(F("dns lookup failed"));   } } void setup()  {   Serial.begin(9600);   while (!Serial)     ;   // You can use Ethernet.init(pin) to configure the CS pin   //Ethernet.init(10);  // Most Arduino shields   //Ethernet.init(5);   // MKR ETH shield   //Ethernet.init(0);   // Teensy 2.0   //Ethernet.init(20);  // Teensy++ 2.0   //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet   //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet   Ethernet.init(17);  // WIZnet W5100S-EVB-Pico W5500-EVB-Pico W6100-EVB-Pico   // start Ethernet   Ethernet.begin(mac, ip);   // Ethernet.begin(mac, ip, myDns, gateway, subnet); } void loop() {   // ping_site();   ping_ip(pingAddr); } Ping网站的时候还是获取到网站的IP地址,然后进行PING的。   用wireshark看ping自己主机,就是这样的。 基础任务二:主控板建立TCPIP或UDP服务器 这部分我们先看UDP协议,UDP他也是有例子的,我们可以查看下。 #include <Ethernet.h> #include <EthernetUdp.h> // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192, 168, 2, 177); unsigned int localPort = 8888;      // local port to listen on // buffers for receiving and sending data char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // buffer to hold incoming packet, char ReplyBuffer[] = "acknowledged";        // a string to send back // An EthernetUDP instance to let us send and receive packets over UDP EthernetUDP Udp; void setup() {   // You can use Ethernet.init(pin) to configure the CS pin   //Ethernet.init(10);  // Most Arduino shields   //Ethernet.init(5);   // MKR ETH shield   //Ethernet.init(0);   // Teensy 2.0   //Ethernet.init(20);  // Teensy++ 2.0   //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet   //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet   Ethernet.init(17);  // WIZnet W5100S-EVB-Pico W5500-EVB-Pico W6100-EVB-Pico   // start the Ethernet   Ethernet.begin(mac, ip);   // Open serial communications and wait for port to open:   Serial.begin(9600);   while (!Serial) {     ; // wait for serial port to connect. Needed for native USB port only   }   // Check for Ethernet hardware present   if (Ethernet.hardwareStatus() == EthernetNoHardware) {     Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");     while (true) {       delay(1); // do nothing, no point running without Ethernet hardware     }   }   if (Ethernet.linkStatus() == LinkOFF) {     Serial.println("Ethernet cable is not connected.");   }   // start UDP   Udp.begin(localPort); } void loop() {   // if there's data available, read a packet   int packetSize = Udp.parsePacket();   if (packetSize) {     Serial.print("Received packet of size ");     Serial.println(packetSize);     Serial.print("From ");     IPAddress remote = Udp.remoteIP();     for (int i=0; i < 4; i++) {       Serial.print(remote[i], DEC);       if (i < 3) {         Serial.print(".");       }     }     Serial.print(", port ");     Serial.println(Udp.remotePort());     // read the packet into packetBufffer     Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);     Serial.println("Contents:");     Serial.println(packetBuffer);     // send a reply to the IP address and port that sent us the packet we received     Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());     Udp.write(ReplyBuffer);     Udp.endPacket();   }   delay(10); } 这部分还比较好理解,主要就是创建一个UDP服务,端口是8888,通过电脑软件也建一个UDP服务连接他。   连接目标机器的IP地址和端口。   连接上之后会有反馈。接收信息也会打印的。     网络分析就是看数据段,数据是吻合的。 进阶任务:从NTP服务器同步时间 本身我们的arduino上面就有NTP服务器获取时间的例程,所以我在基础上稍微修改了下,显示了日期和时间。 /*  Udp NTP Client  Get the time from a Network Time Protocol (NTP) time server  Demonstrates use of UDP sendPacket and ReceivePacket  For more on NTP time servers and the messages needed to communicate with them,  see http://en.wikipedia.org/wiki/Network_Time_Protocol  created 4 Sep 2010  by Michael Margolis  modified 9 Apr 2012  by Tom Igoe  modified 02 Sept 2015  by Arturo Guadalupi  This code is in the public domain.  */ #include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> // Enter a MAC address for your controller below. // Newer Ethernet shields have a MAC address printed on a sticker on the shield byte mac[] = {   0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; unsigned int localPort = 8888;       // local port to listen for UDP packets const char timeServer[] = "ntp1.aliyun.com"; // time.nist.gov NTP server const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets // A UDP instance to let us send and receive packets over UDP EthernetUDP Udp; void setup() {   // You can use Ethernet.init(pin) to configure the CS pin   //Ethernet.init(10);  // Most Arduino shields   //Ethernet.init(5);   // MKR ETH shield   //Ethernet.init(0);   // Teensy 2.0   //Ethernet.init(20);  // Teensy++ 2.0   //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet   //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet   Ethernet.init(17);  // WIZnet W5100S-EVB-Pico W5500-EVB-Pico W6100-EVB-Pico   // Open serial communications and wait for port to open:   Serial.begin(9600);   while (!Serial) {     ; // wait for serial port to connect. Needed for native USB port only   }   // start Ethernet and UDP   if (Ethernet.begin(mac) == 0) {     Serial.println("Failed to configure Ethernet using DHCP");     // Check for Ethernet hardware present     if (Ethernet.hardwareStatus() == EthernetNoHardware) {       Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");     } else if (Ethernet.linkStatus() == LinkOFF) {       Serial.println("Ethernet cable is not connected.");     }     // no point in carrying on, so do nothing forevermore:     while (true) {       delay(1);     }   }   Udp.begin(localPort); } void loop() {   sendNTPpacket(timeServer); // send an NTP packet to a time server   // wait to see if a reply is available   delay(1000);   if (Udp.parsePacket()) {     // We've received a packet, read the data from it     Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer     // the timestamp starts at byte 40 of the received packet and is four bytes,     // or two words, long. First, extract the two words:     unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);     unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);     // combine the four bytes (two words) into a long integer     // this is NTP time (seconds since Jan 1 1900):     unsigned long secsSince1900 = highWord << 16 | lowWord;     unsigned long n=0,d=0,total_d=0,rz=0;     uint32_t p_year_total_sec;     uint32_t r_year_total_sec;     uint16_t y=0,r=0,yr=0;     uint8_t yf=0;     signed long long yd=0;     Serial.print("Seconds since Jan 1 1900 = ");     Serial.println(secsSince1900);     // now convert NTP time into everyday time:     Serial.print("Unix time = ");     // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:     const unsigned long seventyYears = 2208988800UL;     // subtract seventy years:     unsigned long epoch = secsSince1900 - seventyYears;     // print Unix time:     Serial.println(epoch);     // print the hour, minute and second:     Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)         n = epoch;     total_d = epoch/(86400);     d=0;     p_year_total_sec=86400*365;     r_year_total_sec=86400*366;     while(n>=p_year_total_sec)      {       if((1970+r)%400==0 || ((1970+r)%100!=0 && (1970+r)%4==0))       {         n = n -(r_year_total_sec);         d = d + 366;       }       else       {         n = n - (p_year_total_sec);         d = d + 365;       }       r+=1;       y+=1;         }         y += 1970;     Serial.print(y); // print the year (86400 equals secs per day)     Serial.print('/');     yd=0;     yd = total_d - d;         yf=1;     while(yd>=28)      {                 if(yf==1 || yf==3 || yf==5 || yf==7 || yf==8 || yf==10 || yf==12)         {           yd -= 31;           if(yd<0)break;           rz += 31;         }             if (yf==2)         {           if (y%400==0 || (y%100!=0 && y%4==0))            {             yd -= 29;             if(yd<0)break;             rz += 29;           }           else            {             yd -= 28;             if(yd<0)break;             rz += 28;           }         }          if(yf==4 || yf==6 || yf==9 || yf==11 )         {           yd -= 30;           if(yd<0)break;           rz += 30;         }         yf += 1;             }         Serial.print(yf);     Serial.print('/');     yr = total_d-d-rz;         yr += 1;         Serial.print(yr); // print the day (86400 equals secs per day)     Serial.print(' ');     Serial.print((epoch  % 86400L) / 3600+8); // print the hour (86400 equals secs per day)     Serial.print(':');     if (((epoch % 3600) / 60) < 10) {       // In the first 10 minutes of each hour, we'll want a leading '0'       Serial.print('0');     }     Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)     Serial.print(':');     if ((epoch % 60) < 10) {       // In the first 10 seconds of each minute, we'll want a leading '0'       Serial.print('0');     }     Serial.println(epoch % 60); // print the second   }   // wait ten seconds before asking for the time again   delay(1000);   Ethernet.maintain(); } // send an NTP request to the time server at the given address void sendNTPpacket(const char * address) {   // set all bytes in the buffer to 0   memset(packetBuffer, 0, NTP_PACKET_SIZE);   // Initialize values needed to form NTP request   // (see URL above for details on the packets)   packetBuffer[0] = 0b11100011;   // LI, Version, Mode   packetBuffer[1] = 0;     // Stratum, or type of clock   packetBuffer[2] = 6;     // Polling Interval   packetBuffer[3] = 0xEC;  // Peer Clock Precision   // 8 bytes of zero for Root Delay & Root Dispersion   packetBuffer[12]  = 49;   packetBuffer[13]  = 0x4E;   packetBuffer[14]  = 49;   packetBuffer[15]  = 52;   // all NTP fields have been given values, now   // you can send a packet requesting a timestamp:   Udp.beginPacket(address, 123); // NTP requests are to port 123   Udp.write(packetBuffer, NTP_PACKET_SIZE);   Udp.endPacket(); } 最常用的国内NTP服务器 http://ntp1.aliyun.com   http://ntp.tencent.com   http://edu.ntp.org.cn   不修改服务器也是可以的。     其可以直接获取到时间   https://www.beijing-time.org/shijianchuo/   可以通过上面的时间戳通过网站验证我们转换是否正确。     北京时间加8小时既可。 终极任务二:使用外部存储器,组建简易FTP文件服务器 最后一个任务我们用国内的Wiznet供应商提供的代码,完成FTP服务器搭建。   在VScode下构建好这个FTP Server案例。   构建完成后我们只需要把这个uf2文件拖到板子上。 启动fileZilla软件创建FTP连接。     连接成功后可以看到正常列出了文件,同时可以上传和下载里面的文件。   串口也是有打印信息的。   代码  

  • 2024-02-25
  • 发表了主题帖: 【复旦微车规MCU FM33FT0A 系列】+ADC采集并用显示屏显示采集结果

    我们本身MCU还有一个12bit的ADC的,板载上也有一个可调电阻,我们可以测试ADC采集的精度。   原理图,ADC口接在我们的PC11接口上。   案例修改,添加ADC驱动。   获取的数值扩大了1000倍,直接出的uint型结果。  

  • 发表了主题帖:  【复旦微车规MCU FM33FT0A 系列】+创建个人案例并点屏

    我们板载是带了一块屏幕的,这款屏幕使用ST7789v3芯片作为驱动,直接搜素型号不太行。     直接这样搜索,我们就能找到类似的屏幕了,然后中景园也是给了资料案例,我们进行移植。   大致修改就是修改引脚,由于他们使用的是模拟SPI,所以直接对应上管脚就能点屏,但是速度太慢了,所以我增加了SPI点屏方式。   稍微修改下就能兼容了。 void LCD_Writ_Bus(u8 dat) { if(!LCD_HW_SPI) { u8 i; LCD_CS_Clr(); for(i=0;i<8;i++) {    LCD_SCLK_Clr(); if(dat&0x80) {    LCD_MOSI_Set(); } else {    LCD_MOSI_Clr(); } LCD_SCLK_Set(); dat<<=1; } LCD_CS_Set(); } else { uint32_t counter, RX_Flag; uint8_t *rdata; LCD_CS_Clr(); FL_SPI_I2S_WriteTXBuff(SPI0, dat);   /* 发送数据 */ counter = 0;         do         {             RX_Flag = FL_SPI_I2S_IsActiveFlag_RXBuffFull(SPI0);             counter++;         } while((counter != 0xFFFFFFFFU) && (RX_Flag == 0U));        /* 等待接收标志置起 */         if(RX_Flag == 0x01)         {             *rdata = (uint8_t)(FL_SPI_I2S_ReadRXBuff(SPI0) & 0xFFU); /* 读取接收数据,同时可自动清除接收标志 */             rdata++;         }          LCD_CS_Set(); } } 上面就是发送代码。 硬件SPI速度要快很多。  

  • 2024-02-23
  • 发表了主题帖: 【得捷电子Follow me第4期】 终极任务二:使用外部存储器,组建简易FTP文件服务器

    最后一个任务我们用国内的Wiznet供应商提供的代码,完成FTP服务器搭建。   在VScode下构建好这个FTP Server案例。   构建完成后我们只需要把这个uf2文件拖到板子上。 启动fileZilla软件创建FTP连接。     连接成功后可以看到正常列出了文件,同时可以上传和下载里面的文件。   串口也是有打印信息的。  

  • 2024-02-22
  • 加入了学习《 【得捷电子Follow me第4期】》,观看 【得捷Follow me第4期】简易FTP文件服务器

  • 加入了学习《 【得捷电子Follow me第4期】》,观看 【得捷Follow me第4期】综合实践之智能家居控制器

统计信息

已有374人来访过

  • 芯积分:1392
  • 好友:--
  • 主题:141
  • 回复:94

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言