目录
前言
之前所学都是分为多个模块化的知识点进行的,学习的知识需要结合到一起进行实践,更加考察对所学单片机知识的综合、灵活应用能力。(写的比较基础,如有错误欢迎指正)
任务
要求
- LED亮度可以被调节,分为100级;
- 若按键处于松开状态,当电脑通过串口向单片机发送一个亮度值n(0<=n<=100)后,将LED灯亮度调为n;
- 若按键被按下,则该LED以呼吸灯形式闪烁(不受串口控制),周期为2s;
- 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 */