stm32定时器小试
一.使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
1.工程建立
配置时钟
设置Debug模式
配置定时器,由于只用来做定时器,所以把下面的计算打开即可
设置Pc13为输出模式
2.代码部分
写在main函数中,while之前。打开中断
HAL_TIM_Base_Start_IT(&htim3);
在main函数后面写中断回掉函数,里面写的时PC13口的翻转
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance ==TIM3)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
3.实验结果
定时器亮灭
二.接上,采用定时器pwm模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整到一个满意效果。使用Keil虚拟示波器,观察 pwm输出波形。
基本配置如上
1.定时器配置
2.代码部分
1 打开定时器pwm
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
2.while里面写入
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(20);
if(j==0)
{
i+=10;
if(i>500){j=1;}
}
if(j==1)
{
i-=10;
if(i<10){j=0;}
}
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, i);
/* USER CODE BEGIN 3 */
}
3.结果展示
再接上,采用定时器的另外一个通道,编程采集上面的pwm输出信号,获得其周期和脉宽,并重定向输出到串口显示。
1.工程建立
定时器1用来采集、pwm信号
定时器2 用来输出pwm信号
2.代码部分
1.打开对应的中断,或者定时器的开启
printf("´®¿Ú²âÊÔ\r\n");
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 100);
写在前面的定义
uint8_t i = 0;
float Duty = 0;
float Frequency = 0;
uint16_t Cap_val1 = 0;
uint16_t Cap_val2 = 0;
写在while里面
while (1)
{
/* USER CODE END WHILE */
// ´®¿Ú·¢ËÍ ÆµÂÊ Õ¼¿Õ±È
printf("Cap_val1 is :%d , Cap_val2 is : %d \r\n", Cap_val1, Cap_val2);
printf("Duty is :%0.2f%% Frequency is : %0.2f ms\r\n", Duty, Frequency);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
写在 main函数后面
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance ==TIM3)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM1)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
Cap_val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
Cap_val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
Duty = 100 - (float)Cap_val2 / (float)Cap_val1 * 100;
Frequency = 0.001 * Cap_val1;
}
}
}
3.结果展示
总结
本次通过利用单片机的定时器功能实现了将LED亮灭变换,以及LED灯的呼吸效果,本次实验过程遇到了许多的问题和困难,在各种网络平台上查找了许多的资料才完成了本次实验,同时我最大的感受是,利用HEL库在写代码虽然节约了大量初始化各个功能块的时间,但是个人感觉用HEL库的人还是比用库函数的数量相对少一些,所以在查找对应的资料时很费时间,而且找出来的资料质量也一般,作为初学者来说还是有一定的挑战。除此之外,HAL库一般在执行完中断过后最后会进入一个叫做中断回调函数里面,利用HEL库时通常是把用户需要的一部分代码写在此函数之中,但是在本次利用定时器时就遇到了分不清中断函数与回调函数是否对应的问题,由于学习的资源感觉也不太全面能找到的,或者说自己想要知道的答案比较难找到,所以导致在本次实验的学习过程上挺艰难的。当热肯定也是有收获的,熟悉了定时器的基本功能以及对HEL的操作更加熟练