7973|38

7048

帖子

11

TA的资源

版主

楼主
 

【国民技术N32WB031_STB开发板评测】GPIO之按键与LED灯 [复制链接]

 

【国民技术N32WB031_STB开发板评测】创建MDK模版 

1、在这篇创建的基础上,复制这个模版,重命名为N32WB_KEY。并在bsp文件夹下新建key、led两个文件夹,添加好key.c、key.h、led.c、led.h。目录如下:

├─key
│      key.c
│      key.h
├─led
│      led.c
│      led.h

2、用mdk打开工程,把创建bsp/LED\bsp/key分组,并把.c\.h添加进工程:

    3、led.c程序如下:

#include "led.h"


/**
 * [url=home.php?mod=space&uid=159083]@brief[/url] Configures LED GPIO.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedInit(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_InitType GPIO_InitStructure;

    /* Check the parameters */
    assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

    /* Enable the GPIO Clock */
    if (GPIOx == GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    }
    else if (GPIOx == GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    }
    else
    {
        return;
    }

    /* Configure the GPIO pin */
    if (Pin <= GPIO_PIN_ALL)
    {
        GPIO_InitStruct(&GPIO_InitStructure);
        GPIO_InitStructure.Pin = Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
    }
}

/**
 * @brief  Turns selected Led on.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedOn(GPIO_Module *GPIOx, uint16_t Pin)
{
    GPIO_SetBits(GPIOx, Pin);
}

/**
 * @brief  Turns selected Led Off.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedOff(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_ResetBits(GPIOx, Pin);
}

/**
 * @brief  Toggles the selected Led.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedBlink(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_TogglePin(GPIOx, Pin);
}

led.h:

#ifndef __LED_H__
#define __LED_H__
#include "n32wb03x.h"
void LedInit(GPIO_Module* GPIOx, uint16_t Pin);
void LedOn(GPIO_Module *GPIOx, uint16_t Pin);
void LedOff(GPIO_Module* GPIOx, uint16_t Pin);
void LedBlink(GPIO_Module* GPIOx, uint16_t Pin);

#endif

key.c:

#include "key.h"
#include "led.h"
#include "main.h"

/**
 * @brief  Configures key port.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void KeyInputExtiInit(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_InitType GPIO_InitStructure;
    EXTI_InitType EXTI_InitStructure;
    NVIC_InitType NVIC_InitStructure;

    /* Check the parameters */
    assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

    /* Enable the GPIO Clock */
    if (GPIOx == GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else if (GPIOx == GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else
    {
        return;
    }

    /*Configure the GPIO pin as input floating*/
    if (Pin <= GPIO_PIN_ALL)
    {
        GPIO_InitStruct(&GPIO_InitStructure);
        GPIO_InitStructure.Pin          = Pin;
        GPIO_InitStructure.GPIO_Pull    = GPIO_PULL_UP;
        GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
    }

    /*Configure key EXTI Line to key input Pin*/
    GPIO_ConfigEXTILine(KEY_INPUT_PORT_SOURCE, KEY_INPUT_PIN_SOURCE);

    /*Configure key EXTI line*/
    EXTI_InitStructure.EXTI_Line    = KEY_INPUT_EXTI_LINE;
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

    /*Set key input interrupt priority*/
    NVIC_InitStructure.NVIC_IRQChannel                   = KEY_INPUT_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority           = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


ke.y:

#ifndef __KEY_H__
#define __KEY_H__
#include "n32wb03x.h"


void KeyInputExtiInit(GPIO_Module* GPIOx, uint16_t Pin);

#endif

4、在n32wb03_it.c中添加按键中断程序:

void EXTI2_3_IRQHandler(void)
{
    if (RESET != EXTI_GetITStatus(KEY_INPUT_EXTI_LINE))
    {
        if(GPIO_ReadInputDataBit(KEY_INPUT_PORT, KEY_INPUT_PIN) == RESET)
        {
            Delay(10);
            if(GPIO_ReadInputDataBit(KEY_INPUT_PORT, KEY_INPUT_PIN) == RESET)
            {
                LedBlink(LED2_PORT, LED2_PIN);
            }
        }
        EXTI_ClrITPendBit(KEY_INPUT_EXTI_LINE);
    }
}

【注】这里只是演示所用,不能在实际项目中运行

然后在主程序里初始化key\led

#include "led.h"
#include "key.h"

int main(void)
{

    LedInit(LED1_PORT, LED1_PIN);
    LedInit(LED2_PORT, LED2_PIN);
    

    LedOn(LED1_PORT, LED1_PIN);
    LedOn(LED2_PORT, LED2_PIN);
		KeyInputExtiInit(KEY_INPUT_PORT, KEY_INPUT_PIN);
    while (1)
    {
        LedBlink(LED1_PORT, LED1_PIN);


        Delay(0x28FFFF);


    }
}

这样就可以实现LED1的周期闪烁,当按下Button1时翻转LED2【注】由于在中断中用了延时,所以效果不是很好,等讲了定时器,会进行优化。

此帖出自无线连接论坛

最新回复

建议看看反汇编代码,国民的delay函数在c99规范下会被常规gcc编译器优化掉。我之前用他们的N32G45x,搭配gcc的时候就遇到过。   详情 回复 发表于 2023-5-8 22:47
点赞 关注
 

回复
举报

7048

帖子

11

TA的资源

版主

沙发
 
附上工程,大家可以取用,如果有不足之处,还请指出。多谢! N32WB031_KEY.zip (234.21 KB, 下载次数: 5)
此帖出自无线连接论坛
 
 

回复

7244

帖子

2

TA的资源

版主

板凳
 

后面是不是准备测评蓝牙了~

此帖出自无线连接论坛

点评

蓝牙是作业之一,我还是想能做出什么样的功耗的东西出来。  详情 回复 发表于 2023-4-29 17:03
 
 
 

回复

7048

帖子

11

TA的资源

版主

4
 
wangerxian 发表于 2023-4-29 14:33 后面是不是准备测评蓝牙了~

蓝牙是作业之一,我还是想能做出什么样的功耗的东西出来。

此帖出自无线连接论坛
 
 
 

回复

4856

帖子

3

TA的资源

版主

5
 

期待一些基本作业,有空再有一点小实验就更好了

此帖出自无线连接论坛

点评

主要是水平有限呀,还得继续操练。  详情 回复 发表于 2023-4-29 20:58
 
 
 

回复

7048

帖子

11

TA的资源

版主

6
 
led2015 发表于 2023-4-29 20:01 期待一些基本作业,有空再有一点小实验就更好了

主要是水平有限呀,还得继续操练。

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

7
 

你好 我想问一下为啥我用国民的LED实例 在里面添加按键控制LED 按键没反应 只能在上电一瞬间才监测按键是否按下

此帖出自无线连接论坛

点评

你可以把代码帖到我下面,我帮看看怎么回事。  详情 回复 发表于 2023-5-5 13:34
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

8
 

能加个WX探讨下 帮我看下吗 我小白

此帖出自无线连接论坛
 
 
 

回复

7048

帖子

11

TA的资源

版主

9
 
J1anbean 发表于 2023-5-5 11:56 你好 我想问一下为啥我用国民的LED实例 在里面添加按键控制LED 按键没反应 只能在上电一瞬间才监测按键是否 ...

你可以把代码帖到我下面,我帮看看怎么回事。

此帖出自无线连接论坛
 
 
 

回复

7048

帖子

11

TA的资源

版主

10
 
J1anbean 发表于 2023-5-5 11:56 能加个WX探讨下 帮我看下吗 我小白

可以的,你发私信我wx吧。

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

11
 

#ifndef __MAIN_H__
#define __MAIN_H__

#ifdef __cplusplus
extern “C” {
#endif

#include “N32G031.H”

/*LED1-PB1,Led2-PB6,Led3-PB7*/
#define PORT_GROUP GPIOB
#define LED1_PORT PORT_GROUP
#define LED2_PORT PORT_GROUP
#define LED3_PORT PORT_GROUP#define LED1_PIN GPIO_PIN_1

#define LED2_PIN GPIO_PIN_6#define LED3_PIN GPIO_PIN_7

#define KEY_INPUT_PORT GPIOA
#define KEY_INPUT_PIN GPIO_PIN_5
#define KEY_INPUT_EXTI_LINE EXTI_LINE5#define KEY_INPUT_PORT_SOURCE GPIOA_PORT_SOURCE

#define KEY_INPUT_PIN_SOURCE GPIO_PIN_SOURCE5#define KEY_INPUT_IRQn EXTI4_15_IRQn

无效延迟(uint32_t计数);
void LedInit(GPIO_Module* GPIOx, uint16_t Pin);
void LedOn(GPIO_Module *GPIOx, uint16_t Pin);
void LedOff(GPIO_Module* GPIOx, uint16_t Pin);
void LedBlink(GPIO_Module* GPIOx, uint16_t Pin);
void LedBreath(GPIO_Module* GPIOx, uint16_t Pin);
void KeyInputExtiInit(GPIO_Module* GPIOx, uint16_t Pin);
//uint8_t Key_Scan(GPIO_Module *GPIOx,uint16_t pin);
#ifdef __cplusplus
}#endif

#endif /* __MAIN_H__ */

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

12
 

 

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

13
 

 

image.png (216.05 KB, 下载次数: )

image.png
此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

14
 

void KeyInputExtiInit(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_InitType GPIO_InitStructure;
    EXTI_InitType EXTI_InitStructure;
    NVIC_InitType NVIC_InitStructure;

    /* Check the parameters */
    assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

    /* Enable the GPIO Clock */
    if (GPIOx == GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else if (GPIOx == GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else if (GPIOx == GPIOC)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else if (GPIOx == GPIOF)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOF | RCC_APB2_PERIPH_AFIO, ENABLE);
    }
    else
    {
        return;

    }

    /*Configure the GPIO pin as input floating*/
    if (Pin <= GPIO_PIN_ALL)
    {
        GPIO_InitStruct(&GPIO_InitStructure);
        GPIO_InitStructure.Pin          = Pin;
        GPIO_InitStructure.GPIO_Pull    = GPIO_PULL_UP;
        GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);

    }

    /*Configure key EXTI Line to key input Pin*/
    GPIO_ConfigEXTILine(KEY_INPUT_PORT_SOURCE, KEY_INPUT_PIN_SOURCE);

    /*Configure key EXTI line*/
    EXTI_InitStructure.EXTI_Line    = KEY_INPUT_EXTI_LINE;
    EXTI_InitStructure.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);

    /*Set key input interrupt priority*/
    NVIC_InitStructure.NVIC_IRQChannel                   = KEY_INPUT_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority           = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

/**
 * @brief  Inserts a delay time.
 * @param count specifies the delay time length.
 */
void Delay(uint32_t count)
{
    for (; count > 0; count--)

        ;
}

/**
 * @brief  Configures LED GPIO.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedInit(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_InitType GPIO_InitStructure;

    /* Check the parameters */
    assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

    /* Enable the GPIO Clock */
    if (GPIOx == GPIOA)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    }
    else if (GPIOx == GPIOB)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    }
    else if (GPIOx == GPIOC)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
    }
    else if (GPIOx == GPIOF)
    {
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOF, ENABLE);
    }
    else
    {
        return;

    }

    /* Configure the GPIO pin */
    if (Pin <= GPIO_PIN_ALL)
    {
        GPIO_InitStruct(&GPIO_InitStructure);
        GPIO_InitStructure.Pin = Pin;
        GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);

    }
}

