拼搏、奋斗、努力 https://bbs.21ic.com/?579401 [收藏] [复制] [RSS]

日志

STM学习第一篇(不调用库函数编写程序)

已有 558 次阅读2015-6-28 21:52 |个人分类:ARM|系统分类:嵌入式系统| STM32

最近研究生毕业了,离去新单位还有段时日,将家中的STM32开发板又一次翻了出来,准备趁着这段时间再学习下。

看的是一本《stm32从入门到精通》的书,讲的还是挺通透的,书中第一个例子是不利用ST公司的库函数,自己通过改写寄存器来使开发板的led点亮和熄灭的例子,自己也照着这个例子大概的写了写,当然笔者的开发板与书中的不尽相同,原理相近。把理解这个例子中的部分难点写出来,方便自己日后查看。
(1)
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;
程序中定义GPIOD的地址(无需定义结构体内寄存器地址)
此段结构体的编写,完全按照了GPIO内寄存器的编写顺序,GPIOD->CRH

用mdk自带的仿真功能可以看到,CRH的地址变成了0x44444443,这里也无需奇怪,你可以看stm的中文手册,CRH复位地址为0x44444444,其实你定义的GPIOD的地址后,程序汇总添加了stm32f10x.s后,会自动根据结构体中的位置给寄存器赋予相应的地址,这部分还应该认真了解。

(2)

typedef struct
{
_IO uint32_t CR;
_IO uint32_t CFGR;
_IO uint32_t CIR;
_IO uint32_t APB2RSTR;
_IO uint32_t APB1RSTR;
_IO uint32_t AHBENR;
_IO uint32_t APB2ENR;
_IO uint32_t APB1ENR;
_IO uint32_t BDCR;
_IO uint32_t CSR;

}RCC_TypeDef;

RCC->APB2ENR|=RCC_APB2Periph_GPIOD;

这句程序第一个问题中类似,其实就是开启GPIOD时钟。

(3)

GPIOD->CRH&=0xFFFFFFF0;
GPIOD->CRH|=0x00000003;

设置GPIOD中第8个引脚的工作方式。

大概将程序中部分不易理解的部分写了出来


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)