303 lines
8.7 KiB
C
303 lines
8.7 KiB
C
#include "E53_SF1.h"
|
|
#include "stm32l4xx.h"
|
|
#include "stm32l4xx_it.h"
|
|
#include "main.h"
|
|
|
|
ADC_HandleTypeDef hadc1;
|
|
TIM_HandleTypeDef htim16;
|
|
|
|
/***************************************************************
|
|
* 函数名称: MX_TIM16_Init
|
|
* 说 明: 初始化定时器16
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
/* TIM16 init function */
|
|
void MX_TIM16_Init(void)
|
|
{
|
|
TIM_OC_InitTypeDef sConfigOC;
|
|
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
|
|
|
|
htim16.Instance = TIM16;
|
|
htim16.Init.Prescaler = 79;
|
|
htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
|
|
htim16.Init.Period = 999;
|
|
htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
|
htim16.Init.RepetitionCounter = 0;
|
|
htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
|
if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
if (HAL_TIM_PWM_Init(&htim16) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
sConfigOC.Pulse = 499;
|
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
|
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
|
|
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
|
|
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
|
|
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
|
|
sBreakDeadTimeConfig.DeadTime = 0;
|
|
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
|
|
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
|
|
sBreakDeadTimeConfig.BreakFilter = 0;
|
|
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
|
|
if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
HAL_TIM_MspPostInit(&htim16);
|
|
|
|
}
|
|
/***************************************************************
|
|
* 函数名称: HAL_TIM_Base_MspInit
|
|
* 说 明: 使能定时器16时钟,设置时钟源
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
|
|
{
|
|
|
|
if(tim_baseHandle->Instance==TIM16)
|
|
{
|
|
/* USER CODE BEGIN TIM16_MspInit 0 */
|
|
|
|
/* USER CODE END TIM16_MspInit 0 */
|
|
/* TIM16 clock enable */
|
|
__HAL_RCC_TIM16_CLK_ENABLE();
|
|
/* USER CODE BEGIN TIM16_MspInit 1 */
|
|
|
|
/* USER CODE END TIM16_MspInit 1 */
|
|
}
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: HAL_TIM_MspPostInit
|
|
* 说 明: 使能定时器16硬件初始化
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
|
|
{
|
|
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
if(timHandle->Instance==TIM16)
|
|
{
|
|
/* USER CODE BEGIN TIM16_MspPostInit 0 */
|
|
|
|
/* USER CODE END TIM16_MspPostInit 0 */
|
|
|
|
/**TIM16 GPIO Configuration
|
|
PB8 ------> TIM16_CH1
|
|
*/
|
|
GPIO_InitStruct.Pin = SF1_Beep_Pin;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
GPIO_InitStruct.Alternate = GPIO_AF14_TIM16;
|
|
HAL_GPIO_Init(SF1_Beep_GPIO_Port, &GPIO_InitStruct);
|
|
|
|
/* USER CODE BEGIN TIM16_MspPostInit 1 */
|
|
|
|
/* USER CODE END TIM16_MspPostInit 1 */
|
|
}
|
|
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: MX_ADC1_Init
|
|
* 说 明: 初始化ADC1电压采集通道
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void MX_ADC1_Init(void)
|
|
{
|
|
ADC_ChannelConfTypeDef sConfig;
|
|
|
|
/**Common config
|
|
*/
|
|
hadc1.Instance = ADC1;
|
|
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
|
|
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
|
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
|
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
|
hadc1.Init.LowPowerAutoWait = DISABLE;
|
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
|
hadc1.Init.NbrOfConversion = 1;
|
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
|
hadc1.Init.NbrOfDiscConversion = 1;
|
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
|
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
|
hadc1.Init.DMAContinuousRequests = DISABLE;
|
|
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
|
|
hadc1.Init.OversamplingMode = DISABLE;
|
|
if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
/**Configure Regular Channel
|
|
*/
|
|
sConfig.Channel = ADC_CHANNEL_3;
|
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
|
sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
|
|
sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
|
sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
|
sConfig.Offset = 0;
|
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
|
{
|
|
Error_Handler();
|
|
}
|
|
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: HAL_ADC_MspInit
|
|
* 说 明: 使能ADC时钟,设置时钟源
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
|
|
{
|
|
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
if(adcHandle->Instance==ADC1)
|
|
{
|
|
/* USER CODE BEGIN ADC1_MspInit 0 */
|
|
|
|
/* USER CODE END ADC1_MspInit 0 */
|
|
/* ADC1 clock enable */
|
|
__HAL_RCC_ADC_CLK_ENABLE();
|
|
|
|
/**ADC1 GPIO Configuration
|
|
PC2 ------> ADC1_IN3
|
|
*/
|
|
GPIO_InitStruct.Pin = GPIO_PIN_2;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
|
|
/* USER CODE BEGIN ADC1_MspInit 1 */
|
|
|
|
/* USER CODE END ADC1_MspInit 1 */
|
|
}
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: Init_Beep
|
|
* 说 明: 初始化E53_SF1的蜂鸣器
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void Init_Beep(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
|
|
/* GPIO Ports Clock Enable */
|
|
SF1_Beep_GPIO_CLK_ENABLE();
|
|
|
|
/*Configure GPIO pin Output Level */
|
|
HAL_GPIO_WritePin(SF1_Beep_GPIO_Port, SF1_Beep_Pin, GPIO_PIN_RESET);
|
|
|
|
/*Configure GPIO pin : PtPin */
|
|
GPIO_InitStruct.Pin = SF1_Beep_Pin;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
HAL_GPIO_Init(SF1_Beep_GPIO_Port, &GPIO_InitStruct);
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: Init_LED
|
|
* 说 明: 初始化E53_SF1的LED灯
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void Init_LED(void)
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct;
|
|
|
|
/* GPIO Ports Clock Enable */
|
|
SF1_LED_GPIO_CLK_ENABLE();
|
|
|
|
/*Configure GPIO pin Output Level */
|
|
HAL_GPIO_WritePin(SF1_LED_GPIO_Port, SF1_LED_Pin, GPIO_PIN_SET);
|
|
|
|
/*Configure GPIO pin : PtPin */
|
|
GPIO_InitStruct.Pin = SF1_LED_Pin;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
HAL_GPIO_Init(SF1_LED_GPIO_Port, &GPIO_InitStruct);
|
|
}
|
|
/***************************************************************
|
|
* 函数名称: Init_E53_SF1
|
|
* 说 明: 初始化E53_SF1扩展板
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void Init_E53_SF1(void)
|
|
{
|
|
MX_ADC1_Init();
|
|
Init_Beep();
|
|
Init_LED();
|
|
MX_TIM16_Init();
|
|
}
|
|
/***************************************************************
|
|
* 函数名称: E53_SF1_Read_Data
|
|
* 说 明: 获取烟雾传感器的数据
|
|
* 参 数: 无
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void E53_SF1_Read_Data(void)
|
|
{
|
|
HAL_ADC_Start(&hadc1);
|
|
HAL_ADC_PollForConversion(&hadc1, 50);
|
|
E53_SF1_Data.Smoke_Value = HAL_ADC_GetValue(&hadc1);
|
|
}
|
|
/***************************************************************
|
|
* 函数名称: E53SF1_LED_StatusSet
|
|
* 说 明: E53SF1开发板上的LED灯的亮灭控制
|
|
* 参 数: status,LED灯的状态
|
|
* 非1,关灯
|
|
* 1,开灯
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void E53SF1_LED_StatusSet(E53SF1_Status_ENUM status)
|
|
{
|
|
HAL_GPIO_WritePin(SF1_LED_GPIO_Port, SF1_LED_Pin, status != ON ? GPIO_PIN_RESET : GPIO_PIN_SET );
|
|
}
|
|
|
|
/***************************************************************
|
|
* 函数名称: E53SF1_BEEP
|
|
* 说 明: E53SF1蜂鸣器报警与否
|
|
* 参 数: status,LED_ENUM枚举的数据
|
|
* LED_OFF,关灯
|
|
* LED_ON,开灯
|
|
* 返 回 值: 无
|
|
***************************************************************/
|
|
void E53SF1_Beep(E53SF1_Status_ENUM status)
|
|
{
|
|
if(status == ON)
|
|
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
|
|
if(status == OFF)
|
|
HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1);
|
|
}
|
|
|
|
|