中移ML307A(4G Cat1,C-SDK,OpenCPU)模组学习开发-GPIO
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
GPIO输出高低电平
1,直接上代码
#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,在引脚作为输出的模式下读取引脚状态
#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=%d\r\n",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=%d\r\n",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作为输入
#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输入中断
这边写的复杂了些,有了中断以后就发送个事件, 任务等到有事件以后处理
#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; }
.