阿里云网站建设方案书模板,伪静态 wordpress,芜湖企业做网站,开通域名一、介绍 
首先我们需要了解一个内存映射#xff1a;  stm32的flash地址起始于0x0800 0000#xff0c;结束地址是0x0800 0000加上芯片实际的flash大小#xff0c;不同的芯片flash大小不同。 
RAM起始地址是0x2000 0000#xff0c;结束地址是0x2000 0000加上芯片的RAM大小。…一、介绍 
首先我们需要了解一个内存映射  stm32的flash地址起始于0x0800 0000结束地址是0x0800 0000加上芯片实际的flash大小不同的芯片flash大小不同。 
RAM起始地址是0x2000 0000结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。 
Flash中的内容一般用来存储代码和一些定义为const的数据断电不丢失  RAM可以理解为内存用来存储代码运行时的数据变量等等。掉电数据丢失。 
STM32将外设等都映射为地址的形式对地址的操作就是对外设的操作。  stm32的外设地址从0x4000 0000开始可以看到在库文件中是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。 
一般情况下程序文件是从 0x0800 0000 地址写入这个是STM32开始执行的地方0x0800 0004是STM32的中断向量表的起始地址。  在使用keil进行编写程序时其编程地址的设置一般是这样的  程序的写入地址从0x08000000数好零的个数开始的其大小为0x80000也就是512K的空间换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000RAM的地址从0x20000000开始大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的。 
M3复位后从0x08000004取出复位中断的地址并且跳转到复位中断程序中断执行完之后会跳到我们的main函数main函数里边一般是一个死循环进去后就不会再退出当有中断发生的时候M3将PC指针强制跳转回中断向量表然后根据中断源进入对应的中断函数执行完中断函数之后再次返回main函数中。大致的流程就是这样。 
1.1、内部Flash的构成 
STM32F429 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域它们的地址分布及大小如下  STM32F103的中容量内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域它们的地址分布及大小如下  注意STM32F105VC的是有64K或128页x2K256k字节的内置闪存存储器用于存放程序和数据。 主存储器一般我们说 STM32 内部 FLASH 的时候都是指这个主存储器区域它是存储用户应用程序的空间芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样在写入数据前要先按扇区擦除系统存储区系统存储区是用户不能访问的区域它在芯片出厂时已经固化了启动代码它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。OTP 区域OTP(One Time Program)指的是只能写入一次的存储区域容量为 512 字节写入后数据就无法再更改 OTP 常用于存储应用程序的加密密钥。选项字节选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。 
1.2、对内部Flash的写入过程 
1. 解锁 固定的KEY值 (1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1  0x45670123  (2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2  0xCDEF89AB  2. 数据操作位数  最大操作位数会影响擦除和写入的速度其中 64 位宽度的操作除了配置寄存器位外还需要在 Vpp 引脚外加一个 8-9V 的电压源且其供电间不得超过一小时否则 FLASH可能损坏所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用大部分应用场合都是用 32 位的宽度。  3. 擦除扇区  在写入新的数据前需要先擦除存储区域 STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令批量擦除指令仅针对主存储区。  扇区擦除的过程如下  (1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”以确认当前未执行任何  Flash 操作  (2) 在 FLASH_CR 寄存器中将“激活扇区擦除寄存器位 SER ”置 1并设置“扇  区编号寄存器位 SNB”选择要擦除的扇区  (3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1开始擦除  (4) 等待 BSY 位被清零时表示擦除完成。  4. 写入数据  擦除完毕后即可写入数据写入数据的过程并不是仅仅使用指针向地址赋值赋值前还还需要配置一系列的寄存器步骤如下  (1) 检查 FLASH_SR 中的 BSY 位以确认当前未执行任何其它的内部 Flash 操作  (2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1  (3) 针对所需存储器地址主存储器块或 OTP 区域内执行数据写入操作  (4) 等待 BSY 位被清零时表示写入完成。 
1.3、查看工程内存的分布 
由于内部 FLASH 本身存储有程序数据若不是有意删除某段程序代码一般不应修改程序空间的内容所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“ *.map”后缀文件  打开 map 文件后查看文件最后部分的区域可以看到一段以“ Memory Map of the  image”开头的记录(若找不到可用查找功能定位)  【注】ROM加载空间 
这一段是某工程的 ROM 存储器分布映像在 STM32 芯片中 ROM 区域的内容就是 指存储到内部 FLASH 的代码。  在上面 map 文件的描述中我们了解到加载及执行空间的基地址(Base)都是0x08000000它正好是 STM32 内部 FLASH 的首地址即 STM32 的程序存储空间就直接是执行空间它们的大小(Size)分别为 0x00000b50 及 0x00000b3c执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了它们的最大空间(Max)均为 0x00100000即 1M 字节它指的是内部 FLASH 的最大空间。 
计算程序占用的空间时需要使用加载区域的大小进行计算本例子中应用程序使用  的内部 FLASH 是从 0x08000000 至(0x080000000x00000b50)地址的空间区域。  所以从扇区 1(地址 0x08004000)后的存储空间都可以作其它用途使用这些存储空间时不会篡改应用程序空间的数据。  具体可参考原子的例程实验四十一FLASH 模拟 EEPROM 实验 
文章引用地址https://blog.csdn.net/qq_33559992/article/details/77676716 
感谢原文作者 
二、代码拆分介绍以STM32F105系列为例如上图表5所示 2.1 读/写入数据流程 写数据流程 2.1.1、Flash 解锁直接调用#include stm32f10x_flash.h中的void FLASH_Unlock(void)函数这个函数是官方提供的其内部代码如下  1 /**2   * brief  Unlocks the FLASH Program Erase Controller.3   * note   This function can be used for all STM32F10x devices.4   *         - For STM32F10X_XL devices this function unlocks Bank1 and Bank2.5   *         - For all other devices it unlocks Bank1 and it is equivalent 6   *           to FLASH_UnlockBank1 function.. 7   * param  None8   * retval None9   */
10 void FLASH_Unlock(void)
11 {
12   /* Authorize the FPEC of Bank1 Access */
13   FLASH-KEYR  FLASH_KEY1;
14   FLASH-KEYR  FLASH_KEY2;
15 
16 #ifdef STM32F10X_XL
17   /* Authorize the FPEC of Bank2 Access */
18   FLASH-KEYR2  FLASH_KEY1;
19   FLASH-KEYR2  FLASH_KEY2;
20 #endif /* STM32F10X_XL */
21 } 2.1.2、擦除扇区也是直接调用固件库官方的函数FLASH_Status FLASH_ErasePage(uint32_t Page_Address)这个官方函数代码也贴出来看看代码如下 1 /**2   * brief  Erases a specified FLASH page.3   * note   This function can be used for all STM32F10x devices.4   * param  Page_Address: The page address to be erased.5   * retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,6   *         FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.7   */8 FLASH_Status FLASH_ErasePage(uint32_t Page_Address)9 {
10   FLASH_Status status  FLASH_COMPLETE;
11   /* Check the parameters */
12   assert_param(IS_FLASH_ADDRESS(Page_Address));
13 
14 #ifdef STM32F10X_XL
15   if(Page_Address  FLASH_BANK1_END_ADDRESS)  
16   {
17     /* Wait for last operation to be completed */
18     status  FLASH_WaitForLastBank1Operation(EraseTimeout);
19     if(status  FLASH_COMPLETE)
20     { 
21       /* if the previous operation is completed, proceed to erase the page */
22       FLASH-CR| CR_PER_Set;
23       FLASH-AR  Page_Address; 
24       FLASH-CR| CR_STRT_Set;
25     
26       /* Wait for last operation to be completed */
27       status  FLASH_WaitForLastBank1Operation(EraseTimeout);
28 
29       /* Disable the PER Bit */
30       FLASH-CR  CR_PER_Reset;
31     }
32   }
33   else
34   {
35     /* Wait for last operation to be completed */
36     status  FLASH_WaitForLastBank2Operation(EraseTimeout);
37     if(status  FLASH_COMPLETE)
38     { 
39       /* if the previous operation is completed, proceed to erase the page */
40       FLASH-CR2| CR_PER_Set;
41       FLASH-AR2  Page_Address; 
42       FLASH-CR2| CR_STRT_Set;
43     
44       /* Wait for last operation to be completed */
45       status  FLASH_WaitForLastBank2Operation(EraseTimeout);
46       
47       /* Disable the PER Bit */
48       FLASH-CR2  CR_PER_Reset;
49     }
50   }
51 #else
52   /* Wait for last operation to be completed */
53   status  FLASH_WaitForLastOperation(EraseTimeout);
54   
55   if(status  FLASH_COMPLETE)
56   { 
57     /* if the previous operation is completed, proceed to erase the page */
58     FLASH-CR| CR_PER_Set;
59     FLASH-AR  Page_Address; 
60     FLASH-CR| CR_STRT_Set;
61     
62     /* Wait for last operation to be completed */
63     status  FLASH_WaitForLastOperation(EraseTimeout);
64     
65     /* Disable the PER Bit */
66     FLASH-CR  CR_PER_Reset;
67   }
68 #endif /* STM32F10X_XL */
69 
70   /* Return the Erase Status */
71   return status;
72 } 注意这个擦除扇区函数是你提供一个STM32f105系列扇区的开始地址即可擦除是按照页擦除每页2KB1024Byte或者整个擦除见STM32参考手册的第二章2.3.3嵌入式闪存部分介绍 比如我们要擦除互联网型的127页我们只需要FLASH_ErasePage(0x0803f800);执行后第127页的0x0803f800-0x0803FFFF数据都将被擦除。 
当然官方提供的也不知一个擦除函数而是三个具体如下对于32位系统一个是字节4byte32bite一个是半字2byte16bite一个是字节1byte8bite进行擦除。 
FLASH_Status FLASH_ErasePage(uint32_t Page_Address); 
FLASH_Status FLASH_EraseAllPages(void); 
FLASH_Status FLASH_EraseOptionBytes(void); 2.1.3、接下来是写/读数据函数该函数也是官方给出的我们只需要用就好了。但要注意这个是个半字的写操作为什么uint16_t 的数据算半字呢因为单片机是32的对于32位单片机系统来说一个字是4个字节的8位的比如51单片机系统一个字就是2位的64位单片机系统一个字就是8个字节脱离单片机系统说字是多少个字节是没意义的。所以这里写入/读出半字也就是一次写入2个字节写完/读出一次地址会加2。 写数据操作 1 /**2   * brief  Programs a half word at a specified address.3   * note   This function can be used for all STM32F10x devices.4   * param  Address: specifies the address to be programmed.5   * param  Data: specifies the data to be programmed.6   * retval FLASH Status: The returned value can be: FLASH_ERROR_PG,7   *         FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. 8   */9 FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
10 {
11   FLASH_Status status  FLASH_COMPLETE;
12   /* Check the parameters */
13   assert_param(IS_FLASH_ADDRESS(Address));
14 
15 #ifdef STM32F10X_XL
16   /* Wait for last operation to be completed */
17   status  FLASH_WaitForLastOperation(ProgramTimeout);
18   
19   if(Address  FLASH_BANK1_END_ADDRESS)
20   {
21     if(status  FLASH_COMPLETE)
22     {
23       /* if the previous operation is completed, proceed to program the new data */
24       FLASH-CR | CR_PG_Set;
25   
26       *(__IO uint16_t*)Address  Data;
27       /* Wait for last operation to be completed */
28       status  FLASH_WaitForLastBank1Operation(ProgramTimeout);
29 
30       /* Disable the PG Bit */
31       FLASH-CR  CR_PG_Reset;
32     }
33   }
34   else
35   {
36     if(status  FLASH_COMPLETE)
37     {
38       /* if the previous operation is completed, proceed to program the new data */
39       FLASH-CR2 | CR_PG_Set;
40   
41       *(__IO uint16_t*)Address  Data;
42       /* Wait for last operation to be completed */
43       status  FLASH_WaitForLastBank2Operation(ProgramTimeout);
44 
45       /* Disable the PG Bit */
46       FLASH-CR2  CR_PG_Reset;
47     }
48   }
49 #else
50   /* Wait for last operation to be completed */
51   status  FLASH_WaitForLastOperation(ProgramTimeout);
52   
53   if(status  FLASH_COMPLETE)
54   {
55     /* if the previous operation is completed, proceed to program the new data */
56     FLASH-CR | CR_PG_Set;
57   
58     *(__IO uint16_t*)Address  Data;
59     /* Wait for last operation to be completed */
60     status  FLASH_WaitForLastOperation(ProgramTimeout);
61     
62     /* Disable the PG Bit */
63     FLASH-CR  CR_PG_Reset;
64   } 
65 #endif  /* STM32F10X_XL */
66   
67   /* Return the Program Status */
68   return status;
69 } 当然官方给的不止是这一个函数写数据官方提供了3个 
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);//一次写一个字对于32系统一次写的是4个字节uint32_t 变量大小32bit 
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);//一次写一个半字对于32系统一次写的是2个字节uint16_t 变量大小16bit 
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);//一次写一个字节对于32系统一次写的是1个字节uint8_t 变量大小8bit 
读数据操作 
读数据的函数官方并没有给出下面我们自己给出具体的读法代码如下 
1 //读取指定地址的半字(16位数据)
2 //也是按照半字读出即每次读2个字节数据返回
3 uint16_t FLASH_ReadHalfWord(uint32_t address)
4 {
5   return *(__IO uint16_t*)address; 
6 } 如果要连续都区多个地址数据可以进行如下代码操作 1 //从指定地址开始读取多个数据
2 void FLASH_ReadMoreData(uint32_t startAddress,uint16_t *readData,uint16_t countToRead)
3 {
4   uint16_t dataIndex;
5   for(dataIndex0;dataIndexcountToRead;dataIndex)
6   {
7     readData[dataIndex]FLASH_ReadHalfWord(startAddressdataIndex*2);
8   }
9 } 2.1.4、这步骤应该就是再次上锁保护存储区不被重写覆盖了直接使用官方的函数即可FLASH_Lock();//上锁写保护 
具体官方代码贴出如下 1 /**2   * brief  Locks the FLASH Program Erase Controller.3   * note   This function can be used for all STM32F10x devices.4   *         - For STM32F10X_XL devices this function Locks Bank1 and Bank2.5   *         - For all other devices it Locks Bank1 and it is equivalent 6   *           to FLASH_LockBank1 function.7   * param  None8   * retval None9   */
10 void FLASH_Lock(void)
11 {
12   /* Set the Lock Bit to lock the FPEC and the CR of  Bank1 */
13   FLASH-CR | CR_LOCK_Set;
14 
15 #ifdef STM32F10X_XL
16   /* Set the Lock Bit to lock the FPEC and the CR of  Bank2 */
17   FLASH-CR2 | CR_LOCK_Set;
18 #endif /* STM32F10X_XL */
19 } 三、简单的小例程代码实现 
例子功能 1、将数据存储在stm32F105单片机的主存储区0x08036000地址开始的扇区0x08036000应该是该单片机大约108个扇区的开始地址位置即页108起始地址。 2、将该单片机的页108page1080x08036000处的数据再读出来; 
具体实现代码如下作为例子只进行了半字的读写操作我们写的数据buff为空内容默认值为0 1 #include stm32f10x_flash.h2 3 #define StartServerManageFlashAddress    ((u32)0x08036000)//读写起始地址内部flash的主存储块地址从0x08036000开始4 5 //从指定地址开始写入多个数据6 void FLASH_WriteMoreData(uint32_t startAddress,uint16_t *writeData,uint16_t countToWrite)7 {    8     uint32_t offsetAddressstartAddress - FLASH_BASE;               //计算去掉0X08000000后的实际偏移地址9   uint32_t sectorPositionoffsetAddress/SECTOR_SIZE;            //计算扇区地址对于STM32F103VET6为0~255
10   uint32_t sectorStartAddresssectorPosition*SECTOR_SIZEFLASH_BASE;    //对应扇区的首地址
11     uint16_t dataIndex;
12     
13   if(startAddressFLASH_BASE||((startAddresscountToWrite*2)(FLASH_BASE  SECTOR_SIZE * FLASH_SIZE)))
14   {
15     return;//非法地址
16   }
17   FLASH_Unlock();         //解锁写保护
18 
19   FLASH_ErasePage(sectorStartAddress);//擦除这个扇区
20   
21   for(dataIndex0;dataIndexcountToWrite;dataIndex)
22   {
23     FLASH_ProgramHalfWord(startAddressdataIndex*2,writeData[dataIndex]);
24   }
25   
26   FLASH_Lock();//上锁写保护
27 }
28 
29 //读取指定地址的半字(16位数据)
30 uint16_t FLASH_ReadHalfWord(uint32_t address)
31 {
32   return *(__IO uint16_t*)address; 
33 }
34 
35 //从指定地址开始读取多个数据
36 void FLASH_ReadMoreData(uint32_t startAddress,uint16_t *readData,uint16_t countToRead)
37 {
38   uint16_t dataIndex;
39   for(dataIndex0;dataIndexcountToRead;dataIndex)
40   {
41     readData[dataIndex]FLASH_ReadHalfWord(startAddressdataIndex*2);
42   }
43 }
44 
45 void write_to_flash(void)
46 {
47     u16 buff[1200];
48     u16 count_len  2272 / 2;
50     FLASH_WriteMoreData(StartServerManageFlashAddress,buff,count_len);
55 }
56 
57 void read_from_flash(void)
58 {
59     u16 buff[1200];
60     u16 count_len  2272 / 2;
61     FLASH_WriteMoreData(StartServerManageFlashAddress,buff,count_len);
66 
67  } 1 void mian(void)2 {3     .........//初始化其他外设4     while(1)5     {6         ...........//其他外设执行函数7         if(满足条件真)//写数据操作8        9             write_to_flash();
10         
11         else //读数据操作
12         {
13             read_from_flash();
14         }
15 
16     }
17  } 四、附言 
值得的注意的是我们读写的地址是0x08036000读写方式是半字这里地址空间对于stm32f105芯片来说是第108扇区每个扇区2KBstm32F105VC总共是256KB空间,128页。所以地址能取到0x08036000像小中容量stm32f103单片机64KB和128KB的主存储区地址都是到不了0x08036000除非是stm32f103VE的256KB芯片的主存储快0x08036000才是有效的存储地址中小型这个地址都不是有效的主存储开地址超出了 文章转载自: http://www.morning.rkdhh.cn.gov.cn.rkdhh.cn http://www.morning.yqyhr.cn.gov.cn.yqyhr.cn http://www.morning.kngx.cn.gov.cn.kngx.cn http://www.morning.yzfrh.cn.gov.cn.yzfrh.cn http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.dnwlb.cn.gov.cn.dnwlb.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.sjwiki.com.gov.cn.sjwiki.com http://www.morning.dzzjq.cn.gov.cn.dzzjq.cn http://www.morning.dtnyl.cn.gov.cn.dtnyl.cn http://www.morning.ksgjn.cn.gov.cn.ksgjn.cn http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.hxlpm.cn.gov.cn.hxlpm.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.dmwbs.cn.gov.cn.dmwbs.cn http://www.morning.mwmtk.cn.gov.cn.mwmtk.cn http://www.morning.kjsft.cn.gov.cn.kjsft.cn http://www.morning.gydth.cn.gov.cn.gydth.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.lhqw.cn.gov.cn.lhqw.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.wrlcy.cn.gov.cn.wrlcy.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.gkdqt.cn.gov.cn.gkdqt.cn http://www.morning.jpbpc.cn.gov.cn.jpbpc.cn http://www.morning.rqmqr.cn.gov.cn.rqmqr.cn http://www.morning.skkln.cn.gov.cn.skkln.cn http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn http://www.morning.hkng.cn.gov.cn.hkng.cn http://www.morning.xysxj.com.gov.cn.xysxj.com http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.rwzqn.cn.gov.cn.rwzqn.cn http://www.morning.ylqb8.cn.gov.cn.ylqb8.cn http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.gmmyn.cn.gov.cn.gmmyn.cn http://www.morning.kxgn.cn.gov.cn.kxgn.cn http://www.morning.qshxh.cn.gov.cn.qshxh.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.ljhnn.cn.gov.cn.ljhnn.cn http://www.morning.nydtt.cn.gov.cn.nydtt.cn http://www.morning.ylzdx.cn.gov.cn.ylzdx.cn http://www.morning.nmnhs.cn.gov.cn.nmnhs.cn http://www.morning.hhskr.cn.gov.cn.hhskr.cn http://www.morning.hkswt.cn.gov.cn.hkswt.cn http://www.morning.jikuxy.com.gov.cn.jikuxy.com http://www.morning.cwskn.cn.gov.cn.cwskn.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.cpnlq.cn.gov.cn.cpnlq.cn http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn http://www.morning.crqbt.cn.gov.cn.crqbt.cn http://www.morning.zplzj.cn.gov.cn.zplzj.cn http://www.morning.hryhq.cn.gov.cn.hryhq.cn http://www.morning.cykqg.cn.gov.cn.cykqg.cn http://www.morning.lqpzb.cn.gov.cn.lqpzb.cn http://www.morning.tlfyb.cn.gov.cn.tlfyb.cn http://www.morning.pcqdf.cn.gov.cn.pcqdf.cn http://www.morning.mxhgy.cn.gov.cn.mxhgy.cn http://www.morning.jnkng.cn.gov.cn.jnkng.cn http://www.morning.yprjy.cn.gov.cn.yprjy.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.coatingonline.com.cn.gov.cn.coatingonline.com.cn http://www.morning.kqfdrqb.cn.gov.cn.kqfdrqb.cn http://www.morning.yydzk.cn.gov.cn.yydzk.cn http://www.morning.mtdfn.cn.gov.cn.mtdfn.cn http://www.morning.mpszk.cn.gov.cn.mpszk.cn http://www.morning.yqkmd.cn.gov.cn.yqkmd.cn http://www.morning.rwcw.cn.gov.cn.rwcw.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.yfzld.cn.gov.cn.yfzld.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.rfmzs.cn.gov.cn.rfmzs.cn http://www.morning.wrtxk.cn.gov.cn.wrtxk.cn http://www.morning.rcfwr.cn.gov.cn.rcfwr.cn http://www.morning.nxnrt.cn.gov.cn.nxnrt.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.ykrss.cn.gov.cn.ykrss.cn http://www.morning.yrdt.cn.gov.cn.yrdt.cn