Files
2026-04-27 16:55:02 +08:00

295 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "config.h"
volatile u8 SensorCount2TXTask_Flag = 1;//SensorCount接受任务标志位,1允许运行
volatile u8 SensorCount_DMA_RX_Len = 23;
/*_____ D E F I N I T I O N __________________________________________________*/
/****************************************************
函数名:SensorCount_IO_Configuration
功能 SensorCount ModBus通讯部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void SensorCount_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_UART5);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_UART5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
Sensor2_RS485_RxEN;
}
/****************************************************
函数名:SensorCount_NVIC_Configuration
功能 SensorCount ModBus通讯Usart1和发送DMA中断配置
参数 :无
返回值:无
****************************************************/
void SensorCount_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
//USART5_DMA
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************
函数名 SensorCount_USART_Configuration()
功能 : 串口初始化
传入参数:无
返回值 :无
**************************************************/
void SensorCount_USART_Configuration(u32 Baud,u8 Check)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
USART_InitStructure.USART_BaudRate =Baud;// Baud;//?????
if(Check == Even)
{
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Even;
}
else if(Check == None)
{
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
}
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(UART5, &USART_InitStructure);
USART_Cmd(UART5, ENABLE);
USART_DMACmd(UART5, USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
}
/*************************************************
函数名 DMA_Configuration()
功能 DMA初始化
传入参数:无
返回值 :无
**************************************************/
void SensorCount_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
/*******************发送TX*********************/
DMA_DeInit(DMA1_Stream7);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
//DMA_InitStructure.DMA_BufferSize = UART_DMA_SEND_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_Init(DMA1_Stream7, &DMA_InitStructure);
DMA_ITConfig(DMA1_Stream7, DMA_IT_TC, ENABLE);
//DMA_Cmd(DMA1_Stream3, ENABLE);
/*******************RX*********************/
DMA_DeInit(DMA1_Stream0);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 23;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&UART5->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)YWYData.SensorMail.Buff;
DMA_Init(DMA1_Stream0, &DMA_InitStructure);
DMA_ITConfig(DMA1_Stream0, DMA_IT_TC, ENABLE);
DMA_ClearFlag(DMA1_Stream0, DMA_IT_TCIF0);
DMA_Cmd(DMA1_Stream0, ENABLE);
}
//F*****************************************************************************
//* NAME: SensorCount2_DMATX_IRQHandler
//* PURPOSE: DMA传输完成中断,SensorCount ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount2_DMATX_IRQHandler(void)
{
SensorCount2_TX_DMAStop(); //关闭DMA传输 (SensorCount发送)
/**********************DR寄存器里面有数据开启DMA时会自动放入一个数据,长度减一。应对方法:接收中断重设长度,打开DMA,发送中断关闭DMA,重设长度,打开DMA********************/
SensorCount2_RX_DMAStop();
SensorCount2_RX_DMALenSet(SensorCount_DMA_RX_Len);//重置接受长度
DMA_ClearFlag(DMA1_Stream7, DMA_IT_TCIF7);
while(! USART_GetFlagStatus(UART5, USART_FLAG_TC))NULL;
Sensor2_RS485_RxEN;
SensorCount2TXTask_Flag = 1;
SensorCount2_RX_DMAStart();
}
//F*****************************************************************************
//* NAME: SensorCount_DMARX_IRQHandler
//* PURPOSE: DMA传输完成中断,SensorCount ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount2_DMARX_IRQHandler(void)
{
u16 CRC_Temp;
SensorCount2_RX_DMAStop(); //DMA接收
DMA_ClearFlag(DMA1_Stream0, DMA_IT_TCIF0);
SensorCount2_RX_DMAAddrSet((u32)YWYData.SensorMail.Buff);
SensorCount2_RX_DMALenSet(SensorCount_DMA_RX_Len);//重置接受长度
SensorCount2_RX_DMAStart();
CRC_Temp = CRC_Check(YWYData.SensorMail.Buff,YWYData.SensorMail.Register.Len + 3);
if(CRC_Temp == YWYData.SensorMail.Register.Crc)
{
YWYData.SensorMail_Flag = 1; //使能LcdCount接收任务
}
//使能LcdCount接收任务
}
//F*****************************************************************************
//* NAME: SensorCount_Init
//* PURPOSE: SensorCount通讯初始化
//* PARAMS: 无
//* return: 无
//******************************************************************************
void SensorCount_Init(void)
{
u8 i = 0;
SensorCount_IO_Configuration();
SensorCount_USART_Configuration(9600,None);
SensorCount_DMA_Configuration();
SensorCount_NVIC_Configuration();
YWYData.Sensor_Ask_Timer.Init = 0; //清除初始化标志
YWYData.Sensor_Ask_Timer.Flag = 1; //清除到时标志
YWYData.Sensor_Ask_Timer.ON_OFF = 1; //打开轮训开关
YWYData.Sensor_Ask_Timer.Cycle = 1; //设置为循环模式
YWYData.Sensor_Ask_Timer.TimerCountMax = 100; //周期1001SSensor_ERR_Timer
YWYData.Sensor_ERR_Timer[0].Init = 0; //清除初始化标志
YWYData.Sensor_ERR_Timer[0].Flag = 0; //清除到时标志
YWYData.Sensor_ERR_Timer[0].ON_OFF = 1; //打开轮训开关
YWYData.Sensor_ERR_Timer[0].Cycle = 1; //设置为循环模式
YWYData.Sensor_ERR_Timer[0].TimerCountMax = 200; //周期1001SSensor_ERR_Timer
YWYData.Sensor_ERR_Timer[1].Init = 0; //清除初始化标志
YWYData.Sensor_ERR_Timer[1].Flag = 0; //清除到时标志
YWYData.Sensor_ERR_Timer[1].ON_OFF = 1; //打开轮训开关
YWYData.Sensor_ERR_Timer[1].Cycle = 1; //设置为循环模式
YWYData.Sensor_ERR_Timer[1].TimerCountMax = 200; //周期1001S
YWYData.PowerOffDelay_Timer.Init = 0; //清除初始化标志
YWYData.PowerOffDelay_Timer.Flag = 0; //清除到时标志
YWYData.PowerOffDelay_Timer.ON_OFF = 0; //打开轮训开关
YWYData.PowerOffDelay_Timer.Cycle = 0; //设置为循环模式
YWYData.PowerOffDelay_Timer.TimerCountMax = 6000; //周期600060S
}
/***********RS485/探针命令发送************
*****************************************
*****************************************/
u8 Sensor_TX_Buff[10] = {0x00,0x03,0x00,0x02,0x00,0x01,0x00,0x00};
u8 Sensor_Ask_Data(u8 ID)//
{
u16 i = 10;
u16 CRC_Temp = 0;
Sensor2_RS485_TxEN;
SensorCount2TXTask_Flag = 0;
Sensor_TX_Buff[0] = ID + 1;
CRC_Temp = CRC_Check(Sensor_TX_Buff,6);
Sensor_TX_Buff[7] = CRC_Temp >> 8;
Sensor_TX_Buff[6] = CRC_Temp;
SensorCount2_TX_DMAAddrSet((u32)Sensor_TX_Buff);
SensorCount2_TX_DMALenSet(8);
SensorCount2_TX_DMAStart();
SensorCount_DMA_RX_Len = 7;
}
u8 Sensor_Ask_NumNow = 0;
void Sensor_Tast(void)
{
if(YWYData.Sensor_Ask_Timer.Flag == 1)
{
YWYData.Sensor_Ask_Timer.Flag = 0;
Sensor_Ask_Data(Sensor_Ask_NumNow);
Sensor_Ask_NumNow ++;
if(Sensor_Ask_NumNow > 1)
Sensor_Ask_NumNow = 0;
}
if(YWYData.SensorMail_Flag == 1)
{
YWYData.SensorMail_Flag = 0;
if(YWYData.SensorMail.Register.SensorNum < 3)
{
if(YWYData.SensorMail.Register.Dat != 0x0200)
YWYData.ErrState[YWYData.SensorMail.Register.SensorNum - 1].Flag.GasLeakage = 0;
else
YWYData.ErrState[YWYData.SensorMail.Register.SensorNum - 1].Flag.GasLeakage = 1;
}
}
}