/**
 * @brief  Turns selected Led on.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedOn(GPIO_Module *GPIOx, uint16_t Pin)
{
    GPIO_SetBits(GPIOx, Pin);

}

/**
 * @brief  Turns selected Led Off.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedOff(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_ResetBits(GPIOx, Pin);

}

/**
 * @brief  Toggles the selected Led.
 * @param GPIOx x can be A to G to select the GPIO port.
 * @param Pin This parameter can be GPIO_PIN_0~GPIO_PIN_15.
 */
void LedBlink(GPIO_Module* GPIOx, uint16_t Pin)
{
    GPIO_TogglePin(GPIOx, Pin);

}

void LedBreath(GPIO_Module* GPIOx, uint16_t Pin)
{
        unsigned char i = 0;
        unsigned int t = 1;
        unsigned char flag = 1;
         while(1)
        { 
           if(flag == 1) //LED??
        {
            for(i=0;i<10;i++)
            {
                GPIO_ResetBits(PORT_GROUP, LED1_PIN | LED2_PIN | LED3_PIN); 
                Delay(t);
                GPIO_SetBits(PORT_GROUP,LED1_PIN | LED2_PIN | LED3_PIN);        //LED??
                Delay(1001-t);
            }
            t++;    
            if(t == 1000)
            {
                flag = 0;
            }
        }
        if(flag == 0) //LED????
        {
            for(i=0;i<10;i++)
            {    
                GPIO_ResetBits(PORT_GROUP, LED1_PIN | LED2_PIN | LED3_PIN);     //LED??
                Delay(t);
                GPIO_SetBits(PORT_GROUP,LED1_PIN | LED2_PIN | LED3_PIN);        //LED??
                Delay(1001-t);
            }
            t--;
            if(t == 1)
            {
                flag = 1;

            }
        }
    }
}

