UcosIII 使用stm32f4XXX Bsp使用总结。
一:操作步骤
二:硬件资源:
对任何驱动程序的控制都是对寄存器的操作。如要操作寄存器,首先要找到该外设对应寄存器组的基地址。找到基地址后对该外设的寄存器组进行配置、读写,达到控制外设的目的。需要注意的是直接操作内存地址是不直观的,所以常用是把寄存器的址等于一个结构体的基的地址。如下所示:
#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等函数把物理地址映射为虚拟地址,提供给内核使用。对于驱动硬件部分最需要关心的是设备对象树,以及后续寄存器的配置工作。
总结:
到目前基本描述清楚了和设备相关(配置寄存器)的工作和思路。其余操作系统的子系统由其他文件进行解释。