ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-02 20:06:43  阅读:196  来源: 互联网

标签:实战 Duty HAL stm32f411ceu6 TIM USER GPIO 小型 PWM


目录

前言

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

任务

要求

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

知识点

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

所需板载资源

LED1;
按键
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)。 111: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 */

标签:实战,Duty,HAL,stm32f411ceu6,TIM,USER,GPIO,小型,PWM
来源: https://blog.csdn.net/weixin_65489379/article/details/123154689

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有