基础版本

This commit is contained in:
bathfire
2026-04-27 16:55:02 +08:00
commit 64b3e488da
269 changed files with 383851 additions and 0 deletions
+295
View File
@@ -0,0 +1,295 @@
#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;
}
}
}