嵌入式技术项目教程-基于STM32F4CubeMX与HAL库 课件 8 EXTI任务实践_第1页
嵌入式技术项目教程-基于STM32F4CubeMX与HAL库 课件 8 EXTI任务实践_第2页
嵌入式技术项目教程-基于STM32F4CubeMX与HAL库 课件 8 EXTI任务实践_第3页
嵌入式技术项目教程-基于STM32F4CubeMX与HAL库 课件 8 EXTI任务实践_第4页
嵌入式技术项目教程-基于STM32F4CubeMX与HAL库 课件 8 EXTI任务实践_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务2.3 任务实践21 基础任务:中断方式检测按键基础任务1任务目标掌握CubeMX软件配置外部中断的方法。2任务内容采用中断方式检测按键Key的状态,按键按下后执行如下操作:翻转LED灯状态。基础任务:中断方式读取按键EXTI按键电路按键按下,引脚PE4读到高电平按键释放,引脚PE4读到低电平按键按下瞬间,形成上降沿按键释放瞬间,形成下升沿按下保持释放EXTI触发方式下拉式按键LED连接PF9按键控制引脚PE4引脚分配步骤二:引脚分配EXTI在引脚分配图中选择PF9的功能为GPIO_Output,PE4的功能为GPIO_EXTI4。引脚配置结果如图所示。外设配置初始电平引脚模式上/下拉电阻引脚速度引脚名称步骤三:外设配置(LED指示灯)EXTI上/下拉电阻引脚名称引脚外部中断功能设置在出现的引脚列表中单击需要配置的引脚PE4触发方式:下降沿触发外设配置使能对应的外部中断线EXTI使能引脚对应的外部中短线EXTI_LINE[15..0]修改外部中断线EXTI

line[15:10]的抢占优先级为1注意:大多数情况不必设置中断优先级,而直接使用由中断编号设置的默认中断优先级配置中断优先级优先级分组为第4组16级抢占优先级没有子优先级步骤六:程序编写外部中断回调函数注意:本任务只设置一个外部中断引脚,因此不需要判断多个引脚。如果系统中设置了多个外部中断,建议使用switch-case进行多分支判断。引脚设置为外部中断的初始化函数2设置外部中断EXTI15_10的中断优先级为1,并使能这个外部中断设置外部中断触发方式为下降沿触发1由CubeMX自动生成的引脚初始化函数后续任务1任务一:改变中断触发方式将本任务中外部中断的触发方式改为上升沿触发,并观察指示灯状态变化的时刻。2任务二:利用GPIO引脚模拟外部中断信号EXTI使用一个GPIO引脚输出一个10Hz的方波来模拟外部中断信号,利用杜邦线将该引脚与PC13相连,设置PC13为双边沿触发,在中断中执行翻转指示灯LD2状态的操作,要求观察并记录指示灯的变化情况。2 进阶任务:按键控制LED流水灯显示样式进阶任务1任务目标掌握CubeMX软件配置外部中断的方法2任务内容EXTI使用中断方式实现按键功能,用按键控制8只LED流水灯显示样式的切换,并通过串口向PC打印出目前的显示样式。设计8只流水灯5种流水效果显示样式。初始化时,8只LED灯全熄灭。按键第1次按下,显示样式1,第二次按下显示样式2,…,第6次按下8只LED灯熄灭,第7次按下,8只LED灯又显示样式1,如此循环。试完成设计,串口1输出LED灯显示样式。进阶任务:按键控制LED流水灯显示样式实验电路EXTI按键Key由引脚PE4控制,按键按下时为上升沿触发方式,释放时为下降沿触发方式。8只发光二极管阳极通过限流电阻接电源,当PCx(x为0~7)输出高电平,对应连接的LED灯熄灭,反之,PCx输出低电平,对应的LED灯点亮。设计思路EXTI采用前后台编程模式:定义一个全局变量ledMode,初始化为0。在外部中断服务程序(前台程序)中修改ledMode的值,并打印出当前的显示样式;在主程序(后台程序)的while(1)循环中不断检测ledMode的值,根据取值的不同调用不同的流水样式函数。设计思路引脚分配和外设配置EXTI本例所使用连接LED引脚的PC7~PC0应配置为推挽输出,不上/下拉,初始化均为高电平。PE4配置为上升沿触发,下拉。如图2-29所示。图2-29引脚配置按键及LED灯连接的GPIO引脚的配置USART1配置EXTI图2-30USART1串口配置EXTI按图所示顺序配置“ProjectManager”选项卡,特别注意⑥要选“Makefile”选项,此项虚拟仿真时需要。生成基础工程图2-31“ProjectManager”选项卡配置EXTI首先登陆/#/u,注册好自己的账户,设置好密码。进入“示例教学资源/基础实验课”,单击“STM32F407(HAL库)开发实战”,界面如所示。仿真平台搭建单击“STM32F407(HAL库)开发实战”①②③图2-32EXTI选择“中断式独立按键实验(HAL库)”后面的“添加”,将该项目添加为“我的教学资源”。仿真平台搭建仿真平台搭建绘制电路单击“模块列表”中的“LED”列表中的“LED(红)模块”,将“LED(红)模块”拖拽到右侧的绘图区,同理,在“电源”选项中,把“模拟电源(VCC)”拖拽到绘图区,左键选中要连接的一点,移动鼠标到要连接的另一点,即可完成两点的连线。用同样的方法,将“按键”“串口调试助手”等所需的电路元件拖拽到绘图区。绘制好的电路图,如图2-28所示EXTI绘制好电路后,单击绘图区右上方的“保存”,接着单击“编码”,出现代码编辑界面,在界面的右上方单击”上传代码“图标,

