寄存器和库函数.doc
寄存器的基础知识
寄存器的基础知识什么是寄存器?寄存器(Register)是计算机中一种用来存储和操作数据的硬件元件。
它由一组存储单元组成,每个存储单元可以存储一个固定大小的数据。
寄存器在计算机中扮演着重要的角色,可以存储算术运算的操作数、控制信号、地址信息等。
寄存器的分类根据功能和使用方式,寄存器可以分为以下几种类型:通用寄存器通用寄存器(General Purpose Register)是最常见的寄存器类型,其用途十分广泛。
它们用来存储临时数据、变量、函数参数等。
通用寄存器通常具有较小的存储容量,例如x86架构中的EAX、EBX、ECX和EDX寄存器,每个寄存器都有32位大小。
累加寄存器累加寄存器(Accumulator Register)主要用于执行算术和逻辑运算。
它是一种特殊的通用寄存器,在运算过程中存储中间结果和最终结果。
累加寄存器在某些指令集架构中有特殊优化,因此在一些特定的计算任务中性能更好。
状态寄存器状态寄存器(Flag Register)用于存储处理器的运行状态和标志位。
例如,它可以存储条件运算的结果,比如是否相等、是否溢出等。
状态寄存器通常由多个二进制位组成,每个位上的值表示某一种状态。
通过读取和设置状态寄存器的位,程序可以获得有关处理器的各种信息。
指令指针寄存器指令指针寄存器(Instruction Pointer Register)存储下一条将要执行的指令的内存地址。
在程序执行过程中,处理器会不断读取指令指针寄存器中的值,并自动递增以指向下一条指令。
指令指针寄存器的值可以由程序员修改,以实现跳转、函数调用等操作。
寄存器的操作寄存器在计算机中起到存储和操作数据的作用,它可以执行多种操作,包括读取、写入、清零等。
寄存器与其他存储器件(如内存)相比,读取和写入速度更快,但容量较小。
寄存器的操作可以通过特定的指令来完成,这些指令通常是处理器指令集中的一部分。
下面是一些常见的寄存器操作:1.读取寄存器:通过读取指令将寄存器的值加载到处理器的内部寄存器中,以供后续指令使用。
EXTI 库函数
外部中断/事件控制器(EXTI)EXTI 库函数函数名描述EXTI_DeInit 将外设E XTI 寄存器重设为缺省值EXTI_Init 根据E XTI_InitStruct 中指定的参数初始化外设E XTI 寄存器EXTI_StructInit 把E XTI_InitStruct 中的每一个参数按缺省值填入EXTI_GenerateSWInterrupt 产生一个软件中断EXTI_GetFlagStatus 检查指定的 EXTI 线路标志位设置与否EXTI_GetITStatus 检查指定的 EXTI 线路触发请求发生与否EXTI_ClearFlag 清除 EXTI 线路中断标志位在stm32f10x_exti.c中EXTI_ClearITPendingBit 清除E XTI 线路中断标志位这两个函数是一样的,功能相同EXTI_Line 值。
EXTI_Line 选择了待使能或者失能的外部线路。
EXTI_Line 描述EXTI_Line0 外部中断线0EXTI_Line1 外部中断线1EXTI_Line2 外部中断线2EXTI_Line3 外部中断线3EXTI_Line4 外部中断线4EXTI_Line5 外部中断线5EXTI_Line6 外部中断线6EXTI_Line7 外部中断线7EXTI_Line8 外部中断线8EXTI_Line9 外部中断线9EXTI_Line10 外部中断线10EXTI_Line11 外部中断线11EXTI_Line12 外部中断线12EXTI_Line13 外部中断线13EXTI_Line14 外部中断线14EXTI_Line15 外部中断线15EXTI_Line16 外部中断线16EXTI_Line17 外部中断线17EXTI_Line18 外部中断线18函数E XTI_GetITStatus函数名EXTI_GetITStatus函数原形ITStatus EXTI_GetITStatus(u32 EXTI_Line)功能描述检查指定的E XTI 线路触发请求发生与否输入参数EXTI_Line:待检查E XTI 线路的挂起位参阅S ection:EXTI_Line 查阅更多该参数允许取值范围输出参数无返回值EXTI_Line 的新状态(SET 或者R ESET)先决条件无被调用函数无例:/* Get the status of EXTI line 8 */ITStatus EXTIStatus;EXTIStatus = EXTI_GetITStatus(EXTI_Line8);EXTI_ClearITPendingBit函数名EXTI_ClearITPendingBit函数原形void EXTI_ClearITPendingBit(u32 EXTI_Line)功能描述清除E XTI 线路挂起位输入参数EXTI_Line:待清除E XTI 线路的挂起位参阅S ection:EXTI_Line 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无例:/* Clears the EXTI line 2 interrupt pending bit */EXTI_ClearITpendingBit(EXTI_Line2);函数E XTI_Init函数名EXTI_Init函数原形void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)功能描述根据E XTI_InitStruct 中指定的参数初始化外设E XTI 寄存器输入参数EXTI_InitStruct:指向结构E XTI_InitTypeDef 的指针,包含了外设E XTI 的配置信息参阅S ection:EXTI_InitTypeDef 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无EXTI_InitTypeDef 定义于文件“stm32f10x_exti.h”:typedef struct{u32 EXTI_Line;EXTIMode_TypeDef EXTI_Mode;EXTIrigger_TypeDef EXTI_Trigger;FunctionalState EXTI_LineCmd;} EXTI_InitTypeDef;EXTI_Mode 值:EXTI_Mode 设置了被使能线路的模式。
GPIO库函数
通用输入/输出(GPIO)GPIO寄存器结构:GPIO_TypeDef和AFIO_TypeDef,在文件“stm32f10x_map.h”中定义如下:typedef struct{vu32CRL;vu32CRH;vu32IDR;vu32ODR;vu32BSRR;vu32BRR; vu32LCKR;}GPIO_TypeDef;typedef struct{vu32EVCR;vu32MAPR;vu32EXTICR[4];}AFIO_TypeDef;GPIO库函数1、函数GPIO_DeInit功能描述:将外设GPIOx寄存器重设为缺省值例:GPIO_DeInit(GPIOA);2、函数GPIO_AFIODeInit功能描述:将复用功能(重映射事件控制和EXTI设置)重设为缺省值例:GPIO_AFIODeInit();3、函数GPIO_Init功能描述:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器例:GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GP IO_InitStructure);GPIO_InitTypeDef structureGPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”:typedef struct{u16GPIO_Pin;GPIOSpeed_TypeDef GPIO_Speed;GPIOMode_TypeDef GPIO_Mode;}GPIO_InitTypeDef;GPIO_Pin该参数选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚。
寄存器OR函数库对比
首先,两个都是C语言。
从51过渡过来的话,就先说寄存器操作。
每个MCU都有自己的寄存器,51是功能比较简单的一种,相应的寄存器也比较少,我们常用的就那么几个,像P0 P1 SMOD TMOD之类的,这些存在于标准头文件reg.h里面,因为少,所以大家就直接这么去操作了,每一位对应的意义随便翻一下手册就看得到,甚至做几个小项目就记的很清楚了。
所以做51开发的时候大多数都是直接操作寄存器。
到了STM32,原理一样,也是有自己的寄存器,但是作为一款ARM 内核的芯片,功能多了非常多,寄存器自然也就多了很多,STM32的手册有一千多页,这时候想去像51那样记住每个寄存器已经不现实了,所以ST的工程师就给大家提供了库函数这么一个东西。
这是个神器。
库函数里面把STM32的所有寄存器用结构体一一对应并且封装起来,而且提供了基本的配置函数。
我们要去操作配置某个外设的时候不需要再去翻眼花缭乱的数据手册,直接找到库函数描述拿来就可以用,这样就能把精力放在逻辑代码的开发上,而不是去费力的研究一个芯片的外设要怎么配置寄存器才能驱动起来。
简单讲就是这些了,库函数是为了让开发者从大量繁琐的寄存器操作中脱离出来的一个文件包,在使用一个外设的时候让开发者直接去调用相应的驱动函数而不是自己去翻手册一个一个配置寄存器。
有人说用库函数掌握不到芯片的精髓,见仁见智了。
熟悉一款芯片是在不断的开发使用中逐渐了解并掌握的,调试的过程中会遇到很多问
题,会要求我们去跟踪相关寄存器的状态,在整个框架都已经建立起来的基础上再去对照手册做具体到寄存器每一位的分析,代码对照现象,很快就能积累起来经验,祝成功。
第三章-通用并行结构GPIO
至片上外设
模拟输入 复用功能输入
读出
4
位
设
写入
/
置
清
除
寄
存
器
读/写
输
入
数
据
寄 存
3
器
输 出
数 据 寄
存 器
来自片上外设
复用功能输出
开关
VDD 开关
2 TTL肖特基 触发器 输入驱动器
开关 VSS
输出驱动器
VDD
输出 控制
P-MOS N-MOS
VSS
下拉电阻
VDD
1
保护二 (FT) 极管
I/O引脚
保护二 极管
第一节 GPIO结构及寄存器
1.1 GPIO基本结构及工作方式 ● 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态 ● 在推挽式模式时,对输出数据寄存器的读访问得到后一次写的值。
开启状态
至片上外设
模拟输入 复用功能输入
读出
7
位
设
写入
/
置
清
除
寄
存
器
读/写
输
入
数
据
寄 存
6
器
输 出 数 据 寄 存 器
I/O引脚
保护二 极管
VSS
第一节 GPIO结构及寄存器
1.1 GPIO基本结构及工作方式
6.推挽输出模式 (GPIO_Mode_Out_PP) 图 1-7 为 推 挽 输 出 模 式 (GPIO_Mode_Out_PP)。推挽输出 模式下,通过设置位设置/清除寄 存器或者输出数据寄存器的值,途 经P-MOS管和N-MOS管,最终输出到 I/O端口。这里要注意P-MOS管和NMOS管,当设置输出的值为高电平 的时候,P-MOS管处于开启状态, N-MOS管处于关闭状态,此时I/O端 口的电平就由P-MOS管决定,为高 电平;当设置输出的值为低电平的 时候,P-MOS管处于关闭状态,NMOS管处于开启状态,此时I/O端口
STM32F10x_SPI与I2S
SPI与I2S库函数。
Table.0-2 库函数列表串行外设接口(SPI)提供与外部设备进行同步串行通讯的功能。
接口可以被设置工作在主模式或者从模式。
/*【01】函数SPI_I2S_DeInit******************************************************************************* Function Name : SPI_I2S_DeInit* Description : Deinitializes the SPIx peripheral registers to their default* reset values (Affects also the I2Ss).* Input : - SPIx: where x can be 1, 2 or 3 to select the SPI peripheral.* Output : None* Return : None*******************************************************************************/void SPI_I2S_DeInit(SPI_TypeDef* SPIx){/* Check the parameters */assert_param(IS_SPI_ALL_PERIPH(SPIx));switch (*(u32*)&SPIx){case SPI1_BASE:/* Enable SPI1 reset state */RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);/* Release SPI1 from reset state */RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, DISABLE);break;case SPI2_BASE://I2S只有I2S2、I2S3,分别对应SPI2、SPI3。
stm32寄存器写法
STM32是一种常见的微控制器,其寄存器地址和功能由其ARM Cortex-M内核定义。
下面是一些常见的STM32寄存器操作的方法:
1.直接操作寄存器:这种方法需要直接操作特定的寄存器地址,例如:
__asm("MOV R0, #0"); // 将值0写入寄存器R0
2.使用标准C库函数:STM32提供了许多标准C库函数,可以方便地操作寄
存器,例如:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 将GPIOA的第0位设置为低电平
3.使用HAL库函数:STM32 HAL库提供了一组函数,可以方便地操作寄存
器,例如:
HAL_Delay(1000); // 延时1000毫秒
4.使用标准外设库函数:STM32标准外设库函数可以方便地操作寄存器,例
如:
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的第0位为输出模式
以上是一些常见的STM32寄存器操作方法,具体使用哪种方法取决于具体的项目需求和开发环境。
C语言中KeilC51库函数大全
C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。
第一节本征库函数(i n t r i n s i c r o u t i n es)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL 和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。
C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_:相当于插入NOP_testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。
_chkfloat_:测试并返回源点数状态。
使用时,必须包含#inclucle <>一行。
如不说明,下面谈到的库函数均指非本征库函数。
第二节几类重要库函数1. 专用寄存器include文件例如8031、8051均为其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。
2. 绝对地址include文件该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。
3. 动态内存分配函数,位于中4. 缓冲区处理函数位于“”中其中包括拷贝比较移动等函数如:memccpy memchr memcmp memcpy memmove memset这样很方便地对缓冲区进行处理。
5. 输入输出流函数,位于“”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的及源文件,然后在库中替换它们即可。
第三节K ei l C51库函数原型列表1.bit isalnum(char c);bit isalpha(char c);bit iscntrl(char c);bit isdigit(char c);bit isgraph(char c);bit islower(char c);bit isprint(char c);bit ispunct(char c);bit isspace(char c);bit isupper(char c);bit isxdigit(char c);bit toascii(char c);bit toint(char c);char tolower(char c);char __tolower(char c);char toupper(char c);char __toupper(char c);2.unsigned char _crol_(unsigned char c,unsigned char b);unsigned char _cror_(unsigned char c,unsigned char b);unsigned char _chkfloat_(float ual);unsigned int _irol_(unsigned int i,unsigned char b);unsigned int _iror_(unsigned int i,unsigned char b);unsigned long _irol_(unsigned long l,unsigned char b);unsigned long _iror_(unsigned long L,unsigned char b);void _nop_(void);bit _testbit_(bit b);3.char getchar(void);char _getkey(void);char *gets(char * string,int len);int printf(const char * fmtstr[,argument]…);char putchar(char c);int puts (const char * string);int scanf(const char * fmtstr.[,argument]…);int sprintf(char * buffer,const char *fmtstr[;argument]);int sscanf(char *buffer,const char * fmtstr[,argument]);char ungetchar(char c);void vprintf (const char *fmtstr,char * argptr);void vsprintf(char *buffer,const char * fmtstr,char * argptr);4.float atof(void * string);int atoi(void * string);long atol(void * string);void * calloc(unsigned int num,unsigned int len);void free(void xdata *p);void init_mempool(void *data *p,unsigned int size);void *malloc (unsigned int size);int rand(void);void *realloc (void xdata *p,unsigned int size);void srand (int seed);5.void *memccpy (void *dest,void *src,char c,int len);void *memchr (void *buf,char c,int len);char memcmp(void *buf1,void *buf2,int len);void *memcopy (void *dest,void *SRC,int len);void *memmove (void *dest,void *src,int len);void *memset (void *buf,char c,int len);char *strcat (char *dest,char *src);char *strchr (const char *string,char c);char strcmp (char *string1,char *string2);char *strcpy (char *dest,char *src);int strcspn(char *src,char * set);int strlen (char *src);char *strncat (char 8dest,char *src,int len);char strncmp(char *string1,char *string2,int len);char strncpy (char *dest,char *src,int len);char *strpbrk (char *string,char *set);int strpos (const char *string,char c);char *strrchr (const char *string,char c);char *strrpbrk (char *string,char *set);int strrpos (const char *string,char c);int strspn(char *string,char *set);系统分类:用户分类:标签:无标签来源:整理阅读全文(121) | 回复(0)发表于2009/6/23 13:41:24Hello位于\C51\excmples\Hello\目录,其功能是向串口输出“Hello,world”整个程序如下:#pragma DB OE CD#indule <>#include<>void main(void){SCOn=0x50;TMOD=0x20TH1=0xf3;Tri=1;TI=1;printf(“Hello,world \n”);while(1) { }}第一节u V i s i o n f o r W i n d o w s的使用步骤(1) file_new新建一个文件,输入如上内容或直接用目录下源文件。
C语言操作硬件设备
C语言操作硬件设备C语言是一种广泛应用于嵌入式系统开发、驱动程序编写以及底层硬件操作的编程语言。
通过C语言的强大功能和直接的硬件访问能力,开发者可以利用它来操作各种硬件设备,如传感器、执行器、嵌入式控制器等。
本文将介绍C语言操作硬件设备的基本原理和常用方法。
一、硬件设备的基本概念在开始讲解C语言操作硬件设备之前,首先需要了解一些与硬件设备相关的基本概念。
1.1 寄存器寄存器是一种用于存储和操作数据的特殊硬件设备。
在计算机系统中,寄存器是最快的存储器,并且通常直接与CPU相关联。
通过读写寄存器,我们可以与硬件设备进行数据交互。
1.2 端口端口是一种物理接口,用于将计算机与外部硬件设备连接起来。
通过读写端口,我们可以与外设进行通信和控制。
1.3 中断中断是一种机制,用于在硬件设备需要与CPU通信时通知CPU进行响应。
通过中断,我们可以实现实时的硬件设备响应和数据处理。
二、基于C语言的硬件操作方法C语言提供了一系列标准库函数和语法,使得开发者能够直接访问和控制硬件设备。
2.1 使用指针操作寄存器通过定义指针变量,我们可以将地址与寄存器相关联,从而实现对寄存器的操作。
例如,通过指针变量可以读取寄存器中的值,并将特定数据写入寄存器。
2.2 调用库函数操作端口C语言提供了一些库函数,可以直接操作端口。
例如,通过调用outportb函数,可以向特定的端口输出数据。
2.3 处理中断C语言提供了中断处理函数,可以实现硬件中断的响应。
通过编写中断处理函数,我们可以在硬件设备触发中断时进行相应的处理操作。
三、实例:使用C语言操作LED灯为了更好地理解C语言操作硬件设备的方法,下面以操作一个LED 灯为例,介绍在嵌入式系统中如何使用C语言来控制硬件设备。
3.1 硬件连接首先,将LED灯与嵌入式控制器的某个GPIO引脚连接起来。
GPIO引脚是一种通用输入输出引脚,可以用于连接各种外设。
3.2 初始化引脚在程序开始时,我们需要初始化GPIO引脚,以配置引脚的输出模式和初始电平状态。
寄存器
寄存器百科名片32位CPU的寄存器结构寄存器是中央处理器内的组成部分。
寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。
在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
目录寄存器定义寄存器特点工作原理寄存器用途寄存器分类18086的寄存器指令指针IP(Instruction Pointer)1标志寄存器FR(Flag Register)1段寄存器(Segment Register)180386寄存器通用寄存器1用作内存指针的特殊寄存器1段选择器1指令指针寄存器1其他寄存器展开编辑本段寄存器定义寄存器英文名称:Register寄存器寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。
寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个“8 位元寄存器”或“32 位元寄存器”。
寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。
寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。
更适当的是称他们为“架构寄存器”。
例如,x86 指令集定义八个32 位元寄存器的集合,但一个实作x86 指令集的CPU 可以包含比八个更多的寄存器。
寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
编辑本段寄存器特点寄存器又分为内部寄存器与外部寄存器,所谓内部寄存器,其实也是一些小的存储单元,也能存储数据。
但同存储器相比,寄存器又有自己独有的特点:①寄存器位于CPU内部,数量很少,仅十四个;②寄存器所能存储的数据不一定是8bit,有一些寄存器可以存储16bit数据,对于386/486处理器中的一些寄存器则能存储32bit数据;③每个内部寄存器都有一个名字,而没有类似存储器的地址编号。
stm32库函数部分解释
库函数简介一、通用输入/输出(GPIO)--------------------------------------------------------------------------------------------3二、外部中断/事件控制器(EXTI)-----------------------------------------------------------------------------------7三、通用定时器(TIM)-------------------------------------------------------------------------------------------------9四:ADC寄存器------------------------------------------------------------------------25 五:备份寄存器(BKP)-------------------------------------------------------------------------------------------------33六、DMA控制器(DMA)---------------------------------------------------------------37七、复位和时钟设置(RCC)------------------------------------------------------------------------------------------41八、嵌套向量中断控制器(NVIC)-----------------------------------------------------------------------------------49命名规则在函数名中,只允许存在一个下划线,用以分隔外设缩写和函数名的其它部分。
汇编寄存器功能详解
汇编寄存器功能详解汇编语言是一种底层语言,与计算机硬件直接交互。
在汇编语言中,寄存器是一组特殊的存储单元,用于暂时存储数据或指令。
它们在处理器中的位置较为接近,可以快速访问。
在汇编语言中,寄存器被分为通用寄存器、数据段寄存器、指令指针寄存器、标志寄存器等几个类别,每个寄存器都有特定的功能。
一、通用寄存器通用寄存器是CPU中最常见的寄存器,用于存放临时数据和计算的结果。
通用寄存器是命名的,有固定的用途,分别是AX(累加寄存器)、BX(基址寄存器)、CX(计数寄存器)、DX(数据寄存器)、SI(源变址寄存器)、DI(目的变址寄存器)、SP(堆栈指针寄存器)和BP(基址指针寄存器)。
1. AX寄存器(Accumulator Register):是累加器寄存器,用于存放算术和逻辑运算的结果。
在一些特定指令中,它还可以充当乘法或除法运算的除数或被除数。
2. BX寄存器(Base Register):是基址寄存器,通常用于存放数据内存的基址。
它也可以充当累加器或存放地址偏移量的累加器。
3. CX寄存器(Count Register):是计数寄存器,在一些循环指令中用于记录循环迭代的次数。
此外,它还可以充当数据传输或移位指令的位数计数器。
4. DX寄存器(Data Register):是数据寄存器,通常用于存放数据操作的源数据或目标数据。
它也可以存放除法运算的余数或乘法运算的高位结果。
5. SI寄存器(Source Index Register):是源变址寄存器,用于存放源数据的偏移地址。
在字符串或数组的操作中,它通常与DI寄存器共同使用。
6. DI寄存器(Destination Index Register):是目的变址寄存器,用于存放目标数据的偏移地址。
在字符串或数组的操作中,它通常与SI寄存器共同使用。
7. SP寄存器(Stack Pointer Register):是堆栈指针寄存器,用于指向栈顶位置。
RTC-BKP-PWR库函数
备份寄存器(BKP)备份寄存器由10 个16 位寄存器组成,可用来存储20 个字节的用户应用程序数据。
他们处在备份域里,当V DD 电源被切断,他们仍然由V BAT 维持供电。
当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。
此外,BKP 控制寄存器用来管理侵入检测和R TC 校准功能。
BKP 库函数函数名描述BKP_DeInit 将外设B KP 的全部寄存器重设为缺省值BKP_TamperPinLevelConfig 设置侵入检测管脚的有效电平BKP_TamperPinCmd 使能或者失能管脚的侵入检测功能BKP_ITConfig 使能或者失能侵入检测中断BKP_RTCOutputConfig 选择在侵入检测管脚上输出的R TC 时钟源BKP_SetRTCCalibrationValue 设置R TC 时钟校准值BKP_WriteBackupRegister 向指定的后备寄存器中写入用户程序数据BKP_ReadBackupRegister 从指定的后备寄存器中读出数据BKP_GetFlagStatus 检查侵入检测管脚事件的标志位被设置与否BKP_ClearFlag 清除侵入检测管脚事件的待处理标志位BKP_GetITStatus 检查侵入检测中断发生与否BKP_ClearITPendingBit 清除侵侵入检测中断的待处理位函数B KP_ReadBackupRegister函数名BKP_ReadBackupRegister函数原形u16 BKP_ReadBackupRegister(u16 BKP_DR)功能描述从指定的后备寄存器中读出数据输入参数BKP_DR:数据后备寄存器参阅S ection:BKP_DR 查阅更多该参数允许取值范围输出参数无返回值指定的后备寄存器中的数据先决条件无被调用函数无BKP_DR 值BKP_DR 描述BKP_DR1 选中数据后备寄存器1BKP_DR2 选中数据后备寄存器2BKP_DR3 选中数据后备寄存器3BKP_DR4 选中数据后备寄存器4BKP_DR5 选中数据后备寄存器5BKP_DR6 选中数据后备寄存器6BKP_DR7 选中数据后备寄存器7BKP_DR8 选中数据后备寄存器8BKP_DR9 选中数据后备寄存器9BKP_DR10 选中数据后备寄存器10例:u16 Data;Data = BKP_ReadBackupRegister(BKP_DR1);功耗控制(PWR)PWR 有多种用途,包括功耗管理和低功耗模式选择。
gd32f103库函数介绍
gd32f103库函数介绍GD32F103系列是中国独立研发的一款ARM Cortex-M3内核的32位微控制器芯片,该系列芯片广泛应用于工业控制、通信设备、消费电子等领域。
为了方便开发者使用GD32F103系列芯片,官方提供了一套完善的库函数。
库函数是一种封装了芯片底层操作的高层函数,开发者可以直接调用库函数来完成各种功能,而不需要关心底层寄存器和时序等细节。
GD32F103库函数提供了丰富的功能,包括GPIO操作、定时器控制、中断处理、串口通信、SPI、I2C、ADC、DAC等功能。
首先,GD32F103库函数提供了GPIO操作的相关函数。
开发者可以使用这些函数来配置GPIO引脚的输入/输出方向、上拉/下拉电阻、引脚状态等。
例如,可以使用库函数将某个引脚配置为输出,并设置引脚的输出电平。
这样,开发者可以方便地控制外部设备,如LED灯、蜂鸣器等。
其次,GD32F103库函数还提供了定时器的控制函数。
开发者可以使用定时器函数来设定定时器的工作模式、重载值、计数模式等参数。
通过库函数,开发者可以轻松地实现各种定时器功能,如定时中断、PWM输出等。
GD32F103库函数还提供了中断处理相关的函数。
开发者可以使用这些函数来配置中断向量表、使能/禁止中断、设置中断优先级等。
通过库函数,开发者可以很方便地实现中断处理程序,提高系统的响应能力。
串口通信是嵌入式系统中常用的通信方式,GD32F103库函数提供了丰富的串口通信函数。
开发者可以使用这些函数来配置串口的波特率、数据位数、停止位数、校验位等参数。
通过库函数,开发者可以实现串口数据的发送和接收,并进行相应的错误处理。
此外,GD32F103库函数还提供了SPI和I2C的相关函数。
开发者可以使用这些函数来配置SPI和I2C接口的工作模式、速度、数据位数、传输方向等参数。
通过库函数,开发者可以轻松地实现SPI和I2C设备的控制和数据传输。
GD32F103库函数还包括ADC和DAC相关的函数。
stm32l0标准库函数
stm32l0标准库函数STM32L0系列微控制器是广泛应用于嵌入式系统的芯片,其标准库函数提供了丰富的功能和接口,用于读取、写入和操作硬件资源。
本文将介绍STM32L0标准库函数的基本概念、常见函数以及使用方法。
一、标准库函数概述STM32L0标准库函数是一组预先编写好的函数,用于操作STM32L0微控制器的硬件资源,如GPIO、USART、ADC等。
这些函数提供了标准的接口和参数,方便开发者快速上手并实现各种功能。
标准库函数通常由STM32官方提供,并经过严格测试,以确保其可靠性和稳定性。
二、常见标准库函数1.GPIO函数:用于控制GPIO口的状态,如设置输出模式、读取输入状态等。
常见的GPIO函数包括GPIO_WriteBit、GPIO_ReadInputData等。
ART函数:用于串口通信,实现设备之间的数据传输。
常见的USART函数包括USART_SendData、USART_ReceiveData等。
3.ADC函数:用于模拟信号的采集和转换,通常用于测量温度、压力等参数。
常见的ADC函数包括ADC_StartConversion、ADC_GetConversionValue等。
除此之外,STM32L0标准库还提供了其他一些常用函数,如PWM 生成器、定时器等。
这些函数的使用方法大同小异,只需根据具体的硬件资源和需求进行适当的配置即可。
三、使用标准库函数在使用STM32L0标准库函数时,需要先了解所使用的硬件资源和相关寄存器。
然后,根据标准库函数的参数和返回值进行调用,通常需要传入相应的硬件地址和参数值。
在完成操作后,需要调用相应的清理函数或释放资源,以确保系统的稳定性和安全性。
以下是一个简单的示例代码,演示如何使用STM32L0标准库函数实现串口通信:```c#include"stm32l0xx.h"voidmain(){//配置USART参数USART_InitTypeDefUSART_InitStructure;USART_ART_BaudRate=9600;USART_ART_WordLength=USART_WordLength_8b;USART_ART_StopBits=USART_StopBits_1;USART_ART_Parity=USART_Parity_No;USART_ART_HardwareFlowControl=USART_Hardw areFlowControl_None;USART_ART_Mode=USART_Mode_Rx|USART_Mode_T x;USART_Init(USART1,&USART_InitStructure);//发送数据USART_SendData(USART1,'H');while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));//等待发送完成//接收数据并处理while(USART_GetFlagStatus(USART1,USART_FLAG_RXF)==RESET); //等待接收数据uint8_treceivedData=USART_ReceiveData(USART1);//读取接收到的数据//处理接收到的数据...}```以上示例代码中,我们使用了STM32L0标准库中的USART函数来实现串口通信。
寄存器和库函数的操作
寄存器和库函数的操作寄存器的使⽤寄存器位操作(1) 清零,&= ~( 对应位 );原理:x & 1 = x;x & 0 = 0(2) 置⼀,|= ( 对应位 );原理:x | 1 = 1;x | 0 = x(3) 取反,^= ( 对应位 );原理:x ^ 1 = ~x;x | 0 = x寄存器位取反:可以将GPIO的 “ 端⼝位” 的状态反转,0 => 1; 1 => 0IO⼝状态反转:1、需要输出 0/12、需要反转时,寄存器ODR ^= ( )如何操作STM32的寄存器例如:#define _GPIOB_BASE 0X40010C00 //从⼿册中找到GPIOB的基地址#define GPIOB_CRL (*(unsigned int *)(_GPIOB_BASE + 0X00))#define GPIOB_CRH (*(unsigned int *)(_GPIOB_BASE + 0X04))#define GPIOB_IDR (*(unsigned int *)(_GPIOB_BASE + 0X08))#define GPIOB_ODR (*(unsigned int *)(_GPIOB_BASE + 0X0C))//(_GPIOB_BASE + 0X00),获取寄存器的“地址值”//(unsigned int *)(_GPIOB_BASE + 0X00),将该 “地址值” 转换为32位的 “指针” 类型//*(unsigned int *)(_GPIOB_BASE + 0X0C),*解指针,操作对应地址的 “内容”配置代码://配置 GPIOB5 为推挽输出RCC->APB2ENR |= (0x1<<3); //开启PB时钟GPIOB_CRL &= ~(0xF<<20);GPIOB_CRL |= (0x3<<20); //推挽输出GPIOB_ODR |= (0x1<<5); //PB5=1#define LED0_PORT GPIOB#define LED0_PIN 5#define LED1_PORT GPIOE#define LED1_PIN 5#define Led_On(port, pin) (port->ODR &= ~(0x1<<pin))#define Led_Off(port, pin) (port->ODR |= (0x1<<pin))#define Led_Toggle(port, pin) (port->ODR ^= (0x1<<pin))// Toggle/ˈtɒɡl/ v.切换, n.开关将GPIO的端⼝位的状态反转标准库函数怎么添加inc⽂件:是标准外设库函数的.h (声明) ⽂件。
第5章-STM32单片机应用基础与项目实践-微课版-屈微-清华大学出版社
API
函数、宏封装 配置寄存器
驱动层
直接配置寄存器
特殊寄存器层
(a)库开发方式
(b) 直接配置寄存器方式
图5.1 STM32的两种开发方式
• 对比STM32的两种开发方式,库函数操作简单,但是效率不如寄 存器操作的高;寄存器操作要熟悉上百个寄存器,很复杂,但是
程序效率很高。本书的实验中,将以库函数编程为主要开发方式,
• (3)STM32F10x_StdPeriph_Driver 放的是 STM32F1标准外设固件库源码文件和对应 的是s头tm文3件2f1。0xin_cpp目p.录c 格存式放的的固是件st库m3源2f码10文x_件pp。p.h每头一文个件.c,文无件需和改一动个。相src应目的录.h下文面件放对的应。
5.4 实训一 MDK5下 STM32的程序开发
• 操作详见视频演示 • 内容参考教材及工程文件
5.5 本章小结
• 本章是STM32开发的基础,主要讲述了MDK5下如何进行STM32工 程的创建、编译以及程序的烧录,简单介绍了STM32库函数和寄 存器编程的思想,并通过实训项目加深读者的印象。在STM32的 编程中,C语言发挥着独特的优势,所以熟练掌握C语言有利于 STM32单片机的编程。
• (4)Project 文件夹:STM32F10x_StdPeriph_Examples 文件夹中存放的是 ST 官方提 供的固件实例源码,STM32F10x_StdPeriph_Template 文件夹中存放的是工程模板。
• (5)Utilities 文件下就是官方评估板的一些对应源码。 • (6)stm32f10x_stdperiph_lib_um.chm 文件是固件库的帮助文档,主要讲的是如何
5.3 STM32固件库简介
stm32g431例程 库函数版本
stm32g431例程库函数版本STM32G431是STMicroelectronics推出的一款高性能Arm Cortex-M4微控制器,集成了丰富的外设和存储器,并支持丰富的接口,广泛应用于工业自动化、消费电子、医疗设备等领域。
库函数是ST提供的一套用于编程STM32微控制器的函数库,简化了开发者的工作,提高了开发效率。
1. 硬件抽象层(HAL)函数:库函数的核心部分是HAL库,它提供了一组与硬件相关的函数,可以调用这些函数来控制STM32G431上的外设。
例如,使用HAL_GPIO_Init()函数可以初始化GPIO外设,使用HAL_GPIO_TogglePin()函数可以翻转GPIO引脚的电平。
2. 中间件函数:STM32G431库函数还提供了一些中间件函数,用于支持常见的通信协议和功能,如USB、CAN、SPI、I2C 等。
例如,使用HAL_CAN_Receive()函数可以接收CAN总线上的数据,使用HAL_I2C_Master_Transmit()函数可以向I2C设备发送数据。
3. 存储器控制函数:库函数还提供了用于控制存储器的函数,如Flash存储器的编程和擦除。
例如,使用HAL_FLASH_Program()函数可以向Flash存储器编程,使用HAL_FLASH_Erase()函数可以擦除Flash存储器的扇区。
4. 时钟控制函数:STM32G431库函数还提供了一组用于控制时钟的函数,可以配置系统时钟和外设时钟。
例如,使用HAL_RCC_OscConfig()函数可以配置系统时钟源,使用HAL_RCC_ClockConfig()函数可以配置系统时钟频率。
5. 中断控制函数:库函数还提供了一组用于控制中断的函数,可以配置中断优先级和中断回调函数。
例如,使用HAL_NVIC_SetPriority()函数可以设置中断优先级,使用HAL_NVIC_EnableIRQ()函数可以使能中断。
SD库函数讲解
[编辑] SDIO数据结构[编辑] SDIO初始化结构类型定义typedef struct{uint32_t SDIO_ClockEdge; //指定位捕捉的时钟边沿uint32_t SDIO_ClockBypass; //指定是否使能SDIO时钟分频器旁路uint32_t SDIO_ClockPowerSave; //指定当总线空闲时,是否使能SDIO时钟输出uint32_t SDIO_BusWide; //指定SDIO总线宽度uint32_t SDIO_HardwareFlowControl; //指定是否使能SDIO硬件流控制uint8_t SDIO_ClockDiv; //指定SDIO控制器的时钟分频系数(0x00~0xFF) } SDIO_InitTypeDef;/* SDIO_Clock_Edge用于设置NEGEDGE位(SDIO_CLKCR[13]) */#define SDIO_ClockEdge_Rising ((uint32_t)0x00000000) #define SDIO_ClockEdge_Falling ((uint32_t)0x00002000)/* SDIO_ClockBypass用于设置BYPASS位(SDIO_CLKCR[10]) */#define SDIO_ClockBypass_Disable ((uint32_t)0x00000000) #define SDIO_ClockBypass_Enable ((uint32_t)0x00000400)/* SDIO_ClockPowerSave用于设置PWRSAV位(SDIO_CLKCR[9]) */#define SDIO_ClockPowerSave_Disable ((uint32_t)0x00000000) #define SDIO_ClockPowerSave_Enable ((uint32_t)0x00000200)/* SDIO_BusWide用于设置WIDBUS位(SDIO_CLKCR[12:11]) */#define SDIO_BusWide_1b ((uint32_t)0x00000000) #define SDIO_BusWide_4b ((uint32_t)0x00000800) #define SDIO_BusWide_8b ((uint32_t)0x00001000)/* SDIO_HardWareFlowControl用于设置HWFC_EN位(SDIO_CLKCR[14]) */#define SDIO_HardwareFlowControl_Disable ((uint32_t)0x00000000) #define SDIO_HardwareFlowControl_Enable ((uint32_t)0x00004000)/* SDIO_ClockDiv用于设置CLKDIV位(SDIO_CLKCR[7:0]) */[编辑] SDIO命令初始化结构类型定义typedef struct{uint32_t SDIO_Argument; //指定命令参数uint32_t SDIO_CmdIndex; //指定命令索引uint32_t SDIO_Response; //指定响应类型uint32_t SDIO_Wait; //指定是否等待中断请求uint32_t SDIO_CPSM; //指定是否使能命令通道状态机(CPSM)} SDIO_CmdInitTypeDef;/* SDIO_Argument用于设置SDIO_ARG寄存器 *//* SDIO_CmdIndex用于设置CMDINDEX位(SDIO_CMD[5:0]) */#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40)/* SDIO_Response用于设置WAITRESP位(SDIO_CMD[7:6]) */#define SDIO_Response_No ((uint32_t)0x00000000) #define SDIO_Response_Short ((uint32_t)0x00000040) #define SDIO_Response_Long ((uint32_t)0x000000C0)/* SDIO_Wait用于设置WAITPEND和WAITINT位(SDIO_CMD[9:8]) */#define SDIO_Wait_No ((uint32_t)0x00000000) //不等待,允许超时#define SDIO_Wait_IT ((uint32_t)0x00000100) //SDIO等待中断请求#define SDIO_Wait_Pend ((uint32_t)0x00000200) //SDIO等待传输结束/* SDIO_CPSM用于设置CPSMEN位(SDIO_CMD[10]) */#define SDIO_CPSM_Disable ((uint32_t)0x00000000) #define SDIO_CPSM_Enable ((uint32_t)0x00000400) [编辑] SDIO数据初始化结构类型定义typedef struct{uint32_t SDIO_DataTimeOut; //指定数据超时时间uint32_t SDIO_DataLength; //指定待传输的数据字节长度uint32_t SDIO_DataBlockSize; //指定块传输的数据块长度uint32_t SDIO_TransferDir; //指定数据传输方向uint32_t SDIO_TransferMode; //指定数据传输模式uint32_t SDIO_DPSM; //指定是否使能数据通道状态机(DPSM)} SDIO_DataInitTypeDef;/* SDIO_DataTimeOut用于设置SDIO_DTIMER寄存器 *//* SDIO_DataLength用于设置DATALENGTH位(SDIO_DLEN[24:0]) */#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF)/* SDIO_DataBlockSize用于设置DBLOCKSIZE位(SDIO_DCTRL[7:4]) */#define SDIO_DataBlockSize_1b ((uint32_t)0x00000000) #define SDIO_DataBlockSize_2b ((uint32_t)0x00000010) #define SDIO_DataBlockSize_4b ((uint32_t)0x00000020) #define SDIO_DataBlockSize_8b ((uint32_t)0x00000030) #define SDIO_DataBlockSize_16b ((uint32_t)0x00000040) #define SDIO_DataBlockSize_32b ((uint32_t)0x00000050) #define SDIO_DataBlockSize_64b ((uint32_t)0x00000060) #define SDIO_DataBlockSize_128b ((uint32_t)0x00000070) #define SDIO_DataBlockSize_256b ((uint32_t)0x00000080) #define SDIO_DataBlockSize_512b ((uint32_t)0x00000090) #define SDIO_DataBlockSize_1024b ((uint32_t)0x000000A0) #define SDIO_DataBlockSize_2048b ((uint32_t)0x000000B0) #define SDIO_DataBlockSize_4096b ((uint32_t)0x000000C0) #define SDIO_DataBlockSize_8192b ((uint32_t)0x000000D0) #define SDIO_DataBlockSize_16384b ((uint32_t)0x000000E0)/* SDIO_TransferDir用于设置DTDIR位(SDIO_DCTRL[1]) */#define SDIO_TransferDir_ToCard ((uint32_t)0x00000000) #define SDIO_TransferDir_ToSDIO ((uint32_t)0x00000002)/* SDIO_TransferMode用于设置DTMODE位(SDIO_DCTRL[2]) */#define SDIO_TransferMode_Block ((uint32_t)0x00000000) #define SDIO_TransferMode_Stream ((uint32_t)0x00000004)/* SDIO_DPSM用于设置DTEN位(SDIO_DCTRL[0]) */#define SDIO_DPSM_Disable ((uint32_t)0x00000000) #define SDIO_DPSM_Enable ((uint32_t)0x00000001)[编辑] SDIO库函数[编辑] 函数SDIO_Init/*** 功能描述根据SDIO_InitStruct中指定的参数初始化SDIO外设* 输入参数 SDIO_InitStruct: 指向结构SDIO_InitTypeDef的指针,包含了SDIO外设的配置信息* 返回值无*/void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct){uint32_t tmpreg = 0;/* 检查输入参数 */assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass)) ;assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowe rSave));assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_Hard wareFlowControl));/*---------------------------- SDIO CLKCR 配置------------------------*//* 获取 SDIO CLKCR 的值 */tmpreg = SDIO->CLKCR;/* 清除 CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN 位 */tmpreg &= CLKCR_CLEAR_MASK;/* 根据 SDIO_ClockDiv 的值设置 CLKDIV 位 *//* 根据 SDIO_ClockPowerSave 的值设置 PWRSAV 位 *//* 根据 SDIO_ClockBypass 的值设置 BYPASS 位 *//* 根据 SDIO_BusWide 的值设置 WIDBUS 位 *//* 根据 SDIO_ClockEdge 的值设置 NEGEDGE 位 *//* 根据 SDIO_HardwareFlowControl 的值设置 HWFC_EN 位 */tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv |SDIO_InitStruct->SDIO_ClockPowerSave |SDIO_InitStruct->SDIO_ClockBypass |SDIO_InitStruct->SDIO_BusWide |SDIO_InitStruct->SDIO_ClockEdge |SDIO_InitStruct->SDIO_HardwareFlowControl);/* 回写 SDIO CLKCR */SDIO->CLKCR = tmpreg;}[编辑] 函数SDIO_ClockCmd/*** 功能描述使能或失能 SDIO 时钟* 输入参数 NewState:SDIO 时钟的新状态* 该参数可以是:* ENABLE* DISABLE* 返回值无*/void SDIO_ClockCmd(FunctionalState NewState){/* 检查输入参数 */assert_param(IS_FUNCTIONAL_STATE(NewState));/* 根据 NewState 设置或清除 SDIO_CLKCR 的 CLKEN 位 */ *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; }[编辑] 函数SDIO_SetPowerState/*** 功能描述设置控制器的电源状态* 输入参数 SDIO_PowerState:电源状态的新状态* 该参数可以使下列值之一:* SDIO_PowerState_OFF* SDIO_PowerState_ON* 返回值无*/void SDIO_SetPowerState(uint32_t SDIO_PowerState){/* 检查输入参数 */assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));/* 清除当前的电源状态 */SDIO->POWER &= PWR_PWRCTRL_MASK;/* 根据 SDIO_PowerState 关闭或打开SDIO电源 */SDIO->POWER |= SDIO_PowerState;}[编辑] 函数SDIO_GetPowerState/*** 功能描述获取控制器的电源状态* 输入参数无* 返回值控制器的电源状态The returned value can* 该返回值可能是下列值之一:* - 0x00: 电源关闭* - 0x02: 电源启动* - 0x03: 电源打开*/uint32_t SDIO_GetPowerState(void){return (SDIO->POWER & (~PWR_PWRCTRL_MASK));}[编辑] 函数SDIO_ITConfig/*** 功能描述使能或失能SDIO中断* 输入参数 SDIO_IT: 指定待使能或失能的 SDIO 中断源* 该参数可以是下列值之一或任意组合:* SDIO_IT_CCRCFAIL: 已收到命令响应(CRC校验失败)中断* SDIO_IT_DCRCFAIL: 已发送/接收数据块(CRC校验失败)中断* SDIO_IT_CTIMEOUT: 命令响应超时中断* SDIO_IT_DTIMEOUT: 数据超时中断* SDIO_IT_TXUNDERR: 发送 FIFO 下溢错误中断* SDIO_IT_RXOVERR: 接收 FIFO 下溢错误中断* SDIO_IT_CMDREND: 已收到命令响应(CRC校验成功)中断* SDIO_IT_CMDSENT: 已发送命令(不需要响应)中断* SDIO_IT_DATAEND: 数据结束(数据计数器SDIDCOUNT 为0)中断* SDIO_IT_STBITERR: 在宽总线模式下,在所有的数据线号上没有检测到起始位中断* SDIO_IT_DBCKEND: 已发送/接收数据块(CRC校验成功)中断* SDIO_IT_CMDACT: 正在传输命令中断* SDIO_IT_TXACT: 正在发送数据中断* SDIO_IT_RXACT: 正在接收数据中断* SDIO_IT_TXFIFOHE: 发送 FIFO 半空中断* SDIO_IT_RXFIFOHF: 接收 FIFO 半满中断* SDIO_IT_TXFIFOF: 发送 FIFO 满中断* SDIO_IT_RXFIFOF: 接收 FIFO 满中断* SDIO_IT_TXFIFOE: 发送 FIFO 空中断* SDIO_IT_RXFIFOE: 接收 FIFO 空中断* SDIO_IT_TXDAVL: 发送 FIFO 中的数据有效中断 * SDIO_IT_RXDAVL: 接收 FIFO 中的数据有效中断 * SDIO_IT_SDIOIT: 收到 SD I/O 中断中断* SDIO_IT_CEATAEND: CMD61 收到 CE-ATA 命令完成信号中断* 输入参数 NewState: 指定的SDIO中断的新状态* 该参数可以是:* ENABLE* DISABLE* 返回值无*/void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState){/* 检查输入参数 */assert_param(IS_SDIO_IT(SDIO_IT));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* 使能 SDIO 中断 */SDIO->MASK |= SDIO_IT;}else{/* 失能 SDIO 中断 */SDIO->MASK &= ~SDIO_IT;}}[编辑] 函数SDIO_DMACmd/*** 功能描述使能或失能 SDIO DMA 请求* 输入参数 NewState: 选择的 SDIO DMA 请求的新状态* 该参数可以是:* ENABLE* DISABLE* 返回值无*/void SDIO_DMACmd(FunctionalState NewState){/* 检查输入参数 */assert_param(IS_FUNCTIONAL_STATE(NewState));/* 根据 NewState 设置或清除 SDIO_CLKCR 的 DMAEN 位 */*(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState;}[编辑] 函数SDIO_SendCommand/*** 功能描述根据 SDIO_CmdInitStruct 中指定的参数初始化 SDIO 命令,并且发送命令* 输入参数 SDIO_CmdInitStruct:指向结构 SDIO_CmdInitTypeDef 的指针,包含了SDIO命令的配置信息* 返回值无*/void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct){uint32_t tmpreg = 0;/* 检查输入参数 */assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex)); assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response)); assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));/*---------------------------- SDIO 参数寄存器配置------------------------*//* 根据SDIO_Argument的值设置SDIO参数寄存器 */SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;/*---------------------------- SDIO 命令寄存器配置------------------------*//* 获取SDIO命令寄存器的值 */tmpreg = SDIO->CMD;/* 清除 CMDINDEX, WAITRESP, WAITINT, WAITPEND, CPSMEN 位 */tmpreg &= CMD_CLEAR_MASK;/* 根据 SDIO_CmdIndex 的值设置 CMDINDEX 位 *//* 根据 SDIO_Response 的值设置 WAITRESP 位 *//* 根据 SDIO_Wait 的值设置 WAITINT 和 WAITPEND 位 *//* 根据 SDIO_CPSM 的值设置 CPSMEN 位 */tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex |SDIO_CmdInitStruct->SDIO_Response| SDIO_CmdInitStruct->SDIO_Wait |SDIO_CmdInitStruct->SDIO_CPSM;/* 回写SDIO命令寄存器 */SDIO->CMD = tmpreg;}[编辑] 函数SDIO_GetCommandResponse/*** 功能描述返回上一个收到响应的命令的命令索引* 输入参数无* 返回值返回上一个收到响应的命令的命令索引*/uint8_t SDIO_GetCommandResponse(void){return (uint8_t)(SDIO->RESPCMD);}[编辑] 函数SDIO_GetResponse/*** 功能描述返回上一个命令从卡收到的响应* 输入参数 SDIO_RESP: 指定SDIO响应寄存器* 该参数可以是下列值之一:* SDIO_RESP1: 响应寄存器 1* SDIO_RESP2: 响应寄存器 2* SDIO_RESP3: 响应寄存器 3* SDIO_RESP4: 响应寄存器 4* 返回值对应的响应寄存器的值*/uint32_t SDIO_GetResponse(uint32_t SDIO_RESP){__IO uint32_t tmp = 0;/* 检查输入参数 */assert_param(IS_SDIO_RESP(SDIO_RESP));tmp = SDIO_RESP_ADDR + SDIO_RESP;return (*(__IO uint32_t *) tmp);}[编辑] 函数SDIO_DataConfig/*** 功能描述根据SDIO_DataInitStruct中指定的参数初始化SDIO数据通道* 输入参数 SDIO_DataInitStruct: 指向结构SDIO_DataInitTypeDef的指针,包含了SDIO数据的配置信息* 返回值无*/void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct){uint32_t tmpreg = 0;/* 检查输入参数 */assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength ));assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSi ze));assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferD ir));assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_Transfer Mode));assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));/*---------------------------- SDIO 数据定时器配置---------------------*//* 设置SDIO数据超时时间 */SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;/*---------------------------- SDIO 数据长度寄存器配置-----------------------*//* 设置SDIO数据长度 */SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;/*---------------------------- SDIO 数据控制寄存器配置----------------------*//* 获取SDIO 数据控制寄存器的值 */tmpreg = SDIO->DCTRL;/* 清除 DEN, DTMODE, DTDIR 和 DBCKSIZE 位 */tmpreg &= DCTRL_CLEAR_MASK;/* 根据SDIO_DPSM的值设置DEN位 *//* 根据SDIO_TransferMode的值设置DTMODE位 *//* 根据SDIO_TransferDir的值设置DTDIR位 *//* 根据SDIO_DataBlockSize的值设置DBCKSIZE位 */tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir| SDIO_DataInitStruct->SDIO_TransferMode |SDIO_DataInitStruct->SDIO_DPSM;/* 回写SDIO数据控制寄存器 */SDIO->DCTRL = tmpreg;}[编辑] 函数SDIO_ReadData/*** 功能描述从接收FIFO读一个数据字* 输入参数无* 返回值收到的数据*/uint32_t SDIO_ReadData(void){return SDIO->FIFO;}[编辑] 函数SDIO_WriteData/*** 功能描述向发送FIFO写一个数据字* 输入参数 Data: 要写的32位数据字* 返回值无*/void SDIO_WriteData(uint32_t Data){SDIO->FIFO = Data;}[编辑] 函数SDIO_GetFlagStatus/*** 功能描述检查指定的SDIO标志设置与否* 输入参数 SDIO_FLAG: 指定待检查的SDIO标志* 该参数可以是下列值之一:* SDIO_FLAG_CCRCFAIL: 命令响应已接收(CRC校验失败)* SDIO_FLAG_DCRCFAIL: 数据块已发送/接收(CRC校验失败)* SDIO_FLAG_CTIMEOUT: 命令响应超时* SDIO_FLAG_DTIMEOUT: 数据超时* SDIO_FLAG_TXUNDERR: 发送FIFO下溢错误* SDIO_FLAG_RXOVERR: 接收FIFO上溢* SDIO_FLAG_CMDREND: 命令响应已接收(CRC校验通过)* SDIO_FLAG_CMDSENT: 命令已发送(不需要响应)* SDIO_FLAG_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)* SDIO_FLAG_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位* SDIO_FLAG_DBCKEND: 数据块已发送/接收(CRC校验通过)* SDIO_FLAG_CMDACT: 正在传输命令* SDIO_FLAG_TXACT: 正在发送数据* SDIO_FLAG_RXACT: 正在接收数据* SDIO_FLAG_TXFIFOHE: 发送FIFO半空* SDIO_FLAG_RXFIFOHF: 接收FIFO半满* SDIO_FLAG_TXFIFOF: 发送FIFO满* SDIO_FLAG_RXFIFOF: 接收FIFO满* SDIO_FLAG_TXFIFOE: 发送FIFO空* SDIO_FLAG_RXFIFOE: 接收FIFO空* SDIO_FLAG_TXDAVL: 发送FIFO中的数据有效* SDIO_FLAG_RXDAVL: 接收FIFO中的数据有效* SDIO_FLAG_SDIOIT: SD I/O 中断已接收* SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收* 返回值 SDIO标志的状态(SET 或 RESET).*/FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG){FlagStatus bitstatus = RESET;/* 检查输入参数 */assert_param(IS_SDIO_FLAG(SDIO_FLAG));if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET){bitstatus = SET;}else{bitstatus = RESET;}return bitstatus;}[编辑] 函数SDIO_ClearFlag/*** 功能描述清除SDIO的挂起标志* 输入参数 SDIO_FLAG: 指定待清除的标志* 该参数可以是下列值之一:* SDIO_FLAG_CCRCFAIL: 命令响应已接收(CRC校验失败)* SDIO_FLAG_DCRCFAIL: 数据块已发送/接收(CRC校验失败)* SDIO_FLAG_CTIMEOUT: 命令响应超时* SDIO_FLAG_DTIMEOUT: 数据超时* SDIO_FLAG_TXUNDERR: 发送FIFO下溢错误* SDIO_FLAG_RXOVERR: 接收FIFO上溢错误* SDIO_FLAG_CMDREND: 命令响应已接收(CRC校验通过)* SDIO_FLAG_CMDSENT: 命令已发送(不需要响应)* SDIO_FLAG_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)* SDIO_FLAG_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位 * SDIO_FLAG_DBCKEND: 数据块已发送/接收(CRC校验通过)* SDIO_FLAG_SDIOIT: SD I/O 中断已接收* SDIO_FLAG_CEATAEND: CE-ATA命令CMD61的完成信号已接收* 返回值无*/void SDIO_ClearFlag(uint32_t SDIO_FLAG){/* 检查输入参数 */assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));SDIO->ICR = SDIO_FLAG;}[编辑] 函数SDIO_GetITStatus/*** 功能描述检查指定的SDIO中断是否已发生* 输入参数 SDIO_IT: 指定待检查的SDIO中断* 该参数可以是下列值之一:* SDIO_IT_CCRCFAIL: 命令响应已接收(CRC校验失败)中断* SDIO_IT_DCRCFAIL: 数据块已发送/接收(CRC校验失败)中断* SDIO_IT_CTIMEOUT: 命令响应超时中断* SDIO_IT_DTIMEOUT: 数据超时中断* SDIO_IT_TXUNDERR: 发送FIFO下溢错误中断* SDIO_IT_RXOVERR: 接收FIFO上溢错误中断* SDIO_IT_CMDREND: 命令响应已接收(CRC校验通过)中断* SDIO_IT_CMDSENT: 命令已发送(不需要响应)中断* SDIO_IT_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)中断* SDIO_IT_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位中断* SDIO_IT_DBCKEND: 数据块已发送/接收(CRC校验通过)中断* SDIO_IT_CMDACT: 正在传输命令中断* SDIO_IT_TXACT: 正在发送数据中断* SDIO_IT_RXACT: 正在接收数据中断* SDIO_IT_TXFIFOHE: 发送FIFO半空中断* SDIO_IT_RXFIFOHF: 接收FIFO半满中断* SDIO_IT_TXFIFOF: 发送FIFO满中断* SDIO_IT_RXFIFOF: 接收FIFO满中断* SDIO_IT_TXFIFOE: 发送FIFO空中断* SDIO_IT_RXFIFOE: 接收FIFO空中断* SDIO_IT_TXDAVL: 发送FIFO中的数据有效中断* SDIO_IT_RXDAVL: 接收FIFO中的数据有效中断* SDIO_IT_SDIOIT: SD I/O 中断已接收中断* SDIO_IT_CEATAEND: CE-ATA命令CMD61的完成信号已接收中断* 返回值 SDIO_IT的新状态(SET 或 RESET).*/ITStatus SDIO_GetITStatus(uint32_t SDIO_IT){ITStatus bitstatus = RESET;/* 检查输入参数 */assert_param(IS_SDIO_GET_IT(SDIO_IT));if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET){bitstatus = SET;}else{bitstatus = RESET;}return bitstatus;}[编辑] 函数SDIO_ClearITPendingBit/*** 功能描述清除SDIO的中断挂起位* 输入参数 SDIO_IT: 指定待清除的中断挂起位* 该参数可以是下列值的一个或任意组合:* SDIO_IT_CCRCFAIL: 命令响应已接收(CRC校验失败)中断* SDIO_IT_DCRCFAIL: 数据块已发送/接收(CRC校验失败)中断* SDIO_IT_CTIMEOUT: 命令响应超时中断* SDIO_IT_DTIMEOUT: 数据超时中断* SDIO_IT_TXUNDERR: 发送FIFO下溢错误中断* SDIO_IT_RXOVERR: 接收FIFO上溢错误中断* SDIO_IT_CMDREND: 命令响应已接收(CRC校验通过)中断* SDIO_IT_CMDSENT: 命令已发送(不需要响应)中断* SDIO_IT_DATAEND: 数据传输结束(数据计数器SDIDCOUNT为0)中断 * SDIO_IT_STBITERR: 在宽总线模式下,所有数据线都没检测到起始位中断* SDIO_IT_SDIOIT: SD I/O 中断已接收中断* SDIO_IT_CEATAEND: CE-ATA命令CMD61的完成信号已接收中断* 返回值无*/void SDIO_ClearITPendingBit(uint32_t SDIO_IT){/* 检查输入参数 */assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));SDIO->ICR = SDIO_IT;}。
USART库函数
USART库函数USART 库函数函数名描述USART_DeInit 将外设U SARTx 寄存器重设为缺省值USART_Init 根据U SART_InitStruct 中指定的参数初始化外设USARTx寄存器USART_StructInit 把U SART_InitStruct 中的每一个参数按缺省值填入USART_Cmd 使能或者失能U SART 外设USART_ITConfig 使能或者失能指定的U SART 中断USART_DMACmd 使能或者失能指定U SART 的D MA 请求USART_SetAddress 设置U SART 节点的地址USART_WakeUpConfig 选择U SART 的唤醒方式USART_ReceiverWakeUpCmd 检查USART是否处于静默模式USART_LINBreakDetectLengthConfig 设置U SART LIN 中断检测长度USART_LINCmd 使能或者失能U SARTx 的L IN 模式USART_SendData 通过外设U SARTx 发送单个数据USART_ReceiveData 返回 USARTx 最近接收到的数据USART_SendBreak 发送中断字USART_SetGuardTime 设置指定的U SART 保护时间USART_SetPrescaler 设置U SART 时钟预分频USART_SmartCardCmd 使能或者失能指定U SART 的智能卡模式USART_SmartCardNackCmd 使能或者失能N ACK 传输USART_HalfDuplexCmd 使能或者失能U SART 半双工模式USART_IrDAConfig 设置U SART IrDA 模式USART_IrDACmd 使能或者失能U SART IrDA 模式USART_GetFlagStatus 检查指定的U SART 标志位设置与否USART_ClearFlag 清除U SARTx 的待处理标志位USART_GetITStatus 检查指定的U SART 中断发生与否USART_ClearITPendingBit 清除U SARTx 的中断待处理位函数U SART_ GetITStatus函数名USART_ GetITStatus函数原形ITStatus USART_GetITStatus(USART_TypeDef* USARTx, u16 USART_IT)功能描述检查指定的U SART 中断发生与否输入参数1USARTx:x 可以是1,2 或者3,来选择U SART 外设输入参数2USART_IT:待检查的U SART 中断源参阅S ection:USART_IT 查阅更多该参数允许取值范围输出参数无返回值USART_IT 的新状态先决条件无被调用函数无USART_IT 值USART_IT 描述USART_IT_PE 奇偶错误中断USART_IT_TXE 发送中断USART_IT_TC 发送完成中断USART_IT_RXNE 接收中断USART_IT_IDLE 空闲总线中断USART_IT_LBD LIN 中断探测中断USART_IT_CTS CTS 中断USART_IT_ORE 溢出错误中断USART_IT_NE 噪音错误中断USART_IT_FE 帧错误中断例:/* Get the USART1 Overrun Error interrupt status */ITStatus ErrorITStatus;ErrorITStatus = USART_GetITStatus(USART1, USART_IT_OverrunError);函数U SART_ReceiveData函数名USART_ ReceiveData函数原形u8 USART_ReceiveData(USART_TypeDef* USARTx) 功能描述返回U SARTx 最近接收到的数据输入参数USARTx:x 可以是1,2 或者3,来选择U SART 外设输出参数无返回值接收到的字先决条件无被调用函数无例:/* Receive one halfword on USART2 */u16 RxData;RxData = USART_ReceiveData(USART2);函数U SART_ ClearITPendingBit函数名USART_ ClearITPendingBit函数原形void USART_ClearITPendingBit(USART_TypeDef* USARTx, u16 USART_IT)功能描述清除U SARTx 的中断待处理位输入参数1USARTx:x 可以是1,2 或者3,来选择U SART 外设输入参数2USART_IT:待检查的U SART 中断源参阅S ection:USART_IT 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无例:/* Clear the Overrun Error interrupt pending bit */USART_ClearITPendingBit(USART1,USART_IT_OverrunError);函数U SART_Init函数名USART_Init函数原形void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)功能描述根据U SART_InitStruct 中指定的参数初始化外设USARTx 寄存器输入参数1USARTx:x 可以是1,2 或者3,来选择U SART 外设输入参数2USART_InitStruct:指向结构U SART_InitTypeDef的指针,包含了外设U SART的配置信息参阅S ection:USART_InitTypeDef 查阅更多该参数允许取值范围输出参数无返回值无先决条件无被调用函数无typedef struct{u32 USART_BaudRate;u16 USART_WordLength;u16 USART_StopBits;u16 USART_Parity;u16 USART_HardwareFlowControl;u16 USART_Mode;u16 USART_Clock;u16 USART_CPOL;u16 USART_CPHA;u16 USART_LastBit;} USART_InitTypeDef;USART_InitTypeDef 成员U SART 模式对比。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操纵寄存器&调用库函数
编程步骤:
1、原理图一一硬件的连接方式
2、芯片手册一一怎样使用芯片
3、编写程序
d 外设功能初始化配置
e 外设使能
f 外设中断使能和中断优先级配置
g 其他功能函数 LED 初始化
一、寄存器 总时钟初始化 端口时钟初始化 //b 为10端口 (PB/PA/PE 等)在APB2的位置 j 青除端 口 默认值 GPI0A->CRL &二 OxFOOFFFFF; 〃由GPIOA->CRL/H 给PAx 配置位x 清零 设置端 口 工作模式 GPIOA->CRL | = 0x03300000;
〃根据表17、18配置
LED 设置为 OFF GPIOA->ODR I = 1«5 I 1«6; 〃由数据输出寄存器控制,0—ONJ —OFF
a 总时钟初始化
b 外设时钟初始化
c 外设10配置 Stm32_ClockJnit(9); RCC->APB2ENR |= l«b;
二、库函数
GPIO」nitTypeDef GPIO」nitLed; 〃定义结构体变量端口时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB,
ENABLE);
设置端口工作模式(推挽输出)
GPIO InitLed.GPIO Mode = GPIO Mode Out PP;
GPIO InitLed.GPIO Pin = GPIO Pin 5;
GPIO」nitLed・GPIO_Speed = GPIO_Speed_50MHz;
〃由GPIOJnitStruct^指定的参数初始化外设GPIOx寄存器GPIO _lnit(GPIOB,&GPIO JnitLed);
GPIO Jn it(GPIOA,&GPIO JnitLed);
LED设置为OFF
GPIO_SetBits(GPIOA,GPIO_Pi n_5);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
//GPIO_SetBits 设置,GPIO_ResetBits 清除〃或EEP初始化(和LED类似)
GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
KEY初始化
一、寄存器
端口时钟初始化RCC->APB2ENR |= 1«2|1«6;
j青除端口默认值GPIOA->CRL &二 OxFFFFFFFO; 设置端口工作模式GPIOA->CRL | = 0x00000008;
端口输岀位设置GPIOA->ODR | = 1«0;
〃上拉为高电平置1 按键检测
if(!(GPIOA->IDR & (1«0)))//按下为低电平
delay_ms(50);//隔50ms 看是否满足
if(!(GPIOA->IDR & (1«0)))
return UP;
}
〃由输入寄存器GPIOA4DR来检测是否按下二、库函数
GPIO」nitTypeDef GPIO」nitKey;
端口时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOE,
ENABLE);
设置端口工作模式(浮空输入)
GPIO」n itKey.GPIO_Mode = GPIO_ModeJN_FLOATING; GPIO」n itKey.GPIO_Pin = GPIO_Pin_0;
GPIO Jn it(GPIOA,&GPIO JnitKey);
按籲检测
#define KEY1
GPIO_ReadlnputDataBit(GPIOA,GPIO_Pin_0)
〃检测函数GPIO_ReadlnputDataBit 读GPIOA->IDR 的数据if(KEYl==O)
{
Delay(5000);
if(KEYl==O)
return UP;
长按短按(见工程STM32_1)
2、按下灯亮,再按下灯灵
2、长按灯亮,长按灯灭
2.1、长按为多次处理(按着一直亮)
2.2、长按仅为一次处理(按着只亮一次)。