这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 第2讲:Nucleo入门之GPIO输入与函数调用

共6条 1/1 1 跳转至

第2讲:Nucleo入门之GPIO输入与函数调用

菜鸟
2015-12-21 14:29:00     打赏

使用cubemx和MDK,使用HAL库,基本的工程创建流程这里就不详细讲了,请参考论坛其他的入门贴。

下面这个实验主要是练习IO端口电平读取和函数调用。

实现功能:将手放置在红外开关前,RGB LED颜色会在红、绿、蓝之间切换,每秒切换1次,手移开后RGB LED保持当前颜色,可以用于小夜灯颜色选择,用户只需要将手放在红外感应开关前就可以进行颜色选择,直到看到自己喜欢颜色后移开即可。


1. 补充知识:

红外开关:红外开关是一种非接触式开关,当物体靠近时开关触发,典型应用:洗手间自动冲水感应开关。

基本原理:


原理:

红外接收管有一种特性,即当受到红外线照射时,自身反向电阻会急剧减小,左图中D2就是一个红外接收管,红外接收管在未受到红外线照射时,OUT点电压为高电平,D2受到红外照射时,D2导通,相当于将OUT点和GND用一根导线连接,此时OUT点电压变为低电平,这就是红外开关工作的基本原理。

D1是红外发射管,其经限流电阻R2一直处于导通状态,即一直会有红外线对外发射,但在没有物体遮挡的情况下,红外线会直射出去,并不会反射到D2

2.      函数2GPIO

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

注:返回值GPIO_PIN_RESETGPIO_PIN_SET,形参定义如下:

GPIOx: GPIOA,GPIOB,GPIOx……

GPIO_Pin GPIO_PIN_1GPIO_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 */

}




实验效果图片:


【2】Nucleo入门之GPIO输入与函数调用.pdf

LED_T2.rar




菜鸟
2015-12-21 14:36:42     打赏
2楼

没辙了,注释到这里都是乱码,需要的小伙伴尽量下载附件看吧


专家
2015-12-22 07:24:33     打赏
3楼
很详细的说明,楼主继续

助工
2015-12-28 16:56:46     打赏
4楼
分分钟老师范儿啊

高工
2015-12-29 10:03:31     打赏
5楼
写的挺详细,慢慢学

助工
2015-12-29 16:09:53     打赏
6楼
可以用代码插入功能哦~

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]