浏览代码

增加定时器配置

feature/PLSR功能
1923777848 1周前
父节点
当前提交
8b72eb7900
共有 7 个文件被更改,包括 520 次插入42 次删除
  1. +25
    -0
      TrainCamp_zhangcheng_PLSR/app/inc/plsr.h
  2. +2
    -31
      TrainCamp_zhangcheng_PLSR/app/src/main.c
  3. +61
    -0
      TrainCamp_zhangcheng_PLSR/app/src/plsr.c
  4. +55
    -0
      TrainCamp_zhangcheng_PLSR/bsp/inc/time.h
  5. +371
    -0
      TrainCamp_zhangcheng_PLSR/bsp/src/time.c
  6. +6
    -0
      TrainCamp_zhangcheng_PLSR/iar/PLSR.ewp
  7. +0
    -11
      TrainCamp_zhangcheng_PLSR/modbus/inc/modbus.h

+ 25
- 0
TrainCamp_zhangcheng_PLSR/app/inc/plsr.h 查看文件

@@ -0,0 +1,25 @@
/**
* @file plsr.h
* @author zhangcheng
* @brief PLSR指令功能接口文件
* @version v0.1
* @date 2025-08-06
*
* @copyright Copyright (c) 2025
*/


#include "../../modbus/inc/modbus.h"


/**
* @brief PLSR功能初始化
* @details
*
* @param[in] 无
*
* @return RESUIL 初始化结果
* @retval MODBUS_TURE 成功
* @retval MODBUS_FALSE 失败
*/
RESUIL PLSRInit(void);

+ 2
- 31
TrainCamp_zhangcheng_PLSR/app/src/main.c 查看文件

@@ -4,37 +4,7 @@
#include "../modbus/inc/modbus_operate_module.h"
#include "../modbus/inc/modbus_ack_module.h"
#include "../modbus/inc/modbus_link_check_module.h"


// PVD初始化函数,设置PVD阈值和中断模式
void PVD_Init(void)
{
// 使能PWR时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
// 设置PVD阈值为2.9V,可以根据你的电源电压选择其他值
PWR_PVDLevelConfig(PWR_PVDLevel_7);
// 使能PVD
PWR_PVDCmd(ENABLE);
// 使能PVD外部中断线
EXTI_ClearITPendingBit(EXTI_Line16); // 清除中断标志位
EXTI_InitTypeDef EXTI_InitStructure; // 定义外部中断结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line16; // PVD连接到外部中断线16
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 设置为上升沿触发,即电压低于阈值时触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线
EXTI_Init(&EXTI_InitStructure); // 初始化外部中断
// 设置PVD中断优先级和使能
NVIC_InitTypeDef NVIC_InitStructure; // 定义中断控制器结构体
NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn; // PVD中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6; // 抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化中断控制器
}
#include "../inc/plsr.h"


int main(void)
@@ -60,6 +30,7 @@ int main(void)
OperateProcModuleInit();
AckProcModuleInit();
linkCheckModuleInit();
PLSRInit();
OSStart();
}


+ 61
- 0
TrainCamp_zhangcheng_PLSR/app/src/plsr.c 查看文件

@@ -0,0 +1,61 @@
/**
* @file plsr.c
* @author zhangcheng
* @brief PLSR指令功能源文件
* @version v0.1
* @date 2025-08-06
*
* @copyright Copyright (c) 2025
*/


#include "../../system/inc/system.h"
#include "../inc/plsr.h"


#define PLSR_MODULE_PRIO 5
#define PLSR_MODULE_STACK_SIZE 1024
static OS_STK PlsrModuleStack[PLSR_MODULE_STACK_SIZE];
static void PlsrModuleTask(void * pArg);


/**
* @brief PLSR功能初始化
* @details
*
* @param[in] 无
*
* @return RESUIL 初始化结果
* @retval MODBUS_TURE 成功
* @retval MODBUS_FALSE 失败
*/
RESUIL PLSRInit(void)
{
INT8U err;

OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL();

err = OSTaskCreate(
PlsrModuleTask,
NULL,
&PlsrModuleStack[PLSR_MODULE_STACK_SIZE - 1],
PLSR_MODULE_PRIO);

if(err != OS_ERR_NONE)
{
MODBUS_LOG("PlsrcModule init fail\r\n");
OS_EXIT_CRITICAL();
return MODBUS_FALSE;
}

OS_EXIT_CRITICAL();
return MODBUS_TURE;
}


void PlsrModuleTask(void *pArg)
{
while(1);
}

+ 55
- 0
TrainCamp_zhangcheng_PLSR/bsp/inc/time.h 查看文件

@@ -0,0 +1,55 @@
/**
* @file time.h
* @author zhangcheng
* @brief 定时器及PWM输出接口文件
* @version v0.1
* @date 2025-08-06
*
* @copyright Copyright (c) 2025
*/


#ifndef _time_H
#define _time_H

