77范文网 - 专业文章范例文档资料分享平台

STM32学习总结(3)

来源:网络收集 时间:2019-06-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

PLL时钟= 72MHZ PLL2时钟= 40MHZ

四、Cotex-M3异常与中断

1、异常类型

Cortex-M3在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中,编号为1-15的对应系统异常,大于等于16的则全是外部中断。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 Cortex-M3内部总的有255个异常,因为芯片设计者可以修改CM3的硬件描述源代码,所以做成芯片后,支持的中断源数目常常不到240个,并且优先级的位数也由芯片厂商最终决定。

所有能打断正常执行流的事件都称为异常。 异常与中断区别?

240个中断对CM3核来说都是“意外突发事件”也就是说,该请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设,对CM3来说是“异步”的;而异常则是因CM3内核的活动产生的在执行指令或访问存储器时产生,因此对CM3来说是“同步”的。

2、优先级定义

在CM3中,优先级对于异常来说很关键的,它会决定一个异常是否能被掩蔽,以及在未掩蔽的情况下何时可以响应。优先级的数值越小,则优先级越高。CM3支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。有3个系统异常:复位,NMI以及硬fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都是可编程的(但不能被编程为负数)。

原则上,CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。但是,绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数会更少,如8级,16级,32级等。它们在设计时会裁掉表达优先级的几个低端有效位,以减少优先级的级数(可见,不管使用多少位来表达优先级,都是以MSB对齐的)。

3、NVIC概述

向量中断控制器,简称NVIC,是Cortex-M3不可分离的一部分,它与CM3内核的逻辑紧密耦合,有一部分甚至水乳交融在一起。NVIC与CM3内核同声相应,同气相求,相辅相成,里应外合,共同完成对中断的响应。NVIC的寄存器以存储器映射的方式来访问,除了

10

包含控制寄存器和中断处理的控制逻辑之外,NVIC还包含了MPU、SysTick定时器以及调试控制相关的寄存器。

NVIC共支持1至240个外部中断输入(通常外部中断写作IRQs)。具体的数值由芯片厂商在设计芯片时决定。此外,NVIC还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NMI的实际功能亦由芯片制造商决定。在某些情况下,NMI无法由外部中断源控制。

NVIC的访问地址是0xE000_E000。所有NVIC的中断控制/状态寄存器都只能在特权级下访问。不过有一个例外软件触发中断寄存器可以在用户级下访问以产生软件中断。所有的中断控制/状态寄存器均可按字/半字/字节的方式访问。

STM32F10xxx系列有68个可屏蔽中断通道(不包含16个Cortex?M3的中断线),16个可编程的优先等级(使用了4位中断优先级)。

4、InterruptVector.c文件分析

首先通过预定义来进行103与107器件的切换,在两种情况下均定义系统中断NVIC向量表const IRQn_Type g_IVNCTalble[INTERRUPT_NUM],之后定义中断函数指针组void (*g_InterruptProcessVector[INTERRUPT_NUM])(void),运用函数指针数组调用中断向量。

1)RegisterInterrupt() 该函数为注册中断函数。

void RegisterInterrupt(uint8 InterruptNum,uint8 SetPreemptionPriority, SetSubPriority,void (*InterruptProcess)(void))

{ NVIC_InitTypeDef NVIC_InitStructure; //结构体变量定义 MC_ASSERT(InterruptNum

NVIC_InitStructure.NVIC_IRQChannelSubPriority = SetSubPriority; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

11

uint8

}

中断配置过程:

NVIC_IRQChannel参数是用使能或者失能指定的IRQ(中断)通道。

NVIC_IRQChannelPreemptionPriority参数设置了NVIC_IRQChannel中的先占优先级。

NVIC_IRQChannelSubPriority参数设置了NVIC_IRQChannel中的从优先级。 NVIC_IRQChannelCmd 指定了在成员NVIC_IRQChannel中定义的IRQ通道是使能还是失能。

最后进入NVIC_Init()函数初始化。 2)NVIC_Init()

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) {

uint32_t tmppriority = 0x00, tmppre = 0x00, tmpsub = 0x0F; /* Check the parameters */

assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd)); assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));

assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority)); //检测变量是否合法

if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE) //使能开启 {

/* Compute the Corresponding IRQ Priority --------------------------------*/

tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;//算出来得到的就是占先优先级的位数占四位中的几位

tmppre = (0x4 - tmppriority); //算出来得到的就是响应优先级的位数占四位中的几位

tmpsub = tmpsub >> tmppriority; //然后将四位掩码通过抢占优先级位数得到响应优先级的掩码

tmppriority = (uint32_t)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre; //与上相应优先级掩码得到单纯的相应优先级

tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub; //然后 或上(|) 响应优先级得到了该中断通道8位的优先级数

tmppriority = tmppriority << 0x04; //将这个优先级数左移四位放置到相应通道优先级寄存器8位的高四位(优先级8位从左边算起的) NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel] = tmppriority; //输入到包含该通道中断响应优先级寄存器中,可以看出,本质上也是一个读--修改--写的过程

/* Enable the Selected IRQ Channels --------------------------------------*/ NVIC->ISER[NVIC_InitStruct->NVIC_IRQChannel >> 0x05] =

(uint32_t)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (uint8_t)0x1F); //使能中断,完成外设中断的初始化。

12

五、项目实例

以下是基于STM32新版插卡式误码仪代码设计的不带操作系统工程实例。 1、文件夹建立

Studys由Project、Source两个文件夹构成。

Project根目录下存放工程文件,OBJ文件夹存放编译后输出的文件。通过“Select Folder for Objects...”选项选择存储位置。

Source包含6个文件夹。 Cortex_M3中包含以下文件

core_cm3.c和core_cm3.h是CMSIS核心文件,提供进入M3内核接口,system_stm32f10x.c,system_stm32f10x.h文件的功能是设置系统以及总线时钟,这个里面有一个非常重要的SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。stm32f10x.h文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义申明以及包装内存操作。

Driver文件夹中包含我公司常用的驱动函数。

13

一般都会先全部拷贝到文件夹中,不需要的驱动在keil中不进行添加。 Lib文件夹包含FWLib、MCLib。 FWLib中为ST官方库函数。 MCLib为我公司定义库函数。

Middle文件夹用来存放中间件函数,我公司常用中间件函数有6个(不包含头文件)。

StartUp文件夹存放系统启动代码。

USER文件夹中包含主函数main及其他应用函数。 2、工程结构建立

打开keil文件,新建工程,找到之前新建的文件夹“Project”根目录下,输入工程名,保存工程。

14

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库STM32学习总结(3)在线全文阅读。

STM32学习总结(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/650987.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: