sql清除挂起工具中断标志位与sql清除挂起工具线路挂起位有什么区别

库函数的使用
来源:博客园
学了一周多的STM32,从最开始的点亮一盏灯到中断定时的使用,发现对于ST库使用的一些使用方法,现作一小结: 1、初始化结构体 a、定义一个xxx — InitTypeDef 类型的结构体,比如GPIO — InitTypeDef类型的GPIO — InitStructure用来配置GPIO; b、根据所使用的要求向这些结构体的成员中写入特定的控制参数,如GPIO_initStructure.GPIO_Pin=GPIO_Pin_13; c、将结构体作为输入参数调用相应的外设库函数xxx — Init(),实现向寄存器写入控制参数; 2、数据的输入与输出 a、先通过输入参数向函数制定要使用的外设是什么,比如用(GPIOA,GPIO — Pin — 5 ),选中PA5引脚进行控制; b、进行写或者读数据操作,例如函数GPIO_WriteBit(GPIOA, u16 GPIO_Pin — 5, Bit_RESE) ,是对PA5进行写1操作; c、如果是接收外部数据,则调用Read或Receive函数,读取函数返回值来得到外部输入数据。 3、状态位、标志位 在程序运行的过程中当我们需要知道一些外设的工作状态的时候,那么就会涉及一系列的标志检查函数: a、名为 PPP_GetFlagStatus的函数,其功能为检查外设 PPP某标志位被设置与否,例如:TIM_ GetFlagStatus ; b、名为 PPP_ClearFlag 的函数,其功能为清除外设 PPP标志位,例如:TIM_ ClearFlag ; c、名为 PPP_GetITStatus 的函数,其功能为判断来自外设 PPP的中断发生与否,例如:TIM_ GetITStatus ; d、名为 PPP_ClearITPendingBit 的函数,其功能为清除外设 PPP 中断待处理标志位,例如:TIM_ ClearITPendingBit 。 总结: ST官方库有许多共同特点,在此对外设主要的共同函数进行一个简单的分类总结: 函数名 功能 输入参数 返回值 XXX — Init() 对外设进行初始化 XXX — inirTypeDef类型结构体 void XXX — DeInit() 以系统默认形式初始化外设 将要进行初始化的外设名 void XXX — StructInit() 以默认的数据填充初始化结构体 将要进行默认填充的XXX — InitTypeDef类型结构体 void XXX — SendData() 使用外设发送数据 XXX相应的外设名;将要发送的数据 void XXX — ReceiveData() 获取外设接收到的数据 XXX相应的外设名 返回接收到的数据 XXX_ GetFlagStatus () 检测外设事件标志位 要检查的时间标志名 SET或RESET XXX_ GetITStatus () 检查中断标志 要检查的中断标志名 SET或RESET XXX_ ClearFlag () 清除事件标志位 要清除的事件标志名 void XXX_ ClearITPendingBit () 清除挂起的中断标志位 要检测的中断标志名 void XXX_ITConfig () 设置外设的中断 XXX相应得外设;选择开启外设的某中断 void XXX_Cmd () 使能或失能外设 配置外设名;ENABLE或DISABLE void XXX_ DMACmd () 配置外是否可使用DMA请求 配置外设名;选择要配置的DMA请求;ENABLE或DISABLE void
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动6261人阅读
嵌入式系统(35)
在STM32的函数库中,这两个函数实现的功能其实是一样的,都是清除对应的标志位,但是标志位和中断位的含义不一样,不是所有的标志位都可以产生中断。查看源代码如下:
#define ADC_IT_EOC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint16_t)0x0220)
#define ADC_IT_AWD&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint16_t)0x0140)
#define ADC_IT_JEOC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint16_t)0x0480)
这是定义的中断位,可以产生中断
#define ADC_FLAG_AWD&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint8_t)0x01)
#define ADC_FLAG_EOC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint8_t)0x02)
#define ADC_FLAG_JEOC&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint8_t)0x04)
#define ADC_FLAG_JSTRT&& &&&&&&&&&&&&&&&&&&&&&&&&&&((uint8_t)0x08)
#define ADC_FLAG_STRT&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint8_t)0x10)
这是定义的标志位,二者对比可以发现有的标志位不能产生中断
标志位在程序中可以作为判定条件,支持程序的运行,中断则是跳转到中断函数执行。两个函数实现的功能是一样的,在中断程序中可以用两个中的任一个。区分两个函数是为了更清晰的显示函数库的严谨。
再具体分析下面的中断位和标志位:
#define ADC_IT_EOC&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&((uint16_t)0x0220)
#define ADC_FLAG_EOC&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ((uint8_t)0x02)
这两个数值不同是因为标志位只是为了清除标志位而设的,而中断位设置成这个值是因为在其他函数中这一位还有其他用途。而且还要注意:
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
/* Check the parameters */
assert_param(IS_ADC_ALL_PERIPH(ADCx));
assert_param(IS_ADC_CLEAR_FLAG(ADC_FLAG));
/* Clear the selected ADC flags */
ADCx-&SR = ~(uint32_t)ADC_FLAG;
这一句ADCx-&SR = ~(uint32_t)ADC_FLAG;应该是ADCx-&SR &= ~(uint32_t)ADC_FLAG;
不过状态位只能由硬件置位,软件可以读和清零,所以这样写也是可以的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2791107次
积分:17252
积分:17252
排名:第560名
原创:180篇
转载:137篇
评论:194条
(2)(4)(1)(4)(2)(8)(1)(1)(1)(1)(12)(2)(2)(5)(2)(6)(3)(5)(2)(4)(15)(11)(1)(1)(3)(11)(7)(2)(3)(19)(5)(20)(8)(8)(1)(30)(31)(1)(6)(40)(22)(1)(1)(4)STM32学习笔记——外部中断EXTI
&&Created&on:&
&&&&&&Author:&zhang&bin
for&&&STM32F103C8
redesigned&by&zhang&bin
versions:V-0.1
All&Rights&Reserved
main.c如下,注释的比较详细,把下面的例子即说明都看明白基本上就可以用了:
//抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。
//EXTI:外部中断/事件控制器
//EXTI控制器可以产生高达19个软件事件/中断请求
//将19根线配置为中断源,将19根线配置为事件源,将19根线配置为软件中断/事件线,详见《STM32F103xxx使用手册》
//在这个文件中主要是进行各种初始化配置,包括GPIO配置、EXTI配置、系统时钟配置等
//中断服务程序则在stm32f10x_it.c文件中,该文件提供所有异常处理程序和外围中断服务程序的模板,详见该文件
#include&"stm32f10x_lib.h"
EXTI_InitTypeDef&EXTI_InitS&&//定义外部中断初始化结构体变量&&内部含有4个成员&详见EXTI_InitTypeDef的定义
ErrorStatus&HSEStartUpS
//定义错误状态变量,是枚举类型
void&RCC_Configuration(void);
void&GPIO_Configuration(void);
void&NVIC_Configuration(void);
int&main(void)
#ifdef&DEBUG
&&debug();
&&RCC_Configuration();
&//系统时钟配置&&&
&&NVIC_Configuration();
//NVIC配置
&&GPIO_Configuration();&&//配置GPIO
&&&//STM32的外部中断不是固定的,是可以映射的。如EXTI6既可以映射到PB6也可以映射到PA6,详见外部中断/事件与GPIO的映射关系
&&&//将IO端口注册至中断线(将IO口映射到中断线N)
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,&GPIO_PinSource6);&&//选择GPIO管脚用作外部中断线路
&&//第一个参数选择用作外部中断线源的GPIO端口&&第二个参数是待设置的外部中断线路,可以是GPIO_PinSourcex(x可以0~15)
&&//配置按钮中断线触发方式
&设置中断配置结构体成员
&&EXTI_InitStructure.EXTI_Line&=&EXTI_Line6;
//选择外部中断线&&EXTI_Line0~EXTI_Line18共19根线
&&EXTI_InitStructure.EXTI_Mode&=&EXTI_Mode_I
&&//设置为中断请求,可以为EXTI_Mode_Interrupt中断请求或者
&&//EXTI_Mode_Event事件请求
&&EXTI_InitStructure.EXTI_Trigger&=&EXTI_Trigger_F&//触发方式下降沿触发&还可以为EXTI_Trigger_Rising上升沿触发或者
&&//EXTI_Trigger_Rising_Falling上升沿下降沿触发
&&EXTI_InitStructure.EXTI_LineCmd&=&ENABLE;&//中断线使能&&&ENABLE使能,DISABLE失能
&&EXTI_Init(&EXTI_InitStructure);&//根据参数结构体初始化EXTI中断
&&EXTI_GenerateSWInterrupt(EXTI_Line6);&//产生一个软件中断&&EXTI_Line6中断允许&
&&//到此中断配置完成,可以写中断处理函数。
&&while&(1)
void&RCC_Configuration(void)
//复位RCC外部设备寄存器到默认值
&&RCC_DeInit();&&
&&//打开外部高速晶振
&&RCC_HSEConfig(RCC_HSE_ON);&
&//等待外部高速时钟准备好
&&HSEStartUpStatus&=&RCC_WaitForHSEStartUp();&
&&//外部高速时钟已经准别好
&&if(HSEStartUpStatus&==&SUCCESS)&&
&&&&FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
&&&&FLASH_SetLatency(FLASH_Latency_2);
&&&//配置AHB(HCLK)时钟=SYSCLK
&&&&RCC_HCLKConfig(RCC_SYSCLK_Div1);
&&&&//配置APB2(PCLK2)钟=AHB时钟
&&&&RCC_PCLK2Config(RCC_HCLK_Div1);&
&&&&//配置APB1(PCLK1)钟=AHB&1/2时钟
&&&&RCC_PCLK1Config(RCC_HCLK_Div2);&&
&&&&//配置ADC时钟=PCLK2&1/4
&&&&RCC_ADCCLKConfig(RCC_PCLK2_Div4);&
&&&&//配置PLL时钟&==&外部高速晶体时钟*9
8MHz*9MHz=72MHz
&&&&RCC_PLLConfig(RCC_PLLSource_HSE_Div1,&RCC_PLLMul_9);&
//配置ADC时钟=&PCLK2/4
&&&&RCC_ADCCLKConfig(RCC_PCLK2_Div4);
&&&//使能PLL时钟
&&&&RCC_PLLCmd(ENABLE);&&
&&&//等待PLL时钟就绪
&&&&while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)&==&RESET)&&
&&&&//配置系统时钟&=&PLL时钟
&&&&RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);&
&&&//检查PLL时钟是否作为系统时钟
&&&&while(RCC_GetSYSCLKSource()&!=&0x08)&&
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA&|RCC_APB2Periph_GPIOB
&&&&&&&&&&&&&&&&&&&&&&&&&|&RCC_APB2Periph_AFIO,&ENABLE);
&&&//使能GPIOA,GPIOB和AFIO的APB2
void&GPIO_Configuration(void)
&&GPIO_InitTypeDef&GPIO_InitS&&&//定义配置GPIO的结构体
&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_8;
//选中第8个脚
&&GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_Out_PP;&&&&&&&//推挽输出
&&GPIO_Init(GPIOB,&&GPIO_InitStructure);
//用配置好的结构体初始化GPIOB
PB8用于驱动led
&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_6;
&&//选中6脚
&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_IN_FLOATING;
&&//配置浮空输入
&&GPIO_Init(GPIOB,&&GPIO_InitStructure);
&//初始化GPIOB
&&PB6脚连接外部中断线6的中断源
&&//所有的端口都有外部中断的能力,为了使用外部中断线,端口必须配置为输入模式
void&NVIC_Configuration(void)&&//配置嵌套向量中断控制器
&&NVIC_InitTypeDef&NVIC_InitS//定义初始化NVIC的结构体变量&
#ifdef&&VECT_TAB_RAM&&
//配置向量表基址
&&NVIC_SetVectorTable(NVIC_VectTab_RAM,&0x0);&&&//分配中断向量表
&&NVIC_SetVectorTable(NVIC_VectTab_FLASH,&0x0);&&&
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);&&//设置中断优先级
&&//设置优先级分组:先占优先级和从优先级&&输入参数设定优先级分组位长度&&本例中NVIC_PriorityGroup_1:先占优先级1为,从优先级3位
&&//详见《STM32函数说明》P165
&&//优先级分组只能设定一次
&&//EXTI5-9共用一个中断源,EXTI10-15共用一个中断源
&&&&&//详见详见《STM32函数说明》P166
&&NVIC_InitStructure.NVIC_IRQChannel&=&EXTI9_5_IRQC&//中断通道&&指定IRQ通道
这里指定外部中断线9-5中断&&因为使用的是EXTI6
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&=&&0;&&//设定指定IRQ通道的先占优先级
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority&=&0;//设定指定IRQ通道的从优先级
&&NVIC_InitStructure.NVIC_IRQChannelCmd&=&ENABLE;&&//设定指定IRQ通道中断使能&&DISABLE失能
&&NVIC_Init(&NVIC_InitStructure);//根据结构体中指定的参数初始化NVIC中断
#ifdef&&DEBUG
void&assert_failed(u8*&file,&u32&line)
&&while&(1)
stm32f10x_it.c文件中的中断服务函数如下:
void&EXTI9_5_IRQHandler(void)
//外线路5-9的中断处理程序
&&if(EXTI_GetITStatus(EXTI_Line6)&!=&RESET)&//检测制定的EXTI6线路触发请求是否发生。&&
&&//该函数检查指定的EXTI线路出发请求是否发生
&//其实就是对PB8取反
&&&&GPIO_WriteBit(GPIOB,&GPIO_Pin_8,&(BitAction)((1-GPIO_ReadOutputDataBit(GPIOB,&GPIO_Pin_8))));
//该函数可以对指定的端口位进行操作&&指定端口和位,然后指定操作。第三个参数指定待写入的值
//该参数必须取枚举类型BitAction的其中一个值,可以是Bit_RESET:清除数据端口位和Bit_SET:设置数据端口位
//GPIO_ReadOutputDataBit()函数读取指定的IO端口管脚的输出,参数指定端口和位
&//EXTI_ClearFlag(EXTI_Line6);&&&&//清除中断标志位(必须)&&&我在网上看到要求必须,但是在本例中并没有这句
&&&&EXTI_ClearITPendingBit(EXTI_Line6);&//清除EXTI线路挂起位
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。文档分类:
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,
下载前请先预览,预览内容跟原文是一样的,在线预览图片经过高度压缩,下载原文更清晰。
您的浏览器不支持进度条
下载文档到电脑,查找使用更方便
还剩?页未读,继续阅读
播放器加载中,请稍候...
该用户其他文档
下载所得到的文件列表DSP授课教案.doc
文档介绍:
NT4级的中断挂起1至少一个INT4级的中断挂起,向该位写1可将该位清除为0,即清除中断请求。位2INT3FLAG中断3标志位。该位用作连至第3级中断INT3的所有中断标志。0无INT3级的中断挂起1至少一个INT3级的中断挂起,向该位写1可将该位清除为0,即清除中断请求。位1INT2FLAG中断2标志位。该位用作连至第2级中断INT2的所有中断标志。0无INT2级的中断挂起1至少一个INT2级的中断挂起,向该位写1可将该位清除为0,即清除中断请求。位0INT1FLAG中断1标志位。该位用作连至第1级中断INT1的所有中断标志。0无INT1级的中断挂起1至少一个INT1级的中断挂起,向该位写1可将该位清除为0,即清除中断请求。说明:系统初始化时,可以将IFR中的值取出来送入累加器,在将累加器中的值取出来送到IFR中就能实现清除原有中断的要求,具体的语句如下:IFRSACLIFRC.系统控制和状态寄存器1(SCSR1)—地址7018H这是一个16位的寄存器,每一位的意义如下:位15保留位位14CLKSRC。CLKOUT引脚源选择位0CLKOUT引脚输出CPU时钟1CLKOUT引脚输出WDCLK时钟位13—12LPM(1:0)。低功耗模式选择位,这两位声明了CPU在执行IDLE指令时进入哪一种低功耗方式。00CPU进入IDLE1(LPM0)01CPU进入IDLE2(LPM1)1xCPU进入HALT(LPM2)位11—9PLL时钟预定标选择位,这三位对输入时钟选择PLL倍频系数。sCLKPS1CLIPS0系统时钟频率0004*fin0012*fin0101.33*fin0111*fin1000.8*fin1010.66*fin1100.57*fin1110.5*LKEN。ADC模块时钟使能控制位。0禁止ADC模块的时钟(即:关断ADC模块以节约能量)1使能ADC模块的时钟,且正常运行位6SCICLKEN。SCI模块时钟使能控制位。0禁止SCI模块的时钟(即:关断SCI模块以节约能量)1使能SCI模块的时钟,且正常运行位5SPICLKEN。SPI模块时钟使能控制位。0禁止SPI模块的时钟(即:关断SPI模块以节约能量)1使能SPI模块的时钟,且正常运行位4CANCLKEN。CAN模块时钟使能控制位。0禁止CAN模块的时钟(即:关断CAN模块以节约能量)1使能CAN模块的时钟,且正常运行位3EVBCLKEN。EVB模块时钟使能控制位。0禁止EVB模块的时钟(即:关断EVB模块以节约能量)1使能EVB模块的时钟,且正常运行位2EVACLKEN。EVA模块时钟使能控制位。0禁止EVA模块的时钟(即:关断EVA模块以节约能量)1使能EVA模块的时钟,且正常运行位1保留位位0ILLADR位。无效地址检测位。说明:在本程序中,芯片工作在30MHz,禁止所有模块,所以控制字为:0200h(6)复用端口的控制:芯片的每个引脚可能存在多种功能,在具体的程序中使用坐哪一个功能是通过段空控制寄存器认为设定的,在此程序中,是将端口用作一般的输入/输出功能,所以程序语句为:SPLK#00000h,MCRASPLK#00000h,MCRBSPLK#00000h,MCRC具体设置依据如下(MCRB/MCRC的设置与其相同):I/O口复用控制寄存器A(MCRA)MCRA.15MCRA.14MCRA.13MCRA.12MCRA.11MCRA.10MCRA.9MCRA.8MCRA.7MCRA.6MCRA.5MCRA.4MCRA.3MCRA.2MCRA.0MCRA.0表I/O复用控制寄存器A(MCRA)配置位位的名称功能选择基 本功能(MCRA.n=1)一般I/O口(MCRA.n=0)0MCRA.0SCITXDIOPA01MCRA.1SCIRXDIOPA12MCRA.2XINT1IOPA23MCRA.3CAP1/QEP1IOPA34MCRA.4CAP2/QEP2IOPA45MCRA.5CAP3IOPA56MCRA.6PWM1IOPA67MCRA.7PWM2IOPA78MCRA.8PWM3IOPB09MCRA.9PWM4IOPB110MCRA.10PWM5IOPB211MCRA.11PWM6IOPB312MCRA.12T1PWM/T1CMPIOPB413MCRA.13T2PWM/T2CMPIOPB514MCRA.14TDIRAIOPB615MCRA.15TCLKINAIOPB7(7)端口输入输出方向控制:在(6)中将端口选择为输入/输出端口,那么接下来是具体的作为输入端口还是输出端口,并且如果作为输出端口具体输出的是高电平还是地点平也是通过寄存器的设置实现的,具体如下:I/O口数据和方向寄存器1端口A数据和方向控制寄存器A(PADATDIR)——地址7098HA7DIRA6DIRA5DIRA4DIRA3DIRA2DIRA1DIRA0DIRRW_0RW_0RW_0RW_0RW_0RW_0RW_0RW_0IOPA7IOPA6IOPA5IOPA4IOPA3IOPA2IOPA1IOPA0RW_+RW_+RW_+RW_+RW_+RW_+RW_+RW_+注:_+复位后的值和相应的引脚的状态有关,R=可读,W=可写,_0=复位后的值位15~8AnDIR0配置相应的引脚为输入方式1配置相应的引脚为输出方式位7~0IOPAn如果AnDIR=0,即引脚为输入方式0读相应的引脚为低电平1读相应的引脚为高电平如果AnDIR=1,即引脚为输出方式0置相应的引脚使其输出为低电平1设置相应的引脚使其输出为高电平说明:在本程序中用做输出端口且输出的是高电平,语句如下:SPLK#0FFFFh,PADATDIRSPLK#0FFFFh,PBDATDIRSPLK#0FFFFh,PCDATDIRSPLK#0FFFFh,PEDATDIRSPLK#0FFFFh,PFDATDIR(8)输出高低电平的循环控制:寄存器的设置与前面所要求的基本相同。(9)延迟程序的设计:DELAY:LARAR0,#00F34h;装载辅助寄存器,将0f34h送入到辅助寄存器AR0中D_LOOP:RPT#0FFh;将FFh送入到重复计数器中,同时将下一条NOP指令执行FF+1次NOP;空操作指令,单纯的让PC加一BANZD_LOOP;跳转指令,只要当前AR0的内容不等于0就自动跳转到D_LOOP程序处执行RET;返回指令,5、完整的主程序如下:.global_c_int0.datab0.word0fffEh;turn-onGPIO0b1.word0fffDh;turn-onGPIO1b2.word0fffBh;turn-onGPIO2b3.word0fff7h;turn-onGPIO3b4.word0ffEFh;turn-onGPIO0b5.word0ffDFh;turn-onGPIO1b6.word0ffBFh;turn-onGPIO22
内容来自淘豆网转载请标明出处.

我要回帖

更多关于 中断挂起 的文章

 

随机推荐