STM32CubeMX學(xué)習(xí)筆記(8)——ADC接口使用

一、ADC簡(jiǎn)介

ADC(Analog-to-Digital Converter),即模擬-數(shù)字轉(zhuǎn)換器,可以將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào),進(jìn)而使用數(shù)字電路進(jìn)行處理,稱之為數(shù)字信號(hào)處理。

STM32f103 系列有 3 個(gè) ADC,精度為 12 位,每個(gè) ADC 最多有 16 個(gè)外部通道。其中 ADC1 和 ADC2 都有 16 個(gè)外部通道,ADC3 根據(jù) CPU 引腳的不同通道數(shù)也不同,一般都有 8 個(gè)外部通道。各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或間斷模式執(zhí)行。ADC的結(jié)果可以左對(duì)齊或右對(duì)齊方式存儲(chǔ)在16位數(shù)據(jù)寄存器中。模擬看門狗特性允許應(yīng)用程序檢測(cè)輸入電壓是否超出用戶定義的高/低閥值。ADC 的輸入時(shí)鐘不得超過14MHz,它是由PCLK2經(jīng)分頻產(chǎn)生。

二、ADC通道選擇

STM32 的 ADC 多達(dá) 18 個(gè)通道,其中外部的 16 個(gè)通道就是框圖中的 ADCx_IN0、ADCx_IN1...ADCx_IN5。這 16 個(gè)通道對(duì)應(yīng)著不同的 IO 口,具體是哪一個(gè) IO 口可以從手冊(cè)查詢到。其中 ADC1/2/3 還有內(nèi)部通道:ADC1 的通道 16 連接到了芯片內(nèi)部的溫度傳感器,Vrefint 連接到了通道 17。ADC2 的模擬通道 16 和 17 連接到了內(nèi)部的 VSS。ADC3 的模擬通道 9、14、15、16 和 17 連接到了內(nèi)部的 VSS。


三、引腳確定

開發(fā)板板載一個(gè)貼片滑動(dòng)變阻器,引腳為 PC1,對(duì)應(yīng) ADC1 的通道 11


四、新建工程

1. 打開 STM32CubeMX 軟件,點(diǎn)擊“新建工程”

2. 選擇 MCU 和封裝

3. 配置時(shí)鐘
RCC 設(shè)置,選擇 HSE(外部高速時(shí)鐘) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)


選擇 Clock Configuration,配置系統(tǒng)時(shí)鐘 SYSCLK 為 72MHz
修改 HCLK 的值為 72 后,輸入回車,軟件會(huì)自動(dòng)修改所有配置

4. 配置調(diào)試模式
非常重要的一步,否則會(huì)造成第一次燒錄程序后續(xù)無法識(shí)別調(diào)試器
SYS 設(shè)置,選擇 Debug 為 Serial Wire

五、ADC1

5.1 參數(shù)配置

Analog 中選擇 ADC1 設(shè)置,并選擇 IN11 通道11


或者在右邊圖找到 PC1 引腳,選擇 ADC1_IN11

具體配置參數(shù)如下。

  • ADCs_Common_Settings
    • Mode
      Independent mod 獨(dú)立 ADC 模式,當(dāng)使用一個(gè) ADC 時(shí)是獨(dú)立模式,使用兩個(gè) ADC 時(shí)是雙模式,在雙模式下還有很多細(xì)分模式可選,具體配置 ADC_CR1:DUALMOD 位。
  • ADC_Settings
    • Data Alignment
      Right alignment 轉(zhuǎn)換結(jié)果數(shù)據(jù)右對(duì)齊,一般我們選擇右對(duì)齊模式。
      Left alignment 轉(zhuǎn)換結(jié)果數(shù)據(jù)左對(duì)齊。
    • Scan Conversion Mode
      Disabled 禁止掃描模式。如果是單通道 AD 轉(zhuǎn)換使用 DISABLE。
      Enabled 開啟掃描模式。如果是多通道 AD 轉(zhuǎn)換使用 ENABLE。
    • Continuous Conversion Mode
      Disabled 單次轉(zhuǎn)換。轉(zhuǎn)換一次后停止需要手動(dòng)控制才重新啟動(dòng)轉(zhuǎn)換。
      Enabled 自動(dòng)連續(xù)轉(zhuǎn)換。
    • DiscontinuousConvMode
      Disabled 禁止間斷模式。這個(gè)在需要考慮功耗問題的產(chǎn)品中很有必要,也就是在某個(gè)事件觸發(fā)下,開啟轉(zhuǎn)換。
      Enabled 開啟間斷模式。
  • ADC_Regular_ConversionMode
    Enable Regular Conversions 是否使能規(guī)則轉(zhuǎn)換。
    Number Of Conversion ADC轉(zhuǎn)換通道數(shù)目,有幾個(gè)寫幾個(gè)就行。
    External Trigger Conversion Source 外部觸發(fā)選擇。這個(gè)有多個(gè)選擇,一般采用軟件觸發(fā)方式。
  • Rank
    Channel ADC轉(zhuǎn)換通道
    Sampling Time 采樣周期選擇,采樣周期越短,ADC 轉(zhuǎn)換數(shù)據(jù)輸出周期就越短但數(shù)據(jù)精度也越低,采樣周期越長(zhǎng),ADC 轉(zhuǎn)換數(shù)據(jù)輸出周期就越長(zhǎng)同時(shí)數(shù)據(jù)精度越高。
  • ADC_Injected_ConversionMode
    Enable Injected Conversions 是否使能注入轉(zhuǎn)換。注入通道只有在規(guī)則通道存在時(shí)才會(huì)出現(xiàn)。
  • WatchDog
    Enable Analog WatchDog Mode 是否使能模擬看門狗中斷。當(dāng)被 ADC 轉(zhuǎn)換的模擬電壓低于低閾值或者高于高閾值時(shí),就會(huì)產(chǎn)生中斷。

