你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Rt_thread 3.0.2版本的GPIO驱动的使用

[复制链接]
andeyqi 发布时间:2018-3-29 13:08
本帖最后由 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核心代码段如下:
  1. const static struct rt_pin_ops _stm32_pin_ops =
  2. {
  3.     stm32_pin_mode,
  4.     stm32_pin_write,
  5.     stm32_pin_read,
  6.     stm32_pin_attach_irq,
  7.     stm32_pin_dettach_irq,
  8.     stm32_pin_irq_enable,
  9. };

  10. int stm32_hw_pin_init(void)
  11. {
  12.     int result;

  13.     /* enable SYSCFG clock for EXTI */
  14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

  15.     result = rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
  16.     return result;
  17. }
复制代码


bsp层的stm32_hw_pin_init函数 调用pin.h rt_device_pin_register接口向上注册gpio的操作接口,应用层程序使用pin.h中的接口来调用底层的驱动接口。
  1. #define PIN_LOW                 0x00
  2. #define PIN_HIGH                0x01

  3. #define PIN_MODE_OUTPUT         0x00
  4. #define PIN_MODE_INPUT          0x01
  5. #define PIN_MODE_INPUT_PULLUP   0x02
  6. #define PIN_MODE_INPUT_PULLDOWN 0x03
  7. #define PIN_MODE_OUTPUT_OD      0x04

  8. #define PIN_IRQ_MODE_RISING             0x00
  9. #define PIN_IRQ_MODE_FALLING            0x01
  10. #define PIN_IRQ_MODE_RISING_FALLING     0x02

  11. #define PIN_IRQ_DISABLE                 0x00
  12. #define PIN_IRQ_ENABLE                  0x01

  13. #define PIN_IRQ_PIN_NONE                -1

  14. struct rt_device_pin_mode
  15. {
  16.     rt_uint16_t pin;
  17.     rt_uint16_t mode;
  18. };
  19. struct rt_device_pin_status
  20. {
  21.     rt_uint16_t pin;
  22.     rt_uint16_t status;
  23. };
  24. struct rt_pin_irq_hdr
  25. {
  26.     rt_int16_t        pin;
  27.     rt_uint16_t       mode;
  28.     void (*hdr)(void *args);
  29.     void             *args;
  30. };
  31. struct rt_pin_ops
  32. {
  33.     void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_base_t mode);
  34.     void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_base_t value);
  35.     int (*pin_read)(struct rt_device *device, rt_base_t pin);

  36.     /* TODO: add GPIO interrupt */
  37.     rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_int32_t pin,
  38.                       rt_uint32_t mode, void (*hdr)(void *args), void *args);
  39.     rt_err_t (*pin_dettach_irq)(struct rt_device *device, rt_int32_t pin);
  40.     rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled);
  41. };

  42. int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data);

  43. void rt_pin_mode(rt_base_t pin, rt_base_t mode);
  44. void rt_pin_write(rt_base_t pin, rt_base_t value);
  45. int  rt_pin_read(rt_base_t pin);
  46. rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode,
  47.                              void (*hdr)(void *args), void  *args);
  48. rt_err_t rt_pin_dettach_irq(rt_int32_t pin);
  49. rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);

  50. int rt_device_pin_irq_register(const char *name, const struct rt_pin_ops *ops,
  51.                                                               void *user_data);
复制代码

gpio.c 调用 rt_device_pin_irq_register函数后建立如下一一对应的映射关系。
映射.PNG
使用时以gpio输出为例:
①配置GPIO为输出模式,从gpio.c查找需要设置的gpio引脚ID,我要设定GPIOA6,对应的id42,输出模式设置为推挽输出PIN_MODE_OUTPUT
  1.   __STM32_PIN(34, AHB1, A, 0),
  2.     __STM32_PIN(35, AHB1, A, 1),
  3.     __STM32_PIN(36, AHB1, A, 2),
  4.     __STM32_PIN(37, AHB1, A, 3),
  5.     __STM32_PIN_DEFAULT,
  6.     __STM32_PIN_DEFAULT,
  7.     __STM32_PIN(40, AHB1, A, 4),
  8.     __STM32_PIN(41, AHB1, A, 5),
  9.     __STM32_PIN(42, AHB1, A, 6),
  10.     __STM32_PIN(43, AHB1, A, 7),
  11.     __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)


收藏 1 评论10 发布时间:2018-3-29 13:08

举报

10个回答
MrJiu 回答时间:2018-3-29 13:42:20
Rt_thread也开始封装底层了吗?有点意思。。。但是论专业和支持度,我觉得还是统一成HAL比较好!!!
pythonworld 回答时间:2018-3-29 13:47:23
层层封装!!!
andeyqi 回答时间:2018-3-29 13:53:39
MrJiu 发表于 2018-3-29 13:42
Rt_thread也开始封装底层了吗?有点意思。。。但是论专业和支持度,我觉得还是统一成HAL比较好!!!:l ...

我试验的是标准库的版本的,一直没用过HAL,感觉思想应该都差不多,让使用者用起来更加简洁方便。
andeyqi 回答时间:2018-3-29 14:02:06

嗯,使用者不需要关注具体的实现
anobodykey 回答时间:2018-3-29 14:41:19
要实行大一统那?有没有人关注RISC-V呢?
andeyqi 回答时间:2018-3-29 14:57:55
anobodykey 发表于 2018-3-29 14:41
要实行大一统那?有没有人关注RISC-V呢?

没了解过,可否介绍下主要亮点是啥
zero99 回答时间:2018-3-31 13:37:33
感谢分享,已更新到3月原创 https://www.stmcu.org.cn/module/forum/thread-615031-1-1.html
rtthread 回答时间:2018-4-11 10:49:45
如果使用GPIO,可以参考官方的应用文档:RT-Thread通用GPIO设备应用指南 http://www.rt-thread.org/qa/thread-5791-1-1.html
rtthread 回答时间:2018-4-11 10:50:19
anobodykey 发表于 2018-3-29 14:41
要实行大一统那?有没有人关注RISC-V呢?

RTT也已经支持了RISC-V BSP
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版