嵌入式基础-实验3
熟练掌握了STM32CubeMX引脚配置与代码生成。通过Keil仿真有效验证了代码逻辑的正确性。进一步熟悉中断配置与处理,提升系统响应效率。探索更加复杂的外设如UART、I2C以扩展应用范围。熟练掌握了STM32CubeMX引脚配置与代码生成。通过Keil仿真有效验证了代码逻辑的正确性。
嵌入式基础-定时器与PWM
一、任务1:通过定时器Timer方式实现LED等周期性地闪烁与串口发送
- 之前作业中的延时功能都是通过循环、delay/Hal_delay函数等实现,本次作业通过定时器Timer方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。请设置一个5秒的定时器,每隔5秒从串口发送“hello windows!”;
- 同时设置一个2秒的定时器,让LED等周期性地闪烁,实现一个多任务并发运行的功能。思考,如果不采用定时器,如何同时完成上面两个周期性任务?
1. 硬件选型与引脚设置
-
选择STM32芯片型号: STM32F103C8T6
-
引脚设置:
- 配置GPIO端口,如图。

2.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码
-
tm2,tm3配置:
-
Rcc:打开高速时钟:

-
NVIC:打开tm2,tm3中断与代码生成:


-
usart配置:

3. 时钟配置
-
开启HSE时钟: 72MHz外部晶振
-
配置时钟树: 确保系统时钟设置正确满足应用需求。

4. 代码生成
- 生成初始化代码: 点击“GENERATE CODE”,选择Keil uVision5作为工具链。

5. 编写Keil中的代码
5.1 查看工程
-
cubemx为我们生成了工程代码模版。

5.2 启动时钟
- 在 main中写入下面的函数开启时钟:
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
-
在 main中写入下面的语句定义发送的内容:
uint8_t hello[20]="hello windows!\r\n";5.3编写定时器中断回调函数
-
在main.c中定义如下函数:
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(GPIOA,GPIO_PIN_1); } } if(htim->Instance == TIM3) { if(++time_cnt3 >= 1000) { time_cnt3 =0; HAL_UART_Transmit(&huart1,hello,20,100000); } } }
6.分析代码部分
-
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) :
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了定时器的一个静态变量:time_cnt与定时器3 的time_cnt3。
例如time_cnt,当它大于等于100的时候,才会执行if里面的代码。也就是说需要发生400次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以400次中断的时间是0.005400=2秒。也就是说每隔2秒,LED的状态翻转一次。
例如time_cnt3,当它大于等于1000的时候,才会执行if里面的代码。也就是说需要发生1000次中断,才会让串口发一次消息。0.0051000=5秒,符合题目要求。
7.电路板连接

8. 使用软件烧录
-
打开烧录软件,选择在keil中编译生成的Hex文件写入。

8.观察实验现象:
- 查看led状态:

可以看到led状态每两秒转换一次。
- 查看接收区:


可以看到每五秒发送一次数据。
9. 实验总结
总结要点:
- 熟练掌握了STM32CubeMX引脚配置与代码生成。
- 通过Keil仿真有效验证了代码逻辑的正确性。
反思与展望:
- 进一步熟悉中断配置与处理,提升系统响应效率。
- 探索更加复杂的外设如UART、I2C以扩展应用范围。
二、任务2:PWM实现LED呼吸灯的效果
- 使用TIM3和TIM4,分别输出一个PWM波形,PWM的占空比随时间变化,去驱动你外接的一个LED以及最小开发板上已焊接的LED(固定接在 PC13 GPIO端口),实现2个 LED呼吸灯的效果
1. 硬件选型与引脚设置
-
选择STM32芯片型号: STM32F103C8T6
-
引脚设置:
-
配置GPIO端口,如图。

-
2.在STM32CubeMX上为芯片设置引脚、配置时钟,在Keil中生成代码
-
sys配置:

-
tm3,tm4配置相同如下:

- Rcc:打开高速时钟:

3. 时钟配置
-
开启HSE时钟: 8 MHz外部晶振
-
配置时钟树: 确保系统时钟设置正确满足应用需求。

4. 代码生成
- 生成初始化代码: 点击“GENERATE CODE”,选择Keil uVision5作为工具链。

5. 编写Keil中的代码
5.1 查看工程
-
cubemx为我们生成了工程代码模版。

5.2 编写占空比
- 在 main中写入下面的代码设置占空比:
uint16_t duty_num3 = 10;
uint16_t duty_num4 = 10;
- 开启PWM信道:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
5.3 修改主循环函数
- while循环如下:
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 */
}
6.分析代码部分
- while循环 :
设置为每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0。(即灯会从亮倒暗,逐渐变化)
7.电路板连接

8. 使用软件烧录
-
打开烧录软件,选择在keil中编译生成的Hex文件写入。

8.观察实验现象:
-
LED亮度变化:

可以看到led的亮灭转换。
9. 实验总结
总结要点:
- 熟练掌握了STM32CubeMX引脚配置与代码生成。
- 通过Keil仿真有效验证了代码逻辑的正确性。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)