机电传动控制上课实验教程 lecture 2exit.docx
《机电传动控制上课实验教程 lecture 2exit.docx》由会员分享,可在线阅读,更多相关《机电传动控制上课实验教程 lecture 2exit.docx(13页珍藏版)》请在冰豆网上搜索。
机电传动控制上课实验教程lecture2exit
1、打开lecture2-exit
2、检查环境配置
打开TargetOptions:
点击如下图按钮
或者右击Target1选择
(1)选择正确的芯片
Device:
STM32F103VC
(2)输出.hex文件
Output:
SelectFolderforObject选上工程文件里面的OBJ文件。
选上CreateHEXFile
(3)中间文件输出位置正确:
Listing:
选择位置如下图所示:
(4)确认是否已添加头文件
C/C++:
Define中添加USE_STDPERIPH_DRIVER,STM32F10X_MD
IncludePaths如下所示:
(5)选择调试环境
Debug:
Use:
Cortex-M/RJ-Link/J-Trace
(6)添加flash下载算法
Utilities:
Settings:
对应芯片如下所示
点击setting设置为如下所示:
3、文件结构介绍
所建工程文件中,Libraries为固件库,project中存放链接文件(List)和输出文件(Obj),User用来存放工程文件(bsp)和用户代码(main(),application()).
4、exit.c添加代码
在exit.c中进行中断配置,具体步骤:
配置按键1为输入模式->配置NVIC嵌套中断寄存器->配置外部中断寄存器->设置外部中断源.
(1)其中,配置按键输入模式在上节LED及按键配置中已经讲过。
需要注意:
我们使能下降沿触发,是因为按键1初始输入为高电平,当按键按下时,PE11口输入低电平,从而产生一个下降沿,引起中断。
(2)NVIC配置
附:
中断嵌套说明
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个。
还需要注意的一点是这里的中断优先级高是指 是指是否更接近0级,0级优先级是最高的。
(3)配置外部中断寄存器
实际上EXTICR[0]-EXTICR[4]分别代表寄存器EXTICR1~EXTICR5,所以EXTICR[2]实际表示寄存器EXTICR3.
EXTICR3寄存器描述:
由于我们配置的是按键1即PE11脚作为中断输入脚,所以我们需要给寄存器赋值0100,转化成16进制数就是0x4,于是就有了下面的一段代码:
AFIO->EXTICR[2]&=0x0FFF;//清除之前的配置而不影响其他位的配置
AFIO->EXTICR[2]|=0x4000;//中断线配置为PE11
中断屏蔽寄存器(EXTI_IMR)
在此我们需要开启来自线11(PE11)上的中断请求,所以我们需要将对应的控制位置1:
EXTI->IMR|=1<<11;
其他的都是一样的,在此不再赘述。
在exit.c中添加如下代码:
#include"includes.h"
/*外部中断配置函数
KEY1--PE11*/
voidGPIO_Config(void)
{
/*第一步:
使能时钟*/
RCC->APB2ENR|=1<<6;//使能PORTE时钟
RCC->APB2ENR|=1<<0;//使能AFIO时钟
/*第二步:
设置外部中断引脚工作模式
设置PE11为输入模式;
注意如果有外部上拉电阻
则可以设置成浮空输入,
如果没有的话则必须设置
成上拉输入*/
GPIOE->CRH&=0xFFFF0FFF;
GPIOE->CRH|=0x00004000;
}
voidNVIC_config(void)
{
NVIC_InitTypeDefNVIC_InitStructure;/*声明嵌套中断结构体*/
/*中断分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*外部中断15_10*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
/*抢占优先级1*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
/*子优先级0*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
/*使能*/
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);/*外部中断源配置*/
}
voidInterrupt_Config(void)
{
AFIO->EXTICR[2]&=0x0FFF;//初始化
AFIO->EXTICR[2]|=0x4000;//中断线配置为PE11
//允许外部中断
EXTI->IMR|=1<<11;
//屏蔽事件请求
EXTI->EMR&=~(1<<11);
//禁止上升沿触发
EXTI->RTSR&=~(1<<11);
//使能下降沿触发
EXTI->FTSR|=1<<11;
}
voidEXIT_Config(void)
{
/*第一步:
配置GPIO为浮空输入模式*/
GPIO_Config();
/*第二步:
配置NVIC寄存器组*/
NVIC_config();
/*第三步:
配置外部中断配置寄存器*/
Interrupt_Config();
}
5、其中“includes.h”已经添加到“stm32f10x_it.c”文件中
6、其中“voidEXTI15_10_IRQHandler(void)”函数声明已经添加到“stm32f10x_it.h”文件
7、在“stm32f10x_it.c”文件中编写中断处理函数
按键中断触发之后进入中断处理函数EXTI15_10_IRQHandler(void),中断完成的功能为将LED1和LED2熄灭1s后恢复,以此来判断是否进入了中断处理函数。
注意:
中断服务结束后标志位要清零:
EXTI_ClearITPendingBit(EXTI_Line11);
否则未按键时也会检测到中断。
在stm32f10x_it.c中添加如下程序:
voidEXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line11)!
=RESET)//检测中断线11是否发生中断
{
LED1_OFF;
LED2_OFF;
delay_ms(1000);
LED1_ON;
LED2_ON;
//清除中断请求标志
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
8、查看exit.h的内容以及注意exit.h已经添加到了includes.h中
9、查看Application.c的内容(Application()为什么是空?
)
将Application()改为如下:
10、查看main.c内容