///////////////////////////////////////////////////////
//作者: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;
}