本帖最后由 andeyqi 于 2018-3-29 13:07 编辑
1.Rt_thread源码下载地址
http://github.com/RT-Thread/rt-thread/
2.我验证的平台是STM32F407VET6,使用官方已适配的~/bsp/tm32f40x 目录下的工程
3.我们只需要关注源码树下的如下几个文件即可
bsp/stm32f40x/
├── drivers
│ ├── gpio.c
│ ├── gpio.h
components
├── drivers
│ ├── misc
│ │ ├── pin.c
│ │ └── SConscript
│ ├── include
│ │ ├── drivers
│ │ │ ├── pin.h
gpio.c核心代码段如下:
- const static struct rt_pin_ops _stm32_pin_ops =
- {
- stm32_pin_mode,
- stm32_pin_write,
- stm32_pin_read,
- stm32_pin_attach_irq,
- stm32_pin_dettach_irq,
- stm32_pin_irq_enable,
- };
- int stm32_hw_pin_init(void)
- {
- int result;
- /* enable SYSCFG clock for EXTI */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
- result = rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
- return result;
- }
复制代码
bsp层的stm32_hw_pin_init函数 调用pin.h rt_device_pin_register接口向上注册gpio的操作接口,应用层程序使用pin.h中的接口来调用底层的驱动接口。
- #define PIN_LOW 0x00
- #define PIN_HIGH 0x01
- #define PIN_MODE_OUTPUT 0x00
- #define PIN_MODE_INPUT 0x01
- #define PIN_MODE_INPUT_PULLUP 0x02
- #define PIN_MODE_INPUT_PULLDOWN 0x03
- #define PIN_MODE_OUTPUT_OD 0x04
- #define PIN_IRQ_MODE_RISING 0x00
- #define PIN_IRQ_MODE_FALLING 0x01
- #define PIN_IRQ_MODE_RISING_FALLING 0x02
- #define PIN_IRQ_DISABLE 0x00
- #define PIN_IRQ_ENABLE 0x01
- #define PIN_IRQ_PIN_NONE -1
- struct rt_device_pin_mode
- {
- rt_uint16_t pin;
- rt_uint16_t mode;
- };
- struct rt_device_pin_status
- {
- rt_uint16_t pin;
- rt_uint16_t status;
- };
- struct rt_pin_irq_hdr
- {
- rt_int16_t pin;
- rt_uint16_t mode;
- void (*hdr)(void *args);
- void *args;
- };
- struct rt_pin_ops
- {
- void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_base_t mode);
- void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_base_t value);
- int (*pin_read)(struct rt_device *device, rt_base_t pin);
- /* TODO: add GPIO interrupt */
- rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_int32_t pin,
- rt_uint32_t mode, void (*hdr)(void *args), void *args);
- rt_err_t (*pin_dettach_irq)(struct rt_device *device, rt_int32_t pin);
- rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled);
- };
- int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data);
- void rt_pin_mode(rt_base_t pin, rt_base_t mode);
- void rt_pin_write(rt_base_t pin, rt_base_t value);
- int rt_pin_read(rt_base_t pin);
- rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode,
- void (*hdr)(void *args), void *args);
- rt_err_t rt_pin_dettach_irq(rt_int32_t pin);
- rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);
- int rt_device_pin_irq_register(const char *name, const struct rt_pin_ops *ops,
- void *user_data);
复制代码
gpio.c 调用 rt_device_pin_irq_register函数后建立如下一一对应的映射关系。
使用时以gpio输出为例:
①配置GPIO为输出模式,从gpio.c查找需要设置的gpio引脚ID,我要设定GPIOA6,对应的id42,输出模式设置为推挽输出PIN_MODE_OUTPUT
- __STM32_PIN(34, AHB1, A, 0),
- __STM32_PIN(35, AHB1, A, 1),
- __STM32_PIN(36, AHB1, A, 2),
- __STM32_PIN(37, AHB1, A, 3),
- __STM32_PIN_DEFAULT,
- __STM32_PIN_DEFAULT,
- __STM32_PIN(40, AHB1, A, 4),
- __STM32_PIN(41, AHB1, A, 5),
- __STM32_PIN(42, AHB1, A, 6),
- __STM32_PIN(43, AHB1, A, 7),
- __STM32_PIN(44, AHB1, C, 4),
复制代码
rt_pin_mode(42,PIN_MODE_OUTPUT)
②写gpio输出值1,0
rt_pin_write(42,1)
rt_pin_write(42,0)
|
我试验的是标准库的版本的,一直没用过HAL,感觉思想应该都差不多,让使用者用起来更加简洁方便。
嗯,使用者不需要关注具体的实现
没了解过,可否介绍下主要亮点是啥
RTT也已经支持了RISC-V BSP