文档章节

STM32的中断NVIC——C里面的所有调用都是久别重逢

兔之
 兔之
发布于 2014/02/23 10:37
字数 659
阅读 627
收藏 1

我才发现,STM32的中断向量表(interrupt vector table)是不用配置的!!!

这和TI的芯片LM3S系列所用的函数库不一样,Ti的函数库都需要在启动文件startup.s中对中断向量表进行配置。具体操作是把中断服务函数的名字写到对应的汇编代码位置,名字就是中断服务函数的入口地址。一旦发生中断,则跳入到这个地址执行程序。

而STM32的逻辑是把中断向量表里所有的中断服务子函数名字给定,你需要用到哪个中断时,把这个函数名取来用就行。如果需要了解一下STM32的启动过程和中断向量表的作用,可以查看[1]。

##ADC单通道采样 现在需要一个ADC采样程序,在中断中读取采样的数据。

    <!-- lang: cpp -->
#include "stm32f2xx.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h> 

extern void Uart2Init(void);
float f1;
uint32_t ADCVal = 0;  
static void ADC_Configuration(void)
{
	ADC_InitTypeDef ADC_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* Enable ADC3 clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	
	/* Configure ADC3 Channel 3 as analog input */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* ADC Common Init */
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6;
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; 
	ADC_CommonInit(&ADC_CommonInitStructure); 
	
	/* ADC3 Configuration ------------------------------------------------------*/
	ADC_StructInit(&ADC_InitStructure);
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion = 1;
	ADC_Init(ADC3, &ADC_InitStructure);
	
	/*Interrupt Configuration*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel  = ADC_IRQn;         //ADC1,ADC2,ADC3的全局中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority   = 1;   //从优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd   = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    ADC_ITConfig(ADC3, ADC_IT_EOC, ENABLE);
	
/* ADC3 Regular Channel Config */
	ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 1, ADC_SampleTime_56Cycles);
	
	/* Enable ADC3 */
	ADC_Cmd(ADC3, ENABLE);
	
	/* ADC3 regular Software Start Conv */ 
	ADC_SoftwareStartConv(ADC3);
    }

    void AdcDelay(void)
   {
	unsigned int i;
	for(i = 0; i < 6000000; i++);
    }

    void ADC_IRQHandler(void)
   { 
    int Status;
    Status = ADC_GetITStatus(ADC3, ADC_IT_EOC);                 //检查指定的ADC中断是否发生
    if(Status ==SET){             //如果发生中断
    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); //清除中断标志位
	//进行转换处理
    ADCVal = ADC_GetConversionValue(ADC3);
	/* convert to Voltage,  step = 0.8 mV */
	ADCVal = (uint32_t)(ADCVal * 0.8);  
	/* get digits to display */
	f1 = (float)ADCVal / 1000.0;
	printf("ADC input volage:%.2fV\n",f1);
    }
}

		
int main(void)
{
	Uart2Init();
	ADC_Configuration();
	printf("\n\rTest ADC..........\n\r");
	while(1)
	{
		AdcDelay();
	}
 }

这个里面的ADC_IRQHandler就是来自startup_stm32fxx.s。

##printf重定向## 在开发板上肯定无法使用stdio库中printf,这里能够使用是因为它被重定向为UART输出了。具体方法见 [2]。

##久别重逢## 像这种由STM或者TI官方库带来的向函数式编程的转化,写的程序过一段时间很快就忘记用法了。如果换一个平台又得重新熟悉。但万码虽殊,其理揆一。要知道,C语言的所用调用都是久别重逢。

##Reference## [1].http://www.amobbs.com/thread-5462931-1-1.html [2].http://blog.csdn.net/jiangjingui2011/article/details/7216693 [3].http://blog.csdn.net/lanmanck/article/details/8306045

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
stm32 移植freertos时的注意事项

1、stm32中断向量表配置 在STM32使用中由于中断优先级的设置采用的是库函数,因此要请保证所有的优先级设置为可抢占优先级,具体实现方式是在RTOS启动前调用函数:NVICPriorityGroupConfig(N...

crjmail
2018/04/20
0
0
STM32中中断优先级理解

很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级...

shenhuan1104
2017/10/19
0
0
STM32之SysTick定时器

SysTick-------操作系统的心跳 SysTick是系统滴答定时器,可以说是操作系统的的“心跳”,它被绑在NVIC中,用于产生SysTick异常(异常号:15)。一旦产生SysTick异常,就会产生滴答中断,这个...

panrenqiu
2018/04/14
0
0
Easy Code (笔记)CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32

转载自:http://www.cnblogs.com/tdyizhen1314/p/4348725.html 前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC、QT、STM32等平台,由于网上的资源较少,走了不少弯路...

weixin_28900531
2018/04/11
0
0
STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解

STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件...

青春无极限
2015/06/11
454
0

没有更多内容

加载失败,请刷新页面

加载更多

用原生js对表格排序

本文转载于:专业的前端网站➸用原生js对表格排序 阿里的模拟笔试题,当时时间有限没写出来,其实是因为自己对原生dom操作不熟悉,这里补一下。 题目的大意是有一个表格,如代码所示 <table>...

前端老手
29分钟前
4
0
IT兄弟连 HTML5教程 HTML5表单 HTML5新增表单元素

HTML5有一些新的表单元素:<datalist>、<keygen>、<output>。不是所有的浏览器都支持HTML5新的表单元素,但即使浏览器不支持该表单属性,仍然可以显示为常规的表单元素。 1 <datalist>元素 ...

老码农的一亩三分地
31分钟前
4
0
【朝花夕拾】Android自定义View篇之(一)View绘制流程

https://www.cnblogs.com/andy-songwei/p/10955062.html

shzwork
33分钟前
5
0
Qt编写自定义控件70-扁平化flatui

一、前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产...

飞扬青云
42分钟前
3
0
教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部