第二次任务不完全报告
- 任务内容
LED灯初始设置每过两秒闪一下,按一次按键,闪烁间隔减少0.5s,等间隔到0秒之后,led由闪烁变为呼吸灯,并且蜂鸣器开始播放音乐小星星。 - 任务完成情况
刚开始的时候没有找到合适的学习的方法,很多次的死脑经,很多次的绕弯路都使得我的效率不高。其实仍有部分功能我尚未实现,让蜂鸣器唱出小星星,以及外部中断按键的防抖。我想过很多办法都没有完成其功能。 - 代码及解释
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
#define WAKEUP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
uint16_t pwm_value = 2000;
uint16_t step = 100;
uint16_t pwm_value2 = 2000;
uint16_t step1;
uint16_t it =0;
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM9_Init();
MX_TIM12_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3); //启动TIM3定时器
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(pwmt == 1) //当LED常亮时打开PWM呼吸灯模式
{
HAL_Delay(10);
if(pwm_value == 0) step = 50;
if(pwm_value == 2000) step = -50;
pwm_value += step;
user_pwm_setvalue(pwm_value); //呼吸灯的PWM
if(pwm_value2 == 0) step1 = 100;
if(pwm_value2 == 2000) step1 = -100;
pwm_value2 += step1;
user_pwm_setvalue2(pwm_value2); //蜂鸣器的PWM
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
定时器
是利用将亮的时间与LED灯暗的时间由每次进入定时器的次数来决定的
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance)
{
t += 1;
if(t%tiim == 0)
{
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
t = 0;
}
else
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
}
}
PWM定时器
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_2)
{
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
if(b == 0)
{
tiim = 53;
b ++;
}
if(b == 1)
{
tiim = 36;
b ++;
}
if(b == 2)
{
tiim = 19;
b ++;
}
if(b == 3)
{
tiim = 1;
b = 3;
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_TIM_Base_Stop_IT(&htim3); //关闭TIM3定时器
pwmt = 1;
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1);
//打开两个PWM定时器
}
}
}
初始化PWM
void user_pwm_setvalue(uint16_t value)
{
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim9, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim9, TIM_CHANNEL_1);
}
void user_pwm_setvalue2(uint16_t value2)
{
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = value2;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim12, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim12, TIM_CHANNEL_1);
}
(学习使用函数库主要来自于微雪)
视频展示