记录6——stm32f411ceu6之实战小型综合应用项目

前言

之前所学都是分为多个模块化的知识点进行的,学习的知识需要结合到一起进行实践,更加考察对所学单片机知识的综合、灵活应用能力。(写的比较基础,如有错误欢迎指正)

任务

要求

  1. LED亮度可以被调节,分为100级;
  2. 若按键处于松开状态,当电脑通过串口向单片机发送一个亮度值n(0<=n<=100)后,将LED灯亮度调为n;
  3. 若按键被按下,则该LED以呼吸灯形式闪烁(不受串口控制),周期为2s;
  4. main函数中的while不能写任何逻辑

知识点

  • GPIO输出;
  • 外部中断;
  • 定时器中断;
  • PWM输出;
  • 串口收发

所需板载资源

  • LED*1;
  • 按键*1;
  • USB*1

配置工程

LED灯(由于PC13不能开启PWM,故可在单片机上将PC13引脚与可以开启PWM的PA1用杜母线连接):
在这里插入图片描述
按键:
在这里插入图片描述
开启PWM,设置的周期为20ms:

知识点补充:
PWM模式1-
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平(电平为1),否则为无效电平(电平为0);在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2-
在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。
有效为1,无效为0.
————————————————
版权声明:本文为CSDN博主「西蒙先生、」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35661436/article/details/52734812

由于PC13在高电平时为熄灭,为无效电平,所以这里我使用的是mode2。
在这里插入图片描述
串口:
在这里插入图片描述
记得设置中断优先级:
在这里插入图片描述

完成后具体引脚配置如图:
在这里插入图片描述

代码

部分内容在之前所写的文章中有所体现,如果某些部分不太详细,可见之前对应文章。

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint16_t Duty=0;//定义占空比
uint16_t Step=20;//定义步进值
uint8_t n[1];//接收值
/* USER CODE END PV */
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart2 ,(uint8_t*)n ,1);//开启接收中断
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//开启PWM
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收中断回调函数
{
	if(huart->Instance==USART2)
	{
		if(n[0]>=0&&n[0]<=100)
	  {
			__HAL_TIM_SET_COMPARE (&htim2 ,TIM_CHANNEL_2 ,2*n[0]);//设置占空比
			HAL_UART_Transmit(&huart2,n,1,0xFFFFF);//接收后再发送回电脑,在串口调试助手中可以显示
		}
		HAL_UART_Receive_IT(&huart2,n,1);//继续开启接收
	}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//中断回调函数
{
	if(GPIO_Pin==GPIO_PIN_0)
	{
		HAL_Delay(5);
		if(HAL_GPIO_ReadPin (GPIOA,GPIO_PIN_0 )==GPIO_PIN_RESET)//检测按键是被按下
		{
		    //由灭至亮
			for(Duty =0;Duty <=200;Duty=Duty+Step)
			{
				__HAL_TIM_SET_COMPARE (&htim2 ,TIM_CHANNEL_2 ,Duty );
				HAL_Delay (100);
			}
			//由亮至灭
			for(Duty =200;Duty > 0;Duty=Duty-Step)
			{
				__HAL_TIM_SET_COMPARE (&htim2 ,TIM_CHANNEL_2 ,Duty );
				HAL_Delay (100);
			}
		}
	}
	HAL_GPIO_EXTI_Callback(GPIO_PIN_0);
}


/* USER CODE END 4 */
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Drawing Ting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值