配置串口4
uart.c
u8 USART4_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节 u16 USART4_RX_STA=0; //接收状态标记 void uart4_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能USART1,GPIOA时钟 //USART2_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.2 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA.9 //USART2_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;///浮空输入 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); ///根据指定参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 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(UART4, &USART_InitStructure); ///初始化串口1 USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);///打开串口接受中断 USART_Cmd(UART4, ENABLE); //使能串口1 } void UART4_Send_Data(u8 *buf,u16 len) { u16 t; for(t=0;t<len;t ) //循环发送数据 { while(USART_GetFlagStatus(UART4,USART_FLAG_TC)==RESET); //循环发送,直到发送完成 USART_SendData(UART4,buf[t]); } while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET); } void UART4_IRQHandler(void) //串口1中断服务程序 { int Res; if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) ///接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(UART4); ////读取收到的数据 if(Res==0xff) { USART4_RX_STA=0; //接收完成 } else { USART4_RX_BUF[USART4_RX_STA]=Res ; USART4_RX_STA ; } } // USART_ClearFlag(UART4,USART_IT_RXNE); ///必须清除接收中断 }
uart.h
#ifndef __USART_H #define __USART_H #include "stdio.h" #include "sys.h" #define USART_REC_LEN 20 ///定义最大接收字节数 200 extern u16 USART4_RX_STA; //接收状态标记 extern u8 USART4_RX_BUF[USART_REC_LEN]; void uart4_init(u32 bound); void UART4_Send_Data(u8 *buf,u16 len);
CO2.C
#include "CO2.h" /************************************************** 计算二氧化碳值的函数 **************************************************/ int hextoDec(int hex) { int sum=0,mul=1; int i,r; int count=0; do{ r=hex; for(i=0;i<count;i ) mul*=16; mul*=r; sum =mul; mul=1; count ; }while(hex/=16); return sum; } /************************************************** 命令发送给二氧化碳 **************************************************/ void DATA(void) { int i; u8 tr[]={0xff,0x01,0xa0,0x00,0x00,0x00,0x00,0x00,0x5f}; for(i=0;i<9;i ) { while((UART4->SR&0x0080)==0); UART4->DR=tr[i]; } }
CO2.H
#ifndef __CO2_H #define __CO2_H #include "stdio.h" #include "sys.h" #include "usart.h" int hextoDec(int hex); void DATA(void); #endif
主函数 main.c
#include "led.h" #include "delay.h" #include "CO2.h" #include "sys.h" #include "usart.h" #include "stdio.h" int main(void) { u16 i,CO2; u16 CO2H,CO2L; delay_init(); //延迟函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2抢占优先级,二位响应优先级 uart_init(9600); //串口初始化为115200 uart4_init(9600); LED2_Init(); //LED端口初始化 while(1) { DATA(); for(i=0;i<5;i ) delay_ms(1000); CO2H=hextoDec(USART4_RX_BUF[3]); CO2L=hextoDec(USART4_RX_BUF[4]); CO2=CO2H*256 CO2L; printf("%d\r\n",CO2); for(i=0;i<5;i ) delay_ms(1000); } }