#include "stm32f4xx.h"


/**
* @brief 定时器数据结构
* @details
* @note
* @attention
*/
typedef struct TIM
{
TIM_TypeDef *TIM;
int8_t (*init)(struct TIM *tim, uint16_t psc, uint32_t per);
void (*deInit)(struct TIM *tim);
void (*setPsc)(struct TIM *tim, uint16_t psc);
void (*setPer)(struct TIM *tim, uint32_t per);
void (*open)(struct TIM *tim);
void (*close)(struct TIM *tim);
void (*openIrq)(struct TIM *tim);
void (*closeIrq)(struct TIM *tim);
void (*registerIrq)(struct TIM *tim, void (*registerFunc)(void *pArg),
void *pArg);
void (*pwmInit)(struct TIM *tim);
void (*pwmDeInit)(struct TIM *tim);
void (*pwmSetPulse)(struct TIM *tim, uint32_t pulse);
} TIM_OBJ;


/**
* @brief 获取定时器
* @details
*
* @param[in] *timName 定时器名称
* @param "timx" x : 10、11、13、14
*
* @return TIM 定时器结构体
*/
TIM_OBJ GetTimObj(char *timName);

#endif


+ 371
- 0
TrainCamp_zhangcheng_PLSR/bsp/src/time.c 查看文件

@@ -0,0 +1,371 @@
/**
* @file time.h
* @author zhangcheng
* @brief 定时器及PWM输出接口文件
* @version v0.1
* @date 2025-08-06
*
* @copyright Copyright (c) 2025
*/


#include "../../system/inc/system.h"
#include "../inc/time.h"


/* 中断注册回调函数类型 */
typedef void (*Func)(void *pArg);

/* 中断注册回调函数列表 */
static Func CallBackFuncList[3] =
{
NULL, ///< TIM10
NULL, ///< TIM11
NULL ///< TIM13
};

/* 中断注册回调参数列表 */
static void *ArgList[3] =
{
NULL, ///< TIM10
NULL, ///< TIM11
NULL ///< TIM13
};

/* 可用定时器列表 */
static char *TimNameList[] =
{
"tim10", ///< TIM10
"tim11", ///< TIM11
"tim13", ///< TIM13
"tim14" ///< TIM14
};

/* 可用定时器列表参数 */
static TIM_TypeDef *TimType[] =
{
TIM10, ///< TIM10
TIM11, ///< TIM11
TIM13, ///< TIM13
TIM13 ///< TIM14
};


/**
* @brief 定时器初始化
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] psc 定时器预分频系数
* @param[in] per 定时器重装载值
*
* @return int8_t 返回结果
* @retval 0 成功
* @retval -1 失败
*/
int8_t TimInit(TIM_OBJ *tim, uint16_t psc, uint32_t per)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

if (tim->TIM == TIM10)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,ENABLE);
else if (tim->TIM == TIM11)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11,ENABLE);
else if (tim->TIM == TIM13)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE);
else if (tim->TIM == TIM14)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
else
return -1;

TIM_InternalClockConfig(tim->TIM);

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=per;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInit(tim->TIM, &TIM_TimeBaseInitStructure);
return 0;
}


/**
* @brief 定时器复位
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void TimDeInit(TIM_OBJ *tim)
{
if (tim->TIM == TIM10)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,DISABLE);
else if (tim->TIM == TIM11)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM11,DISABLE);
else if (tim->TIM == TIM13)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,DISABLE);
else if (tim->TIM == TIM14)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,DISABLE);
else
return;

TIM_Cmd(tim->TIM, DISABLE);
TIM_DeInit(tim->TIM);
}


/**
* @brief 设置定时器预分频
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] psc 定时器预分频系数
*
* @return 无
*/
void TimSetPsc(TIM_OBJ *tim, uint16_t psc)
{
TIM_PrescalerConfig(tim->TIM, psc, TIM_PSCReloadMode_Immediate);
}


/**
* @brief 设置定时器重载值
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] per 定时器重装载值
*
* @return 无
*/
void TimSetPer(TIM_OBJ *tim, uint32_t per)
{
TIM_SetAutoreload(tim->TIM, per);
}


