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

GD32开发实战指南第11章CPU的高级代理DMA

  开发环境:
  MDK:Keil 5.30
  开发板:GD32F207I-EVAL
  MCU:GD32F207IK11.1 DMA工作原理11.1.1 DMA介绍
  DMA (Direct Memory Access,直接存储器存取),是一种可以大大减轻 CPU 工作量的数据存取方式,DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输 ,因而被广泛地使用。早在 8086 的应用中就已经有 Intel 的 8237 这种典型的 DMA 控制器,而 GD32的 DMA 则是以类似外设的形式添加到 Cortex 内核之外的。可以说,DMA就是CPU的高级代理,DMA大大减轻了CPU的负担。
  在硬件系统中,主要由 CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在内存与外设之间转移,或从外设 A 转移到外设 B。例如 :当 CPU 需要处理由 ADC 外设采集回来的数据时,CPU 首先要把数据从 ADC外设的寄存器读取到内存中(变量),然后进行运算处理,这是一般的处理方法。
  在转移数据的过程中会占用 CPU 十分宝贵的资源,所以我们希望 CPU 更多地被用在数据运算或响应中断之中,而数据转移的工作交由其他部件完成,是不是能够更好的利用CPU的资源呢?DMA 正是为 CPU 分担了数据转移的工作。因为 DMA 的存在 CPU 才被解放出来,它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断,大大提高效率。再次总结下DMA,DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
  图1 DMA数据传输示意图
  DMA数据传输主要涉及三种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。三种情况的数据传输分别时:外设到内存、内存到外设、内存到内存。11.1.2 GD32的DMA主要特征
  GD32F2系列的MCU一般有两个DMA控制器有14个通道(DMA0有7个通道,DMA1有7个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
  要使用 DMA,需要确定一系列的控 制参数,如外设数据的地址、内存地址、传输方向等,在开启 DMA 传输前还要先发出 DMA 请求。
  DMA的主要特点如下:
  ● 14个独立的可配置的通道(请求):DMA0有7个通道,DMA1有7个通道
  ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
  ● 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。
  ● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
  ● 支持循环的缓冲器管理
  ● 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
  ● 支持外设到存储器,存储器到外设,存储器到存储器的数据传输
  ● 闪存、SRAM、外设的SRAM、APB1 、APB2和AHB外设均可作为访问的源和目标。
  ● 可编程的数据传输数目:最大为6553511.1.3 GD32的DMA请求映像
  从外设(TIMERx[x=0、1、 2、 3]、 ADC0、 SPI0、 SPI/I2S1、I2Cx[x=0、1]和USARTx[x=0、1、 2])产生的7个请求,通过逻辑或输入到DMA0控制器,这意味着同时只能有一个请求有效。参见下图的DMA0请求映像。
  图2 DMA1请求映射
  外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。
  表1 各个通道的DMA0通道
  从外设(TIMERx[4、5、6、7]、 ADC2、 SPI/I2S2、UART3、DAC等7个请求,经逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。
  图3 DMA1请求映射
  外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。
  表2 各个通道的DMA1通道
  当DMA控制器在同一时间接收到多个外设请求时,仲裁器将根据外设请求的优先级来决定响应哪一个外设请求。优先级包括软件优先级和硬件优先级,优先级规则如下:
  软件优先级:分为4级,低,中,高和极高。可以通过寄存器DMA_CHxCTL的PRIO位域来配置。
  硬件优先级:当通道具有相同的软件优先级时,编号低的通道优先级高。例:通道0和通道2配置为相同的软件优先级时,通道0的优先级高于通道2。11.1.4 GD32的DMA工作过程
  下图为GD32的DMA的系统框图。
  图4 GD32F2 DMA框图
  我们可以看到GD32内核,存储器,外设及DMA的连接,这些硬件最终通过各种各样的线连接到总线矩阵中,硬件结构之间的数据转移都经过总线矩阵的协调,使各个外设和谐的使用总线来传输数据。
  如果不使用DMA,CPU传输数据还要以内核作为中转站,比如要将USART0的数据转移到SRAM中,这个过程是这样的:
  第一步:内核经过总线矩阵协调,从获取AHB存储的外设USART0的数据。
  第二步:内核再经过总线矩阵协调把数据存放到内存SRAM中。
  图5 GD32F2不使用DMA工作工作过程
  如果使用DMA的话,数据传输需要以下步骤:
  1.DMA传输时外设对DMA控制器发出请求。DMA控制器收到请求,触发DMA工作。
  2.DMA控制器从AHB外设获取USART0的数据,存储到DMA通道中
  3.DMA控制器的DMA总线与总线矩阵协调,使用AHB把外设USART0的数据经由DMA通道存放到SRAM中,这个数据的传输过程中,完全不需要内核的参与,也就是不需要CPU的参与。
  图6 GD32F2使用DMA工作工作过程
  在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。DMA传输结束,如果有更多的请求时,外设可以启动下一个周期。
  DMA控制器数据流都能够提供源和目标之间的单向传输链路。每个数据流配置后都可以执行以下事务:
  ●常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输。
  ●双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当 DMA 正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)。
  要传输的数据量(多达 65535)可以编程,并与连接到外设 AHB 端口的外设(请求 DMA 传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。
  总之,每次DMA传送由3个操作组成:
  1.从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CHxPADDR或DMA_CHxMADDR寄存器指定的外设基地址或存储器单元;
  2.存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CHxPADDR或DMA_CHxMADDR寄存器指定的外设基地址或存储器单元;
  3.执行一次DMA_CHxCNT寄存器的递减操作,该寄存器包含未完成的操作数目。11.2 DMA的寄存器描述
  第一个是 DMA 中断状态寄存器(DMA_INTF)。该寄存器的各位描述如下图所示。我们如果开启了DMA_INTF中这些中断,在达到条件后就会跳到中断服务函数里面去,即使没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是FTFIFx,即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清除。
  图 7 DMA_INTF寄存器各位描述
  每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。
  表3 DMA中断请求
  使能开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 FTFIFx位,即数据流 x 的 DMA 传输完成与否标志。
  第二个是 DMA 中断标志清除寄存器(DMA_INTC)。该寄存器的各位描述如下图所示。DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。在 DMA_ISR 被置位后,我们必须通过向该位寄存器对应的位写入 0 来清除。
  图8 DMA_INTC寄存器各位描述
  第三个是 DMA 通道 x 配置寄存器( DMA_CCRx)( x=1~7,下同)。该寄存器的我们在这里就不贴出来了,见《GD32 参考手册》。该寄存器控制着 DMA 的很多相关信息,包括数据宽度、外设及存储器的宽度、通道优先级、增量模式、传输方向、中断允许、使能等都是通过该寄存器来设置的。所以 DMA_CCRx 是 DMA 传输的核心控制寄存器。
  第四个是 DMA 通道 x 传输数据量寄存器(DMA_CHxCTL)。这个寄存器控制 DMA 通道 x 的每次传输所要传输的数据量。其设置范围为 0~65535。并且该寄存器的值会随着传输的进行而减少,当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送完成了。所以可以通过这个寄存器的值来知道当前 DMA 传输的进度。
  第五个是 DMA 通道 x 的外设地址寄存器(DMA_CHxPADDR)。该寄存器用来存储 GD32 外设的地址,比如我们使用串口0,那么该寄存器必须写入 0x40013804(其实就是USART0+0x04)。如果使用其他外设,就修改成相应外设的地址就行了。
  最后一个是 DMA 通道 x 的存储器地址寄存器(DMA_CHxMADDR),该寄存器和DMA_CHxPADDR差不多,是用来放存储器的地址的。比如我们使用 SendBuf[5200]数组来做存储器,那么我们在DMA_CHxMADDR中写入SendBuff 就可以了。11.3 DMA实例11.3.1 DMA发送数据
  本节我们要用到串口0 的发送,属于 DMA0的通道3,接下来我们就介绍库函数下 DMA1 通道3的配置步骤:
  1)使能 DMA 时钟rcu_periph_clock_enable(RCU_DMA0); //使能 DMA 时钟
  2)初始化 DMA 通道3参数
  前面讲解过,DMA 通道配置参数种类比较繁多,包括内存地址,外设地址,传输数据长度,数据宽度,通道优先级等等。这些参数的配置在库函数中都是在函数 DMA_Init 中完成,下面我们看看函数定义:void dma_init(uint32_t dma_periph, dma_channel_enum channelx, dma_parameter_struct *init_struct)
  函数的第一个参数是指定初始化的DMA,这里有两个选择,DMA0和DMA1;第二个参数是通道号,这个很容易理解,每个DMA有7个通道,这里使用的是通道3;第二个参数通过初始化结构体成员变量值来达到初始化的目的,下面我们来看看 dma_parameter_struct结构体的定义:/* DMA initialize structure */ typedef struct {     uint32_t periph_addr;                        /*!< peripheral base address */     uint32_t periph_width;                       /*!< transfer data size of peripheral */     uint32_t memory_addr;                      /*!< memory base address */     uint32_t memory_width;                     /*!< transfer data size of memory */     uint32_t number;                           /*!< channel transfer number */     uint32_t priority;                            /*!< channel priority level */     uint8_t periph_inc;                          /*!< peripheral increasing mode */     uint8_t memory_inc;                         /*!< memory increasing mode */     uint8_t direction;                            /*!< channel data transfer direction */ } dma_parameter_struct;
  这个结构体的成员比较多,这里我们一一做个介绍。
  第一个参数 periph_addr用来设置 DMA 传输的外设基地址,比如要进行串口DMA 传输,那么外设基地址为串口接受发送数据存储器 USART0+0x04的地址。
  第二个参数 periph_width用来设置外设的数据长度是为字节传输( 8bits),半字传输(16bits)还是字传输 (32bits) ,这里我们是8位字节传输,所以值设置为DMA_PERIPHERAL_WIDTH_8BIT。
  第三个参数 memory_addr为内存基地址,也就是我们存放 DMA传输数据的内存地址。
  第四个参数memory_width是用来设置内存的数据长度,和第二个参数意思接近,这里我们同样设置为字节传输 DMA_MEMORY_WIDTH_8BIT。
  第五个参数number设置一次传输数据量的大小,这个很容易理解。
  第六个参数priority是设置 DMA 通道的优先级,有低,中,高,超高四种模式,这个在前面讲解过,这里我们设置优先级别为中级,所以值为DMA_PRIORITY_MEDIUM。如果要开启多个通道,那么这个值就非常有意义。
  第七个参数periph_inc设置传输数据的时候外设地址是不变还是递增。如果设置为递增,那么下一次传输的时候地址加 1,这里因为我们是一直往固定外设地址USART0+0x04发送数据,所以地址不递增,值为DMA_PERIPH_INCREASE_DISABLE;
  第八个参数memory_inc设置传输数据时候内存地址是否递增。这个参数和periph_inc意思接近,只不过针对的是内存。 这里我们的场景是将内存中连续存储单元的数据发送到串口,毫无疑问内存地址是需要递增的,所以值为DMA_MEMORY_INCREASE_ENABLE。
  第九个参数direction设置数据传输方向, 决定是从外设读取数据到内存还送从内存读取数据发送到外设, 也就是外设是源地还是目的地, 这里我们设置为从内存读取数据发送到串口,所以外设自然就是目的地了,所以选择值为 DMA_MEMORY_TO_PERIPHERAL。
  这里我们给出上面场景的实例代码:/* 定义一个DMA配置结构体 */ dma_parameter_struct dma_init_struct; /* 使能 DMA 时钟 */ rcu_periph_clock_enable(RCU_DMA0); /* 初始化 DMA0 通道3 */ dma_deinit(DMA0, DMA_CH3); dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; /* 存储器到外设方向 */ dma_init_struct.memory_addr = (uint32_t)UART0_TX_BUF; /* 存储器基地址 */ dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; /* 存储器地址自增 */ dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; /* 存储器位宽为8位 */ dma_init_struct.number = UART0_TX_LEN; /* 传输数据个数 */ dma_init_struct.periph_addr = ((uint32_t)(USART0+0X04)); /* 外设基地址,即USART数据寄存器地址 */ dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; /* 外设地址固定不变 */ dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; /* 外设数据位宽为8位 */ dma_init_struct.priority = DMA_PRIORITY_MEDIUM; /* 软件优先级为极高*/ dma_init(DMA0, DMA_CH3, &dma_init_struct);
  3)DMA模式配置
  我们要从内存中采集 64 个字节发送到串口,如果设置为重复采集,那么它会在 64 个字节采集完成之后继续从内存的第一个地址采集,如此循环。这里我们设置为一次连续采集完成之后不循环。因此需要关闭循环发送。
  在我们下面的实验中,如果设置此参数为循环采集,那么你会看到串口不停的打印数据,不会中断,大家在实验中可以修改这个参数测试一下。循环模式可用于处理循环缓冲区和连续数据流(例如 ADC 扫描模式)。可以使用 DMA_SxCR 寄存器中的 CIRC 位使能此特性。当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应 DMA 请求。
  还需设置是否是存储器到存储器模式传输,这里设置为不使用存储器到存储器模式*。/* DMA循环模式配置,不使用循环模式 */ dma_circulation_disable(DMA0, DMA_CH3); /* DMA存储器到存储器模式模式配置,不使用存储器到存储器模式*/ dma_memory_to_memory_disable(DMA0, DMA_CH3);
  4)使能 DMA0通道3,启动传输。
  接着就要使能 DMA 传输通道。dma_channel_enable(DMA0, DMA_CH3);
  5)使能串口 DMA 发送
  进行DMA配置之后,我们就要开启串口的 DMA 发送功能,使用的函数是:
  usart_dma_enable(USART0, USART_DMA_TRANSMIT);
  如果是要使能串口 DMA 接受,那么第二个参数修改为USART_DMA_RECEIVE即可。
  这样,我们就可以启动一次 USART0的 DMA 传输了。
  6)查询 DMA 传输状态
  在 DMA 传输过程中,我们要查询 DMA 传输通道的状态,使用的函数是:FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag)
  比如我们要查询 DMA 通道 3传输是否完成,方法是:dma_flag_get (DMA0, DMA_CH3, DMA_FLAG_FTF);
  这里还有一个比较重要的函数就是获取当前剩余数据量大小的函数:uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx)
  比如我们要获取 DMA 通道3还有多少个数据没有传输,方法是:dma_transfer_number_get(DMA0, DMA_CH3);
  最后看看UART0的DMA整体配置。/**   * @brief  USART0 TX DMA 配置,内存到外设(USART0+0x04)   * @param  None   * @retval None   */ void usart0_dma_init(void) {     /* 定义一个DMA配置结构体 */     dma_parameter_struct dma_init_struct;      /* 使能 DMA 时钟 */     rcu_periph_clock_enable(RCU_DMA0);      /* 初始化 DMA0 通道3 */     dma_deinit(DMA0, DMA_CH3);     dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; /* 存储器到外设方向 */     dma_init_struct.memory_addr = (uint32_t)SendBuff; /* 存储器基地址 */     dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; /* 存储器地址自增 */     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; /* 存储器位宽为8位 */     dma_init_struct.number = BUFF_SIZE; /* 传输数据个数 */     dma_init_struct.periph_addr = ((uint32_t)(USART0+0X04)); /* 外设基地址,即USART数据寄存器地址 */     dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; /* 外设地址固定不变 */     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; /* 外设数据位宽为8位 */     dma_init_struct.priority = DMA_PRIORITY_MEDIUM; /* 软件优先级为极高*/     dma_init(DMA0, DMA_CH3, &dma_init_struct);          /* DMA循环模式配置,不使用循环模式 */     dma_circulation_disable(DMA0, DMA_CH3);     /* DMA存储器到存储器模式模式配置,不使用存储器到存储器模式*/     dma_memory_to_memory_disable(DMA0, DMA_CH3);      /* DMA0 通道3 中断优先级设置并使能 */     //nvic_irq_enable(DMA0_Channel3_IRQn, 0, 0);     /* 使能 DMA0 通道3 传输完成、传输错误中断 */     //dma_interrupt_enable(DMA0, DMA_CH3, DMA_INT_FTF|DMA_INT_ERR);     /* 使能 DMA0 通道3 */     dma_channel_enable(DMA0, DMA_CH3); }
  主函数如下所示:/*     brief      main function     param[in]  none     param[out] none     retval     none */ int main(void) {     int i;      /*填充将要发送的数据*/     for(i=0; i sizeof(SendBuff) ? sizeof(SendBuff) : len;      //while (dma_transfer_number_get(DMA0, DMA_CH3));  // 检查DMA发送通道内是否还有数据     if(arr)      {         memcpy(SendBuff, arr, sendLen);     }     // 开启 UART TX DMA     dma_channel_disable(DMA0, DMA_CH3);     dma_transfer_number_config(DMA0, DMA_CH3, sendLen);   // 重新写入要传输的数据数量     dma_channel_enable(DMA0, DMA_CH3);     // 启动DMA发送     }
  接下来看看主函数的代码。/*     brief      main function     param[in]  none     param[out] none     retval     none */ int main(void) {     //systick init     sysTick_init();      // led init     led_init(LED1);      //usart init 115200 8-N-1     com_init(COM1, 115200);      // DMA config     usart0_dma_init();      printf("USART0 DMA Testr ");	          /* USART DMA 发送使能 */     usart_dma_enable(USART0, USART_DMA_TRANSMIT);     /* USART DMA接收使能 */     usart_dma_enable(USART0, USART_DMA_RECEIVE);      while(1)     {         led_toggle(LED1);         delay_ms(1000);     } }
  主函数主要增加了串口DMA接收请求,其他的和上一个实例是一样的。
  最后编译下载固件,打开串口助手,这里发送一些数据,效果如下所示。
  图10实验现象

奔驰销售公司高层变动段建军成为首位本土CEO21世纪经济报道记者杜巧梅北京报道3月7日,北京梅赛德斯奔驰销售服务有限公司(下称奔驰销售公司)宣布多项重要人事任命公司总裁兼首席执行官杨铭(JanMadeja)即将结束其在中国市官媒官司缠身,李铁的公司,即将走向末路!球迷墙倒众人推头条创作挑战赛中新社官媒国是直通车消息表示李铁在沈阳的足球俱乐部面临困境,面临劳动纠纷!李铁的公司帝国,即将走向末路!从消息看,沈阳李铁足球俱乐部有限公司陷入一场官司,将于3月10从易经诗经找灵感基金公司起名更名门道多图虫创意供图陈锦兴制图证券时报记者余世鹏基金公司股权变更不仅会带来管理层发展策略等方面的变化,还可能会导致公司名字变更。基金公司起新名字看似简单,做起来却有不少困难。近期就有几家公海康威视又拆出一家上市公司海康机器人IPO,年赚4亿现金流却为负杭州海康威视数字技术股份有限公司(简称海康威视,002514。SZ)分拆机器人业务正式启动IPO。继分拆萤石网络(688465。SH)成功上市后,3月7日,海康威视分拆的第二家子公安布罗西尼我儿子患上1型糖尿病,每天要注射几次胰岛素直播吧3月4日讯安布罗西尼日前在Instagram上晒出视频,他表示自己的儿子亚历山德罗患上了1型糖尿病。安布罗西尼在视频中证实自己的儿子患上了1型糖尿病,他说道这种疾病并不明显,穿搭灵感不一样的白衬衫白衬衫是一年四季都绕不开的单品,具有百变的魅力。在过去,白衬衫是男士的服装,直到20世纪初,衬衫在女性当中越普及。时尚界给衬衫很高的评价,ELLE时尚杂志称它为衣橱里的终极必备品。买包买鞋有选择困难症?找出2023年幸运色脱离包色回圈记者林孝庭台北报导你曾有过站在专柜前却突然有选择困难症的经验吗?买包买鞋想要搭配衣橱里的所有衣服,恨不得一口气包色!但冲动的念头却被荷包的厚度限制。现在用一个简单的心理测验帮你解决夏季男士穿搭,四种日常Polo衫的颜色搭配好内容我来评Polo衫在男士们的衣柜里一直都有很高的存在感,因为它的适用性非常强,既不会像T恤那样过于休闲,也不会像衬衫那样严肃正式,所以才能在时尚长河里经久不息。那么Polo衫作57岁温碧霞真实颜值曝光,皮肤松弛,皱纹变多,看上去老气了很多3月3日,有网友在香港旅游,逛街的时候她遇到了正在拍照片的温碧霞。当时网友在一条街上游玩,看到一群人拿着摄像机在拍照片。她以为是哪个网红带这么多人拍视频,网友走进一看,原来是温碧霞AI模特多场景写真作为时尚产业的代表,模特是许多人心中的梦想职业之一。他们的漂亮外表和专业能力吸引了无数人的眼球。然而,我们通常只看到他们在舞台上的表演,很少有机会了解他们在生活中的真实状态。为了展成熟性感女人味的刘涛可以说44岁的刘涛有着一种大气和霸气的气质,凸显了中年女性事业成功,成熟内敛而低调的风格。每次出场都是时髦大气舒展的打扮,轻松成为焦点。通过改变头发长度卷度和发色,遮挡原有的脸部缺
四十岁了,你还会生二胎吗?你好很高兴能为你解答,希望能帮到你!40岁要二胎其实要考虑很多因素的,并且这条路也不是很好走的,如果真的要尝试要,那么还是要考虑清楚。分析如下1女性最佳生育年龄2429岁,35岁以陌生人你好,可以推荐一部催泪的电影吗?伟人周恩来!一是死不留灰农用飞机沿着渤海湾飞临黄河入海口,将那一棒银白的灰粉撤向海空,或许就是这一撒,总理的魂魄就永远充满人间,贯通天地。二是生而无后后人为大,对世人来说,有一条血王者荣耀伽罗到底强在哪里?怎么玩好?大家好我是七年老玩家在王者荣耀中,伽罗的定位是射手,她的射程远高于其他射手,在远距离poke与留人等方面有着不俗的优势,那么伽罗怎么玩,你们知道吗,下面带来伽罗攻略。一技能介绍被动你认为什么牌子的运动鞋不贵并且质量又好耐穿?迪卡侬就很不错,价格很亲民,我们这边没有卖的,在网上买过几次,以前都是给我老公买耐克的,穿不了多长时间就容易开胶,现在我老公喜欢穿小米的主要是便宜,好穿我儿子基本都是361,便宜也为什么感觉有些农民整天无所事事,喝酒抽烟打牌却不缺钱?所谓不缺钱,只是表面现象。它反映了一个人,对问题的主观臆断。从总体来讲,农村人有钱吗?他们的钱从哪而来?是有人给他们发钱吗?一个农户每年所种的三两亩地,只够自家的全年囗粮。即便是有好多企业拒绝做过催收员的人,正常吗?我觉得正常。如果我是企业老板,我也不会要这种人。什么样的人才会去做催收员(非银行职员)?最少他不会是什么好人,金融公司的催收手段网上一搜一大堆,即便个别人稍微有点良心,劝暴力催收也都知道马自达的车好,但为什么你就是不买?不能说是不买吧,不过马自达的车有很多统一的特点1更加注重驾驶感而不是乘坐感隔音普遍较差悬挂普遍较硬2同样的车长,内部空间普遍小于竞争对手3设计相对更多讨好年轻人,豪华感缺失严重这也虚假宣传与崇洋媚外,欧拉你想好怎么甩锅了吗?欧拉事件无法甩锅需要相关部门进行惩戒欧拉好猫芯片造假事件自9日长城汽车发布第二份声明后,至今再没有任何动静,似乎这是想要通过热点新闻周期的热度自然衰减让事件平息可是这个事件不可能简你们家乡的特色菜有些什么?那肯定是宜宾燃面了,色香味俱全!各种香味依次释放,太过瘾啦!宜宾燃面是宜宾的传统名小吃,宜宾燃面,原名叙府燃面,旧称油条面,源于四川省宜宾市,为宜宾传统小吃,属于川菜。因其油重无水如果渣分等级的话,王力宏,罗志祥,吴亦凡你会怎么定级?王某宏排第一,在三人中,唯有他是父亲,是爸爸,还是三个孩子的爸爸,但是却没有爸爸的样子。这是责任的提现。可以说他没有责任感,害人害己。罗排第二,他没有结婚,没有孩子,但是在恋爱期间罗志祥,陈冠希,王力宏,李云迪他们四个人谁更渣?谁最渣不知道,陈冠希最不渣你差一个吴宇凡年终总结,压轴呀,大伙懂的让他们比渣吗?还是比惨吧!他们都遭遇了红颜之劫,都身败名裂,但似乎陈冠希目前找到了真爱,其他人还在情路茫茫之中。祝