范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

对串口接收FIFO处理机制的解读

  一、FIFOFIFO
  是 First Input First Output 的缩写,先入先出队列。
  使用的场景:一般是在 不同的时钟域 之间的 数据传输 (简单理解即:一个(读写)快,另外的一个(读写)慢的场景中。)
  本质操作:就是将收的数据存储的一个 线性的数组 中,通过指针指向该数组的 自加1(偏移) 来遍历数据,达到 读取或者写入 的目的。
  作用:起到 缓冲 环节,可防止数据的丢失。
  对数据量大的进行存储, 避免频繁的总线操作 。并且可满足dma的操作。
  在fifo中需要理解连个重要成员:
  宽度:指 一次 写读操作的 数据位数 。
  深度:存储多少个宽度的数据。(如:存储8个16位宽的数据)。  第一类、FIFO处理机制如下:
  FIFO信息的定义:  /* 该结构体定义成员有 缓存区, 长度, 输出, 输入的计数。 */ typedef struct fifo_t {     uint8_t *buf;  uint32_t size;  uint32_t in;  uint32_t out; } _fifo_str; #define min(x,y) ((x) < (y)?(x):(y))   1234567891011121314 1、初始化FIFOfifo_str fifo_str;  int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size)//初始化fifo {  _fifo_str *p = &fifo_str;    if(fifo_addr == NULL || fifo_size == 0)//判断数据是否为空   return -1;   memset((char *)p, 0, sizeof(_fifo_str));//初始化结构体  p->buf = fifo_addr;//对应宽度     p->in = 0;//输入计数     p->out = 0;//输出计数     p->size = fifo_size;//对应深度  return 0; } 12345678910111213141516 2、数据的长度获取//数据的实际使用数据空间长度 int FifoDataLen(void) {  _fifo_str *p = &fifo_str;  return (p->in - p->out);//输入计数-输出计数 } //剩余数据空间长度 int FifoSpaceLen(void) {  _fifo_str *p = &fifo_str;    return (p->size - (p->in - p->out));//定义长度-(实际长度) } 12345678910111213 3、FIFO的进和出处理//获取fifo数据 //数据的内容缓存区,要读的长度 int FifoRead(uint8_t *buf, uint32_t len) {  uint32_t i = 0, j = 0;  _fifo_str *p = &fifo_str;   j = (p->out % p->size);//获取剩余空间长度未读量  len = min(len, p->in - p->out);//防止长度为超出实际拥有的数据长度,即让读取的长度在  (0<设定len<定义的缓存区长度len )这间的实际长度  i = min(len, p->size - j);//获取实际内容的长度,的数据长度  memcpy(buf, p->buf + j, i);//将数据通道里的数据拷贝给缓存区  memcpy(buf + i, p->buf, len - i);//将未有数据的区域存入,对应为写入数据的区域数据(即,有数据的填数据,没数据的地方补0)  p->out += len;//已读的数据量  return len;//实际读到的数据长度 } //对fifo写入数据 int FifoWrite(uint8_t *buf, uint32_t len) {  uint32_t i = 0, j = 0;  _fifo_str *p = &fifo_str;   j = p->in % p->size;//获取要写入的剩余空间长度  len = min(len, p->size - p->in + p->out);//得到实际写入的长度  i = min(len, p->size - j);//实际写入数据的长度  memcpy(p->buf + j, buf, i);//将写入的数据的内容拷贝值数据中。  memcpy(p->buf, buf + i, len - i);//补充多余空间的内容  p->in += len;//记录实际写入数据的数量  return len;//返回写入的长度 }  123456789101112131415161718192021222324252627282930 4、置位记录量//清空fifo 中的记录量 void FifoClear(void) {  _fifo_str *p = &fifo_str;     p->in = 0;     p->out = 0; } 1234567 5、应用处理机制#define LEN 2048 uint8_t pdata[LEN] = {0}; FifoInit(pdata, LEN);//初始化FIFO uint8_t buf[32] = {0};  int tx_len = 0; uint8_t tx_buf[100] = {0};  HAL_UART_Receive_IT(&huart1, buf, IT_LEN);//串口的接收中断开启 while(1)  {    tx_len = FifoDataLen();//获取数据长度   if (tx_len > 0)   {    tx_len = (tx_len > 100) ? 100 : tx_len;//判读数据长度是否越界    FifoRead(tx_buf, tx_len);//读取在中断中写入FIFO缓存的数据    HAL_UART_Transmit(&huart1, tx_buf, tx_len, 1000);//将读到的数据通过串口发送出来   }  }  接收回调函数中的处理 HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {  if (FifoSpaceLen() >= 串口记录的接收数据长度)//判断写入FIFO空间的数据量是否大于接收的数据量  {   FifoWrite(huart->pRxBuffPtr, huart->RxXferCount);//想FIFO中写入数据  } }  123456789101112131415161718192021222324252627
  该FIFO的处理机制中用的记录是通过uint32t类型进行记录的,可能在遇到超出其数据极限的情况,导致数据通信异常。(该类型的数据极限较大,为特殊情况可能出现的情况)。  第二类、FIFO处理机制如下:/* 定义串口波特率和FIFO缓冲区大小, 分为发送缓冲区和接收缓冲区*/  #if UART1_FIFO_EN == 1   #define UART1_BAUD 115200   #define UART1_TX_BUF_SIZE 1*1024   #define UART1_RX_BUF_SIZE 1*1024 #endif   /* 串口设备结构体  设置发送、接收缓存区(长度),  并设置两个变量,一个是指针,一个是计数  */  typedef struct  {    USART_TypeDef *uart; /* STM32内部串口设备指针 */     uint8_t *pTxBuf; /* 发送缓冲区 */    uint8_t *pRxBuf; /* 接收缓冲区 */    uint16_t usTxBufSize; /* 发送缓冲区大小 */    uint16_t usRxBufSize; /* 接收缓冲区大小 */     __IO uint16_t usTxWrite; /* 发送缓冲区写指针 */    __IO uint16_t usTxRead; /* 发送缓冲区读指针 */     __IO uint16_t usTxCount; /* 等待发送的数据个数 */       __IO uint16_t usRxWrite; /* 接收缓冲区写指针 */     __IO uint16_t usRxRead; /* 接收缓冲区读指针 */    __IO uint16_t usRxCount; /* 还未读取的新数据个数 */      void (*SendBefor)(void); /* 开始发送之前的回调函数指针(主要用于RS485切换到发送模式) */    void (*SendOver)(void); /* 发送完毕的回调函数指针(主要用于RS485将发送模式切换为接收模式) */   void (*ReciveNew)(uint8_t _byte); /* 串口收到数据的回调函数指针 */    uint8_t Sending; /* 正在发送中 */   }UART_T;  /* 定义每个串口结构体变量 */  #if UART1_FIFO_EN == 1 static UART_T g_tUart1;  static uint8_t g_TxBuf1[UART1_TX_BUF_SIZE]; /* 发送缓冲区 */   static uint8_t g_RxBuf1[UART1_RX_BUF_SIZE]; /* 接收缓冲区 */  #endif  12345678910111213141516171819202122232425262728293031323334353637383940414243
  怎样才叫做回调函数?回调函数,是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数, 当这个指针被用为调用它所指向的函数时, 我们就说这是回调函数。
  区别指针函数和函数指针:  //指针函数: int *fun(int x,int y) int *x=fun(4,5); 在调用指针函数时,需要同类型的指针来接收函数返回值 是函数,返回值时指针 属于数据类型 123456 //函数指针: int (*fun)(int x,int y) int x(int x,int y); x=fun; fun=&x; x=(*fun)(1,3); 是指针,指向函数。 属于函数名称 12345678 1.初始化串口FIFO对应的相关的变量static void UartVarInit(void)  {    #if UART1_FIFO_EN == 1    g_tUart1.uart = USART1; /* STM32 串口设备 */    g_tUart1.pTxBuf = g_TxBuf1; /* 发送缓冲区指针 */    g_tUart1.pRxBuf = g_RxBuf1; /* 接收缓冲区指针 */    g_tUart1.usTxBufSize = UART1_TX_BUF_SIZE; /* 发送缓冲区大小 */    g_tUart1.usRxBufSize = UART1_RX_BUF_SIZE; /* 接收缓冲区大小 */    g_tUart1.usTxWrite = 0; /* 发送FIFO写索引 */    g_tUart1.usTxRead = 0; /* 发送FIFO读索引 */    g_tUart1.usRxWrite = 0; /* 接收FIFO写索引 */    g_tUart1.usRxRead = 0; /* 接收FIFO读索引 */    g_tUart1.usRxCount = 0; /* 接收到的新数据个数 */    g_tUart1.usTxCount = 0; /* 待发送的数据个数 */    g_tUart1.SendBefor = 0; /* 发送数据前的回调函数 */    g_tUart1.SendOver = 0; /* 发送完毕后的回调函数 */    g_tUart1.ReciveNew = 0; /* 接收到新数据后的回调函数 */    g_tUart1.Sending = 0; /* 正在发送中标志 */   #endif  }  1234567891011121314151617181920
  明确中断服务程序的顺序:中断函数处理:void USART1_IRQHandler(void)—》 UART中断请求:HAL_UART_IRQHandler(UART_HandleTypeDef *huart)—》 中断使能:UART_Receive_IT— 》 中断回调函数 HAL_UART_RxCpltCallback(huart);  #if UART1_FIFO_EN == 1 void USART1_IRQHandler(void) //系统中串口的中断函数入口 {     UartIRQ(&g_tUart1); } #endif  1234567
  嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
  无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
  点击这里找小助理0元领取:嵌入式物联网学习资料(头条)
  2.编辑自定义的UART中断请求static void UartIRQ(UART_T *_pUart) {     uint32_t isrflags = READ_REG(_pUart->uart->ISR);     uint32_t cr1its = READ_REG(_pUart->uart->CR1);     uint32_t cr3its = READ_REG(_pUart->uart->CR3);      if ((isrflags & USART_ISR_RXNE) != RESET)     {         /* 从串口接收数据寄存器读取数据存放到接收FIFO */         uint8_t ch;         ch = READ_REG(pUart->uart->RDR);         /* 读串口接收数据寄存器 */         _pUart->pRxBuf[_pUart->usRxWrite] = ch;         /* 填入串口接收FIFO */         if (++_pUart->usRxWrite >= _pUart->usRxBufSize) /* 接收FIFO的写指针+1 */         {             _pUart->usRxWrite = 0;         }         if (_pUart->usRxCount < _pUart->usRxBufSize) /* 统计未处理的字节个数 */         {             _pUart->usRxCount++;         }         /* 回调函数,通知应用程序收到新数据,一般是发送1个消息或者设置一个标记 */         // if (_pUart->usRxWrite == _pUart->usRxRead)         // if (_pUart->usRxCount == 1)         {             if (_pUart->ReciveNew)             {                 _pUart->ReciveNew(ch); /* 比如,交给MODBUS解码程序处理字节流 */             }         }     }     /* 处理发送缓冲区空中断 */     if (((isrflags & USART_ISR_TXE) != RESET) && (cr1its & USART_CR1_TXEIE) != RESET)     {         // if (_pUart->usTxRead == _pUart->usTxWrite)         if (_pUart->usTxCount == 0) /* 发送缓冲区已无数据可取 */         {             /* 发送缓冲区的数据已取完时, 禁止发送缓冲区空中断 (注意:此时最后1个数据还未真正发送完毕)*/             // USART_ITConfig(_pUart->uart, USART_IT_TXE, DISABLE);             CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); /* 使能数据发送完毕中断 */             // USART_ITConfig(_pUart->uart, USART_IT_TC, ENABLE);             SET_BIT(_pUart->uart->CR1, USART_CR1_TCIE);         }         Else /* 还有数据等待发送 */         {             _pUart->Sending = 1; /* 从发送FIFO取1个字节写入串口发送数据寄存器 */             // USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);             _pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];             if (++_pUart->usTxRead >= _pUart->usTxBufSize)             {                 _pUart->usTxRead = 0;             }             _pUart->usTxCount--;         }     }     /* 数据bit位全部发送完毕的中断 */     if (((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))     {         // if (_pUart->usTxRead == _pUart->usTxWrite)         if (_pUart->usTxCount == 0)         { /* 如果发送FIFO的数据全部发送完毕,禁止数据发送完毕中断 */             // USART_ITConfig(_pUart->uart, USART_IT_TC, DISABLE);             CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TCIE); /* 回调函数, 一般用来处理RS485通信,将RS485芯片设置为接收模式,避免抢占总线 */             if (_pUart->SendOver)             {                 _pUart->SendOver();             }             _pUart->Sending = 0;         }          else         { /* 正常情况下,不会进入此分支 */             /* 如果发送FIFO的数据还未完毕,则从发送FIFO取1个数据写入发送数据寄存器 */             // USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);             _pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];             if (++_pUart->usTxRead >= _pUart->usTxBufSize)             {                 _pUart->usTxRead = 0;             }             _pUart->usTxCount--;         }     } /* 清除中断标志 */     SET_BIT(_pUart->uart->ICR, UART_CLEAR_PEF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_FEF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_NEF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_OREF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_IDLEF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_TCF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_LBDF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_CTSF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_CMF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_WUF);     SET_BIT(_pUart->uart->ICR, UART_CLEAR_TXFECF); } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 3.填写数据到UART发送缓冲区。
  并启动发送中断,中断处理函数发送完毕后,自动关闭发送中断 .  static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)  {    uint16_t i;     for (i = 0; i < _usLen; i++)    {  /* 如果发送缓冲区已经满了,则等待缓冲区空 */     while (1)     {      __IO uint16_t usCount;   DISABLE_INT();      usCount = _pUart->usTxCount;      ENABLE_INT();       if (usCount < _pUart->usTxBufSize)      {       break;      }      else if(usCount == _pUart->usTxBufSize)/* 数据已填满缓冲区 */      {       if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)       {        SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE);       }      }     }   /* 将新数据填入发送缓冲区 */     _pUart->pTxBuf[_pUart->usTxWrite] = _ucaBuf[i];      DISABLE_INT();     if (++_pUart->usTxWrite >= _pUart->usTxBufSize)     {      _pUart->usTxWrite = 0;     }     _pUart->usTxCount++;     ENABLE_INT();    }     SET_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); /* 使能发送中断(缓冲区空) */  }   12345678910111213141516171819202122232425262728293031323334 4.向串口发送一组数据。
  数据放到发送缓冲区后立即返回,由中断服务程序在后台完成发送  void comSendBuf(COM_PORT_E _ucPort, uint8_t *_ucaBuf, uint16_t _usLen)  {    UART_T *pUart;     pUart = ComToUart(_ucPort);    if (pUart == 0)    {     return;    }     if (pUart->     != 0)    {     pUart->SendBefor(); /* 如果是RS485通信,可以在这个函数中将RS485设置为发送模式 */    }     UartSend(pUart, _ucaBuf, _usLen);  }  123456789101112131415
  向串口发送1个字节。数据放到发送缓冲区后立即返回, 由中断服务程序在后台完成发送  void comSendChar(COM_PORT_E _ucPort, uint8_t _ucByte)  {    comSendBuf(_ucPort, &_ucByte, 1);  }   123456
  函数comSendChar是发送一个字节, 通过调用函数comSendBuf实现, 而函数comSendBuf又是通过调用函数UartSend实现, 这个函数是重点。  5.将COM端口号转换为UART指针UART_T *ComToUart(COM_PORT_E _ucPort)  {    if (_ucPort == COM1)    {    #if UART1_FIFO_EN == 1     return &g_tUart1;     #else     return 0;     #endif    }    else    {     Error_Handler(__FILE__, __LINE__);     return 0;    }  }  1234567891011121314151617 6.从串口接收缓冲区读取1字节数据static uint8_t UartGetChar(UART_T *_pUart, uint8_t *_pByte)  {     uint16_t usCount;   /* usRxWrite 变量在中断函数中被改写,主程序读取该变量时,必须进行临界区保护 */     DISABLE_INT();  usCount = _pUart->usRxCount;  ENABLE_INT();   /* 如果读和写索引相同,则返回0 */     //if (_pUart->usRxRead == usRxWrite)    if (usCount == 0) /* 已经没有数据 */    {     return 0;    }    else    {     *_pByte = _pUart->pRxBuf[_pUart->usRxRead]; /* 从串口接收  FIFO取1个数据 */      /* 改写FIFO读索引 */      DISABLE_INT();      if (++_pUart->usRxRead >= _pUart->usRxBufSize)     {      _pUart->usRxRead = 0;     }     _pUart->usRxCount--;     ENABLE_INT();     return 1;    }   }  1234567891011121314151617181920212223242526272829
  从接收缓冲区读取1字节,非阻塞。无论有无数据均立即返回。  uint8_t comGetChar(COM_PORT_E _ucPort, uint8_t *_pByte)  {   UART_T *pUart;     pUart = ComToUart(_ucPort);    if (pUart == 0)  {     return 0;    }     return UartGetChar(pUart, _pByte);  } 123456789101112
  接收数据的调用顺序是:comGetChar–》UartGetChar  7.判断发送缓冲区是否为空uint8_t UartTxEmpty(COM_PORT_E _ucPort) {    UART_T *pUart;    uint8_t Sending;        pUart = ComToUart(_ucPort);    if (pUart == 0)    {       return 0;    }     Sending = pUart->Sending;     if (Sending != 0)    {       return 0;    }    return 1; }  1234567891011121314151617181920 8.清零串口接收缓冲区void comClearRxFifo(COM_PORT_E _ucPort) {  UART_T *pUart;  pUart = ComToUart(_ucPort);  if (pUart == 0)  {   return;  }  pUart->usRxWrite = 0;  pUart->usRxRead = 0;  pUart->usRxCount = 0; } 123456789101112 9.清零串口发送缓冲区void comClearTxFifo(COM_PORT_E _ucPort) {  UART_T *pUart;   pUart = ComToUart(_ucPort);  if (pUart == 0)  {   return;  }   pUart->usTxWrite = 0;  pUart->usTxRead = 0;  pUart->usTxCount = 0; } 1234567891011121314 10.输入输出的重定向int fputc(int ch, FILE *f) { #if 1 /* 将需要printf的字符通过串口中断FIFO发送出去,printf函数会立即返回 */  comSendChar(COM1, ch);  return ch; #else /* 采用阻塞方式发送每个字符,等待数据发送完毕 */  /* 写一个字节到USART1 */  USART1->DR = ch;  /* 等待发送结束 */  while((USART1->SR & USART_SR_TC) == 0)  {}  return ch; #endif }   int fgetc(FILE *f) { #if 1 /* 从串口接收FIFO中取1个数据, 只有取到数据才返回 */  uint8_t ucData;  while(comGetChar(COM1, &ucData) == 0);  return ucData; #else  /* 等待接收到数据 */  while((USART1->SR & USART_SR_RXNE) == 0)  {}  return (int)USART1->DR; #endif } 1234567891011121314151617181920212223242526272829 11.应用层初始化://FIFO串口初始化 UartVarInit(void); //串口参数配置 void bsp_SetUartParam(USART_TypeDef *Instance,  uint32_t BaudRate, uint32_t Parity, uint32_t Mode) {  UART_HandleTypeDef UartHandle;   /*##-1- 配置串口硬件参数 ######################################*/  /* 异步串口模式 (UART Mode) */  /* 配置如下:    - 字长    = 8 位    - 停止位  = 1 个停止位    - 校验    = 参数Parity    - 波特率  = 参数BaudRate    - 硬件流控制关闭 (RTS and CTS signals) */  UartHandle.Instance        = Instance;  UartHandle.Init.BaudRate   = BaudRate;  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;  UartHandle.Init.StopBits   = UART_STOPBITS_1;  UartHandle.Init.Parity     = Parity;  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;  UartHandle.Init.Mode       = Mode;  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;       if (HAL_UART_Init(&UartHandle) != HAL_OK)  {   Error_Handler(__FILE__, __LINE__);  } } //对应的串口波特率配置 void comSetBaud(COM_PORT_E _ucPort, uint32_t _BaudRate) {  USART_TypeDef* USARTx;  USARTx = ComToUSARTx(_ucPort);  if (USARTx == 0)  {   return;  }  bsp_SetUartParam(USARTx,  _BaudRate, UART_PARITY_NONE, UART_MODE_TX_RX); } //硬件初始化 void InitHardUart(void) { GPIO 复用....  /* 配置NVIC the NVIC for UART */     HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);  HAL_NVIC_EnableIRQ(USART1_IRQn);     /* 配置波特率、奇偶校验 */  bsp_SetUartParam(USART1,  UART1_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);   CLEAR_BIT(USART1->SR, USART_SR_TC);   /* 清除TC发送完成标志 */     CLEAR_BIT(USART1->SR, USART_SR_RXNE); /* 清除RXNE接收标志 */  // USART_CR1_PEIE | USART_CR1_RXNEIE  SET_BIT(USART1->CR1, USART_CR1_RXNEIE); /* 使能PE. RX接受中断 */ } 在主循环中  comGetChar(COM1, &read);//获取一个字节数据 comSendBuf(COM1, (uint8_t *)buf, strlen(buf));//发送数据 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  文章链接:https://mp.weixin.qq.com/s/h1L6sQ8OOiFf3KJq0ZjnVg
  转载自:技术让梦想更伟大
  文章来源:对串口接收FIFO处理机制的解读
  版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

万字长文解读美国芯片往事从1947年12月,世界第一块晶体管在美国的贝尔实验室诞生,到1959年,美国仙童半导体的诺伊斯写出打造集成电路的方案,并发明世界第一块硅集成电路,芯片开始迅猛发展,甚至成为一个国铃木死都不向中国妥协,奥迪我们在中国迈进新能源时代7月份国内乘用车销售快报已经出炉。根据乘联会数据,7月份狭义乘用车销售181。8万辆,比去年同期增长20。417月份累计销售1107。9万辆,比去年同期下降3。5。新能源狭义乘用车中国光纤,是如何一步步成为世界第一的?文华商韬略吴静2019年6月,何同学的一条5G测评视频爆火,引来千万播放百万涨粉,足见大众对5G充满好奇与期待。3年前有5G信号的地方还并不多,而据工信部今年7月数据,我国已累计建女性健康私密书,了解自己的身体,关爱自己今天分享的读书笔记是女性健康私密书,这本书有四位作者,都来自于日本。他们发挥专长,致力于研究女性健康,预防女性疾病,这本手册可以让你少提前预防疾病,掌握有效的避孕方法,让自己变得更ampampquot导演杀手ampampquot张静初被蒋雯丽扇脸,遭太太团封杀,号召吃素惹群嘲如果说王艳是住在紫禁城的格格张静初就是隐居山林的贵族小姐2020年张静初近亿豪宅曝光该住宅是一套位于北京的复式别墅且内带超大型庭院只是早被张静初种满各种花草果蔬不事先了解还以为身处原神在角色的丰富程度上超越塞尔达,还会不会被人喷?游戏中的笔杆王者,每日靠玩游戏过日子,玩网游也有20个年头,我有自己独特的见解,作为一个10年不脱坑的老玩家,如果文章写的有什么问题,请重喷!如果大家觉得好,请转发加点赞!非常感谢新中国首枚火箭长征一号,竟是在这里诞生的1957年10月4日,苏联将一颗名为斯普特尼一号的人造地球卫星送入太空。它的横空出世,瞬间打破了世界的平静,开启了人类探索太空的新时代!斯普特尼一号1958年1月31日,美国紧随其奇特配件潮品展现独特态度京东3C数码配件节带你打造专属style随着生活水平的逐渐提高,平凡普通的产品已经不足以满足大多数人的口味,更多人偏向于选择各类脑洞大开的新奇特好物。当前,配件产品也变得奇奇怪怪,在兼具有趣的灵魂内核和好看的皮囊之外,更小米12TPro入网或搭载三星HP12亿像素主摄在上月初,小米带来了下半年的重磅旗舰小米12S系列手机,包含小米12S小米12SPro和小米12SUltra三款机型,尤其是超大杯的小米12SUltra更是凭借着一英寸的超大底主摄好物分享我为iPad买的那些东西作者静静教主排版静静教主文章字数2530阅读时长4分钟昨天收拾屋子的时候,发现光iPad配件我就整了这么多虽说,我用iPad工作的频率远远比不上电脑,但有些东西,如果用到的时候没有03!世界杯大冷门!亚洲冠军出局,5分钟丢2球,中国女足未出线正文近日结束的U20女足世界杯末轮一场焦点战中,大冷门诞生,亚洲冠军澳大利亚队03完败于西班牙队耻辱出局。本场较量,澳大利亚队5分钟连丢2球,后防线被打成了筛子。对比此番以递补身份高端技术加持的三星GalaxyZFlip4手机,品质有保障值得我们的青睐据了解,在8月10日,备受期待的三星品牌正式发布了全新的旗舰折叠屏手机三星GalaxyZFlip4。并且伴随着产品的惊艳亮相,其在折叠屏市场中成为了独特的存在。这款手机还秉承了对手让设计服务于用户从GalaxyZFold4看三星的设计理念伴随着折叠屏手机的更新迭代,消费者对于这个品类已经不再陌生。去年,折叠屏手机的全球出货量已经接近1000万台,根据预测,接下来的几年当中这个数字还将迅速增长。尽管折叠屏手机纷至沓来给父母买的老人机推荐大家好,这里是年轻人选数码轻松的源头氢源评测1。纽曼(Newman)N2204G全网通老人手机移动联通电信三网双卡双待大字大声大按键学生老年手机黑色推荐原因全网通4G,移动联通电信iPhone14惊艳颜值亮相,前辈iPhone13跌至白菜价,福利来袭了iPhone信号差是不争的事实,尤其是5G时代,任何安卓手机都可以挂iPhone,苹果其实也在为此担忧。然而,苹果公司未能开发出自己的5G基带的消息给iPhone14的信号性能能否乐视诈尸了?华为HMS服务iPhone13Pro外观,256GB仅999元说起性价比手机,很多网友可能会想起小米,雷军算是性价比手机的鼻祖,每次公布价格都比友商低很多,还在一次发布会上提到硬件净利润永远不超过5,觉得雷军在亏本卖手机!其实小米还是有盈利的目前公认的四款零差评手机,实际体验出色,闭眼买都没问题如果你最近有更换手机的打算的话,强烈建议考虑下面提到的三款机型,综合实力表现出色,市场好评率超高,闭眼买都没问题。第一款OPPOReno8如果你对手机性能要求不高的话,强烈建议入手暗黑破坏神不朽官网更新世界观暗黑世界来临在暗黑破坏神不朽上线后不久,游戏官方更新了开发团队的幕后故事,展现了本作的世界观。在暗黑破坏神不朽中,庇护之地再陷险境,玩家们将作为冒险者在暗黑世界中经历重重考研,完成拯救世界的使SE公布三角战术玩家调查结果六成玩家愿意购买续作SE最近公布HD2D游戏三角战术的玩家问卷调查结果,其中统计了游玩时长游戏评价续作购买意向等多个项目数据。根据调查结果,三角战术的游玩时间在100小时以上的占32,50100小时的王者之路风云传奇如何升级哈喽,大家好!小编这期给大家介绍一下王者之路风云版如何快速升级。王者之路复古三职业,相爱相杀,携手共创传奇战绩。解锁侠侣系统后(大家可以看一下小编上一期介绍到的侠侣攻略),优先培养全场最高25分!布朗尼隔人暴扣嗨翻老詹美媒多所名校想抢他北京时间8月16日,加州篮球俱乐部的欧洲之行仍在继续,他们在巴黎站的对手是U18的法国选拔队。詹姆斯的大儿子布朗尼表现出色,拿到全场最高的25分,而且送出了一记快攻隔人暴扣,嗨翻老灰熊8换2接近达成!NBA又一后场双枪!联手莫兰特冲冠在球队中锋被交易走之后,戈贝尔和米切尔的双星组合也落下帷幕,球队立马把米切尔也摆上了货架。最近几周,米切尔和纽约尼克斯的传闻已经放缓,在球队中锋被交易走之后,戈贝尔和米切尔的双星组
挑战台积电!三星晶圆代工降价1成,引入谷歌AI打造Exynos处理器在去年6月底时,三星就宣布可成功量产3nm制程工艺,不过这对于三星晶圆代工的市场占有率似乎并没有太大推动作用。根据TrendForce的调研数据,截止去年第3季度,三星晶圆代工全球何祚庥院士是不是不务正业?何祚庥主要从事粒子物理及各种应用性问题研究并取得多项重要成果。提出ChewMandelstam推导的方程有严重错误对层子模型进行了合作研究,并建立了一个复合粒子量子场论的新体系。何美欲全面断供华为芯片?别担心,我们已放出大招应对!多家外媒1月31日爆料称,美国政府已停止向该国企业发放向华为出口产品的供货许可证,并正在考虑切断美国供应商与中国华为公司之间的所有联系,禁止英特尔和高通等公司向华为提供任何产品,包反制来了,中国更新出口限制清单,涉及三大核心技术这几年美国为了打压中国高科技产业的发展,可以说是手段频出,大家最熟悉的就是美国针对华为的制裁,导致麒麟芯片无以为继,华为的手机业务也元气大伤,作为5G领导者只能出售4G手机,而且最早已跌下神坛的日本半导体,凭什么制裁中国前言2月5日,据日媒报道,日本正计划配合美国对中国出手,最快将在4月对尖端半导体技术实施出口管制,日本行政机构METI(经济产业省)近期将公布外汇及外国贸易法修正案。日本时事通信社周末市场消息汇总,下周部分持股需谨慎又一个周末,再过几个小时,大A激动人心的时刻又要到来。想要做好投资,市场传达的消息很重要这周小编概要苹果(AAPL。O)将在2月14日的欧盟听证会上为移动支付技术辩护。成长风格板块詹姆斯的皇冠,一秒23万美元,蕾哈娜补妆带货都是美国春晚的故事这几年,提到美国春晚这四个字,想必很多人已经不陌生了,这特指美国的超级碗(SuperBowl)冠军赛。第57届NFL超级碗于北京时间今天730正式打响,由费城老鹰对阵堪萨斯城酋长。JayCroghan军事化管理道具都是真的,我感受到了中国电影人的认真导读在中国电影流浪地球2火爆全球后,一位爱尔兰网友在外国社交媒体Reddit上发文,回顾自己在此片中做临演的经历。观察者网特翻译此文,供读者一探电影制作的台前幕后。文JayCrog一个动作片演员最好的归宿,76岁的史泰龙首部美剧塔尔萨之王2022年的全球电影市场逐渐开始复苏,各路神仙你方唱罢我登场,精彩的大片一部接着一部,让人应接不暇。然而不难发现,近几年占据票房前列的作品中缺少了一类曾经风靡世界的电影,动作片。上哭不出来别硬演!我们的日子3位演员告诉你啥是教科书式哭戏对于演员来说,每一场戏份都是展现实力的机会,而在大部分观众看来,最能够有效检验演技的场景还是要看哭戏,把人物情感哭得深入人心,让观众跟着共情才是好的哭戏。比如刚刚收官的狂飙,原以为灵魂真的存在吗?86版西游拍摄时怪事频发,演员也纷纷开始信佛八六版西游记背后有多邪门?剧组当中出现的怪事可是一出接一出,导演杨洁曾经历灵魂出窍,不少剧组成员还表示看到过阿飘现身,导致演员们集体信佛,这其中的许多怪事科学都无法解释讲奇闻异事,