<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;
}