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

注册于 3 years ago

回答
378
文章
2
关注者
14

你把bsp文件夹删了就是你要的。
或者如果已经有了对应的bsp,执行scons --dist,生成的dist文件夹,就是一个集成好的工程了

可能是你RW_IRAM1未定义吧,链接脚本和此处是对应的
image.png

nano-3.1.3是先发布的,这个函数后来才加上的,所以nano-3.1.3没有这个函数
https://github.com/RT-Thread/rt-thread/pull/3078

但是message其他函数可以正常使用

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

用hal库就行。
或者你也可以把device.c加进来、然后再把pin框架加进来、把gpio驱动加进来,以及相应的头文件

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

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

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

ns级中断可以使用systick之外的其他timer实现

回到
顶部

发布
问题

投诉
建议