寄存器和库函数.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新建一个文件,输入如上内容或直接用目录下源文件。
- 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、长按仅为一次处理(按着只亮一次)。