中移ML307A(4G Cat1,C-SDK,OpenCPU)模组学习开发-GPIO

2024-08-13 11:13:54 浏览数 (2)

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

GPIO输出高低电平

 1,直接上代码

代码语言:javascript复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉

    //      这个0代表GPIO0  同理1就代表GPIO1 ....
    cm_gpio_init(0, &cfg);//配置GPIO0

    while (1)
    {
        cm_gpio_set_level(0, 1);//设置GPIO0输出高电平
        osDelay(1000/5);//延时

        cm_gpio_set_level(0, 0);//设置GPIO0输出低电平
        osDelay(1000/5);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

烧录下载以后就会看到这个灯每隔1S亮灭

2,关于 cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

 其它的配置不用说大家也都知道了

GPIO输入

1,在引脚作为输出的模式下读取引脚状态

代码语言:javascript复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0

    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉

    //      这个0代表GPIO0  同理1就代表GPIO1 ....
    cm_gpio_init(0, &cfg);//配置GPIO0

    cm_gpio_level_e level;
    while (1)
    {
        cm_gpio_set_level(0, 1);//设置GPIO0输出高电平

        cm_gpio_get_level(0, &level);//读取引脚电平
        cm_log_printf(0,"cm_gpio_get_level=%drn",level);//打印

        osDelay(1000/5);//延时

        cm_gpio_set_level(0, 0);//设置GPIO0输出低电平
        
        cm_gpio_get_level(0, &level);//读取引脚电平
        cm_log_printf(0,"cm_gpio_get_level=%drn",level);//打印

        osDelay(1000/5);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

2,在引脚作为输入的模式下读取引脚状态

咱们就使用 77号引脚作为功能2, GPIO13, 让GPIO13作为输入

代码语言:javascript复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    //配置GPIO0为输出
    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(0, &cfg);//配置GPIO0

    //配置GPIO13为输入
    cm_iomux_set_pin_func(77, 2);//设置 77 号引脚为功能 2, 也就是作为 GPIO13
    cfg.direction = CM_GPIO_DIRECTION_INPUT;//输入
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(13, &cfg);//配置GPIO13


    cm_gpio_level_e level;
    while (1)
    {
        cm_gpio_get_level(13, &level);//读取GPIO13引脚的电平
        
        cm_gpio_set_level(0, level);//GPIO13输入什么电平,GPIO0就输出什么电平

        osDelay(1);//延时
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

咱设置GPIO13上拉了,所以GPIO0也会输出高电平,灯亮; 可以把GPIO13接电平,灯就会灭;

3,GPIO输入中断

这边写的复杂了些,有了中断以后就发送个事件, 任务等到有事件以后处理

代码语言:javascript复制
#include "cm_sys.h"
#include "cm_os.h"
#include "cm_mem.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include <string.h>

#include "cm_gpio.h"
#include "cm_iomux.h"


osEventFlagsId_t osEventFlagsIdTest;//事件句柄

#define GPIO_INT 0x01

static void gpio_irq_callback(void)
{
    //不能处理打印和耗时任务
    osEventFlagsSet(osEventFlagsIdTest, GPIO_INT);//发送事件
}

osThreadId_t osThreadIdFirst;//用于记录任务的句柄(ID码),可以用来停止任务
static void osThreadFuncFirst(void *param)
{
    osStatus_t status;

    //配置GPIO0为输出
    cm_iomux_set_pin_func(16, 1);//设置16号引脚为功能1, 也就是作为GPIO0
    cm_gpio_cfg_t cfg = {0};
    cfg.direction = CM_GPIO_DIRECTION_OUTPUT;//输出
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(0, &cfg);//配置GPIO0

    //配置GPIO13为输入
    cm_iomux_set_pin_func(77, 2);//设置 77 号引脚为功能 2, 也就是作为 GPIO13
    cfg.direction = CM_GPIO_DIRECTION_INPUT;//输入
    cfg.pull = CM_GPIO_PULL_UP;//上拉
    cm_gpio_init(13, &cfg);//配置GPIO13
    //增加设置GPIO13中断
    cm_gpio_interrupt_register(13, gpio_irq_callback);
    cm_gpio_interrupt_enable(13, CM_GPIO_IT_EDGE_BOTH);//上下沿触发


    cm_gpio_level_e level;
    while (1)
    {
        //等待事件,                                         等待0x01         其中一个来了就执行       一直等着
        uint32_t flag = osEventFlagsWait(osEventFlagsIdTest, GPIO_INT,     osFlagsWaitAny,         osWaitForever);

        if (flag&GPIO_INT == GPIO_INT)
        {
            cm_gpio_get_level(13, &level);//读取GPIO13引脚的电平

            cm_gpio_set_level(0, level);//GPIO13输入什么电平GPIO0输出什么电平
        }
    }
}

//相当于程序的main函数
int cm_opencpu_entry(char * param)
{
    (void)param;

    osEventFlagsIdTest = osEventFlagsNew(NULL);//创建事件
    if (osEventFlagsIdTest==NULL) 
    {
        return -1;
    }

    //配置任务
    osThreadAttr_t app_task_attr = {0};
    app_task_attr.name  = "First";//任务名字-随意
    app_task_attr.stack_size = 4096 * 2;//任务使用栈大小-写这个就可以
    app_task_attr.priority = osPriorityNormal;//任务优先级-普通优先级
    osThreadIdFirst = osThreadNew((osThreadFunc_t)osThreadFuncFirst,      NULL,         &app_task_attr);

    return 0;
}

0 人点赞