5.2 配置NVIC

使能 ADC 中斷


5.3 ADC時(shí)鐘配置

ADC 的轉(zhuǎn)換時(shí)間跟 ADC 的輸入時(shí)鐘和采樣時(shí)間有關(guān)。
公式為:Tconv = 采樣時(shí)間 + 12.5 個(gè)周期。當(dāng) ADCLK = 14MHZ (最高),采樣時(shí)間設(shè)置為 1.5 周期(最快),那么總的轉(zhuǎn)換時(shí)間(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。
一般我們?cè)O(shè)置 PCLK2=72M,經(jīng)過 ADC 預(yù)分頻器能分頻到最大的時(shí)鐘只能是 12M,采樣周期設(shè)置為 1.5 個(gè)周期,算出最短的轉(zhuǎn)換時(shí)間為 1.17us,這個(gè)才是最常用的。

5.4 生成代碼

輸入項(xiàng)目名和項(xiàng)目路徑


選擇應(yīng)用的 IDE 開發(fā)環(huán)境 MDK-ARM V5

每個(gè)外設(shè)生成獨(dú)立的 ’.c/.h’ 文件
不勾:所有初始化代碼都生成在 main.c
勾選:初始化代碼生成在對(duì)應(yīng)的外設(shè)文件。 如 GPIO 初始化代碼生成在 gpio.c 中。

點(diǎn)擊 GENERATE CODE 生成代碼

六、獨(dú)立模式單通道采集中斷方式

單通道采集適用 AD 轉(zhuǎn)換完成中斷,在中斷服務(wù)函數(shù)中讀取數(shù)據(jù),不使用 DMA 傳輸,在多通道采集時(shí)才使用 DMA 傳輸。

6.1 修改中斷回調(diào)函數(shù)

打開 stm32f1xx_it.c 中斷服務(wù)函數(shù)文件,找到 ADC1 中斷的服務(wù)函數(shù) ADC1_2_IRQHandler()
中斷服務(wù)函數(shù)里面就調(diào)用了 ADC 中斷處理函數(shù) HAL_ADC_IRQHandler()

打開 stm32f1xx_hal_adc.c 文件,找到 ADC 中斷處理函數(shù)原型 HAL_ADC_IRQHandler(),其主要作用就是判斷是哪個(gè) ADC 產(chǎn)生中斷,清除中斷標(biāo)識(shí)位,然后調(diào)用中斷回調(diào)函數(shù) HAL_ADC_ConvCpltCallback()

/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_GPIO_EXTI_Callback could be implemented in the user file
*/
這個(gè)函數(shù)不應(yīng)該被改變,如果需要使用回調(diào)函數(shù),請(qǐng)重新在用戶文件中實(shí)現(xiàn)該函數(shù)。

