配置串口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); 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 //定义最大接收字节数 200extern 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
CO2); for(i=0;i<5;i ) delay_ms(1000);} }CO2); for(i=0;i<5;i ) delay_ms(1000);} }