<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ML307A_OPEN" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
#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;
}
#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;
}
#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;
}
#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;
}