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

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实验现象

放屁频繁以为是身体在排毒?有可能是这2种疾病发出的信号大家好,我是中医教授初杰。有句古话叫一屁千副药,意思是说放屁有益于身心健康。听到这,可能有人就会说了,原来我一天放好几个屁是身体在排毒啊,这是好事。实际上,如果放屁的频率特别高,或汾河二库杨兆江内心随缘就是,走自己的路,看自己喜欢的风景这几天一直在山里值班。晚上安静的时候,思考一些问题。始终在悟道进行时。我想到了人所有的情感都是生命的一部分。生命就是一朵花,静静地开,悄悄地落。这一路,我们慢走细品,深悟,方知道平张家港的十种美,你喜欢哪个?生活在这座宜居城市的人,很难不被张家港一城文明风满目和谐情的氛围吸引,你知道吗?秋天里的张家港,美美与共,各美其美,我们不妨放慢脚步,来领略张家港的十种美!要说张家港的美,风景之美外国人最喜欢去的我国的这些美景,你都去过吗?都去过才是真厉害祖国山河,锦绣中华!张家界山美水美人更美,张家界的景色仿佛是仙境,奇山怪石,碧山绿水,应有尽有。黄果树瀑布黄果树瀑布景色壮美,风景秀丽,令人心驰神往!九寨沟都说神奇的九寨沟是人间的李世民和长孙皇后感情那么好,两人的子女又是什么结局对李世民与长孙皇后一生感情笃厚,他们的子女是什么结局?很感兴趣的小伙伴们,小编带来详细的文章供大家参考。李世民绝对算得上一个长情的男人,他的妻子长孙皇后是他唯一的皇后。长孙皇后13四川省青神县的山沟深处有座废弃的三线厂,代号863,也叫306厂1967年至1971年,青神县黑龙青竹两公社建立星华(867)建华(863)建川(4501)三家三线厂,四机部408医院,就是所谓的青神三厂一院。经过两代人的奋斗,三厂一院从白手起盘点感情丰富的五位港台女星,关之琳只爱富豪,张柏芝三胎成谜文吃瓜粉猪君编辑吃瓜粉猪君前言盘点私生活混乱的五位港台女星,她们人前装娇妻,人后却个个都是老色批。有人就像陈冠希,从来没有空窗期,今天我们就来盘一盘这些女星的风流往事!清纯玉女代言滕哈赫拉什福德创造了两次好机会,这是我希望替补做到的事情直播吧10月17日讯英超第11轮比赛,曼联在老特拉福德和纽卡互交白卷,暂时在积分榜上位居第5位。本场比赛,拉什福德替补登场后曾有机会改写比赛结果。在比赛最后阶段,英格兰前锋的头球本幸福是人梦寐以求的理念,亲友很喜欢这样的话题,谢谢再次的讨论用一句话来概括,幸福是什么你们的是幸福,而另一部人是辛苦,她不奢望幸福,那时候的幸福对她来说好像是很遥远的事,心情好的时候也会去回味去羡慕,有时候感觉幸福是一种可望而不可即的念想。山西印象十一与与朋友出游山西,三日行程,白天自驾临汾市周边名胜古迹,晚上品山西美酒美食文化,吃喝玩乐为载体,叙友情,享亲情,回来路上还在回味,于是将所见所闻所感记录下来,留作明天的回忆。每新疆印象七之二旅行社派发免费地图地窝堡国际机场还是在广州白云机场候机的时候,同事就有点后悔地说从珠海出发时,我们就该带份新疆地图。我们自己书店有不少折叠地图,其中就有新疆的。用完之后,仍可继续放出来销售,而不必在
朱棣为什么不喜欢太子朱高炽?头条创作挑战赛明仁宗朱高炽,是明朝少有的明君,虽然在位的时间仅有八个月,但是在历史上的地位和评价都比较高!只是,无论从电视剧里面还是从史书的记载上面,咱们都看到的是,明成祖朱棣非常生活在不同地区,母乳脂质组成各有什么特点?母乳是婴幼儿食品配方设计的黄金标准,全面解析母乳脂质是开发适合中国宝宝配方食品的重要前提。多项研究证明了母乳脂质受母亲基因环境的影响,尤其是我国南北内地与沿海地区饮食习俗差异显著,带娃之路任重而道远啊自从前段时间被隔离了,没什么事情就开始研究起来和孩子一起拍跳舞视频,但是呢始终没什么播放量。事情还是因为被隔离期间,偶然看见抖音上父女跳舞的视频,感觉挺好玩,就开始带着孩子没事也拍静默期出生的蛋壳宝贝12月5日,伴随着翼城县人民医院手术室里一阵嘹亮的啼哭声,静默期的小县城又迎来了两个新的小生命,刚刚出生的天使宝宝还裹着妈妈给自己的保护壳,悠闲地躺在完整的胎膜内,像一个透明的水晶不要随意拿孩子的安危对赌这两天看了一个视频,是说这个孩子睡着了,妈妈去送姐姐上学,结果这孩子还没等妈妈回来的时候就醒了,自己哭着找衣服,然后穿上衣服上学去了。其实这还算是只让人感慨不让人揪心的,我相信许多父母再生气,这5句话也一定不要对孩子说!句句戳在心窝里本文作者红小豆亲爱的爸爸妈妈今天终于鼓起勇气给你们写这封信,有些话藏在心里很久了,现在,我想大声说出来你们可能不知道,常对我说的这些话,字字如针扎!01hr多大点事儿,你就不能忍忍适宜行为和不适宜行为幼儿教师,是36岁幼儿在园生活的领路人,是为幼儿一生的发展打下基础的好伙伴,幼儿教师的一举一动一言一行,将会给孩子带来巨大而深远的影响。据研究,教师的教育行为是影响幼儿身心健康发展儿子的第一次暑假工,是坎坷,也是成长时间啊,你说它短吧,有时候又觉得很长,当你含辛茹苦地抚养着孩子的时候,会觉得怎么过得这么慢,孩子怎么还不快快长大,长大一点,就能自己走路了,不用每天抱在怀里了再长大一点,就可以上幼赵丽颖打破畸形审美,大脸盘法令纹又怎样,美人不该被标准化年代剧风吹半夏上线后就引起了观众们的注意,该剧以九十年代的钢铁行业发展为背景,演绎大女主成长史,把热门元素都结合到了一起,真是不爆都难。这部剧播出后火速冲到了全网热度第一的位置,也娇娇离开本山传媒后,走上整容之路,如今后遗症明显,劝网友别碰现在的女生容颜焦虑实在是太过于明显,越来越多的女生,都想让自己变得越来越漂亮,哪怕她本身已经天生丽质,但是依旧会为了让自己变得更加完美,而选择去整容。可能是近年来,我国整容行业变得童自荣配音界王子,从未对妻子说我爱你,还批李连杰艺德差文李百解童自荣童自荣出生于上海,是我国著名的配音员,获得过第四届汉米顿幕后英雄特别贡献奖。他配有虎胆龙威3侏罗纪公园铁甲威龙佐罗阿凡提少林寺机械战警西游记大圣归来水晶鞋与玫瑰花等3