STM32外设驱动库分析及如何实现_第1页
STM32外设驱动库分析及如何实现_第2页
STM32外设驱动库分析及如何实现_第3页
STM32外设驱动库分析及如何实现_第4页
STM32外设驱动库分析及如何实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WordSTM32外设驱动库分析及如何实现一、如何控制单片机?

(单片机)的内存映射图解析

这里以(STM32)F429(芯片)为例,讲解下单片机芯片内存映射图。从此图中可以看到芯片的外设被分配了512M的空间,然而真正的外设其实没有使用到512M的内存空间。

然后我们操作外设时,只需要操作它对应的内存地址即可。更加详细的外设内存地址,可以参考芯片的用户手册(不是数据手册)的Memorymap章节。

因为单片机是将外设映射到内存地址上,所以我们可以像操作内存一样来操作外设(写/读)。

我们在操作内存时是通过地址来进行操作的,由于单片机已经将外设与内存进行了映射,所以我们在操作单片机外设时只需要操作外设映射的内存地址就行。

内存如何操作?

在(C语言)中操作内存,我们可以用指针来进行操作。在(汇编)语言中由于没有指针这个概念,所以我们在操作地址时只能用一些内存读写指令来完成。比如:LDR,STR

结构体操作与宏定义操作的对比

C语言——宏定义形式

#define

GPIOA

(*(volatile

uint32_t

*)(0x000800E0))#define

GPIOA_DR

(*(volatile

uint32_t

*)(0x000800E4))#define

GPIOA_MR

(*(volatile

uint32_t

*)(0x00080108))#define

GPIOA_TR

(*(volatile

uint32_t

*)(0x00080108))

C语言——结构体操作

struct

GPIOA_Reg{

volatile

uint32_t

dr;

volatile

uint32_t

mr;

volatile

uint32_t

tr;}GPIOA_REG

汇编语言操作内存

LDR

r0,

=0x00800010MOV

r1,

#2STR

r1,

[r0]

二、(寄存器)方式操作单片机

代码结构框架:

文件结构

一个芯片头文件:外设的地址宏定义以及外设相关的结构体定义

查看芯片的用户手册(注意:不是数据手册)中寄存器对应的相应地址。然后使用宏定义来将它们定义好,同时定义好结构体来更加方便的管理外设寄存器组。这里以STM32F1系列为例

一个启动文件:汇编编写的、中断向量表等

用户代码文件:剩余就是用户代码文件了

各个芯片的外设驱动函数编写(读/写、控制)、以及用户逻辑部分代码。

三、使用HAL库方式操作单片机

HAL库与固件库的区别

HAL全称Hardwareabstractlayer((硬件)抽象层),这是一个大家公认并且遵守的一种函数名称命名、资源定义。因为是统一的命名规范,所以当用户更换芯片平台后由于函数命名与所使用的资源都与具体硬件没有关系,这样就不需要修改用户层代码了。

而所谓的标准库其实就是芯片厂商公司内部自己命名与实现的库并且各个厂商的命名规则不一样,这样就会导致可移植性变差。当用户更换了芯片平台后由于它们各自的A(PI)函数不一样就会导致用户需要修改应用层代码。

HAL库设计

1.HAL框架设计

2.HAL资源命名规则

HAL函数命名规则:

中断与(时钟)设置宏:

回调函数命名规则:

3.文件结构:

一个芯片头文件:外设的地址宏定义以及外设相关的结构体定义

查看芯片的用户手册(注意:不是数据手册)中寄存器对应的相应地址。然后使用宏定义来将它们定义好,同时定义好结构体来更加方便的管理外设寄存器组。这里以STM32F1系列为例

一个启动文件:汇编编写的、中断向量表等。

一个HAL库全局头文件:一些全局的宏定义以及包含其他外设头文件

HAL库文件:芯片外设的驱动函数

四、HAL库组成说明

1.HAL库的数据结构体

外设句柄结构体

初始化和配置结构体

特定的处理结构体(读写/控制)

**外设句柄结构体(跟硬件不相关):**

比如:下面这个串口结构体

typedef

struct{

USART_TypeDef

*Instance;

/*

USART

regis(te)(rs)

base

(ad)dress

*/

USART_InitTypeDef

Init;

/*

Usart

communication

pa(ram)eters

*/

uint8_t

*pTxBuffPtr;/*

Pointer

to

Usart

Tx

transfer

Buffer

*/

uint16_t

TxXferSize;

/*

Usart

Tx

Transfer

size

*/

__IO

uint16_t

TxXferCount;/*

Usart

Tx

Transfer

Counter

*/

uint8_t

*pRxBuffPtr;/*

Pointer

to

Usart

Rx

transfer

Buffer

*/

uint16_t

RxXferSize;

/*

Usart

Rx

Transfer

size

*/

__IO

uint16_t

RxXferCount;

/*

Usart

Rx

Transfer

Counter

*/

(DMA)_HandleTypeDef

*hdmatx;

/*

Usart

Tx

DMA

Handle

parameters

*/

DMA_HandleTypeDef

*hdmarx;

/*

Usart

Rx

DMA

Handle

parameters

*/

HAL_LockTypeDef

Lock;

/*

Locking

object

*/

__IO

HAL_USART_StateTypeDef

State;

/*

Usart

communication

state

*/

__IO

HAL_USART_ErrorTypeDef

ErrorCode;/*

USART

Error

code

*/}USART_HandleTypeDef;

初始化结构体(跟硬件相关):

比如:下面这个串口硬件相关的结构体

typedef

struct{

uint32_t

BaudRate;

/*!

特定的处理结构体(跟硬件有关):

比如:下面这个(ADC)处理处理结构体

typedef

struct

{

uint32_t

Channel;

/*!

2.HAL库公共资源

HALStatus:状态枚举

Typedef

enum{HAL_OK

=

0x00,HAL_ERROR

=

0x01,HAL_BUSY

=

0x02,HAL_(TI)MEOUT

=

0x03}

HAL_StatusTypeDef;

HALLocked:用于防止共享资源被意外访问

typedef

enum{HAL_UNLOCKED

=

0x00,

/*!

公共的宏定义:NULL和HAL_MAX_DELAY

#ifndef

NULL#define

NULL

(void

*)

0#endif#define

HAL_MAX_DELAY

0xFFFFFFFF

3.HAL库中断回调函数实现说明

(1)使用__weak定义好回调函数。如果用户自己重写了回调函数,那么编译器就会使用用户重写的这个回调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论