使用cubemx和MDK,使用HAL库,基本的工程创建流程这里就不详细讲了,请参考论坛其他的入门贴。
下面这个实验主要是练习IO端口电平读取和函数调用。
实现功能:将手放置在红外开关前,RGB LED颜色会在红、绿、蓝之间切换,每秒切换1次,手移开后RGB LED保持当前颜色,可以用于小夜灯颜色选择,用户只需要将手放在红外感应开关前就可以进行颜色选择,直到看到自己喜欢颜色后移开即可。
红外开关:红外开关是一种非接触式开关,当物体靠近时开关触发,典型应用:洗手间自动冲水感应开关。
基本原理:
|
2. 函数2:GPIO读
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
注:返回值GPIO_PIN_RESET或GPIO_PIN_SET,形参定义如下:GPIOx: GPIOA,GPIOB,GPIOx……
GPIO_Pin: GPIO_PIN_1,GPIO_PIN_2,……GPIO_PIN_15;
例:if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)== GPIO_PIN_RESET) //判断PA15是否是低电平
{
…… //用户要执行的代码
……
}
else //否则PA15就是高电平,执行以下代码
{
……
……
}
3. 函数的调用:
/* USER CODE BEGIN 0 */
void User_Delay(uint32_t time) //用户自定义延时函数
{
while(time--)
{
uint8_t t=4;
while(t--);
}
}
/* USER CODE END 0 */
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
……
while (1)
{
……
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //LED亮约0.5s
User_Delay(500000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET); // LED灭约0.5s
User_Delay(500000);
}
/* USER CODE END 3 */
}
注意:
这里和标准C语言中完全一样,任何符合C语言的函数定义和调用均可以在这里使用,定义在main函数前面可以不用声明,定义在main函数后面必须在前面声明后才能调用。
4. 练习:1、通过红外控制LED的亮灭:当有物体靠近时,LED亮,当物体离开,LED灭。
2、有没有办法实现“呼吸灯”效果:即控制一个LED由亮逐渐变灭,由有灭逐渐变量?
3、红外与“呼吸灯”结合实验:当物体靠近时,LED逐渐变量,直到最亮;物体移开后,LED逐渐变暗,直至熄灭。
4、红外触发切换RGB LED的颜色:红外开关每触发一次,RGB的颜色变化一次,红、绿、蓝,依次轮换。
5、有没有办法控制RGB LED组合出任意颜色?如:紫色、白色、黄色?
主要代码:
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t temp=0,trig=0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
void User_Delay(uint32_t time) //Óû§×Ô¶¨ÒåÑÓʱº¯Êý
{
while(time--)
{
uint8_t t=4;
while(t--);
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //LEDÁÁÔ¼0.5s
// User_Delay(500000);
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET); //LEDÃðÔ¼0.5s
// User_Delay(500000);
if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==GPIO_PIN_SET)&(trig==0)) //µ±PA15ÊǸߵçƽÇÒtrig=0ʱ£¬½øÈëÕâ¸öÑ»·
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);
}
else if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==GPIO_PIN_RESET)&(trig==0)) //µ±PA15Êǵ͵çƽÇÒtrig=0ʱ£¬½øÈëÕâ¸öÑ»· //µ±PA15ÊǸߵçƽʱ£¬½øÈëÕâ¸öÑ»·
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //µãÁÁ°å×ÓÉϵÄLED
temp++;
trig=1; //trigÖÃ1£¬·ÀÖ¹Òò´¥·¢ÑÓʱµÈÎÊÌâµ¼ÖÂÖظ´½øÈëÑ»·£¬Ôì³Étemp¶à´Î+1
}
else
;
if(trig==1)
{
switch (temp%3)
{
case 0:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
break;
case 2:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
break;
default :
;
}
trig=0;
}
else
;
HAL_Delay(1000); //ÑÓʱ1s
}
/* USER CODE END 3 */
}
实验效果图片: