总结——调试STM32F103ZET6外围传感器(SDS011高精度PM2.5传感器)

一、SDS011高精度PM2.5传感器信息

串口通讯协议:9600 8N1。(速率 9600,数据位 8,校验位无,停止位 1)
串口上报通讯周期:1+0.5 秒

数据帧(10 字节):报文头+指令号+数据(6 字节)+校验和+报文尾

0 报文头 AA

1 指令号 C0

2 数据 1 PM2.5 低字节

3 数据 2 PM2.5 高字节

4 数据 3 PM10 低字节

5 数据 4 PM10 高字节

6 数据 5 ID

7 数据 6 ID

8 校验和校验和

9 报文尾 AB

PM2.5 数据内容:PM2.5(ug/m3) = ((PM2.5 高字节*256) + PM2.5 低字节)/10

PM10 数据内容:PM10(ug/m3) = ((PM10 高字节*256) + PM10 低字节)/10

  引脚定义:

1:NC 控制脚,备用
2:1um >0.3 微米颗粒物浓度,PWM 输出
3:5V 5V 电源输入
4:25um >2.5 微米-颗粒物浓度,PWM 输出
5:GND 地
6:RXD 串口接收 RX
7:TXD 串口发送 TX

备注: 接口间距采用 2.54 间距,无特殊说明采用 90 度插针接口;

二、接线

本实验开发板用的是正点原子的stm32精英板,传感器正极接VOUT2的 5V,负极接VOUT2的GND,TX接PB11,RX接PB10

三、关键代码

u8 USART_RX_BUF_3[USART3_REC_LEN];////接收缓冲,最大USART3_REC_LEN个字节
u16 USART3_RX_STA;//接收状态标记

void uart3_init(u32 bound)
{  
    //GPIO端口设置  
    GPIO_InitTypeDef GPIO_InitStructure;  
    USART_InitTypeDef USART_InitStructure;  
    NVIC_InitTypeDef NVIC_InitStructure;  
    //使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);  //使能USART3时钟  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能GPIOB时钟
     //USART1_TX   PB.10  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10  
     
    //USART1_RX   PB.11  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入  
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11  
  
   //USART3初始化设置  
    USART_InitStructure.USART_BaudRate = bound;//波特率9600;  
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位  
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
    USART_Init(USART3, &USART_InitStructure); //初始化串口  
   //Usart3 NVIC 配置  
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能  
    NVIC_Init(&NVIC_InitStructure); //初始化NVIC配置  
     
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断  
    USART_Cmd(USART3, ENABLE);                    //使能串口3     
}  


void USART3_IRQHandler(void)
{
	u8 Res;
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
		{
		Res =USART_ReceiveData(USART3);	//读取接收到的数据
		if((USART3_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART3_RX_STA&0x4000)//接收到了所有数据
				 USART3_RX_STA|=0x8000;	//接收完成了 
			else //还没接收完成
				{	
				if((USART3_RX_STA&0X3FFF)>9)//接收到了10字节数据
				{
					USART3_RX_STA|=0x4000;
				}
				else 
					{
					USART_RX_BUF_3[USART3_RX_STA&0X3FFF]=Res ;//读取数据到USART_RX_BUF_3[]
					USART3_RX_STA++;
					if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 
}
int main(void)
{
	u8 t,len,checksum;
	float PM25Data;
	//初始化
	delay_init();
	led_Init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  uart3_init(9600);
	uart_init(115200);
	while(1)
	{
		if (USART3_RX_STA&0x8000)//串口3数据接收完成
			{
				len=USART3_RX_STA&0X3FFF;//数据长度
				checksum = USART_RX_BUF_3[2] + USART_RX_BUF_3[3] + USART_RX_BUF_3[4]   
                                 + USART_RX_BUF_3[5] + USART_RX_BUF_3[6] + USART_RX_BUF_3[7];//校验和
				PM25Data = (USART_RX_BUF_3[3] * 256 + USART_RX_BUF_3[2]) / (float)10;//计算PM2.5
				if(checksum == USART_RX_BUF_3[8])//判断校验和是否正确
				{
					printf("USART_RX_BUF_3:");
					for(t = 0;t					printf("%x ",USART_RX_BUF_3[t]); //打印串口3接收到的数据
					/*for(t=0;t	//向串口1发送接收到的数据
					{
						USART_SendData(USART1,USART_RX_BUF_3[t]);y
						while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
					}*/
					printf("\r\n");
					printf("PM2.5浓度为:%0.1fug/m3\r\n",PM25Data);
					USART3_RX_STA=0;//重置标志位
				}
			}
		led0=!led0;//闪烁LED,提示系统正在运行
			delay_ms(100);
	}	
}



你可能感兴趣的:(stm32)