/**
* @brief 用户断言失败的功能。
* @param文件 失败的调用的名称。
* @param行 失败的呼叫的源线路号。
*/
#ifdef USE_FULL_ASSERT
void assert_failed(const uint8_t* expr, const uint8_t* file, uint32_t line){
while (1)


    {
    }
}

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

15
 

帮忙看看 楼主 下面是LED KEY初始化 和LED 点亮熄灭的函数 最上面是头文件和宏定义  中间是main函数

此帖出自无线连接论坛
 
 
 

回复

7048

帖子

11

TA的资源

版主

16
 

你如果要想检测按键,你这样写阻塞式的delay是不行的,要用状态机来写才行。

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

17
 

就算我不这么写延迟按键按下去也没反应 不知道哪里有问题

此帖出自无线连接论坛
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

18
 

可以看看代码打包发你了

此帖出自无线连接论坛

点评

好的,晚上回去修改发给你。你要去学习一下状态机的知识,这样才行。  详情 回复 发表于 2023-5-5 16:17
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

19
 
Project.rar (3.95 MB, 下载次数: 1)

 
此帖出自无线连接论坛
 
 
 

回复

7048

帖子

11

TA的资源

版主

20
 
J1anbean 发表于 2023-5-5 16:10 可以看看代码打包发你了

好的,晚上回去修改发给你。你要去学习一下状态机的知识,这样才行。

此帖出自无线连接论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表