激光 pm2.5传感器 攀藤科技 stm32 调试通过

///////////////////////////////////////////////////////
//作者:zhl
//时间:2015,4,2
//程序:夏普二代PM传感器串口读取
//声明:未经应许,不得他用
///////////////////////////////////////////////////////
#include "stm32f10x_lib.h"
#include "stdio.h"
#include "delay.h"


#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
u8 Uart1_Rx;
u8 Uart1_Tx;
u8 Uart1_Sta=0;
u8 Uart1_Buffer[];
u8 Uart1_Len;
u8 tx1;




GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;


void USART1_SendByte(u8 ch);


void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 时钟参数初始化设置
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE );
}


void GPIO_Configuration(void)
{
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选中管脚9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最高输出速率50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 选择A端口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //选中管脚10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);  //选择A端口
}


void NVIC_Config()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


void USART1_Configuration(void)
{  
USART_InitStructure.USART_BaudRate = 9600;  // 波特率为:115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b;  // 8位数据
USART_InitStructure.USART_StopBits = USART_StopBits_1;  // 在帧结尾传输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;  // 发送使能+接收使能
/* Configure USART1 basic and asynchronous paramters */
USART_Init(USART1, &USART_InitStructure);
/* Enable USART1 */
USART_ClearFlag(USART1, USART_IT_RXNE); //清中断,以免一启用中断后立即产生中断
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //使能USART1中断源
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_Cmd(USART1, ENABLE); //USART1总开关:开启 
}


void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
/*
********************************************************************************
** 函数名称 : void Delayms(vu32 m)
** 函数功能 : 长延时函数 m=1,延时1ms
** 输    入 : 无
** 输    出 : 无
** 返    回 : 无
********************************************************************************
*/
void Delayms(vu32 m)
{
  u32 i;
  
  for(; m != 0; m--)
       for (i=0; i<50000; i++);
}
//************************************************
//uchar zhuan (uchar temp) //转化为十进制数
//{ 
//
//uchar bai,shi,ge;
//bai=temp/100;
//temp=temp%100;
//shi=temp/10;
//ge=temp%10;
//return (bai*100+shi*10+ge);
//}  
//
//float TPM()  //1050数据处理
//{  pmt=pm;
// if(pm5==(pm1+pm2+pm3+pm4))   //数据校验
//   {  
//   pm=(zhuan(pm1)*256+zhuan(pm2))/204.8;
//  return pm;
//  }
//
//  return pmt;  //如果一组数据没有传完,返回原值
//  
//}






int main(void)
{
u8 a,b,c;

RCC_Config();
GPIO_Configuration();
USART1_Configuration();
NVIC_Config();
// delay_init(72);
while(1)
{
if(Uart1_Sta)
{
// for(tx1=0;tx1 <= Uart1_Len;tx1++,Uart1_Tx++)
// USART1_SendByte(Uart1_Buffer[Uart1_Tx]);//发送数据
// if(Uart1_Buffer[Uart1_Tx+1]<0x40&&Uart1_Buffer[Uart1_Tx+2]>0x00)
// {
b=Uart1_Buffer[Uart1_Tx+12];
c=Uart1_Buffer[Uart1_Tx+13];
// }
Uart1_Rx=0; //初始化
Uart1_Tx=0;
Uart1_Sta=0;
}
printf("\n\r--%d ug/m3--\n\r" ,(u16)b*256+(u16)c);
Delay(0xfffff);

// printf("%d",i);
}
}


void USART1_SendByte(u8 ch)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
}
  USART_SendData(USART1, ch);

}


void USART1_IRQHandler()
{
if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET);//中断产生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
Uart1_Buffer[Uart1_Rx] = USART_ReceiveData(USART1);
Uart1_Rx++;
Uart1_Rx &= 0xff;
}
if(Uart1_Buffer[Uart1_Rx-1] == 0x42)//头
Uart1_Tx = Uart1_Rx-1;
if((Uart1_Buffer[Uart1_Tx] == 0x42)&&(Uart1_Buffer[Uart1_Tx+1]==0x4d)&&((Uart1_Rx-1- Uart1_Tx)==31))//检测到头的情况下检测到尾
{
Uart1_Len = Uart1_Rx-1- Uart1_Tx; //长度
Uart1_Sta=1; //标志位
}
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR
USART_ReceiveData(USART1); //读DR
}



/* 重定义fputc函数 如果使用MicroLIB只需要重定义fputc函数即可 */  
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* Loop until the end of transmission */
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
}
  USART_SendData(USART1, ch);
    return ch;
}





你可能感兴趣的:(STM32数据采集)