文章目录
目录
题目
一. 使用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 */
}