将前面CubeMX生成基础工程代码打包成key_water_flow.zip添加上传。显示界面如图2-35所示。编写程序EXTImain.c文件具体代码如程序清单2-14所示。编写程序/*Privatevariables--------------------------------------*//*USERCODEBEGINPV*/uint16_tled_style1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};uint16_tled_style2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};uint16_tled_style3[]={0x18,0x24,0x42,0x81,0x42,0x24,0x18,0x00};uint16_tled_style4[]={0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};uint16_tled_style5[]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};

const

charstringMode1[10]="mode_1!\r\n";const

charstringMode2[10]="mode_2!\r\n";const

charstringMode3[10]="mode_3!\r\n";const

charstringMode4[10]="mode_4!\r\n";const

charstringMode5[10]="mode_5!\r\n";const

charstringStop[10]="Stop!\r\n";

volatileint8_tled_Mode=0;uint16_tLEDvalue=0;/*USERCODEENDPV*/EXTImain.c文件具体代码如程序清单2-14所示。编写程序/*Privatefunctionprototypes--------------------------------------*/voidSystemClock_Config(void);/*USERCODEBEGINPFP*/voiddisplay(uint16_t*p,intn);/*USERCODEENDPFP*/

/*Privateusercode-------------------------------------------*//*USERCODEBEGIN0*/voiddisplay(uint16_t*p,intn){uint8_ti;

for(i=0;i<n;i++) { HAL_GPIO_WritePin(GPIOC,0x00FF,GPIO_PIN_SET);//熄灭所有的LED7~LED0 HAL_GPIO_WritePin(GPIOC,*(p+i),GPIO_PIN_RESET); HAL_Delay(20); }}/*USERCODEEND0*/EXTI

/*USERCODEBEGINWHILE*/

while(1){

/*USERCODEENDWHILE*/

/*USERCODEBEGIN3*/ HALDelay(GPIOC,0xff,GPIO_PIN_SET);switch(led_Mode){

case1:display(led_style1,sizeof(led_style1)/2);

break;case2: display(led_style2,sizeof(led_style2)/2);

break;case3: display(led_style3,sizeof(led_style3)/2);

break;case4:display(led_style4,sizeof(led_style4)/2);

break;case5:display(led_style5,sizeof(led_style5)/2);

break;default:HALDelay(GPIOC,0xff,GPIO_PIN_SET);break;}//end

of

case

}

/*USERCODEEND3*/EXTI编写程序/*USERCODEBEGIN4*/voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==GPIO_PIN_4){ led_Mode++;

if(led_Mode==6)led_Mode=0;switch(ledMode){

case1: printf("%s",stringMode1);

break;

case2: printf("%s",stringMode2);

break;

case3: printf("%s",stringMode3);

break;

case4: printf("%s",stringMode4);

break;

case5: printf("%s",stringMode5);

break;

default: printf("%s",stringStop);

break; }//endofcase

}//endofif() }//endofCallback/*USERCODEEND4*/中断回调函数编写EXTI编写程序串口输出重定向:使用虚拟仿真时,需要在GCC版本中重定向printf()函数。用适合的编辑器编辑usart.c文件,添加代码如程序清单2-15所示。程序清单2-15:/*Includes--------------------------------*/#include

"usart.h"#include

"stdio.h"/*USERCODEBEGIN2*/#pragmaGCCdiagnosticignored"-Wunknown-pragmas"//确保程序中不包含任何半主机的函数#pragmaimport(_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论