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__ */
This diff is collapsed.
#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();
}
This diff is collapsed.
#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__ */
This diff is collapsed.
#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