嵌入式作业十一(定时器&PWM应用编程)

文章介绍了如何使用STM32F103的定时器TIM2、TIM3和TIM4控制LED进行周期性闪烁和PWM呼吸灯效果,包括创建工程、配置GPIO、编写代码以及使用Keil观察波形。还涉及了串口通信和PWM参数调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

目录

文章目录

题目

一、用定时器控制小灯周期性闪烁

1、创建工程

2、编写代码

3、运行结果

二、用PWM模式运行呼吸灯

1、创建工程

2、代码编写

3、结果

参考链接


题目

一. 使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。

二. 接上,采用定时器pwm模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整到一个满意效果。使用Keil虚拟示波器,观察 pwm输出波形。

三. 再接上,采用定时器的另外一个通道,编程采集上面的pwm输出信号,获得其周期和脉宽,并重定向输出到串口显示。

一、用定时器控制小灯周期性闪烁

1、创建工程

首先创建一个新工程,然后设置系统时钟RCC为外部时钟源Crystal/ceramic Resonator。

 然后将SYS设为Serial Wire。

 然后配置GPIO口 ,将PC15口设置为输出口并且将其重命名为D1。

 然后配置定时器TIM2,TIM3,来控制灯闪烁的频率和串口通信的间隔。
将Clock Source选为Internal Clock,下面的配置如图所示。

TIM2与TIM3进行相同的配置。

打开TIM2和TIM3的中断控制。

 生成定时器2,定时器3中断优先级配置代码。

 打开串口USART1,并设置为串口通信

 最后配置时钟

2、编写代码

首先要打开两个计时器。

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);
  /* USER CODE END 2 */

 然后添加输出的数组

uint8_t hello[20]="hello windows!\r\n";

 最后编写闪烁和串口通信的函数

/* USER CODE BEGIN 4 */
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 400)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 1000)
		{
			time_cnt3 =0;
            HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}
 
/* USER CODE END 4 */

3、运行结果

二、用PWM模式运行呼吸灯

1、创建工程

同一相似

定时器设置TIM3和TIM4

时钟配置:
 

2、代码编写

main.c中添加:

uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;

 然后打开TIM3的通道3,输出PWM,TIM4的通道4,输出PWM。

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);

 最后设置为每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0。

  while (1)
  {
    /* USER CODE END WHILE */
 HAL_Delay(50);
		duty_num3 = duty_num3 + 10;
			duty_num4 = duty_num4 + 10;
		if(duty_num3 > 500)
		{
			duty_num3 = 0;
		}
		__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_num3);
			if(duty_num4 > 500)
		{
			duty_num4 = 0;
		}
		__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_1,duty_num4);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3、结果


参考链接:

第8-9周作业--定时器&PWM应用编程-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值