收藏官网首页
查看: 11046|回复: 0

STM32固件库文件编程结构思想的理解

65

主题

123

帖子

787

积分

高级会员

Rank: 4

积分
787
跳转到指定楼层
楼主
发表于 2015-10-31 11:30:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
教您5分钟接入机智云,实现傻瓜式开发
STM32的固件库文件功能相当完善,提供的API完全能满足一般的项目需要。
   首先,请看一段简单的C语言代码
#include <stdio.h>
#define base  0x0012ff60
#define flash ((TestType *)base)
typedef struct
{
      int i;
      int j;
      int k;
}TestType;
void main()
{
       flash->i = 0;
       flash->j = 1;
       flash->k = 2;
       printf( "%x \n", flash->i);
       printf( "%x", &(flash->i));
}
ST的固件库都是按照这种方式编写的
上面程序打印出来结果为:   0
                         0x0012ff60
例如GPIOA口来说吧,在stm32f10x.h定义如下:
#define PERIPH_BASE            ((uint32_t)0x40000000)
#define  APB1PERIPH_BASE                 PERIPH_BASE
#define APB2PERIPH_BASE     (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE       (PERIPH_BASE + 0x20000)
#define GPIOA_BASE             (APB2PERIPH_BASE + 0x0800)
有了地址之后,如何定义GPIOA的各个寄存器地址,它们是控制IO的关键所在。GPIO的各个寄存器都是连续排列的,为什么要连续排呢,方便找啊,用结构体就能很好搞定了
stm32f10x.h定义如下:
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;
每个寄存器都是32位的,所以很方便用结构体寻找每个寄存器,准备工作都做好了,接下来就要开始针对GPIOA设置了
core_cm3.c
#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
把地址强制转换成结构体指针,这样就能很方便对寄存器操作。寄存器搞定了,接下来就真对用户操作了,要很好的让用户使用,就得人性话点,所以用enum枚举变量就能实现,你就再也不用为想输入的值去烦恼了,直接输入名称就行了,拿IO口的输出速度来说
typedef enum
{
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表