确实,main()函数中,不需要再按照CubeMx的初始化流程再做一遍,
按照RTT的流程,在rtthread_startup()函数中已经有对board的各种接口的初始化。
其中rt_hw_board_init()函数(文件 drv_common.c中)已经是改写成STM32对应的函数。
宏定义 RT_USING_PIN 在rtconfig.h文件中也已经定义。
继续调用 rt_hw_pin_init(void) (drv_gpio.c文件中),这个函数中,根据配置打开各个端口,并注册硬件pin设备。 rt_device_pin_register(“pin”, &_stm32_pin_ops, RT_NULL);
这个函数注册pin设备时,传递了_stm32_pin_ops 结构地址,这个是在这个文件中定义的局部变量。
再下层函数将这个ops地址付给 _hw_pin.ops.
一切看起来都非常OK。
但是,main()函数里,执行 rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
也就是调用
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
_hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}
发现_hw_pin.ops 是空(RT_NULL)
我觉得最大可能性,前面初始化函数就没有执行。
可惜我没能在初始化部分单步跟踪,断点调试。
百思不得其解!
继续求教!请多指导!
确实,main()函数中,不需要再按照CubeMx的初始化流程再做一遍,
按照RTT的流程,在rtthread_startup()函数中已经有对board的各种接口的初始化。
其中rt_hw_board_init()函数(文件 drv_common.c中)已经是改写成STM32对应的函数。
宏定义 RT_USING_PIN 在rtconfig.h文件中也已经定义。
继续调用 rt_hw_pin_init(void) (drv_gpio.c文件中),这个函数中,根据配置打开各个端口,并注册硬件pin设备。 rt_device_pin_register(“pin”, &_stm32_pin_ops, RT_NULL);
这个函数注册pin设备时,传递了_stm32_pin_ops 结构地址,这个是在这个文件中定义的局部变量。
再下层函数将这个ops地址付给 _hw_pin.ops.
一切看起来都非常OK。
但是,main()函数里,执行 rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
也就是调用
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
RT_ASSERT(_hw_pin.ops != RT_NULL);
_hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}
发现_hw_pin.ops 是空(RT_NULL)
我觉得最大可能性,前面初始化函数就没有执行。
可惜我没能在初始化部分单步跟踪,断点调试。
百思不得其解!
继续求教!请多指导!
举报