Commit 532c25e9 authored by 李运金's avatar 李运金

🎉 init:上传初版程序

parents
#include "main.h"
#include "RTE.h"
static ADC_HandleTypeDef AdcHandle = {0};
static ADC_ChannelConfTypeDef ADC_InitStructure = {0};
static uint8_t u8ADC_State = 0;
static uint8_t u8ADC_CHseq = 0; //记录通道轮转状态
static uint8_t u8ADC_CHidex = 0xFF; //控制需要转换的通道组,防止重复添加
static uint32_t u32Ad_CH_Record[ADC_CH_NUMS] = {0xFFFFFFFF}; //记录需要转换的通道
static uint16_t u16AdDatelist[ADC_CH_NUMS]; //临时记录获取的通道转换结果
uint32_t u32ADC_CHS[24] =
{
ADC_CHANNEL_0,
ADC_CHANNEL_1,
ADC_CHANNEL_2,
ADC_CHANNEL_3,
ADC_CHANNEL_4,
ADC_CHANNEL_5,
ADC_CHANNEL_6,
ADC_CHANNEL_7,
ADC_CHANNEL_8,
ADC_CHANNEL_9,
ADC_CHANNEL_10,
ADC_CHANNEL_11,
ADC_CHANNEL_12,
ADC_CHANNEL_13,
ADC_CHANNEL_14,
ADC_CHANNEL_15,
ADC_CHANNEL_16,
ADC_CHANNEL_17,
ADC_CHANNEL_18,
ADC_CHANNEL_19,
ADC_CHANNEL_20,
ADC_CHANNEL_21,
ADC_CHANNEL_22,
ADC_CHANNEL_23,
};
/************************************************************************
* @description:adc初始化,通道需要添加进轮转的通道组内
* @param {uint8_t} u8ChList 暂时不用这种方式添加
* @param {uint8_t} u8ChNum 通道号
* @return {*}
************************************************************************/
void RTE_ADC_Init(const uint8_t u8ChList[], uint8_t u8ChNum)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit = {0};
uint8_t i;
if(u8ChNum<=7)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = 1U << u8ChNum;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}
else if((u8ChNum==8)||(u8ChNum==9))
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = (u8ChNum==8? ((uint16_t)0x0001):((uint16_t)0x0002)); //PB0或PB1
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
else if (u8ChNum >= 10 && u8ChNum <= 15)
{
u8ChNum-=10;
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = 1U << u8ChNum;
GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
u8ChNum+=10;
}
AdcHandle.Instance = ADC1;
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */
AdcHandle.Init.DataAlign = ADC_DATAFORMAT; /* Right-alignment for converted data */
AdcHandle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* *Scan mode off */
AdcHandle.Init.ContinuousConvMode = DISABLE; /* Single mode */
AdcHandle.Init.NbrOfConversion = 1; /* Number of conversion channels 1 */
AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Discontinuous mode not enabled */
AdcHandle.Init.NbrOfDiscConversion = 1; /* Discontinuous mode short sequence length is 1 */
AdcHandle.Init.ExternalTrigConv = ADC_SOFTWARE_START; /* *software trigger */
/* Enable ADC clock */
__HAL_RCC_ADC_CLK_ENABLE();
RCC_PeriphCLKInit.PeriphClockSelection= RCC_PERIPHCLK_ADC;
RCC_PeriphCLKInit.ADCClockSelection = RCC_ADCCLKSOURCE_PCLK_DIV8;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);
ADC_InitStructure.Channel = u32ADC_CHS[u8ChNum];
if(u8ADC_CHidex == 0xFF)
{
u8ADC_CHidex = 0;
u32Ad_CH_Record[u8ADC_CHidex] = ADC_InitStructure.Channel;
}
else
{
for(i = 0; i <= u8ADC_CHidex; i++)
{
if(ADC_InitStructure.Channel == u32Ad_CH_Record[i])
break;
}
if (i > u8ADC_CHidex)
{
u8ADC_CHidex++;
u32Ad_CH_Record[u8ADC_CHidex] = ADC_InitStructure.Channel;
}
}
ADC_InitStructure.SamplingTime = ADC_SAMPLETIME;
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
//APP_ErrorHandler();
}
if (HAL_ADC_ConfigChannel(&AdcHandle, &ADC_InitStructure) != HAL_OK)
{
//APP_ErrorHandler();
}
/* ADC calibration */
if(HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
{//如果想校准必须在启动前
//APP_ErrorHandler();
}
HAL_NVIC_SetPriority(ADC_COMP_IRQn, 0, 0); /* Interrupt priority setting */
HAL_NVIC_EnableIRQ(ADC_COMP_IRQn); /* ADC interrupt enable */
}
/************************************************************************
* @description: adc复位初始化
* @return {*}
************************************************************************/
void RTE_ADC_DeInit(void)
{
__HAL_RCC_ADC_CLK_DISABLE();
HAL_ADC_DeInit(&AdcHandle);
NVIC_ClearPendingIRQ(ADC_COMP_IRQn); // clear INTAD interrupt flag
NVIC_DisableIRQ(ADC_COMP_IRQn); // disable INTAD interrupt
u8ADC_State = 0;
u8ADC_CHidex = 0xFF;
uint8_t i;
for(i=0; i<ADC_CH_NUMS; i++)
u32Ad_CH_Record[i] = 0xFFFFFFFF;
}
/************************************************************************
* @description: 开启转换,按照轮转通道进行顺序转化
* @return {*}
************************************************************************/
void RTE_ADC_Start_Conversion(void)
{
/*A/D conversion for SG1 is completed*/
NVIC_ClearPendingIRQ(ADC_COMP_IRQn); // clear INTAD interrupt flag
NVIC_EnableIRQ(ADC_COMP_IRQn); // enable INTAD interrupt
ADC_InitStructure.Channel = u32Ad_CH_Record[u8ADC_CHseq];
ADC_InitStructure.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&AdcHandle, &ADC_InitStructure);
HAL_ADC_Start_IT(&AdcHandle);
u8ADC_State = 1;
}
/************************************************************************
* @description: STOP
* @return {*}
************************************************************************/
void RTE_ADC_Stop_Conversion(void)
{
HAL_ADC_Stop(&AdcHandle);
u8ADC_State = 0;
}
/*****************************************************************************
* @description:获取AD状态
* @return {*} 0:已转换完所有通道 1:未转换完所有通道
*****************************************************************************/
uint8_t RTE_ADC_Get_Conversion_Status(void)
{
return u8ADC_State;
}
/*****************************************************************************
* @description: 获取转换数据
* @param {uint16_t} *pu16Data
* @param {uint8_t} u8ChNum
* @return {*}
*****************************************************************************/
void RTE_ADC_Get_Conversion_Result(uint16_t *pu16Data, uint8_t u8ChNum)
{
uint8_t i;
if(pu16Data == NULL)
return;
if ((pu16Data != 0U) && (u8ChNum > 0U) && (u8ChNum <= ADC_CH_NUMS))
{
for(i=0; i < u8ChNum; i++)
*pu16Data++ = u16AdDatelist[i];
}
}
/*****************************************************************************
* @description: 中断服务函数,按照转换组内的通道顺序进行转换
* @return {*}
*****************************************************************************/
void ADC_COMP_IRQHandler(void)
{
if((READ_BIT(AdcHandle.Instance->SR, ADC_SR_EOC) == (ADC_SR_EOC)) != 0)
{
WRITE_REG(AdcHandle.Instance->SR, ~ADC_SR_EOC);
u16AdDatelist[u8ADC_CHseq] = (uint16_t)(READ_BIT(AdcHandle.Instance->DR, ADC_DR_DATA));
u8ADC_CHseq++;
u8ADC_State = 0;
if(u8ADC_CHseq >= ADC_CH_NUMS)
{
u8ADC_CHseq = 0;
}
else
{
RTE_ADC_Start_Conversion();
}
}
}
#ifndef RTE_ADC_PY32F072_H__
#define RTE_ADC_PY32F072_H__
#include <stdint.h>
#include "Analog/Analog_Signals.h"
#define ADC_CONV_CH_NUMBER ADC_TOTAL_CH_NUMBER //测试用,正式要考虑这里
#define ADC_RESOLUTION (4096u) /* 12bit ADC */
//下面的配置要考虑
#define ADC_DATAFORMAT ADC_DATAALIGN_RIGHT /* 数据右对齐 */
#define ADC_SAMPLETIME ADC_SAMPLETIME_28CYCLES_5 /* 采样时间 */
#define ADC_CH_NUMS ADC_CONV_CH_NUMBER
extern void RTE_ADC_Init(const uint8_t u8ChList[], uint8_t u8ChNum);
extern void RTE_ADC_DeInit(void);
extern void RTE_ADC_Start_Conversion(void);
extern void RTE_ADC_Stop_Conversion(void);
extern void RTE_ADC_Get_Conversion_Result(uint16_t *pu16Data, uint8_t u8ChNum);
extern uint8_t RTE_ADC_Get_Conversion_Status(void);
#endif
/*
* TrmerM.h
*
* Created on: 2024年2月21日
*/
#ifndef RTE_CAN_H_
#define RTE_CAN_H_
#include <stdint.h>
#include "main.h"
#include "RTE.h"
typedef enum
{
CAN_500Kbps = 4,
CAN_250Kbps = 8,
CAN_125Kbps = 16,
//CAN_100Kbps = 20, //测试有BUG
} CAN_freq;
/**
* @brief CAN
*
*/
#pragma pack(4)
typedef struct
{
uint32_t ch;
// CAN_freq freq;
// uint32_t MASK[4];
// can_rx_callback rx_callback;
} can_config_st_t;
#pragma pack()
extern CAN_RxHeaderTypeDef CAN_RecvMsg;
extern CAN_HandleTypeDef CanHandle;
extern uint8_t BusoffState;
extern uint8_t rte_can_init(can_config_st_t *config);
extern uint8_t CAN_User_Transmit(CAN_TxHeaderTypeDef CanTxHeader, uint8_t *pData);
extern void CAN_Config( void);
#endif /* RTE_CAN_H_ */
#include <stdint.h>
// #include "gpio.h"
// #include "isr.h"
// #include "RTE_CAN.h"
#include "main.h"
#include "RTE.h"
#include "CommonInterface.h"
uint8_t RxData[8] = {0};
CAN_RxHeaderTypeDef CanRxHeader;
CAN_HandleTypeDef CanHandle;
uint8_t BusoffState;
uint8_t txCplt ;
/**
* @brief CAN就收完成回调
*
* @param msg
*/
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *hcan)
{
/* Read received data */
if (HAL_CAN_GetRxMessage(&CanHandle, &CanRxHeader, RxData) == HAL_OK)
{
Can_Rx_Cak(&CanRxHeader,RxData);
}
}
void HAL_CAN_PtbTxCpltCallback(CAN_HandleTypeDef *hcan)
{
txCplt = 1;
}
void HAL_CAN_BusErrorCallback(CAN_HandleTypeDef *hcan)
{
__HAL_RCC_CAN1_FORCE_RESET();
__HAL_RCC_CAN1_RELEASE_RESET();
BusoffState = 1;
}
uint8_t CAN_User_Transmit(CAN_TxHeaderTypeDef CanTxHeader, uint8_t *pData)
{
if(txCplt == 1)
{
txCplt = 0;
}
else
{
return 1;
}
if (HAL_CAN_AddMessageToTxFifo(&CanHandle, &CanTxHeader, pData, CAN_TX_FIFO_PTB) == HAL_OK)
{
if (HAL_CAN_ActivateTxRequest(&CanHandle, CAN_TXFIFO_PTB_SEND) == HAL_OK)
{
return 0;
}
}
}
void CAN_Config( void)
{
/* Initialize CAN */
CanHandle.Instance = CAN1;
CanHandle.Init.FrameFormat = CAN_FRAME_CLASSIC;
CanHandle.Init.Mode = CAN_MODE_NORMAL;
CanHandle.Init.Prescaler = 9U;
CanHandle.Init.NominalSyncJumpWidth = 4U;/* 250KHz */
CanHandle.Init.NominalTimeSeg1 = 12U;
CanHandle.Init.NominalTimeSeg2 = 4U;
if (HAL_CAN_Init(&CanHandle) != HAL_OK)
{
}
/* Start CAN */
Can_RX_Apply_Buff();
if (HAL_CAN_Start(&CanHandle) != HAL_OK)
{
}
BusoffState = 0;
txCplt = 1;
__HAL_CAN_ENABLE_IT(&CanHandle, CAN_IT_RX_COMPLETE | CAN_IT_BUS_ERROR | CAN_IT_TX_PTB_COMPLETE);
}
/**
* @brief This function handles CAN Handler.
* @param None
* @retval None
*/
void CAN_IRQHandler(void)
{
HAL_CAN_IRQHandler(&CanHandle);
}
/**
* @brief CAN初始�?
*
* @param config CAN初始结构体指�?
* @return uint8_t 0成功 1失败
*/
uint8_t rte_can_init(can_config_st_t *config)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* enable clock */
__HAL_RCC_CAN1_CLK_ENABLE(); /* Enable CAN clock */
__HAL_RCC_GPIOA_CLK_ENABLE(); /* Enable GPIOA clock */
/* Configure CAN pins */
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; /* CAN_RX:PB8,CAN_TX:PB9 */
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_CAN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(CAN_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(CAN_IRQn);
/****** CAN bus periphal init ******/
CAN_Config();
return 0;
}
#include "RTE.h"
RTE_GPIO_IRQ_Desc_st_t stSLEEPIRQDesc={0};
/*****************************************************************************
* @description:外部中断回调函数,
* @param {uint32_t} pin
* @param {uint8_t} u8level
* @return {*}
*****************************************************************************/
void RTE_SLEEP_EXTICallBack(uint32_t pin, uint8_t u8level)
{
/* Enable SysTick interrupt */
// HAL_ResumeTick();
return;
}
/*****************************************************************************
* @description: 配置指定GPIO进行休眠唤醒,这里如果中断线冲突可能注册失败,调用前先用GPIOconfig配置
* @param {uint32_t} u32Pin
* @param {RTE_GPIO_Interrupt_Type_en_t} EXTI_Trigger
* @return {*}
*****************************************************************************/
void RTE_DEEPSLEEP_GPIO_Interrupt_Enable(uint32_t u32Pin,RTE_GPIO_Interrupt_Type_en_t EXTI_Trigger)
{
RTE_GPIO_Interrupt_Register(&stSLEEPIRQDesc, u32Pin, EXTI_Trigger, RTE_SLEEP_EXTICallBack);
RTE_GPIO_Interrupt_Enable(&stSLEEPIRQDesc);
}
/*****************************************************************************
* @description: 配置休眠唤醒相关参数和使能
* @param {uint32_t} u32StopVoltSelection
* @param {uint32_t} u32StopFlashDelay
* @param {uint32_t} u32StopWakeUpHsiEnableTime
* @return {*}
*****************************************************************************/
void RTE_DEEPSLEEP_Enable(uint32_t u32StopVoltSelection, uint32_t u32StopFlashDelay, uint32_t u32StopWakeUpHsiEnableTime)
{
PWR_StopModeConfigTypeDef PwrStopModeConf = {0};
/* Suspend SysTick interrupt */
// HAL_SuspendTick();
PwrStopModeConf.LPVoltSelection = u32StopVoltSelection;
PwrStopModeConf.FlashDelay = u32StopFlashDelay;
PwrStopModeConf.WakeUpHsiEnableTime = u32StopWakeUpHsiEnableTime;
HAL_PWR_ConfigStopMode(&PwrStopModeConf);
/* Enter STOP mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
#ifndef RTE_SLEEP_PY32F072_H__
#define RTE_SLEEP_PY32F072_H__
#include "main.h"
#ifdef 0
typedef struct
{
uint32_t u32StopVoltSelection; /*< STOP mode LPR Voltage Selection. */
uint32_t u32StopFlashDelay; /*< PWR_STOP_WakeUp_Flash_Delay PWR STOP WakeUp Flash Delay. */
uint32_t u32StopWakeUpHsiEnableTime; /*< PWR_STOP_WakeUp_HSIEN_Timing PWR STOP mode WakeUp HSI Enable Timing. */
}RTE_STOPMODE_Config_st_t;
#endif
#define RTE_STOPMOD_LPR_VOLT_1P2V PWR_STOPMOD_LPR_VOLT_1P2V /*!< After entering stop mode, VDD=1.2V */
#define RTE_STOPMOD_LPR_VOLT_1P0V PWR_STOPMOD_LPR_VOLT_1P0V /*!< After entering stop mode, VDD=1.0V */
#define RTE_STOPMOD_LPR_VOLT_0P9V PWR_STOPMOD_LPR_VOLT_0P9V /*!< After entering stop mode, VDD=0.9V */
#define RTE_STOPMOD_LPR_VOLT_0P8V PWR_STOPMOD_LPR_VOLT_0P8V /*!< After entering stop mode, VDD=0.8V */
#define RTE_WAKEUP_FLASH_DELAY_1US PWR_WAKEUP_FLASH_DELAY_1US /* Wake up from the STOP mode, Delay 1us enable flash*/
#define RTE_WAKEUP_FLASH_DELAY_2US PWR_WAKEUP_FLASH_DELAY_2US /* Wake up from the STOP mode, Delay 2us enable flash*/
#define RTE_WAKEUP_FLASH_DELAY_3US PWR_WAKEUP_FLASH_DELAY_3US /* Wake up from the STOP mode, Delay 3us enable flash*/
#define RTE_WAKEUP_FLASH_DELAY_0US PWR_WAKEUP_FLASH_DELAY_0US /* Wake up from the STOP mode, From Sram*/
#define RTE_WAKEUP_HSIEN_AFTER_MR PWR_WAKEUP_HSIEN_AFTER_MR /* Wake up from the STOP mode, After the MR becomes stable, enable HSI */
#define RTE_WAKEUP_HSIEN_IMMEDIATE PWR_WAKEUP_HSIEN_IMMEDIATE /* Wake up from the STOP mode, Enable HSI immediately */
extern void RTE_DEEPSLEEP_GPIO_Interrupt_Enable(uint32_t u32Pin, RTE_GPIO_Interrupt_Type_en_t EXTI_Trigger);
extern void RTE_DEEPSLEEP_Enable(uint32_t u32StopVoltSelection, uint32_t u32StopFlashDelay, uint32_t u32StopWakeUpHsiEnableTime);
extern void RTE_SLEEP_EXTICallBack(uint32_t pin, uint8_t u8level);
#endif
#ifndef RTE_GPIO_H__
#define RTE_GPIO_H__
#include "stdint.h"
#include "main.h"
#include "RTE_GPIO_PY32F072.h"
/**@enum RTE_GPIO_Level_en_t
* @brief GPIO端口的电平 \n
*/
#define RTE_GPIO_LEVEL_LOW (0x00U) /**< 低电平 */
#define RTE_GPIO_LEVEL_HIGH (0x01U) /**< 高电平 */
/**@enum RTE_GPIO_Dir_en_t
* @brief GPIO端口的输入输出方向 \n
*/
#define RTE_GPIO_DIR_IN (0x00U) /**< 输入 */
#define RTE_GPIO_DIR_OUT (0x80U) /**< 输出 */
/*******************************************************************************
* GPIO 的输入工作模式定义
* =======================================================================
* bit 8 | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
* -------+-------+-------+-------+-------+-------+-------+-------+-------
* | DIR | - | - | TYPE | - | - | PULL UP/DN
* =======================================================================
* - 其中DIR须为 RTE_GPIO_DIR_IN
*******************************************************************************/
/**@enum RTE_GPIO_Pull_en_t
* @brief GPIO端口的上下拉 \n
*/
#define RTE_GPIO_PULL_NONE (0x00U) /**< 无上/下拉 */
#define RTE_GPIO_PULL_DOWN (0x01U) /**< 下拉 */
#define RTE_GPIO_PULL_UP (0x02U) /**< 上拉 */
#define RTE_GPIO_PULL_BOTH (0x03U) /**< 上下拉同时存在(拉至1/2VCC),慎用 */
/**@enum RTE_GPIO_Input_Type_en_t
* @brief GPIO端口的输入类型 \n
*/
#define RTE_GPIO_INPUT_CMOS (0x00U) /**< COMS电平输入 */
#define RTE_GPIO_INPUT_TTL (0x10U) /**< TTL电平输入 */
/*******************************************************************************
* GPIO 的输出工作模式定义
* =======================================================================
* bit 8 | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0
* -------+-------+-------+-------+-------+-------+-------+-------+-------
* | DIR | Rsvd. | Rsvd. | TYPE | SPEED | LEVEL
* =======================================================================
* - 其中DIR须为 RTE_GPIO_DIR_OUT
* - 其中LEVEL为输出电平 RTE_GPIO_LEVEL_LOW 或 RTE_GPIO_LEVEL_HIGH
*******************************************************************************/
/**@enum RTE_GPIO_Output_Type_en_t
* @brief GPIO端口的输出类型 \n
*/
#define RTE_GPIO_OUTPUT_PP (0x00U) /**< Push-Pull推挽输出 */
#define RTE_GPIO_OUTPUT_OD (0x10U) /**< Open Drain开漏输出 */
/**@enum RTE_GPIO_Output_Speed_en_t
* @brief GPIO端口的输出速度 \n
*/
#define RTE_GPIO_SPEED_HIGH (0x00U) /**< 输出最高速度 */
#define RTE_GPIO_SPEED_0 (0x00U) /**< 输出速度等级0 (最高) */
#define RTE_GPIO_SPEED_1 (0x02U) /**< 输出速度等级1 */
#define RTE_GPIO_SPEED_2 (0x04U) /**< 输出速度等级2 */
#define RTE_GPIO_SPEED_3 (0x06U) /**< 输出速度等级3 */
#define RTE_GPIO_SPEED_4 (0x08U) /**< 输出速度等级4 */
#define RTE_GPIO_SPEED_5 (0x0AU) /**< 输出速度等级5 */
#define RTE_GPIO_SPEED_6 (0x0CU) /**< 输出速度等级6 */
#define RTE_GPIO_SPEED_7 (0x0EU) /**< 输出速度等级7 (最低) */
#define RTE_GPIO_SPEED_LOW (0x0EU) /**< 输出最低速度 */
/*******************************************************************************
* RTE_GPIO_Init 函数和 RTE_GPIO_Config 函数的参数中的GPIO工作模式由多个字段组合而成
*
* 当GPIO被配置成输入模式时,GPIO工作模式应当依照输入模式下定义的字段组合而成,例如:
* u8Mode = RTE_GPIO_DIR_IN | RTE_GPIO_PULL_UP | RTE_GPIO_INPUT_CMOS
*
* 当GPIO被配置成输出模式时,GPIO工作模式应当依照输出模式下定义的字段组合而成,例如:
* u8Mode = RTE_GPIO_DIR_OUT | RTE_GPIO_OUTPUT_PP | RTE_GPIO_LEVEL_HIGH
*
* 当GPIO被配置成EXTI下降沿触发模式时,GPIO工作模式应当依照输出模式下定义的字段组合而成,例如:
* u8Mode = RTE_GPIO_DIR_OUT | RTE_GPIO_OUTPUT_PP | RTE_GPIO_LEVEL_HIGH
*
*******************************************************************************/
/**@enum RTE_GPIO_Input_Type_en_t
* @brief GPIO工作模式掩码 \n
*/
#define RTE_GPIO_DIR_MASK (0x80U) /**< 输入输出方向掩码 bit 7 */
#define RTE_GPIO_PULL_MASK (0x03U) /**< 上/下拉掩码 bit 0 - bit 1 */
#define RTE_GPIO_INPUT_TYPE_MASK (0x10U) /**< 输入类型掩码 bit 4 */
#define RTE_GPIO_LEVEL_MASK (0x01U) /**< 输出电平掩码 bit 0 */
#define RTE_GPIO_SPEED_MASK (0x0EU) /**< 输出速度掩码 bit 1 - bit 3 */
#define RTE_GPIO_OUTPUT_TYPE_MASK (0x10U) /**< 输出类型掩码 bit 4 */
#define RTE_GPIO_INT_EDGE_MODE_MASK (0x04U) /**< 边沿中断模式掩码 bit 2 */
/**@enum RTE_GPIO_Interrupt_Type_en_t
* @brief GPIO端口的中断类型 \n
*/
typedef enum
{
RTE_GPIO_INT_LOW_LEVEL = 0x00U, /**< 低电平中断 */
RTE_GPIO_INT_HIGH_LEVEL = 0x01U, /**< 高电平中断 */
RTE_GPIO_INT_FALLING_EDGE = 0x04U, /**< 下降沿中断 */
RTE_GPIO_INT_RISING_EDGE = 0x05U, /**< 上升沿中断 */
RTE_GPIO_INT_DUAL_EDGE = 0x06U, /**< 双沿中断 */
}RTE_GPIO_Interrupt_Type_en_t;
/**@type RTE_GPIO_Int_Handler_Func_ptr_t
* @brief GPIO端口的中断服务回调函数 \n
* @param[in] u16Pin 发生中断的端口编号
* @param[in] u8Level 发生中断时端口的电平, 0为低电平, 1为高电平
*/
typedef void (*RTE_GPIO_Int_Handler_Func_ptr_t) (uint32_t u32Pin, uint8_t u8Level);
/**@enum RTE_GPIO_Mode_en_t
* @brief GPIO端口的工作模式
\n
*/
typedef enum
{
RTE_GPIO_MODE_INPUT_CMOS = 0x00U, /**< CMOS电平悬空输入 */
RTE_GPIO_MODE_INPUT_CMOS_PD = 0x01U, /**< CMOS电平下拉输入 */
RTE_GPIO_MODE_INPUT_CMOS_PU = 0x02U, /**< CMOS电平上拉输入 */
RTE_GPIO_MODE_INPUT_TTL = 0x04U, /**< TTL电平悬空输入 */
RTE_GPIO_MODE_INPUT_TTL_PD = 0x05U, /**< TTL电平下拉输入 */
RTE_GPIO_MODE_INPUT_TTL_PU = 0x06U, /**< TTL电平上拉输入 */
RTE_GPIO_MODE_OUTPUT_PP_LOW = 0x80U, /**< 推挽输出低电平 */
RTE_GPIO_MODE_OUTPUT_PP_HIGH = 0x81U, /**< 推挽输出高电平 */
RTE_GPIO_MODE_OUTPUT_OD_LOW = 0x82U, /**< 开漏输出低电平 */
RTE_GPIO_MODE_OUTPUT_OD_HIGH = 0x83U, /**< 开漏输出高电平 */
RTE_GPIO_MODE_INVALID = 0xFFU, /**< 无效的GPIO模式 */
}RTE_GPIO_Mode_en_t;
/**@struct RTE_GPIO_Config_st_t
* @brief GPIO端口的配置结构 \n
*/
typedef struct
{
uint32_t u32PinNum; /**< GPIO端口编号(RTE_GPIO_PORTxx_PINyy) */
uint16_t u16PinMode; /**< GPIO工作模式 */
}RTE_GPIO_Config_st_t;
/******************************************************************************
* GPIO控制函数
******************************************************************************/
extern void RTE_GPIO_Init(void);
extern void RTE_GPIO_DeInit(void);
extern int32_t RTE_GPIO_Config(uint32_t u32Pin, uint8_t u8Mode);
extern int32_t RTE_GPIO_Bulk_Config(RTE_GPIO_Config_st_t *pstGPIOPinList, uint32_t u32Num);
extern int32_t RTE_GPIO_Set_Level(uint32_t u32Pin, uint8_t u8Level);
extern uint8_t RTE_GPIO_Get_Level(uint32_t u32Pin);
extern int32_t RTE_GPIO_Set_Port(uint8_t u8Port, uint32_t u32Value);
extern uint32_t RTE_GPIO_Get_Port(uint8_t u8Port);
/*******************************************************************************
* GPIO中断函数
*
* GPIO所有的中断操作都是基于中断描述符的
* 由于不同芯片的GPIO结构存在差异, GPIO中断描述符在芯片各自的GPIO头文件中定义
* GPIO中断描述符中的参数必须使用RTE_GPIO_Interrupt_Register设置, 禁止直接修改
*
* 使用GPIO中断的步骤:
* 1. 使用RTE_GPIO_IRQ_Desc_st_t声明中断描述符, 生命周期为长期有效(全局/静态变量)
* 每一个中断需要有唯一的中断描述符, 需要使用多少中断, 就声明多少个描述符
* 2. 初始化GPIO
* 3. 使用RTE_GPIO_Config将中断引脚配置为输入
* 4. 使用RTE_GPIO_Interrupt_Register将中断引脚注册到其对应的中断描述符
* 5. 使用RTE_GPIO_Interrupt_Enable使能中断
* 6. 在中断系统中开启对应的外设中断
* 7. 使用中断功能, 可以通过RTE_GPIO_Get_Interrupt_Flag获取中断标志, 也可以直接使用
* 注册的中断回调函数
* 8. 在不需要使用GPIO中断时,可能通过RTE_GPIO_Interrupt_Disable将其禁用
*******************************************************************************/
extern int32_t RTE_GPIO_Interrupt_Register(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc,
uint32_t u32Pin,
RTE_GPIO_Interrupt_Type_en_t enType,
RTE_GPIO_Int_Handler_Func_ptr_t pfnHandler);
extern int32_t RTE_GPIO_Interrupt_Enable(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc);
extern int32_t RTE_GPIO_Interrupt_Disable(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc);
extern int32_t RTE_GPIO_Get_Interrupt_Flag(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc);
extern int32_t RTE_GPIO_Clear_Interrupt_Flag(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc);
#endif /* RTE_GPIO_H__ */
#include <stdlib.h>
#include "main.h"
#include "RTE.h"
static GPIO_TypeDef *g_pstRTEGPIOPortList[5] =
{
GPIOA,
GPIOB,
GPIOC,
GPIOF,
};
static uint32_t g_u32RTEGPIOEXTIPortList[5] =
{
EXTI_GPIOA,
EXTI_GPIOB,
EXTI_GPIOC,
EXTI_GPIOF,
};
RTE_GPIO_IRQ_Desc_st_t *g_pstRTEGPIOIRQDesc[16] =
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
void EXTI0_1_IRQHandler(void);
void EXTI2_3_IRQHandler(void);
void EXTI4_15_IRQHandler(void);
/**
* @brief 初始化GPIO的工作条件
* @warning None
*
* 示例
@code
RTE_GPIO_Init();
@endcode
*
* @since 1.0.0
*/
void RTE_GPIO_Init(void)
{
uint32_t i;
/* 启动GPIO外设时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/* 禁用所有GPIO中断 */
//EXTI_DeInit();
NVIC_DisableIRQ(EXTI0_1_IRQn);
NVIC_DisableIRQ(EXTI2_3_IRQn);
NVIC_DisableIRQ(EXTI4_15_IRQn);
/* 清除所有GPIO中断回调函数 */
for (i = 0UL; i < 16UL; i++)
{
g_pstRTEGPIOIRQDesc[i] = NULL;
}
}
/**
* @brief 复位GPIO至默认状态
* @warning None
*
* 示例
@code
RTE_GPIO_DeInit();
@endcode
*
* @since 1.0.0
*/
void RTE_GPIO_DeInit(void)
{
uint32_t i;
/* 禁用所有GPIO中断 */
//EXTI_DeInit();
NVIC_DisableIRQ(EXTI0_1_IRQn);
NVIC_DisableIRQ(EXTI2_3_IRQn);
NVIC_DisableIRQ(EXTI4_15_IRQn);
/* 清除所有GPIO中断回调函数 */
for (i = 0UL; i < 16UL; i++)
{
g_pstRTEGPIOIRQDesc[i] = NULL;
}
/* GPIO恢复至默认状态 */
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_All);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_All);
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_All);
HAL_GPIO_DeInit(GPIOF, GPIO_PIN_All);
/* 停止GPIO外设时钟 */
__HAL_RCC_GPIOA_CLK_DISABLE();
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
__HAL_RCC_GPIOF_CLK_DISABLE();
}
/**
* @brief 使端口工作在设定的GPIO模式下
* @param[in] u16Pin 端口编号
* @param[in] u8Mode GPIO工作模式
* @return 设置结果, 0为设置成功, -1为设置失败
* @warning None
*
* 示例
@code
RTE_GPIO_Config(RTE_GPIO_PORTxx_PINyy, RTE_GPIO_DIR_OUT | RTE_GPIO_LEVEL_HIGH);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Config(uint32_t u32Pin, uint8_t u8Mode)
{
int32_t i32Result;
uint16_t u16PortIndex;
uint16_t u16PinIndex;
GPIO_TypeDef *pPort;
GPIO_InitTypeDef stInit;
i32Result = -1;
u16PinIndex = u32Pin & 0xFFFFU;
u16PortIndex = (u32Pin >> 16) & 0xFFFFU;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
pPort = g_pstRTEGPIOPortList[u16PortIndex];
stInit.Pin = 1U << u16PinIndex;
if ((u8Mode & RTE_GPIO_DIR_MASK) == RTE_GPIO_DIR_IN )
{
stInit.Mode = GPIO_MODE_INPUT;
if ((u8Mode & RTE_GPIO_PULL_MASK) == RTE_GPIO_PULL_UP)
{
stInit.Pull = GPIO_PULLUP;
}
else if ((u8Mode & RTE_GPIO_PULL_MASK) == RTE_GPIO_PULL_DOWN)
{
stInit.Pull = GPIO_PULLDOWN;
}
else
{
stInit.Pull = GPIO_NOPULL;
}
HAL_GPIO_Init(pPort, &stInit);
}
else if ((u8Mode & RTE_GPIO_DIR_MASK) == RTE_GPIO_DIR_OUT)
{
if ((u8Mode & RTE_GPIO_SPEED_MASK) == RTE_GPIO_SPEED_0)
{
stInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
}
else if ((u8Mode & RTE_GPIO_SPEED_MASK) == RTE_GPIO_SPEED_1)
{
stInit.Speed = GPIO_SPEED_FREQ_HIGH;
}
else if ((u8Mode & RTE_GPIO_SPEED_MASK) == RTE_GPIO_SPEED_2)
{
stInit.Speed = GPIO_SPEED_FREQ_MEDIUM;
}
else if ((u8Mode & RTE_GPIO_SPEED_MASK) == RTE_GPIO_SPEED_3)
{
stInit.Speed = GPIO_SPEED_FREQ_LOW;
}
else
{
stInit.Speed = GPIO_SPEED_FREQ_LOW;
}
if ((u8Mode & RTE_GPIO_OUTPUT_TYPE_MASK) == RTE_GPIO_OUTPUT_PP)
{
stInit.Mode = GPIO_MODE_OUTPUT_PP;
}
else
{
stInit.Mode = GPIO_MODE_OUTPUT_OD;
}
HAL_GPIO_Init(pPort, &stInit);
HAL_GPIO_WritePin(pPort, stInit.Pin, (GPIO_PinState)(u8Mode & RTE_GPIO_LEVEL_MASK));
}
i32Result = 0;
}
return i32Result;
}
/**
* @brief GPIO端口批量初始化
* @param[in] pstGPIOPinList 指向GPIO端口配置列表的指针
* @param[in] u32Num 列表中的GPIO端口数量
* @return 设置结果, 0为设置成功, -1为设置失败
* @warning None
*
* 示例
@code
RTE_GPIO_Bulk_Config(&stGPIOPinList, (sizeof(stGPIOPinList) / sizeof(RTE_GPIO_Config_st_t)));
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Bulk_Config(RTE_GPIO_Config_st_t *pstGPIOPinList, uint32_t u32Num)
{
uint32_t i;
uint32_t u32Pin;
uint8_t u8Mode;
int32_t i32Result;
i32Result = -1;
if ((pstGPIOPinList != NULL) && (u32Num != 0))
{
for(i = 0UL; i < u32Num; i++)
{
u32Pin = pstGPIOPinList[i].u32PinNum;
u8Mode = (uint8_t)(pstGPIOPinList[i].u16PinMode & 0x00FFU);
RTE_GPIO_Config(u32Pin, u8Mode);
}
i32Result = 0;
}
return i32Result;
}
/**
* @brief 设置指定的端口的输出电平
* @param[in] u16Pin 端口编号
* @param[in] u8Level 输出电平,0为低电平,1为高电平
* @warning None
*
* 示例
@code
RTE_GPIO_Set_Level(RTE_GPIO_PORTxx_PINyy, 0U);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Set_Level(uint32_t u32Pin, uint8_t u8Level)
{
uint16_t u16PortIndex;
uint16_t u16PinIndex;
uint16_t u16PinBitMask;
int32_t i32Result;
GPIO_TypeDef *pPort;
i32Result = -1;
u16PinIndex = u32Pin & 0xFFFFU;
u16PortIndex = (u32Pin >> 16) & 0xFFFFU;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
pPort = g_pstRTEGPIOPortList[u16PortIndex];
u16PinBitMask = 1U << u16PinIndex;
HAL_GPIO_WritePin(pPort, u16PinBitMask, (GPIO_PinState)u8Level);
i32Result = 0;
}
return i32Result;
}
/**
* @brief 读取设置指定的端口的输入电平
* @param[in] u16Pin 端口编号
* @return 端口输入电平,0为低电平,1为高电平
* @warning None
*
* 示例
@code
uint8_t u8Level = RTE_GPIO_Get_Level(RTE_GPIO_PORTxx_PINyy);
@endcode
*
* @since 1.0.0
*/
uint8_t RTE_GPIO_Get_Level(uint32_t u32Pin)
{
uint16_t u16PortIndex;
uint16_t u16PinIndex;
uint16_t u16PinBitMask;
uint8_t u8Level;
GPIO_TypeDef *pPort;
u16PinIndex = u32Pin & 0xFFFFU;
u16PortIndex = (u32Pin >> 16) & 0xFFFFU;
u8Level = 0U;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
pPort = g_pstRTEGPIOPortList[u16PortIndex];
u16PinBitMask = 1U << u16PinIndex;
u8Level = HAL_GPIO_ReadPin(pPort, u16PinBitMask);
}
return u8Level;
}
/**
* @brief 设置指定的一组端口的输出电平
* @param[in] u8Port 端口组编号
* @param[in] u32Value 整组端口的输出电平
* @warning None
*
* 示例
@code
RTE_GPIO_Set_Port(RTE_GPIO_PORT_GROUP_x, 0xAABBCCDDUL);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Set_Port(uint8_t u8Port, uint32_t u32Value)
{
int32_t i32Result;
GPIO_TypeDef *pPort;
i32Result = -1;
if (u8Port < 5U)
{
pPort = g_pstRTEGPIOPortList[u8Port];
HAL_GPIO_WritePin(pPort, GPIO_PIN_All, (GPIO_PinState)u32Value);
i32Result = 0;
}
return i32Result;
}
/**
* @brief 读取设置指定的一组端口的输入电平
* @param[in] u8Port 端口组编号
* @return 整组端口输入电平
* @warning None
*
* 示例
@code
uint32_t u32Value = RTE_GPIO_Get_Port(RTE_GPIO_PORT_GROUP_x);
@endcode
*
* @since 1.0.0
*/
uint32_t RTE_GPIO_Get_Port(uint8_t u8Port)
{
uint32_t u32Value;
GPIO_TypeDef *pPort;
u32Value = 0UL;
if (u8Port < 5U)
{
pPort = g_pstRTEGPIOPortList[u8Port];
u32Value = (uint16_t)(pPort->IDR);
}
return u32Value;
}
/**
* @brief 将指定端口中断方式注册到中断描述符,所有的中断操作都是基于中断描述符的
* @param[in] pstIRQDesc 中断描述符
* @param[in] u16Pin 端口编号
* @param[in] enType 中断类型(上升沿中断,下降沿中断...)
* @param[in] pfnHandler 中断回调函数,不需要中断回调函数时可以填NULL
* @return 注册结果,0为注册成功,-1为注册失败
* @warning 1.禁止直接改写中断描述符中的数据,更改中断描述符必须通过此函数 \
2.已使能的中断的描述符不可更改,如需更改应先禁止这一中断 \
3.受单片机特性限制,并非所有的中断类型都会被支持,不支持的中断类型将返回注册失败
*
* 示例
@code
int32_t i32Result = RTE_GPIO_Interrupt_Register(&IRQDesc, RTE_GPIO_PORT_GROUP_x, RTE_GPIO_INT_FALLING_EDGE, NULL);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Interrupt_Register(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc,
uint32_t u32Pin,
RTE_GPIO_Interrupt_Type_en_t enType,
RTE_GPIO_Int_Handler_Func_ptr_t pfnHandler)
{
uint32_t i;
uint16_t u16PortIndex;
uint16_t u16PinIndex;
uint32_t u32Available;
int32_t i32Result;
uint8_t u8EXTIType;
i32Result = -1;
if (pstIRQDesc != NULL)
{
u16PinIndex = u32Pin & 0xFFFFU;
u16PortIndex = (u32Pin >> 16) & 0xFFFFU;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
/* 确定是否支持用户请求的中断类型 */
if (enType == RTE_GPIO_INT_FALLING_EDGE)
{
u8EXTIType = EXTI_TRIGGER_FALLING;
i32Result = 0;
}
else if (enType == RTE_GPIO_INT_RISING_EDGE)
{
u8EXTIType = EXTI_TRIGGER_RISING;
i32Result = 0;
}
else if (enType == RTE_GPIO_INT_DUAL_EDGE)
{
u8EXTIType = EXTI_TRIGGER_RISING_FALLING;
i32Result = 0;
}
else
{
}
if (i32Result == 0)
{
/* 确定用户请求的中断描述符没有被其他中断占用 */
i = 0UL;
u32Available = 1UL;
while ((i < 16UL) && (u32Available != 0UL))
{
if (pstIRQDesc == g_pstRTEGPIOIRQDesc[i])
{
u32Available = 0UL;
}
i++;
}
if (u32Available)
{
/* 用户请求有效,将中断参数注册到当前描述符 */
g_pstRTEGPIOIRQDesc[u16PinIndex] = pstIRQDesc;
g_pstRTEGPIOIRQDesc[u16PinIndex]->u32Pin = u32Pin;
g_pstRTEGPIOIRQDesc[u16PinIndex]->u16Type = (uint16_t)u8EXTIType;
g_pstRTEGPIOIRQDesc[u16PinIndex]->i32Flag = 0;
g_pstRTEGPIOIRQDesc[u16PinIndex]->pvHandler = (void *)pfnHandler;
}
else
{
i32Result = -1;
}
}
}
}
return i32Result;
}
/**
* @brief 使能中断
* @param[in] pstIRQDesc 中断描述符
* @return 中断使能结果,0为中断成功使能,-1为中断使能失败,需检查描述符是否正确注册
* @warning None
*
* 示例
@code
int32_t i32Result = RTE_GPIO_Interrupt_Enable(&IRQDesc);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Interrupt_Enable(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc)
{
int32_t i32Result;
uint16_t u16PortIndex;
uint16_t u16PinIndex;
IRQn_Type em_IRQnTYPE;
EXTI_HandleTypeDef stEXTIhandleDef = {0};
EXTI_ConfigTypeDef stExtiConfigDef = {0};
i32Result = -1;
if (pstIRQDesc != NULL)
{
u16PinIndex = pstIRQDesc->u32Pin & 0xFFFFU;
u16PortIndex = (pstIRQDesc->u32Pin >> 16) & 0xFFFFU;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
if (g_pstRTEGPIOIRQDesc[u16PinIndex] != NULL) /* 这一路中断是未被使能的 */
{
stExtiConfigDef.Line = (EXTI_GPIO | EXTI_REG1 | u16PinIndex);
stExtiConfigDef.Mode = EXTI_MODE_INTERRUPT;
stExtiConfigDef.Trigger = g_pstRTEGPIOIRQDesc[u16PinIndex]->u16Type;
stExtiConfigDef.GPIOSel = g_u32RTEGPIOEXTIPortList[u16PortIndex];
HAL_EXTI_SetConfigLine(&stEXTIhandleDef, &stExtiConfigDef);
if ((u16PinIndex >= 0U) && (u16PinIndex <= 1U))
{
em_IRQnTYPE = EXTI0_1_IRQn;
}
else if ((u16PinIndex >= 2U) && (u16PinIndex <= 3U))
{
em_IRQnTYPE = EXTI2_3_IRQn;
}
else if ((u16PinIndex >= 4U) && (u16PinIndex <= 15U))
{
em_IRQnTYPE = EXTI4_15_IRQn;
}
/* Enable EXTI interrupt */
HAL_NVIC_EnableIRQ(em_IRQnTYPE);
/* Configure interrupt priority */
HAL_NVIC_SetPriority(em_IRQnTYPE, 0, 0);
i32Result = 0;
}
}
}
return i32Result;
}
/**
* @brief 禁止中断
* @param[in] pstIRQDesc 中断描述符
* @return 中断禁止结果,0为中断成功禁止,-1为中断禁止失败,需检查描述符是否正确注册
* @warning None
*
* 示例
@code
int32_t i32Result = RTE_GPIO_Interrupt_Disable(&IRQDesc);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Interrupt_Disable(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc)
{
int32_t i32Result;
uint16_t u16PortIndex;
uint16_t u16PinIndex;
uint16_t u16PinBitMask;
IRQn_Type em_IRQnTYPE;
GPIO_TypeDef *pPort;
i32Result = -1;
if (pstIRQDesc != NULL)
{
u16PinIndex = pstIRQDesc->u32Pin & 0xFFFFU;
u16PortIndex = (pstIRQDesc->u32Pin >> 16) & 0xFFFFU;
if ((u16PortIndex < 5U) && (u16PinIndex < 16U))
{
if (g_pstRTEGPIOIRQDesc[u16PinIndex] == pstIRQDesc) /* 与当前已使能的中断的描述符相同 */
{
g_pstRTEGPIOIRQDesc[u16PinIndex] = NULL;
pPort = g_pstRTEGPIOPortList[u16PortIndex];
u16PinBitMask = 1U << u16PinIndex;
HAL_GPIO_DeInit(pPort, u16PinBitMask);
if ((u16PinIndex >= 0U) && (u16PinIndex <= 1U))
{
em_IRQnTYPE = EXTI0_1_IRQn;
}
else if ((u16PinIndex >= 2U) && (u16PinIndex <= 3U))
{
em_IRQnTYPE = EXTI2_3_IRQn;
}
else if ((u16PinIndex >= 4U) && (u16PinIndex <= 15U))
{
em_IRQnTYPE = EXTI4_15_IRQn;
}
NVIC_DisableIRQ(em_IRQnTYPE);
i32Result = 0;
}
}
}
return i32Result;
}
/**
* @brief 获取中断标志
* @param[in] pstIRQDesc 中断描述符
* @return 中断标志,0为无中断, 1为中断已发生, -1为获取中断标志失败, 需检查描述符是否正确注册
* @warning 1.使用形如if(RTE_GPIO_Get_Interrupt_Flag(&IRQDesc))的方式判断中断是否发生时需注意 \
如果描述符未正确注册, 函数将返回-1, 也会被判定为真 \
2.获取中断标志后并不会清除中断标志, 如需清除应调用RTE_GPIO_Clear_Interrupt_Flag函数
*
* 示例
@code
int32_t i32Flag = RTE_GPIO_Get_Interrupt_Flag(&IRQDesc);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Get_Interrupt_Flag(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc)
{
int32_t i32Result;
i32Result = -1;
if (pstIRQDesc != NULL)
{
i32Result = pstIRQDesc->i32Flag;
}
return i32Result;
}
/**
* @brief 清除中断标志
* @param[in] pstIRQDesc 中断描述符
* @return 中断标志清除结果, 0为中断标志成功清除,-1为中断标志清除失败,需检查描述符是否正确注册
* @warning None
*
* 示例
@code
int32_t i32Result = RTE_GPIO_Clear_Interrupt_Flag(&IRQDesc);
@endcode
*
* @since 1.0.0
*/
int32_t RTE_GPIO_Clear_Interrupt_Flag(RTE_GPIO_IRQ_Desc_st_t *pstIRQDesc)
{
int32_t i32Result;
i32Result = -1;
if (pstIRQDesc != NULL)
{
pstIRQDesc->i32Flag = 0;
i32Result = 0;
}
return i32Result;
}
/**
* @brief 外部中断0-1中断服务
* @warning None
* @since 1.0.0
*/
void EXTI0_1_IRQHandler(void)
{
uint8_t u8Level[2];
uint32_t u32IntFlag;
uint32_t u32IntMask;
uint32_t u32Index;
RTE_GPIO_IRQ_Desc_st_t *pstDesc;
RTE_GPIO_Int_Handler_Func_ptr_t pfnIRQHandler;
/* 清除中断标志 */
u32IntFlag = EXTI->PR;
u32IntFlag &= 0x00000003UL;
EXTI->PR = u32IntFlag;
/* 读取中断发生时端口的电平 */
u32Index = 0UL;
u32IntMask = 0x00000001UL;
while(u32Index < 2UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
u8Level[u32Index] = RTE_GPIO_Get_Level(pstDesc->u32Pin);
pstDesc->i32Flag = 1;
}
u32Index++;
u32IntMask <<= 1;
}
/* 执行注册的回调函数 */
u32Index = 0UL;
u32IntMask = 0x00000001UL;
while(u32Index < 2UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
if (pstDesc->pvHandler != NULL)
{
pfnIRQHandler = (RTE_GPIO_Int_Handler_Func_ptr_t)(pstDesc->pvHandler);
pfnIRQHandler(pstDesc->u32Pin, u8Level[u32Index]);
}
}
u32Index++;
u32IntMask <<= 1;
}
}
/**
* @brief 外部中断2-3中断服务
* @warning None
* @since 1.0.0
*/
void EXTI2_3_IRQHandler(void)
{
uint8_t u8Level[2];
uint32_t u32IntFlag;
uint32_t u32IntMask;
uint32_t u32Index;
RTE_GPIO_IRQ_Desc_st_t *pstDesc;
RTE_GPIO_Int_Handler_Func_ptr_t pfnIRQHandler;
/* 清除中断标志 */
u32IntFlag = EXTI->PR;
u32IntFlag &= 0x0000000CUL;
EXTI->PR = u32IntFlag;
/* 读取中断发生时端口的电平 */
u32Index = 2UL;
u32IntMask = 0x00000004UL;
while(u32Index < 4UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
u8Level[u32Index] = RTE_GPIO_Get_Level(pstDesc->u32Pin);
pstDesc->i32Flag = 1;
}
u32Index++;
u32IntMask <<= 1;
}
/* 执行注册的回调函数 */
u32Index = 2UL;
u32IntMask = 0x00000004UL;
while(u32Index < 4UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
if (pstDesc->pvHandler != NULL)
{
pfnIRQHandler = (RTE_GPIO_Int_Handler_Func_ptr_t)(pstDesc->pvHandler);
pfnIRQHandler(pstDesc->u32Pin, u8Level[u32Index - 2UL]);
}
}
u32Index++;
u32IntMask <<= 1;
}
}
/**
* @brief 外部中断4-15中断服务
* @warning None
* @since 1.0.0
*/
void EXTI4_15_IRQHandler(void)
{
uint8_t u8Level[12];
uint32_t u32IntFlag;
uint32_t u32IntMask;
uint32_t u32Index;
RTE_GPIO_IRQ_Desc_st_t *pstDesc;
RTE_GPIO_Int_Handler_Func_ptr_t pfnIRQHandler;
/* 清除中断标志 */
u32IntFlag = EXTI->PR;
u32IntFlag &= 0x0000FFF0UL;
EXTI->PR = u32IntFlag;
/* 读取中断发生时端口的电平 */
u32Index = 4UL;
u32IntMask = 0x00000010UL;
while(u32Index < 16UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
u8Level[u32Index] = RTE_GPIO_Get_Level(pstDesc->u32Pin);
pstDesc->i32Flag = 1;
}
u32Index++;
u32IntMask <<= 1;
}
/* 执行注册的回调函数 */
u32Index = 4UL;
u32IntMask = 0x00000010UL;
while(u32Index < 16UL)
{
if (((u32IntFlag & u32IntMask) != 0UL) && (g_pstRTEGPIOIRQDesc[u32Index] != NULL))
{
pstDesc = g_pstRTEGPIOIRQDesc[u32Index];
if (pstDesc->pvHandler != NULL)
{
pfnIRQHandler = (RTE_GPIO_Int_Handler_Func_ptr_t)(pstDesc->pvHandler);
pfnIRQHandler(pstDesc->u32Pin, u8Level[u32Index - 4UL]);
}
}
u32Index++;
u32IntMask <<= 1;
}
}
#ifndef RTE_GPIO_PY32F072_H__
#define RTE_GPIO_PY32F072_H__
#include "main.h"
typedef struct
{
uint32_t u32Pin;
uint16_t u16Type;
int32_t i32Flag;
void *pvHandler;
}RTE_GPIO_IRQ_Desc_st_t;
#define RTE_GPIO_PORT_GROUP_A (0x00U)
#define RTE_GPIO_PORT_GROUP_B (0x01U)
#define RTE_GPIO_PORT_GROUP_C (0x02U)
#define RTE_GPIO_PORT_GROUP_F (0x03U)
#define RTE_GPIO_PIN_NUM_00 (0x00U)
#define RTE_GPIO_PIN_NUM_01 (0x01U)
#define RTE_GPIO_PIN_NUM_02 (0x02U)
#define RTE_GPIO_PIN_NUM_03 (0x03U)
#define RTE_GPIO_PIN_NUM_04 (0x04U)
#define RTE_GPIO_PIN_NUM_05 (0x05U)
#define RTE_GPIO_PIN_NUM_06 (0x06U)
#define RTE_GPIO_PIN_NUM_07 (0x07U)
#define RTE_GPIO_PIN_NUM_08 (0x08U)
#define RTE_GPIO_PIN_NUM_09 (0x09U)
#define RTE_GPIO_PIN_NUM_10 (0x0AU)
#define RTE_GPIO_PIN_NUM_11 (0x0BU)
#define RTE_GPIO_PIN_NUM_12 (0x0CU)
#define RTE_GPIO_PIN_NUM_13 (0x0DU)
#define RTE_GPIO_PIN_NUM_14 (0x0EU)
#define RTE_GPIO_PIN_NUM_15 (0x0FU)
#define RTE_GPIO_PORTA_PIN00 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_00)
#define RTE_GPIO_PORTA_PIN01 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_01)
#define RTE_GPIO_PORTA_PIN02 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_02)
#define RTE_GPIO_PORTA_PIN03 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_03)
#define RTE_GPIO_PORTA_PIN04 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_04)
#define RTE_GPIO_PORTA_PIN05 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_05)
#define RTE_GPIO_PORTA_PIN06 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_06)
#define RTE_GPIO_PORTA_PIN07 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_07)
#define RTE_GPIO_PORTA_PIN08 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_08)
#define RTE_GPIO_PORTA_PIN09 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_09)
#define RTE_GPIO_PORTA_PIN10 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_10)
#define RTE_GPIO_PORTA_PIN11 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_11)
#define RTE_GPIO_PORTA_PIN12 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_12)
#define RTE_GPIO_PORTA_PIN13 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_13)
#define RTE_GPIO_PORTA_PIN14 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_14)
#define RTE_GPIO_PORTA_PIN15 (((uint32_t)RTE_GPIO_PORT_GROUP_A << 16) | (uint32_t)RTE_GPIO_PIN_NUM_15)
#define RTE_GPIO_PORTB_PIN00 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_00)
#define RTE_GPIO_PORTB_PIN01 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_01)
#define RTE_GPIO_PORTB_PIN02 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_02)
#define RTE_GPIO_PORTB_PIN03 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_03)
#define RTE_GPIO_PORTB_PIN04 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_04)
#define RTE_GPIO_PORTB_PIN05 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_05)
#define RTE_GPIO_PORTB_PIN06 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_06)
#define RTE_GPIO_PORTB_PIN07 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_07)
#define RTE_GPIO_PORTB_PIN08 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_08)
#define RTE_GPIO_PORTB_PIN09 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_09)
#define RTE_GPIO_PORTB_PIN10 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_10)
#define RTE_GPIO_PORTB_PIN11 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_11)
#define RTE_GPIO_PORTB_PIN12 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_12)
#define RTE_GPIO_PORTB_PIN13 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_13)
#define RTE_GPIO_PORTB_PIN14 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_14)
#define RTE_GPIO_PORTB_PIN15 (((uint32_t)RTE_GPIO_PORT_GROUP_B << 16) | (uint32_t)RTE_GPIO_PIN_NUM_15)
#define RTE_GPIO_PORTC_PIN00 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_00)
#define RTE_GPIO_PORTC_PIN01 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_01)
#define RTE_GPIO_PORTC_PIN02 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_02)
#define RTE_GPIO_PORTC_PIN03 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_03)
#define RTE_GPIO_PORTC_PIN04 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_04)
#define RTE_GPIO_PORTC_PIN05 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_05)
#define RTE_GPIO_PORTC_PIN06 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_06)
#define RTE_GPIO_PORTC_PIN07 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_07)
#define RTE_GPIO_PORTC_PIN08 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_08)
#define RTE_GPIO_PORTC_PIN09 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_09)
#define RTE_GPIO_PORTC_PIN10 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_10)
#define RTE_GPIO_PORTC_PIN11 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_11)
#define RTE_GPIO_PORTC_PIN12 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_12)
#define RTE_GPIO_PORTC_PIN13 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_13)
#define RTE_GPIO_PORTC_PIN14 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_14)
#define RTE_GPIO_PORTC_PIN15 (((uint32_t)RTE_GPIO_PORT_GROUP_C << 16) | (uint32_t)RTE_GPIO_PIN_NUM_15)
#define RTE_GPIO_PORTF_PIN00 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_00)
#define RTE_GPIO_PORTF_PIN01 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_01)
#define RTE_GPIO_PORTF_PIN02 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_02)
#define RTE_GPIO_PORTF_PIN03 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_03)
#define RTE_GPIO_PORTF_PIN04 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_04)
#define RTE_GPIO_PORTF_PIN05 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_05)
#define RTE_GPIO_PORTF_PIN06 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_06)
#define RTE_GPIO_PORTF_PIN07 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_07)
#define RTE_GPIO_PORTF_PIN08 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_08)
#define RTE_GPIO_PORTF_PIN09 (((uint32_t)RTE_GPIO_PORT_GROUP_F << 16) | (uint32_t)RTE_GPIO_PIN_NUM_09)
#endif /* RTE_GPIO_N32G432CB_H__ */
#include "RTE_RTC_PY32F072.h"
#include "main.h"
RTC_DateTypeDef RTC_DateStructure;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_Information_st_t g_stRTCInformation = {
RTC_DEFAULT_YEAR,
RTC_DEFAULT_MONTH,
RTC_DEFAULT_DATE,
RTC_DEFAULT_WEEK,
RTC_DEFAULT_HOUR,
RTC_DEFAULT_MINUTE,
RTC_DEFAULT_SECOND,
};
RTC_HandleTypeDef RTCinit;
/************************************************************************
* @description:
* @param {RTC_Information_st_t} *g_stRTCInformationPart
* @param {uint32_t} u32RTCFORMAT
* @return {*}
************************************************************************/
void RTE_RTC_Init(RTC_Information_st_t *g_stRTCInformationPart, uint32_t u32RTCFORMAT)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef RTCLCKconfig = {0};
/* Enable access to the backup domain (RTC settings are stored in the backup domain) */
HAL_PWR_EnableBkUpAccess();
/*Enable RTC clock*/
//__HAL_RCC_RTCAPB_CLK_ENABLE(); /* Enable RTC module APB clock */
__HAL_RCC_RTC_ENABLE(); /* Enable RTC clock */
/* RCC peripheral clock initialization */
RTCLCKconfig.PeriphClockSelection = RCC_PERIPHCLK_RTC; /* RCC peripheral clock selection as RTC */
RTCLCKconfig.RTCClockSelection = RCC_RTCCLKSOURCE; /* RTC source selection as LSI */
HAL_RCCEx_PeriphCLKConfig(&RTCLCKconfig);
/* RTC initialization */
RTCinit.Instance = RTC; /* Select RTC */
RTCinit.Init.AsynchPrediv = RTC_AUTO_1_SECOND; /* Automatic calculation of RTC's 1-second time base */
RTCinit.Init.OutPut = RTC_OUTPUTSOURCE_NONE; /* No output on the TAMPER pin */
RTC_TimeStructure.Hours = g_stRTCInformationPart->u8RTCHour;
RTC_TimeStructure.Minutes = g_stRTCInformationPart->u8RTCMinute;
RTC_TimeStructure.Seconds = g_stRTCInformationPart->u8RTCSecond;
// 日期:星期一,2025年1月1日
RTC_DateStructure.WeekDay = g_stRTCInformationPart->u8RTCDayOfWeek;
RTC_DateStructure.Date = g_stRTCInformationPart->u8RTCDayOfMonth;
RTC_DateStructure.Month = g_stRTCInformationPart->u8RTCMonth;
RTC_DateStructure.Year = g_stRTCInformationPart->u8RTCYear;
/* RTC deinitialization */
HAL_RTC_DeInit(&RTCinit);
/* RTC initialization */
HAL_RTC_Init(&RTCinit);
HAL_RTC_SetDate(&RTCinit, &RTC_DateStructure, u32RTCFORMAT);
/* Set RTC current time in binary format */
HAL_RTC_SetTime(&RTCinit, &RTC_TimeStructure, u32RTCFORMAT);
}
/************************************************************************
* @description:
* @param {RTC_TimeTypeDef} *RTC_UserTimeStruct
* @param {RTC_DateTypeDef} *RTC_UserDateStruct
* @param {uint32_t} u32RTCFORMAT 时间格式
* @return {*}
************************************************************************/
void RTE_RTC_Set_Time(RTC_TimeTypeDef *RTC_UserTimeStruct, RTC_DateTypeDef *RTC_UserDateStruct, uint32_t u32RTCFORMAT)
{
HAL_RTC_SetTime(&RTCinit, RTC_UserTimeStruct, u32RTCFORMAT);
HAL_RTC_SetDate(&RTCinit, RTC_UserDateStruct, u32RTCFORMAT);
}
/************************************************************************
* @description:
* @param {RTC_TimeTypeDef} *RTC_UserTimeStruct
* @param {RTC_DateTypeDef} *RTC_UserDateStruct
* @param {uint32_t} u32RTCFORMAT 时间格式
* @return {*}
************************************************************************/
void UPDATE_RTC_GET_DATETIME(RTC_TimeTypeDef *RTC_UserTimeStruct, RTC_DateTypeDef *RTC_UserDateStruct, uint32_t u32RTCFORMAT)
{
HAL_RTC_GetTime(&RTCinit, RTC_UserTimeStruct, u32RTCFORMAT);
HAL_RTC_GetDate(&RTCinit, RTC_UserDateStruct, u32RTCFORMAT);
}
#ifndef RTE_RTC_H__
#define RTE_RTC_H__
#include <stdint.h>
#include "main.h"
/* RTC default time setting */
#ifndef RTC_DEFAULT_TIME
#define RTC_DEFAULT_TIME 1U
#define RTC_DEFAULT_YEAR 25U
#define RTC_DEFAULT_MONTH 3U
#define RTC_DEFAULT_DATE 14U
#define RTC_DEFAULT_WEEK 5U /*must be right*/
#define RTC_DEFAULT_HOUR 23U
#define RTC_DEFAULT_MINUTE 59U
#define RTC_DEFAULT_SECOND 30U
#endif
#define RCC_RTCCLKSOURCE RCC_RTCCLKSOURCE_HSE_DIV128
#define RTC_BINFORMAT RTC_FORMAT_BIN
#define RTC_BCDFORMAT RTC_FORMAT_BCD
#define ErrorStatus unsigned char
typedef struct __attribute__((aligned(4)))
{
uint8_t u8RTCYear; /*00~~99 in Dec*/
uint8_t u8RTCMonth; /*01~~12 in Dec*/
uint8_t u8RTCDayOfMonth; /*01~~31 in Dec*/
uint8_t u8RTCDayOfWeek; /*0~~6 in Dec*/
uint8_t u8RTCHour; /*fix 24Hour Format 00~~23 in Dec*/
uint8_t u8RTCMinute; /*0~~59 in Dec*/
uint8_t u8RTCSecond; /*0~~59 in Dec*/
} RTC_Information_st_t;
typedef enum
{
RTC_CLK_SRC_TYPE_HSE_DIV128 = 0x01,
RTC_CLK_SRC_TYPE_LSE = 0x02,
RTC_CLK_SRC_TYPE_LSI = 0x03,
} RTC_CLK_SRC_TYPE;
/* RTC exported time register */
#define RTC_YEAR g_stRTCInformation.u8RTCYear
#define RTC_MONTH g_stRTCInformation.u8RTCMonth
#define RTC_DATE g_stRTCInformation.u8RTCDayOfMonth
#define RTC_WEEK g_stRTCInformation.u8RTCDayOfWeek
#define RTC_HOUR g_stRTCInformation.u8RTCHour
#define RTC_MINUTE g_stRTCInformation.u8RTCMinute
#define RTC_SECOND g_stRTCInformation.u8RTCSecond
extern RTC_DateTypeDef RTC_DateStructure;
extern RTC_TimeTypeDef RTC_TimeStructure;
extern RTC_Information_st_t g_stRTCInformation;
extern void RTE_RTC_Init(RTC_Information_st_t *g_stRTCInformationPart, uint32_t u32RTCFORMAT);
extern void RTE_RTC_Set_Time(RTC_TimeTypeDef *RTC_UserTimeStruct, RTC_DateTypeDef *RTC_UserDateStruct, uint32_t u32RTCFORMAT);
extern void UPDATE_RTC_GET_DATETIME(RTC_TimeTypeDef *RTC_UserTimeStruct, RTC_DateTypeDef *RTC_UserDateStruct, uint32_t u32RTCFORMAT);
#endif
#ifndef RTE_ALLMODULES_H__
#define RTE_ALLMODULES_H__
#define __DEBUG (1U)
#include "RTE_GPIO.h"
#include "TrmerM.h"
#include "RTE_UART.h"
#include "RTE_WDT.h"
#include "RTE_Tick_Timer.h"
#include "RTE_ADC_PY32F072.h"
#include "RTE_RTC_PY32F072.h"
#include "RTE_GPIO_PY32F072.h"
#include "RTE_SLEEP_PY32F072.h"
#include "RTE_CAN.h"
#endif /* RTE_ALLMODULES_H__ */
#include "stdint.h"
#ifndef RTE_TICK_TIMER_H__
#define RTE_TICK_TIMER_H__
/* Tick timer interrupt call back function */
typedef void (*RTE_Tick_Timer_Call_Back_ptr_t)(void);
/* Tick timer 1us */
extern void RTE_Tick_Timer_Start(uint32_t u32Interval, RTE_Tick_Timer_Call_Back_ptr_t pfnCallBack);
extern void RTE_Tick_Timer_Stop(void);
#endif /* RTE_TICK_TIMER_H__ */
//#include "stddef.h"
//#include "Tick_Timer\RTE_Tick_Timer.h"
#include "RTE_Tick_Timer.h"
#include "main.h"
#include "RTE.h"
#include "Sys_Scheduler.h"
#define RTE_TICK_TIMER_CLK_SRC_FREQ (72000000UL)
RTE_Tick_Timer_Call_Back_ptr_t g_pfnRTETickTimerCallBackFunc = NULL;
extern unsigned int g_Flag;
void SysTick_Handler(void);
void RTE_Tick_Timer_Start(uint32_t u32Interval, RTE_Tick_Timer_Call_Back_ptr_t pfnCallBack)
{
uint32_t u32ReloadVal;
u32ReloadVal = RTE_TICK_TIMER_CLK_SRC_FREQ / 1000000UL;
u32ReloadVal = u32ReloadVal * u32Interval - 1UL;
NVIC_DisableIRQ(SysTick_IRQn);
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk;
SysTick->LOAD = u32ReloadVal;
SysTick->VAL = 0UL;
g_pfnRTETickTimerCallBackFunc = pfnCallBack;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SysTick_IRQn);
}
void RTE_Tick_Timer_Stop(void)
{
NVIC_DisableIRQ(SysTick_IRQn);
SysTick->CTRL = 0UL;
SysTick->VAL = 0UL;
}
uint8_t g_u8TickTimeradd = 0;
void SysTick_Handler(void)
{
g_u8TickTimeradd++;
if (g_u8TickTimeradd >= 20)
{
HAL_IncTick();
g_u8TickTimeradd = 0U;
}
if (g_pfnRTETickTimerCallBackFunc != NULL)
{
g_pfnRTETickTimerCallBackFunc();
}
Sys_Exact_50us_Tasks();
}
#include <stdint.h>
#include "RTE.h"
RTE_PWM_TIMER_Desc_st_t g_stTIMERPWM1 = {
TIMERM_1, 0,
};
RTE_PWM_TIMER_Desc_st_t g_stTIMERPWM14 = {
TIMERM_14, 0,
};
/************************************************************************
* @description:根据目标频率计算定时器是否需要分频,拿到定时器预分频值
* @param {uint32_t} target_freq 目标频率
* @param {uint32_t} tim_clk_freq 定时器频率
* @param {uint32_t} *psc 计算后得到的Prescaler值
* @param {uint8_t} *clk_divider 定时器分频系数
* @return {*}
************************************************************************/
/*static void calculate_pwm_divider(uint32_t target_freq, uint32_t tim_clk_freq, uint32_t *psc, uint8_t *clk_divider) {
// 初始不分频
*clk_divider = TIM_CLOCK_DIV1;
// 计算理论预分频值
*psc = (tim_clk_freq / (target_freq * (ARR_VALUE + 1))) - 1;
// 判断是否需要 2 分频
if (*psc > 0xFFFF) {
*clk_divider = TIM_CLOCK_DIV2;
*psc = ((tim_clk_freq / *clk_divider) / (target_freq * (ARR_VALUE + 1))) - 1;
}
// 判断是否需要 4 分频
if (*psc > 0xFFFF) {
*clk_divider = TIM_CLOCK_DIV4;
*psc = ((tim_clk_freq / *clk_divider) / (target_freq * (ARR_VALUE + 1))) - 1;
}
}
*/
/************************************************************************
* @description:配置定时器初始化相关参数,(这里定时器和引脚配置不全,根据需要后续添加和修改)
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {uint16_t} freq
* @param {uint32_t} PWM_Clock
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_counter_Output_Init(RTE_PWM_TIMER_Desc_st_t* psTimx, uint16_t freq, uint32_t PWM_Clock)
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
{
return 1;
}
psTimx->TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
psTimx->TimHandle.Init.RepetitionCounter = 1-1;
psTimx->TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
psTimx->TimHandle.Init.Period = psTimx->Period = ARR_VALUE;
psTimx->TimHandle.Init.Prescaler = (PWM_Clock / (freq * (ARR_VALUE + 1))) - 1;
psTimx->TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
switch (psTimx->TIMX)
{
case TIMERM_1:
{
TIM1_GPIOCLK_ENABLE();
psTimx->TimHandle.Instance = TIM1;
}break;
case TIMERM_14:
{
TIM14_GPIOCLK_ENABLE();
psTimx->TimHandle.Instance = TIM14;
}break;
default:return 1;
}
if (HAL_TIM_PWM_Init(&psTimx->TimHandle) != HAL_OK)
return 1;
else
return 0;
}
/************************************************************************
* @description:配置具体通道参数并使能pwm输出,占空比默认采用宏DEFAULT_PULSE,(这里定时器和引脚配置不全,根据需要后续添加和修改)
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {TIMERM_PWM_Channel_en_t} ch
* @param {TIMERM_PWM_ActiveLevel_en_t} ActiveLevel
* @return {*} 正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_CH_Output_init(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch, TIMERM_PWM_ActiveLevel_en_t ActiveLevel)
{
GPIO_InitTypeDef GPIO_InitStruct;
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
{
return 1;
}
psTimx->TimsConfig.OCMode = TIM_OCMODE_PWM1;
psTimx->TimsConfig.OCFastMode = TIM_OCFAST_DISABLE;
psTimx->TimsConfig.OCNPolarity = TIM_OCPOLARITY_LOW;
psTimx->TimsConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
psTimx->TimsConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
if (ActiveLevel == ActiveLevel_High)
{
psTimx->TimsConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
}
else
{
psTimx->TimsConfig.OCPolarity = TIM_OCPOLARITY_LOW;
}
switch (psTimx->TIMX)
{
case TIMERM_1:
{
TIM1_CHANNEL1_GPIOCLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
if (ch == TIMERM_CH1)
{
GPIO_InitStruct.Pin = TIM1_GPIO_PIN_CHANNEL1;
GPIO_InitStruct.Alternate = TIM1_GPIO_AF_CHANNEL1;
HAL_GPIO_Init(TIM1_GPIO_PORT_CHANNEL1, &GPIO_InitStruct);
psTimx->TimsConfig.Pulse = psTimx->pwm_duty[TIMERM_CH1] = DEFAULT_PULSE;
if (HAL_TIM_PWM_ConfigChannel(&psTimx->TimHandle, &psTimx->TimsConfig, TIM_CHANNEL_1) != HAL_OK)
return 1;
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_1) != HAL_OK)
return 1;
return 0;
}
if (ch == TIMERM_CH2)
{
GPIO_InitStruct.Pin = TIM1_GPIO_PIN_CHANNEL2;
GPIO_InitStruct.Alternate = TIM1_GPIO_AF_CHANNEL2;
HAL_GPIO_Init(TIM1_GPIO_PORT_CHANNEL2, &GPIO_InitStruct);
psTimx->TimsConfig.Pulse = psTimx->pwm_duty[TIMERM_CH2] = DEFAULT_PULSE;
if (HAL_TIM_PWM_ConfigChannel(&psTimx->TimHandle, &psTimx->TimsConfig, TIM_CHANNEL_2) != HAL_OK)
return 1;
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_2) != HAL_OK)
return 1;
return 0;
}
if (ch == TIMERM_CH3)
{
GPIO_InitStruct.Pin = TIM1_GPIO_PIN_CHANNEL3;
GPIO_InitStruct.Alternate = TIM1_GPIO_AF_CHANNEL3;
HAL_GPIO_Init(TIM1_GPIO_PORT_CHANNEL3, &GPIO_InitStruct);
psTimx->TimsConfig.Pulse = psTimx->pwm_duty[TIMERM_CH3] = DEFAULT_PULSE;
if (HAL_TIM_PWM_ConfigChannel(&psTimx->TimHandle, &psTimx->TimsConfig, TIM_CHANNEL_3) != HAL_OK)
return 1;
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_3) != HAL_OK)
return 1;
return 0;
}
if (ch == TIMERM_CH4)
{
GPIO_InitStruct.Pin = TIM1_GPIO_PIN_CHANNEL4;
GPIO_InitStruct.Alternate = TIM1_GPIO_AF_CHANNEL4;
HAL_GPIO_Init(TIM1_GPIO_PORT_CHANNEL4, &GPIO_InitStruct);
psTimx->TimsConfig.Pulse = psTimx->pwm_duty[TIMERM_CH3] = DEFAULT_PULSE;
if (HAL_TIM_PWM_ConfigChannel(&psTimx->TimHandle, &psTimx->TimsConfig, TIM_CHANNEL_4) != HAL_OK)
return 1;
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_4) != HAL_OK)
return 1;
}
return 0;
}break;
case TIMERM_14:
{
TIM14_GPIOCLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
if(ch == TIMERM_CH1)
{
GPIO_InitStruct.Pin = TIM14_GPIO_PIN_CHANNEL1;
GPIO_InitStruct.Alternate = TIM14_GPIO_AF_CHANNEL1;
HAL_GPIO_Init(TIM14_GPIO_PORT_CHANNEL1, &GPIO_InitStruct);
psTimx->TimsConfig.Pulse = psTimx->pwm_duty[TIMERM_CH1] = DEFAULT_PULSE;
if (HAL_TIM_PWM_ConfigChannel(&psTimx->TimHandle, &psTimx->TimsConfig, TIM_CHANNEL_1) != HAL_OK)
return 1;
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_1) != HAL_OK)
return 1;
}
return 0;
}break;
default: break;
}
return 1;
}
/************************************************************************
* @description:PWM占空比设置
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {TIMERM_PWM_Channel_en_t} ch
* @param {uint16_t} duty
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_set_duty(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch, uint16_t duty )
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
return 1;
if (duty >= 1000)
duty = 0;
else if (duty <= 0)
duty = 1000;
switch (ch)
{
case TIMERM_CH1:
{
if(psTimx->TIMX == TIMERM_1)
TIM1->CCR1 = duty;
}break;
case TIMERM_CH2:
{
if(psTimx->TIMX == TIMERM_1)
TIM1->CCR2 = duty;
}break;
case TIMERM_CH3:
{
if(psTimx->TIMX == TIMERM_1)
TIM1->CCR3 = duty;
}break;
case TIMERM_CH4:
{
if(psTimx->TIMX == TIMERM_1)
TIM1->CCR4 = duty;
}break;
default: return 1;
}
return 0;
}
/************************************************************************
* @description:关闭定时器的通道输出
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {TIMERM_PWM_Channel_en_t} ch
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_STOP_CHX(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch)
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
{
return 1;
}
switch(ch)
{
case (TIMERM_CH1):
{
if (HAL_TIM_PWM_Stop(&psTimx->TimHandle, TIM_CHANNEL_1) != HAL_OK)
return 1;
}break;
case (TIMERM_CH2):
{
if (HAL_TIM_PWM_Stop(&psTimx->TimHandle, TIM_CHANNEL_2) != HAL_OK)
return 1;
}break;
case (TIMERM_CH3):
{
if (HAL_TIM_PWM_Stop(&psTimx->TimHandle, TIM_CHANNEL_3) != HAL_OK)
return 1;
}break;
case (TIMERM_CH4):
{
if (HAL_TIM_PWM_Stop(&psTimx->TimHandle, TIM_CHANNEL_4) != HAL_OK)
return 1;
}break;
default:return 1;
}
return 0;
}
/************************************************************************
* @description:使能pwm输出
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {TIMERM_PWM_Channel_en_t} ch
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_START_CHX(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch)
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
{
return 1;
}
switch(ch)
{
case (TIMERM_CH1):
{
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_1) != HAL_OK)
return 1;
}break;
case (TIMERM_CH2):
{
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_2) != HAL_OK)
return 1;
}break;
case (TIMERM_CH3):
{
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_3) != HAL_OK)
return 1;
}break;
case (TIMERM_CH4):
{
if (HAL_TIM_PWM_Start(&psTimx->TimHandle, TIM_CHANNEL_4) != HAL_OK)
return 1;
}break;
default:return 1;
}
return 0;
}
/************************************************************************
* @description:复位定时器
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_DeInit_CHX(RTE_PWM_TIMER_Desc_st_t* psTimx)
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
return 1;
if (HAL_TIM_PWM_DeInit(&psTimx->TimHandle) != HAL_OK)
return 1;
memset(psTimx, 0, sizeof(RTE_PWM_TIMER_Desc_st_t));
return 0;
}
/************************************************************************
* @description: pwm频率设置
* @param {RTE_PWM_TIMER_Desc_st_t*} psTimx
* @param {uint16_t} freq
* @return {*}正常0 失败1
************************************************************************/
uint8_t TimerM_PWM_set_freq(RTE_PWM_TIMER_Desc_st_t* psTimx, uint16_t freq )
{
if ((psTimx->TIMX < 0) || (psTimx->TIMX >= TIMERM_MAX))
{
return 1;
}
switch (psTimx->TIMX)
{
case TIMERM_1:
{
TIM1->PSC = (TIMERCLkFREQ / (freq * (ARR_VALUE + 1))) - 1;
}break;
case TIMERM_14:
{
TIM14->PSC = (TIMERCLkFREQ / (freq * (ARR_VALUE + 1))) - 1;
}break;
default: return 1;
}
return 0;
}
#ifndef TRMERM_H_
#define TRMERM_H_
#include <stdint.h>
#include "main.h"
#define TIMERCLkFREQ (24000000) //注意配置
#define ARR_VALUE 999 //注意配置
#define DEFAULT_PULSE 500 //注意配置
//没有确定具体使用引脚,后续需要重新添加配置
#define TIM1_GPIOCLK_ENABLE() __HAL_RCC_TIM1_CLK_ENABLE()
#define TIM1_CHANNEL1_GPIOCLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIM1_GPIO_PORT_CHANNEL1 GPIOA
#define TIM1_GPIO_PIN_CHANNEL1 GPIO_PIN_8
#define TIM1_GPIO_AF_CHANNEL1 GPIO_AF2_TIM1
#define TIM1_CHANNEL2_GPIOCLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIM1_GPIO_PORT_CHANNEL2 GPIOA
#define TIM1_GPIO_PIN_CHANNEL2 GPIO_PIN_8
#define TIM1_GPIO_AF_CHANNEL2 GPIO_AF2_TIM1
#define TIM1_CHANNEL3_GPIOCLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIM1_GPIO_PORT_CHANNEL3 GPIOA
#define TIM1_GPIO_PIN_CHANNEL3 GPIO_AF2_TIM1
#define TIM1_GPIO_AF_CHANNEL3 GPIO_AF2_TIM1
#define TIM1_CHANNEL4_GPIOCLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIM1_GPIO_PORT_CHANNEL4 GPIOA
#define TIM1_GPIO_PIN_CHANNEL4 GPIO_AF2_TIM1
#define TIM1_GPIO_AF_CHANNEL4 GPIO_AF2_TIM1
#define TIM14_GPIOCLK_ENABLE() __HAL_RCC_TIM14_CLK_ENABLE()
#define TIM14_CHANNEL1_GPIOCLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
#define TIM14_GPIO_PORT_CHANNEL1 GPIOA
#define TIM14_GPIO_PIN_CHANNEL1 GPIO_PIN_7
#define TIM14_GPIO_AF_CHANNEL1 GPIO_AF4_TIM14
typedef enum
{
TIMERM_1 = 0x0000U,
TIMERM_2,
TIMERM_3,
TIMERM_6,
TIMERM_7,
TIMERM_14,
TIMERM_15,
TIMERM_16,
TIMERM_17,
TIMERM_MAX
} TIMERM_NUM_en_t;
typedef enum
{
TIMERM_CH1 = 0U,
TIMERM_CH2,
TIMERM_CH3,
TIMERM_CH4,
TIMERM_CHALL
} TIMERM_PWM_Channel_en_t;
typedef struct
{
TIMERM_NUM_en_t TIMX;
TIM_HandleTypeDef TimHandle;
TIM_OC_InitTypeDef TimsConfig;
uint32_t cycle_pulse;
uint32_t Period;
uint32_t pwm_duty[TIMERM_CHALL];
}RTE_PWM_TIMER_Desc_st_t;
typedef enum
{
ActiveLevel_High = 0,
ActiveLevel_Low,
} TIMERM_PWM_ActiveLevel_en_t;
typedef enum
{
TIM_CLOCK_DIV1 = 1,
TIM_CLOCK_DIV2 = 2,
TIM_CLOCK_DIV4 = 4
} TIMERM_PWM_u8clkdiv_en_t;
extern RTE_PWM_TIMER_Desc_st_t g_stTIMERPWM1;
extern RTE_PWM_TIMER_Desc_st_t g_stTIMERPWM14;
extern uint8_t TimerM_PWM_counter_Output_Init(RTE_PWM_TIMER_Desc_st_t* psTimx, uint16_t freq, uint32_t PWM_Clock);
extern uint8_t TimerM_PWM_CH_Output_init(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch, TIMERM_PWM_ActiveLevel_en_t ActiveLevel);
extern uint8_t TimerM_PWM_set_duty(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch, uint16_t duty );
extern uint8_t TimerM_PWM_set_freq(RTE_PWM_TIMER_Desc_st_t* psTimx, uint16_t freq );
extern uint8_t TimerM_PWM_START_CHX(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch);
extern uint8_t TimerM_PWM_STOP_CHX(RTE_PWM_TIMER_Desc_st_t* psTimx, TIMERM_PWM_Channel_en_t ch);
#endif /* TRMERM_H_ */
#ifndef RTE_UART_H__
#define RTE_UART_H__
extern UART_HandleTypeDef USART1_St;
extern UART_HandleTypeDef USART2_St;
extern UART_HandleTypeDef USART3_St;
extern UART_HandleTypeDef USART4_St;
#define READ_BIT(REG, BIT) ((REG) & (BIT))
#define USART1_GPIOCLK __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART1_CLK __HAL_RCC_USART1_CLK_ENABLE()
#define USART1_TXGPIOTypeDef GPIOA
#define USART1_TXGPIOPIN GPIO_PIN_2
#define USART1_GPIOTXAF GPIO_AF1_USART2
#define USART1_RXGPIOTypeDef GPIOA
#define USART1_RXGPIOPIN GPIO_PIN_3
#define USART1_GPIORXAF GPIO_AF1_USART2
#define USART2_GPIOCLK __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART2_CLK __HAL_RCC_USART2_CLK_ENABLE()
#define USART2_TXGPIOTypeDef GPIOA
#define USART2_TXGPIOPIN GPIO_PIN_2
#define USART2_GPIOTXAF GPIO_AF1_USART2
#define USART2_RXGPIOTypeDef GPIOA
#define USART2_RXGPIOPIN GPIO_PIN_3
#define USART2_GPIORXAF GPIO_AF1_USART2
#define USART3_GPIOCLK __HAL_RCC_GPIOC_CLK_ENABLE()
#define USART3_CLK __HAL_RCC_USART3_CLK_ENABLE()
#define USART3_TXGPIOTypeDef GPIOC
#define USART3_TXGPIOPIN GPIO_PIN_2
#define USART3_GPIOTXAF GPIO_AF9_USART3
#define USART3_RXGPIOTypeDef GPIOC
#define USART3_RXGPIOPIN GPIO_PIN_3
#define USART3_GPIORXAF GPIO_AF9_USART3
#define USART4_GPIOCLK __HAL_RCC_GPIOA_CLK_ENABLE()
#define USART4_CLK __HAL_RCC_USART4_CLK_ENABLE()
#define USART4_TXGPIOTypeDef GPIOA
#define USART4_TXGPIOPIN GPIO_PIN_0
#define USART4_GPIOTXAF GPIO_AF4_USART4
#define USART4_RXGPIOTypeDef GPIOA
#define USART4_RXGPIOPIN GPIO_PIN_1
#define USART4_GPIORXAF GPIO_AF4_USART4
typedef enum
{
RTEUSART1 = 0x00U,
RTEUSART2 = 0x01U,
RTEUSART3 = 0x02U,
RTEUSART4 = 0x03U
}RET_USARTX_en_t;
void RTE_USART_DeInit(UART_HandleTypeDef* USARTx);
void RTE_USART_Init(RET_USARTX_en_t emUSARTx);
void RTE_USART_SendData(UART_HandleTypeDef* USARTx, uint8_t *Data, uint32_t SendLen);
uint8_t RTE_USART_ReceiveData(UART_HandleTypeDef* USARTx);
uint8_t UASRT_Get_TX_Busy_Flag(void);
uint8_t UASRT_Send_Multiple_Byte(UART_HandleTypeDef* USARTx, uint8_t *Data, uint32_t Len);
uint8_t UASRT_TX_ISR(void);
#endif /* RTE_UART_H__ */
#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>
#include "main.h"
#include "RTE.h"
#include "Application.h"
#pragma pack(4)
UART_HandleTypeDef USART1_St;
UART_HandleTypeDef USART2_St;
UART_HandleTypeDef USART3_St;
UART_HandleTypeDef USART4_St;
// 加对齐指令
typedef struct __attribute__((aligned(4)))
{
uint8_t u8UartSendCount;
uint8_t u8UartSendLen;
uint8_t u8UartSendStatus; /*0:idle 1:busy*/
uint8_t u8reserved;
} Uart_Send_Ctr_st_t;
Uart_Send_Ctr_st_t stUartSendCtr;
void RTE_USSART_DeInit(UART_HandleTypeDef* USARTx)
{
HAL_UART_DeInit(USARTx);
if(USARTx->Instance == USART1)
{
HAL_NVIC_DisableIRQ(USART1_IRQn);
}
else if(USARTx->Instance == USART2)
{
HAL_NVIC_DisableIRQ(USART2_IRQn);
}
else if(USARTx->Instance == USART3)
{
HAL_NVIC_DisableIRQ(USART3_4_IRQn);
}
else if(USARTx->Instance == USART4)
{
HAL_NVIC_DisableIRQ(USART3_4_IRQn);
}
}
static void RTE_USART1_RCC_Configuration(void)
{
/* Enable GPIO clock */
USART1_GPIOCLK;
USART1_CLK;
}
static void RTE_USART1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = USART1_TXGPIOPIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = USART1_GPIOTXAF;
HAL_GPIO_Init(USART1_TXGPIOTypeDef, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART1_RXGPIOPIN;
GPIO_InitStruct.Alternate = USART1_GPIORXAF;
HAL_GPIO_Init(USART1_RXGPIOTypeDef, &GPIO_InitStruct);
}
static void RTE_USART2_RCC_Configuration(void)
{
/* Enable GPIO clock */
USART2_GPIOCLK;
USART2_CLK;
}
static void RTE_USART2_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = USART2_TXGPIOPIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = USART2_GPIOTXAF;
HAL_GPIO_Init(USART2_TXGPIOTypeDef, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART2_RXGPIOPIN;
GPIO_InitStruct.Alternate = USART2_GPIORXAF;
HAL_GPIO_Init(USART2_RXGPIOTypeDef, &GPIO_InitStruct);
}
static void RTE_USART3_RCC_Configuration(void)
{
/* Enable GPIO clock */
USART3_GPIOCLK;
USART3_CLK;
}
static void RTE_USART3_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = USART3_TXGPIOPIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = USART3_GPIOTXAF;
HAL_GPIO_Init(USART3_TXGPIOTypeDef, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART3_RXGPIOPIN;
GPIO_InitStruct.Alternate = USART3_GPIORXAF;
HAL_GPIO_Init(USART3_RXGPIOTypeDef, &GPIO_InitStruct);
}
static void RTE_USART4_RCC_Configuration(void)
{
USART4_GPIOCLK;
USART4_CLK;
}
static void RTE_USART4_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = USART4_TXGPIOPIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = USART4_GPIOTXAF;
HAL_GPIO_Init(USART4_TXGPIOTypeDef, &GPIO_InitStruct);
GPIO_InitStruct.Pin = USART4_RXGPIOPIN;
GPIO_InitStruct.Alternate = USART4_GPIORXAF;
HAL_GPIO_Init(USART4_RXGPIOTypeDef, &GPIO_InitStruct);
}
void RTE_USART_Init(RET_USARTX_en_t emUSARTx)
{
stUartSendCtr.u8UartSendCount = 0U;
stUartSendCtr.u8UartSendLen = 0U;
stUartSendCtr.u8UartSendStatus= 0U;
stUartSendCtr.u8reserved = 0U;
switch (emUSARTx)
{
case RTEUSART1:
{
RTE_USART1_RCC_Configuration();
RTE_USART1_GPIO_Configuration();
/* Initialize USART */
USART1_St.Instance = USART1;
USART1_St.Init.BaudRate = 115200;
USART1_St.Init.WordLength = UART_WORDLENGTH_8B;
USART1_St.Init.StopBits = UART_STOPBITS_1;
USART1_St.Init.Parity = UART_PARITY_NONE;
USART1_St.Init.HwFlowCtl = UART_HWCONTROL_NONE;
USART1_St.Init.Mode = UART_MODE_TX_RX;
USART1_St.Init.OverSampling = UART_OVERSAMPLING_16;
USART1_St.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&USART1_St);
HAL_NVIC_SetPriority(USART1_IRQn, 0,0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
__HAL_UART_ENABLE_IT(&USART1_St, UART_IT_RXNE);
}
break;
case RTEUSART2:
{
RTE_USART2_RCC_Configuration();
RTE_USART2_GPIO_Configuration();
/* Initialize USART */
USART2_St.Instance = USART2;
USART2_St.Init.BaudRate = 115200;
USART2_St.Init.WordLength = UART_WORDLENGTH_8B;
USART2_St.Init.StopBits = UART_STOPBITS_1;
USART2_St.Init.Parity = UART_PARITY_NONE;
USART2_St.Init.HwFlowCtl = UART_HWCONTROL_NONE;
USART2_St.Init.Mode = UART_MODE_TX_RX;
USART2_St.Init.OverSampling = UART_OVERSAMPLING_16;
USART2_St.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&USART2_St);
HAL_NVIC_SetPriority(USART2_IRQn, 0,0);
HAL_NVIC_EnableIRQ(USART2_IRQn);
__HAL_UART_ENABLE_IT(&USART2_St, UART_IT_RXNE);
}
break;
case RTEUSART3:
{
RTE_USART3_RCC_Configuration();
RTE_USART3_GPIO_Configuration();
/* Initialize USART */
USART3_St.Instance = USART3;
USART3_St.Init.BaudRate = 115200;
USART3_St.Init.WordLength = UART_WORDLENGTH_8B;
USART3_St.Init.StopBits = UART_STOPBITS_1;
USART3_St.Init.Parity = UART_PARITY_NONE;
USART3_St.Init.HwFlowCtl = UART_HWCONTROL_NONE;
USART3_St.Init.Mode = UART_MODE_TX_RX;
USART3_St.Init.OverSampling = UART_OVERSAMPLING_16;
USART3_St.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&USART3_St);
HAL_NVIC_SetPriority(USART3_4_IRQn, 0,0);
HAL_NVIC_EnableIRQ(USART3_4_IRQn);
__HAL_UART_ENABLE_IT(&USART3_St, UART_IT_RXNE);
}
break;
case RTEUSART4:
{
RTE_USART4_RCC_Configuration();
RTE_USART4_GPIO_Configuration();
/* Initialize USART */
USART4_St.Instance = USART4;
USART4_St.Init.BaudRate = 115200;
USART4_St.Init.WordLength = UART_WORDLENGTH_8B;
USART4_St.Init.StopBits = UART_STOPBITS_1;
USART4_St.Init.Parity = UART_PARITY_NONE;
USART4_St.Init.HwFlowCtl = UART_HWCONTROL_NONE;
USART4_St.Init.Mode = UART_MODE_TX_RX;
USART4_St.Init.OverSampling = UART_OVERSAMPLING_16;
USART4_St.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
HAL_UART_Init(&USART4_St);
HAL_NVIC_SetPriority(USART3_4_IRQn, 0,0);
HAL_NVIC_EnableIRQ(USART3_4_IRQn);
__HAL_UART_ENABLE_IT(&USART4_St, UART_IT_RXNE);
}
break;
default:break;
}
}
uint8_t USART_Get_TX_Busy_Flag(void)
{
return stUartSendCtr.u8UartSendStatus;
}
/*因本项目使用外部全局数组进行数据发送,函数内部不额外拷贝一次数据了*/
uint8_t USART_Send_Multiple_Byte(UART_HandleTypeDef* USARTx, uint8_t *Data, uint32_t Len)
{
uint32_t u32UARTResult = 1UL;
if(USARTx == NULL)
return u32UARTResult;
if ((USART_Get_TX_Busy_Flag() == 0U) && (Len <= 255))
{
stUartSendCtr.u8UartSendCount = 0U;
stUartSendCtr.u8UartSendLen = Len;
stUartSendCtr.u8UartSendStatus = 1U;
u32UARTResult = 0UL;
/*使能中断*/
__HAL_UART_ENABLE_IT(USARTx, UART_IT_TXE);
}
return u32UARTResult;
}
void RTE_USART_SendData(UART_HandleTypeDef* USARTx, uint8_t *Data, uint32_t SendLen)
{
HAL_UART_Transmit(USARTx, Data, SendLen, 500);//超时时间需要注意合理设置
}
uint8_t RTE_USART_ReceiveData(UART_HandleTypeDef* USARTx)
{
uint32_t u32UARTResult = 1UL;
if(USARTx == NULL)
{
return u32UARTResult;
}
return (uint8_t)(READ_BIT(USARTx->Instance->DR, USART_DR_DR));
}
uint8_t USART_TX_ISR(UART_HandleTypeDef* USARTx)
{
uint32_t u32UARTResult = 1UL;
if(USARTx == NULL)
return u32UARTResult;
if ((stUartSendCtr.u8UartSendLen) && (stUartSendCtr.u8UartSendCount < stUartSendCtr.u8UartSendLen))
{
//USART_SendData(USART2, UsartDataBuf[stUartSendCtr.u8UartSendCount++]);
//USARTx->Instance->DR = buff[stUartSendCtr.u8UartSendCount++];
}
else /*发送完成或者异常*/
{
//USART_ConfigInt(USART2, USART_INT_TXDE, DISABLE);
__HAL_UART_DISABLE_IT(USARTx, UART_IT_TXE);
stUartSendCtr.u8UartSendCount = 0U;
stUartSendCtr.u8UartSendLen = 0U;
stUartSendCtr.u8UartSendStatus = 0U;
}
return u32UARTResult;
}
void USART1_IRQHandler(void)
{
if (__HAL_UART_GET_FLAG(&USART1_St, UART_FLAG_RXNE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART1_St, UART_FLAG_RXNE);
// UART_Put(RTE_USART_ReceiveData(&USART1_St));
}
if (__HAL_UART_GET_FLAG(&USART1_St, UART_FLAG_TXE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART1_St, UART_FLAG_TXE);
}
}
void USART2_IRQHandler(void)
{
if (__HAL_UART_GET_FLAG(&USART2_St, UART_FLAG_RXNE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART2_St, UART_FLAG_RXNE);
// UART_Put(RTE_USART_ReceiveData(&USART2_St));
}
if (__HAL_UART_GET_FLAG(&USART2_St, UART_FLAG_TXE) != RESET)
{
/* Write one byte to the transmit data register */
__HAL_UART_CLEAR_FLAG(&USART2_St, UART_FLAG_TXE);
// USART_TX_ISR(&USART2_St);
}
}
void USART3_4_IRQHandler(void)
{
if (__HAL_UART_GET_FLAG(&USART3_St, UART_FLAG_RXNE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART3_St, UART_FLAG_RXNE);
// UART_Put(RTE_USART_ReceiveData(&USART3_St));
}
if (__HAL_UART_GET_FLAG(&USART3_St, UART_FLAG_TXE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART3_St, UART_FLAG_TXE);
//USART_TX_ISR(&USART3_St);
}
if (__HAL_UART_GET_FLAG(&USART4_St, UART_FLAG_RXNE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART4_St, UART_FLAG_RXNE);
uint16_t rx_data = (uint16_t)RTE_USART_ReceiveData(&USART4_St);
UART_Put(rx_data);
}
if (__HAL_UART_GET_FLAG(&USART4_St, UART_FLAG_TXE) != RESET)
{
__HAL_UART_CLEAR_FLAG(&USART4_St, UART_FLAG_TXE);
}
}
#ifndef RTE_WDT_H__
#define RTE_WDT_H__
#define IWDG_PRESCALER IWDG_PRESCALER_32
#define IWDG_RELOAD 1024
extern void RTE_WDT_Enable(void);
extern void RTE_WDT_Disable(void);
extern void RTE_WDT_Clear(void);
#endif /* RTE_WDT_H__ */
\ No newline at end of file
#include "main.h"
#include "RTE.h"
#define RTE_WDT_CLK_SRC_FREQ (32000U)
IWDG_HandleTypeDef IwdgHandle = {0};
/**
* @description: 看门狗使能
* @return {*}
*/
void RTE_WDT_Enable(void)
{
#if __DEBUG
__HAL_DBGMCU_FREEZE_IWDG();
#endif
//相关使能
//__HAL_RCC_SYSCFG_CLK_ENABLE();
//__HAL_RCC_PWR_CLK_ENABLE();
//RCC_EnableLsi(ENABLE);本芯片自动LSI使能
IwdgHandle.Instance = IWDG; /* Select IWDG */
IwdgHandle.Init.Prescaler = IWDG_PRESCALER; /* Configure prescaler as 32 */
IwdgHandle.Init.Reload = IWDG_RELOAD; /* IWDG counter reload value is 1024, 1s */
/* Initialize IWDG */
if (HAL_IWDG_Init(&IwdgHandle) != HAL_OK)
{
//APP_ErrorHandler();
}
}
/*****************************************************************************
* @description: FLASH用户选项配置字里选择关门狗休眠冻结,执行HAL_FLASH_OB_Launch会复位一次
* @return {*}
*****************************************************************************/
void RTE_WDT_Disable(void)
{
if( READ_BIT(FLASH->OPTR, FLASH_OPTR_IWDG_STOP) == OB_IWDG_STOP_FREEZE)
return;
FLASH_OBProgramInitTypeDef OBInitCfg={0};
HAL_FLASH_Unlock(); /* Unlock Flash */
HAL_FLASH_OB_Unlock(); /* Unlock Option */
OBInitCfg.OptionType = OPTIONBYTE_USER;
OBInitCfg.USERType = OB_USER_IWDG_STOP;
OBInitCfg.USERConfig = OB_IWDG_STOP_FREEZE;
/* Start option byte programming */
HAL_FLASH_OBProgram(&OBInitCfg);
HAL_FLASH_Lock(); /* Lock Flash */
HAL_FLASH_OB_Lock(); /* Lock Option */
/* Option Launch */
HAL_FLASH_OB_Launch();
}
/*****************************************************************************
* @description: 看门狗刷新
* @return {*}
*****************************************************************************/
void RTE_WDT_Clear(void)
{
//IWDG_ReloadKey();
if (HAL_IWDG_Refresh(&IwdgHandle) != HAL_OK)
{
//APP_ErrorHandler();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment