yangjie
yangjie - 认证专家
This guy hasn't written anything yet

注册于 3 years ago

回答
378
文章
2
关注者
14

RTT定时器有会分两种模式,soft模式(超时在线程环境下)和hard模式(超时在中断环境下)
不开soft模式,默认创建hard模式定时器。

只在创建时,使用RT_TIMER_FLAG_SOFT_TIMER可否?必须要开启soft模式(RT_USING_TIMER_SOFT),指定flag为soft(RT_TIMER_FLAG_SOFT_TIMER),创建的才是soft模式的。

一般就是:定义设备-实现ops-注册。

bsp/stm32/libraries/HAL_Drivers/drv_soft_i2c.c为例。

1、设备:
static struct stm32_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])];

2、实现ops:

static const struct rt_i2c_bit_ops stm32_bit_ops_default =
{
    .data     = RT_NULL,
    .set_sda  = stm32_set_sda,
    .set_scl  = stm32_set_scl,
    .get_sda  = stm32_get_sda,
    .get_scl  = stm32_get_scl,
    .udelay   = stm32_udelay,
    .delay_us = 1,
    .timeout  = 100
};

3、初始化(注册)


/* I2C initialization function */
int rt_hw_i2c_init(void)
{
    rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct stm32_i2c);
    rt_err_t result;

    for (int i = 0; i < obj_num; i++)
    {
        i2c_obj[i].ops = stm32_bit_ops_default;
        i2c_obj[i].ops.data = (void*)&soft_i2c_config[i];
        i2c_obj[i].i2c2_bus.priv = &i2c_obj[i].ops;
        stm32_i2c_gpio_init(&i2c_obj[i]);
        result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c2_bus, soft_i2c_config[i].bus_name);
        RT_ASSERT(result == RT_EOK);
        stm32_i2c_bus_unlock(&soft_i2c_config[i]);

        LOG_D("software simulation %s init done, pin scl: %d, pin sda %d",
        soft_i2c_config[i].bus_name,
        soft_i2c_config[i].scl,
        soft_i2c_config[i].sda);
    }

    return RT_EOK;
}
INIT_BOARD_EXPORT(rt_hw_i2c_init);

bsp/stm32/libraries/HAL_Drivers/drv_dac.为例:

1、设备:

struct stm32_dac
{
    DAC_HandleTypeDef DAC_Handler;
    struct rt_dac_device stm32_dac_device;
};

static struct stm32_dac stm32_dac_obj[sizeof(dac_config) / sizeof(dac_config[0])];

2、实现ops

static const struct rt_dac_ops stm_dac_ops =
{
    .disabled = stm32_dac_disabled,
    .enabled  = stm32_dac_enabled,
    .convert  = stm32_set_dac_value,
};

3、初始化(注册)


static int stm32_dac_init(void)
{

//xxxx

            if (rt_hw_dac_register(&stm32_dac_obj[i].stm32_dac_device, name_buf, &stm_dac_ops, &stm32_dac_obj[i].DAC_Handler) == RT_EOK)
            {
                LOG_D("%s init success", name_buf);
            }

    return result;
}
INIT_DEVICE_EXPORT(stm32_dac_init);

创建信号量的时候设置了数量为5,表示此时可以获取5次,获取一次值减一。
释放信号量是信号量的值增加,释放一次会变成6,以此类推,所以不会报错。

finsh对接在uart上了,finsh将接收到的数据和系统已有的命令进行匹配。

可以用uart1作为finsh,用uart2或者其他uart作为串口传输。

【1:env配置的串口为uart2,不在MDK中添加rtos的shell功能,打开串口后无反应。
2:添加rtos的shell功能后,编译报好多错误。】

我觉得你还没理解rtt版本的关系。
1、mdk内置的rtt是rtt-nano版本。
2、env能用版本是rtt是完整版本
以上两个版本 2选1 即可,不要重复选择.

F语言 in shell,后来有msh,module shell

启动uart1只是打开了uart1外设,uart可以使用了,但不确定console就是uart1了。还需要修改console name为uart1,如下图圈出地方需要修改,以及uart1要连接到主机上

image.png

mb_str1 和 &mb_str1 都可以表示首地址

没注册上设备,看下这个教程,先把你的设备注册上,主要注册代码在该文章的使用流程中。

《GD32VF使用说明_20190919》是在哪里看的?
可以下载源码,编译一下源码中的 bsp:rt-thread\bsp\gd32vf103v-eval

回到
顶部

发布
问题

投诉
建议