/**
* @brief 开启定时器
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void TimOpen(TIM_OBJ *tim)
{
TIM_Cmd(tim->TIM, ENABLE);
}


/**
* @brief 关闭定时器
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void TimClose(TIM_OBJ *tim)
{
TIM_Cmd(tim->TIM, DISABLE);
}


/**
* @brief 开启定时器更新中断
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void TimOpenIrq(TIM_OBJ *tim)
{
NVIC_InitTypeDef NVIC_InitStructure;

TIM_ITConfig(tim->TIM, TIM_IT_Update, ENABLE);
TIM_ClearITPendingBit(tim->TIM, TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel=TIM8_UP_TIM13_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=7;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}


/**
* @brief 关闭定时器更新中断
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void TimCloseIrq(TIM_OBJ *tim)
{
TIM_ITConfig(tim->TIM, TIM_IT_Update, DISABLE);
TIM_ClearITPendingBit(tim->TIM, TIM_IT_Update);
}


/**
* @brief 注册定时器中断回调函数
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] registerFunc 回调函数地址
* @note 回调函数格式 void (*registerFunc)(void *pArg)
*
* @return 无
*/
void TimRegisterIrq(TIM_OBJ *tim, void (*registerFunc)(void *pArg), void *pArg)
{
if (tim->TIM == TIM10)
{
CallBackFuncList[0] = registerFunc;
ArgList[0] = pArg;
}
else if (tim->TIM == TIM11)
{
CallBackFuncList[1] = registerFunc;
ArgList[1] = pArg;
}
else if (tim->TIM == TIM13)
{
CallBackFuncList[2] = registerFunc;
ArgList[2] = pArg;
}
else
return;
}


/**
* @brief PWM初始化
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] pulse 脉冲宽度
*
* @return 无
*/
void PwmInit(TIM_OBJ *tim)
{
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCStructInit(&TIM_OCInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = ENABLE;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(tim->TIM, &TIM_OCInitStructure);
}



/**
* @brief PWM复位
* @details
*
* @param[in] *tim 定时器结构体指针
*
* @return 无
*/
void PwmDeInit(TIM_OBJ *tim)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OutputState = DISABLE;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(tim->TIM, &TIM_OCInitStructure);
}


/**
* @brief 设置PWM脉冲宽度
* @details
*
* @param[in] *tim 定时器结构体指针
* @param[in] pulse PWM脉冲宽度
*
* @return 无
*/
void PwmSetPulse(TIM_OBJ *tim, uint32_t pulse)
{
TIM_SetCompare1(tim->TIM, pulse);
}


/**
* @brief 定时器10、11、13、14更新中断服务函数
* @details
*
* @param[in] 无
*
* @return 无
*/
void TIM8_UP_TIM13_IRQHandler(void)
{
if (TIM_GetITStatus(TIM10,TIM_IT_Update) == SET)
{
if (ArgList[0] != NULL)
CallBackFuncList[0](ArgList[0]);
TIM_ClearITPendingBit(TIM10, TIM_IT_Update);
}
else if (TIM_GetITStatus(TIM11,TIM_IT_Update) == SET)
{
if (ArgList[1] != NULL)
CallBackFuncList[1](ArgList[1]);
TIM_ClearITPendingBit(TIM11, TIM_IT_Update);
}
else if (TIM_GetITStatus(TIM11,TIM_IT_Update) == SET)
{
if (ArgList[2] != NULL)
CallBackFuncList[2](ArgList[2]);
TIM_ClearITPendingBit(TIM12, TIM_IT_Update);
}
else
return;
}


/**
* @brief 获取定时器
* @details
*
* @param[in] *timName 定时器名称
* @param "timx" x : 10、11、13、14
*
* @return TIM_OBJ 定时器结构体
*/
TIM_OBJ GetTimObj(char *timName)
{
TIM_OBJ tim;

for (uint8_t i = 0; i < sizeof(TimNameList) / sizeof(TimNameList[0]); i++)
{
if (strcmp(timName, TimNameList[i]) == 0)
{
tim.TIM = TimType[i];
}
}

tim.init = &TimInit;
tim.deInit = &TimDeInit;
tim.setPsc = &TimSetPsc;
tim.setPer = &TimSetPer;
tim.open = &TimOpen;
tim.close = &TimClose;
tim.openIrq = &TimOpenIrq;
tim.closeIrq = &TimCloseIrq;
tim.registerIrq = &TimRegisterIrq;
tim.pwmInit = &PwmInit;
tim.pwmDeInit = &PwmDeInit;
tim.pwmSetPulse = &PwmSetPulse;

return tim;
}

+ 6
- 0
TrainCamp_zhangcheng_PLSR/iar/PLSR.ewp 查看文件

@@ -2122,6 +2122,9 @@
<file>
<name>$PROJ_DIR$\..\app\src\main.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\app\src\plsr.c</name>
</file>
</group>
<group>
<name>BSP</name>
@@ -2131,6 +2134,9 @@
<file>
<name>$PROJ_DIR$\..\bsp\src\led.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\bsp\src\time.c</name>
</file>
</group>
<group>
<name>CMSIS</name>


+ 0
- 11
TrainCamp_zhangcheng_PLSR/modbus/inc/modbus.h 查看文件

@@ -8,17 +8,6 @@
* @copyright Copyright (c) 2025
*/


/**
* @file modbus.h
* @author zhangcheng
* @brief modbus相关数据结构文件
* @version v0.1
* @date 2025-07-25
*
* @copyright Copyright (c) 2025
*/

#ifndef _MODBUS_H
#define _MODBUS_H


正在加载...
取消
保存