一、实验目的与任务
1. 理解嵌入式系统的组成和设计方法。
2. 掌握GPIO的使用方法,熟悉LED的使用。
3. 熟悉工具软件使用方法,特别是程序的调试方法。
二、实验要求
1. 设计STM32的硬件电路,利用其GPIO控制LED灯。
2. 使用STM32完成流水灯的设计。
三、实验内容及步骤
1. 设计电路图
图1 RGBLED灯与STM32单片机接口电路
2. 软件设计流程图
图2 软件流程图
3. 实验步骤
(1)运行Keil uVision5开发环境,建立一个项目工程。
(2)在工程中添加main.c文件,因其本实验用到LED灯,故再建立一个LED.c和LED.h的两个文件,首先编写主函数main.c的源代码,如图3所示。
图3 main.c程序
(3)编写LED.c程序,主要用于对LED灯所在的三个GPIO进行初始化操作,如图4所示。
图4 LED.c程序
(4)编写LED.h程序,方便以后工程文件以移植,使项目工程工具有移植性,如图5所示。
图5 LED.h程序
运行并调试成功并无错误和警告。
(5)仿真图
图6 仿真图
4. 调试验证及结果
(1)将开发板连接到电脑上,使用STLINK将程序烧录到STM32单片机中,如图7所示:
图7 烧录程序
(2)程序烧录后,观察到RGBLED灯7种颜色的灯来回闪烁,抓拍两张,如图8所示:
图8 LED灯闪烁抓拍
- 实验代码分析
(1)延迟函数程序:
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
(2)LED初始化函数程序:
/**
* @brief LED初始化
* @param
* @retval
*/
void LCD_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽开漏
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//置高电平
}
(3)LED功能函数程序:
/**
* @brief LED1电平反转
* @param
* @retval
*/
void LED1_Turn(void){
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)//判断高低电平
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);//置高电平
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);//置低电平
}
}
/**
* @brief LED2电平反转
* @param
* @retval
*/
void LED2_Turn(void){
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)//判断高低电平
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);//置高电平
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);//置低电平
}
}
/**
* @brief LED3电平反转
* @param
* @retval
*/
void LED3_Turn(void){
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_3) == 0)//判断高低电平
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);//置高电平
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);//置低电平
}
}
四、实验总结
本次实验主要是学习嵌入式系统的组成和设计方法,以及GPIO的使用方法和LED的使用方法。通过实验,我深刻地体会到了嵌入式系统的设计与开发的复杂性和挑战性。
在硬件电路设计方面,需要严格按照要求设计,并注意连接线路的正确性和可靠性。在编写程序方面,需要熟练掌握开发环境的使用方法,能够快速地定位和解决程序的问题。
在实验中,我遇到了一些问题,例如LED灯没有正常亮起来,程序无法正常运行等。通过分析问题原因和调试程序,最终成功地解决了这些问题。通过这些实验过程,我不仅学会了如何使用STM32控制LED灯,还掌握了一些程序调试和解决问题的方法。
总之,本次实验让我深刻地认识到了嵌入式系统设计和开发的重要性和挑战性,同时也让我学会了一些实用的技能和方法,对我的职业发展有着积极的意义。
源码:实验一