HAL_ADC_ConvCpltCallback() 按照官方提示我們應(yīng)該再次定義該函數(shù),__weak 是一個(gè)弱化標(biāo)識(shí),帶有這個(gè)的函數(shù)就是一個(gè)弱化函數(shù),就是你可以在其他地方寫一個(gè)名稱和參數(shù)都一模一樣的函數(shù),編譯器就會(huì)忽略這一個(gè)函數(shù),而去執(zhí)行你寫的那個(gè)函數(shù);而 UNUSED(hadc) ,這就是一個(gè)防報(bào)錯(cuò)的定義,當(dāng)傳進(jìn)來的ADC號(hào)沒有做任何處理的時(shí)候,編譯器也不會(huì)報(bào)出警告。其實(shí)我們?cè)陂_發(fā)的時(shí)候已經(jīng)不需要去理會(huì)中斷服務(wù)函數(shù)了,只需要找到這個(gè)中斷回調(diào)函數(shù)并將其重寫即可而這個(gè)回調(diào)函數(shù)還有一點(diǎn)非常便利的地方這里沒有體現(xiàn)出來,就是當(dāng)同時(shí)有多個(gè)中斷使能的時(shí)候,STM32CubeMX會(huì)自動(dòng)地將幾個(gè)中斷的服務(wù)函數(shù)規(guī)整到一起并調(diào)用一個(gè)回調(diào)函數(shù),也就是無論幾個(gè)中斷,我們只需要重寫一個(gè)回調(diào)函并判斷傳進(jìn)來的定時(shí)器號(hào)即可。

接下來我們就在 stm32f1xx_it.c 這個(gè)文件的最下面添加 HAL_ADC_ConvCpltCallback()

/* USER CODE BEGIN EV */
extern __IO uint32_t ADC_ConvertedValue;
/* USER CODE END EV */

/* USER CODE BEGIN 1 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    ADC_ConvertedValue = HAL_ADC_GetValue(hadc);
}
/* USER CODE END 1 */

在中斷回調(diào)函數(shù)中進(jìn)行讀取數(shù)據(jù),將數(shù)據(jù)存放在變量 ADC_ConvertedValue 中。

6.2 添加全局變量

在 main.c 定義相關(guān)變量。

// ADC轉(zhuǎn)換值
__IO uint32_t ADC_ConvertedValue;
// 用于保存轉(zhuǎn)換計(jì)算后的電壓值     
float ADC_Vol;

6.3 添加ADC中斷啟動(dòng)函數(shù)

在 main.c 中,while 循環(huán)前,ADC初始化后,添加ADC中斷開啟函數(shù),這樣在第一次接收到數(shù)據(jù)的時(shí)候才會(huì)觸發(fā)中斷。

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
  HAL_ADCEx_Calibration_Start(&hadc1);    //AD校準(zhǔn)
  HAL_ADC_Start_IT(&hadc1); //開啟ADC中斷轉(zhuǎn)換
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

6.4 添加電壓值轉(zhuǎn)換

模擬電壓經(jīng)過 ADC 轉(zhuǎn)換后,是一個(gè) 12 位的數(shù)字值,如果通過串口以 16 進(jìn)制打印出來的話,可讀性比較差,那么有時(shí)候我們就需要把數(shù)字電壓轉(zhuǎn)換成模擬電壓,也可以跟實(shí)際的模擬電壓(用萬用表測(cè))對(duì)比,看看轉(zhuǎn)換是否準(zhǔn)確。
我們一般在設(shè)計(jì)原理圖的時(shí)候會(huì)把 ADC 的輸入電壓范圍設(shè)定在:0~3.3v,因?yàn)?ADC 是 12 位的,那么 12 位滿量程對(duì)應(yīng)的就是 3.3V,12 位滿量程對(duì)應(yīng)的數(shù)字值是:2^12。數(shù)值 0 對(duì)應(yīng)的就是 0V。如果轉(zhuǎn)換后的數(shù)值為 X ,X 對(duì)應(yīng)的模擬電壓為 Y,那么會(huì)有這么一個(gè)等式成立: 2^12 / 3.3 = X / Y,=> Y = (3.3 * X ) / 2^12

串口打印功能查看 STM32CubeMX學(xué)習(xí)筆記(6)——USART串口使用

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      ADC_Vol =(float) ADC_ConvertedValue/4096*3.3; // 讀取轉(zhuǎn)換的AD倿
      printf("The current AD value = 0x%04X \r\n", ADC_ConvertedValue); 
      printf("The current AD value = %f V \r\n\r\n",ADC_Vol); //實(shí)際電壓倿
      HAL_Delay(1000); 
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

6.5 HAL庫與標(biāo)準(zhǔn)庫代碼比較

STM32CubeMX 使用 HAL 庫生成的代碼:

__IO uint32_t ADC_ConvertedValue;

/**
  * @brief ADC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_11;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */
}

/**
  * @brief This function handles ADC1 and ADC2 global interrupts.
  */
void ADC1_2_IRQHandler(void)
{
  /* USER CODE BEGIN ADC1_2_IRQn 0 */

  /* USER CODE END ADC1_2_IRQn 0 */
  HAL_ADC_IRQHandler(&hadc1);
  /* USER CODE BEGIN ADC1_2_IRQn 1 */

  /* USER CODE END ADC1_2_IRQn 1 */
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    ADC_ConvertedValue = HAL_ADC_GetValue(hadc);
}

HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_IT(&hadc1);

使用 STM32 標(biāo)準(zhǔn)庫的代碼:

__IO uint16_t ADC_ConvertedValue;

/**
  * @brief  ADC GPIO 初始化
  * @param  無
  * @retval 無
  */
static void ADCx_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 打開 ADC IO端口時(shí)鐘
    ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );
    
    // 配置 ADC IO 引腳模式
    // 必須為模擬輸入
    GPIO_InitStructure.GPIO_Pin = ADC_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    
    // 初始化 ADC IO
    GPIO_Init(ADC_PORT, &GPIO_InitStructure);               
}

/**
  * @brief  配置ADC工作模式
  * @param  無
  * @retval 無
  */
static void ADCx_Mode_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;  

    // 打開ADC時(shí)鐘
    ADC_APBxClock_FUN ( ADC_CLK, ENABLE );
    
    // ADC 模式配置
    // 只使用一個(gè)ADC,屬于獨(dú)立模式
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    
    // 禁止掃描模式,多通道才要,單通道不需要
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ; 

    // 連續(xù)轉(zhuǎn)換模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

    // 不用外部觸發(fā)轉(zhuǎn)換,軟件開啟即可
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

    // 轉(zhuǎn)換結(jié)果右對(duì)齊
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    
    // 轉(zhuǎn)換通道1個(gè)
    ADC_InitStructure.ADC_NbrOfChannel = 1; 
        
    // 初始化ADC
    ADC_Init(ADCx, &ADC_InitStructure);
    
    // 配置ADC時(shí)鐘為PCLK2的8分頻,即9MHz
    RCC_ADCCLKConfig(RCC_PCLK2_Div8); 
    
    // 配置 ADC 通道轉(zhuǎn)換順序和采樣時(shí)間
    ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, 
                             ADC_SampleTime_55Cycles5);
    
    // ADC 轉(zhuǎn)換結(jié)束產(chǎn)生中斷,在中斷服務(wù)程序中讀取轉(zhuǎn)換值
    ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
    
    // 開啟ADC ,并開始轉(zhuǎn)換
    ADC_Cmd(ADCx, ENABLE);
    
    // 初始化ADC 校準(zhǔn)寄存器  
    ADC_ResetCalibration(ADCx);
    // 等待校準(zhǔn)寄存器初始化完成
    while(ADC_GetResetCalibrationStatus(ADCx));
    
    // ADC開始校準(zhǔn)
    ADC_StartCalibration(ADCx);
    // 等待校準(zhǔn)完成
    while(ADC_GetCalibrationStatus(ADCx));
    
    // 由于沒有采用外部觸發(fā),所以使用軟件觸發(fā)ADC轉(zhuǎn)換 
    ADC_SoftwareStartConvCmd(ADCx, ENABLE);
}

static void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  // 優(yōu)先級(jí)分組
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // 配置中斷優(yōu)先級(jí)
  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  ADC初始化
  * @param  無
  * @retval 無
  */
void ADCx_Init(void)
{
    ADCx_GPIO_Config();
    ADCx_Mode_Config();
    ADC_NVIC_Config();
}

void ADC_IRQHandler(void)
{   
    if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET) 
    {
        // 讀取ADC的轉(zhuǎn)換值
        ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
    }
    ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}

MX_ADC1_Init(); 對(duì)應(yīng) ADCx_GPIO_Config();ADCx_Mode_Config();ADC_NVIC_Config();
HAL_ADC_Init(&hadc1) 對(duì)應(yīng) ADC_Init(ADCx, &ADC_InitStructure)
HAL_ADCEx_Calibration_Start(&hadc1); 對(duì)應(yīng) ADC_StartCalibration(ADCx);
HAL_ADC_Start_IT(&hadc1); 對(duì)應(yīng) ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);
HAL_ADC_GetValue(hadc); 對(duì)應(yīng) ADC_GetConversionValue(ADCx);

七、注意事項(xiàng)

用戶代碼要加在 USER CODE BEGIN NUSER CODE END N 之間,否則下次使用 STM32CubeMX 重新生成代碼后,會(huì)被刪除。


? 由 Leung 寫于 2021 年 1 月 19 日

? 參考:STM32CubeMX系列教程7:模數(shù)轉(zhuǎn)換(ADC)
    《嵌入式-STM32開發(fā)指南》第二部分 基礎(chǔ)篇 - 第8章 模擬輸入輸出-ADC(HAL庫)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容