ucosIII使用stm32BSP相关内容总结

UcosIII 使用stm32f4XXX Bsp使用总结。

一:操作步骤

  1. 选择目标cpu
  2. 从目标cpu官网下载标准外设库。
  3. 根据自己板卡的硬件资源需要初始化BSP.H,BSP.C。在此文件中初始化硬件设备。实际需要根据业务层面的需要对硬件设备的驱动进行二次抽象分装为read(),write(),init(),close(),ioctl()等函数。

二:硬件资源:

  1. 下载对应cpu的硬件手册,得到该cpu的内存地址表。如下图stm32f402所示:

对任何驱动程序的控制都是对寄存器的操作。如要操作寄存器,首先要找到该外设对应寄存器组的基地址。找到基地址后对该外设的寄存器组进行配置、读写,达到控制外设的目的。需要注意的是直接操作内存地址是不直观的,所以常用是把寄存器的址等于一个结构体的基的地址。如下所示:

#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)

————————————————————————————————————

 

#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)

#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)

#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)

#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)

#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)

————————————————————————————————_---

 

typedef struct

{

  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */

  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */

  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */

  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */

  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */

  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */

  __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */

  __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */

  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */

  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */

} GPIO_TypeDef;

 

______________________________________________________________________________________________

操作GPIOA就等于操作一个GPIO_TypeDe结构体变量,等于对AHB1PERIPH_BASE寄存器组进行操作。

 

Linux操作系统驱动和ucos的驱动从配置寄存器这部分是相同的,区别在与因为linux和ucos内核的应用场景不同导致的复杂度、功能、性能的不同。

从驱动角度来分析:驱动都是起呈上启下的作用,对上层提供应用接口,对下层提供访问寄存器的能力。不同操作系统的提供方式不同,具体体现到子系统的差异。

所以要写一个驱动或者移植一个驱动第一步是读datasheet了解你的硬件,第二步目标操作系统对该硬件操作的子系统细节。第三步调试。

下面列出一个linux内核驱动简单得到设备硬件资源的方法

版本:linux-4.4.196

Dts目录:arch\arm\boot\dts。Arm表示cup类型。Dts是device tree 的缩写,中文是设备对象树。

在驱动里面通过linux通过的函数Platform_get_resource(),等函数得到该硬件的内存地址,端口,中断号的资源。需要注意的是linux内核访问的也是虚拟地址,需要使用ioremap等函数把物理地址映射为虚拟地址,提供给内核使用。对于驱动硬件部分最需要关心的是设备对象树,以及后续寄存器的配置工作。

 

 

总结:

到目前基本描述清楚了和设备相关(配置寄存器)的工作和思路。其余操作系统的子系统由其他文件进行解释。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值