在FSMC中,INT2~3和INTR引脚是三个外部中断,可高电平触发(EXTI没有的功能)、上升沿或下降沿触发。中断引脚分别是PG6、PG7和PF10。不打开相应的FSMC Bank(FSMC_PCRx_PBKEN=0)也能触发中断。其中上升/下降沿可通过软件对标志位写1来触发。

下面的程序通过改变各中断引脚内部所接的上下拉电阻来改变引脚电平,进而触发相应的中断。

#include <stdio.h>
#include <stm32f10x.h>int fputc(int ch, FILE *fp)
{if (fp == stdout){if (ch == '\n'){while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, '\r');}while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, ch);}return ch;
}int main(void)
{GPIO_InitTypeDef gpio;USART_InitTypeDef usart;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | RCC_APB2Periph_USART1, ENABLE);gpio.GPIO_Mode = GPIO_Mode_AF_PP;gpio.GPIO_Pin = GPIO_Pin_9;gpio.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &gpio);gpio.GPIO_Mode = GPIO_Mode_IPD; // 接内部下拉电阻gpio.GPIO_Pin = GPIO_Pin_10; // PF10为INTR引脚GPIO_Init(GPIOF, &gpio);gpio.GPIO_Mode = GPIO_Mode_IPD; // 接内部下拉电阻gpio.GPIO_Pin = GPIO_Pin_7; // PG7为INT3引脚GPIO_Init(GPIOG, &gpio);USART_StructInit(&usart);usart.USART_BaudRate = 115200;USART_Init(USART1, &usart);USART_Cmd(USART1, ENABLE);printf("FSMC Interrupt Test\n");USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_EnableIRQ(USART1_IRQn);FSMC_ITConfig(FSMC_Bank3_NAND, FSMC_IT_RisingEdge | FSMC_IT_FallingEdge, ENABLE);FSMC_ITConfig(FSMC_Bank4_PCCARD, FSMC_IT_RisingEdge | FSMC_IT_FallingEdge, ENABLE);NVIC_EnableIRQ(FSMC_IRQn);// FSMC的Bank3~4不启用也能触发中断// 外部存储芯片的ready/busy引脚应该全部接到NWAIT上, 不应该接到INT引脚上, 否则无法使用FSMC的WAIT引脚等待功能// ready/busy引脚通常为开漏输出, 所以只要有一个芯片拉低了NWAIT, PD6就为低电平while (1)__WFI();
}void FSMC_IRQHandler(void)
{if (FSMC_GetITStatus(FSMC_Bank3_NAND, FSMC_IT_RisingEdge) == SET){FSMC_ClearITPendingBit(FSMC_Bank3_NAND, FSMC_IT_RisingEdge);printf("Interrupt rising edge in Bank 3!\n");}if (FSMC_GetITStatus(FSMC_Bank3_NAND, FSMC_IT_FallingEdge) == SET){FSMC_ClearITPendingBit(FSMC_Bank3_NAND, FSMC_IT_FallingEdge);printf("Interrupt falling edge in Bank 3!\n");}if (FSMC_GetITStatus(FSMC_Bank4_PCCARD, FSMC_IT_RisingEdge) == SET){FSMC_ClearITPendingBit(FSMC_Bank4_PCCARD, FSMC_IT_RisingEdge);printf("Interrupt rising edge in Bank 4!\n");}if (FSMC_GetITStatus(FSMC_Bank4_PCCARD, FSMC_IT_FallingEdge) == SET){FSMC_ClearITPendingBit(FSMC_Bank4_PCCARD, FSMC_IT_FallingEdge);printf("Interrupt falling edge in Bank 4!\n");}
}void USART1_IRQHandler(void)
{uint8_t data = USART_ReceiveData(USART1);printf("[Key %c] ", data);switch (data){case 'a':// 改变PG7上所接的内部上/下拉电阻printf("PG7=%d\n", GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_7));GPIOG->ODR ^= GPIO_ODR_ODR7;break;case 'b':// 高电平中断会反复触发, 所以放在这里if (FSMC_GetFlagStatus(FSMC_Bank3_NAND, FSMC_FLAG_Level) == SET){FSMC_ClearFlag(FSMC_Bank3_NAND, FSMC_FLAG_Level);printf("Interrupt high-level occurred in Bank 3!\n");}elseprintf("\n");break;case 'c':// 改变PF10上所接的内部上/下拉电阻printf("PF10=%d\n", GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_10));GPIOF->ODR ^= GPIO_ODR_ODR10;break;case 'd':if (FSMC_GetFlagStatus(FSMC_Bank4_PCCARD, FSMC_FLAG_Level) == SET){FSMC_ClearFlag(FSMC_Bank4_PCCARD, FSMC_FLAG_Level);printf("Interrupt high-level occurred in Bank 4!\n");}elseprintf("\n");break;case 'e':if (FSMC_GetFlagStatus(FSMC_Bank2_NAND, FSMC_FLAG_FEMPT) == SET)printf("FSMC Bank2 FIFO empty!\n");if (FSMC_GetFlagStatus(FSMC_Bank3_NAND, FSMC_FLAG_FEMPT) == SET)printf("FSMC Bank3 FIFO empty!\n");if (FSMC_GetFlagStatus(FSMC_Bank4_PCCARD, FSMC_FLAG_FEMPT) == SET)printf("FSMC Bank4 FIFO empty!\n");break;case 'f':// 可软件触发中断FSMC_Bank3->SR3 |= FSMC_SR3_IRS; // risingbreak;case 'g':FSMC_Bank3->SR3 |= FSMC_SR3_IFS; // fallingbreak;case 'h':FSMC_Bank4->SR4 |= FSMC_SR4_IRS;break;case 'i':FSMC_Bank4->SR4 |= FSMC_SR4_IFS;break;default:printf("\n");}// 注意: 高电平中断ILS不可通过对标志位写1触发
}

程序运行结果:

FSMC Interrupt Test
Interrupt rising edge in Bank 3!
Interrupt falling edge in Bank 3!
Interrupt rising edge in Bank 4!
Interrupt falling edge in Bank 4!
[Key b] Interrupt high-level occurred in Bank 3!
[Key b]
[Key b]
[Key b]
[Key a] PG7=0
Interrupt rising edge in Bank 3!
[Key b] Interrupt high-level occurred in Bank 3!
[Key b] Interrupt high-level occurred in Bank 3!
[Key b] Interrupt high-level occurred in Bank 3!
[Key b] Interrupt high-level occurred in Bank 3!
[Key a] PG7=1
Interrupt falling edge in Bank 3!
[Key b] Interrupt high-level occurred in Bank 3!
[Key b]
[Key b]
[Key b]
[Key d] Interrupt high-level occurred in Bank 4!
[Key d]
[Key d]
[Key d]
[Key c] PF10=0
Interrupt rising edge in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key c] PF10=1
Interrupt falling edge in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d]
[Key d]
[Key d]
[Key c] PF10=0
Interrupt rising edge in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key d] Interrupt high-level occurred in Bank 4!
[Key e] FSMC Bank2 FIFO empty!
FSMC Bank3 FIFO empty!
FSMC Bank4 FIFO empty!
[Key f] Interrupt rising edge in Bank 3!
[Key g] Interrupt falling edge in Bank 3!
[Key f] Interrupt rising edge in Bank 3!
[Key g] Interrupt falling edge in Bank 3!
[Key h] Interrupt rising edge in Bank 4!
[Key h] Interrupt rising edge in Bank 4!
[Key h] Interrupt rising edge in Bank 4!
[Key i] Interrupt falling edge in Bank 4!
[Key i] Interrupt falling edge in Bank 4!
[Key i] Interrupt falling edge in Bank 4!

程序最开始运行时标志位FSMC_SRx_IFS、FSMC_SRx_IRS、FSMC_SRx_ILS的状态是不定的,也可能都默认置位了,也可能部分置位,或者全部为0,所以打开FSMC中断前最好清除一下所有的标志位,防止误判:

FSMC_ClearFlag(FSMC_Bank3_NAND, FSMC_FLAG_Level);
FSMC_ClearFlag(FSMC_Bank3_NAND, FSMC_FLAG_RisingEdge);
FSMC_ClearFlag(FSMC_Bank3_NAND, FSMC_FLAG_FallingEdge);
FSMC_ClearFlag(FSMC_Bank4_PCCARD, FSMC_FLAG_Level);
FSMC_ClearFlag(FSMC_Bank4_PCCARD, FSMC_FLAG_RisingEdge);
FSMC_ClearFlag(FSMC_Bank4_PCCARD, FSMC_FLAG_FallingEdge);FSMC_ITConfig(FSMC_Bank3_NAND, FSMC_IT_RisingEdge | FSMC_IT_FallingEdge, ENABLE);
FSMC_ITConfig(FSMC_Bank4_PCCARD, FSMC_IT_RisingEdge | FSMC_IT_FallingEdge, ENABLE);
NVIC_EnableIRQ(FSMC_IRQn);

STM32F103ZE单片机中FSMC Bank2~4中断(INT2~3和INTR引脚)的使用相关推荐

  1. 其实单片机中的串口和中断问题就像设定使碗接到10滴水就溢出

    其实单片机中的串口和中断问题就像设定使碗接到10滴水就溢出 ///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球 ...

  2. 89C51单片机中的中断系统

    89C51单片机中的中断系统 对于在单片机中的学习,中断系统是一难点,如果中断系统没有理解透彻,51单片机的学习就算是失败的. 首先,举例说明下什么是中断. eg.当你在家正在吃着爆米花,看着电视,突 ...

  3. STM32F103ZE单片机FSMC接口读取NAND Flash芯片K9F1G08U0E的数据时出现数据丢失的解决办法

    [问题] STM32单片机使用FSMC读取K9F1G08U0E NAND Flash时,出现部分字节丢失的情况.例如:Flash存储器中存储有连续的0xff字节,则在进行连续读(Page Read)操 ...

  4. c51语言中 如何定义一个中断服务子程序,51单片机中断服务子程序的设计

    中断系统的运行必须与中断服务子程序配合才能正确使用.设计中断服务子程序需要首先明确以下几个问题. 中断服务子程序设计的任务 中断服务子程序设计的基本任务有下列4条: (1)设置中断允许控制寄存器IE, ...

  5. 51单片机学习-5定时器与中断

    5 定时器与中断 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github ...

  6. STM32为何能在众多单片机中脱颖而出?

    现在STM32资料教程如此丰富,但还是很多人学不会- 假如STM32像10年前的NXP单片机资料一样少,估计学不会的人会更多. 大家好,我是无际,一个踩坑单片机开发10年的老油条. 这些年,我用过很多 ...

  7. 单片机中存储器扩展位地址线怎么算_小白学单片机 :AT89S51单片机基本硬件结构认识(2)...

    AT89S51单片机存储器的空间配置及功能结构 AT89S51单片机的存储器在物理结构上可以分为4个不同的存储空间:(1)内部程序存储器:(2)片内数据存储器:(3)片外数据存储器(最大可扩展到64K ...

  8. 单片机中的ROM,RAM和FLASH的作用

    本文部分参考自:http://blog.sina.com.cn/s/blog_98ca54fc01017y4t.html 并在此基础上进行整理,添加了关于flash的问题. 之前从较为抽象的角度介绍了 ...

  9. 联合体在单片机中的应用

    转自:http://baike.baidu.com/item/%E8%81%94%E5%90%88%E4%BD%93?fr=aladdin 联合体在单片机中的应用 单片机中经常会遇见分离高低字节的操作 ...

最新文章

  1. EOS安全漏洞再发,BCH将如何兼顾智能合约效率与安全?
  2. Java虚拟机对类加载的处理机制
  3. Oracle 11g 的bug?: aix 上,expdp 11.2.0.1 导出,impdp 11.2.0.3 导入,Interval 分区的 【Interval】 分区属性成了【N】...
  4. vim使用四个空格代替TAB键
  5. 【数据竞赛】这篇文章送给想要学习特征交叉的朋友。
  6. Activity功能控件
  7. webstorm的安装
  8. WinForm ListView
  9. hadoop2.4.1源码编译步骤 hive0.13.1编译
  10. Scala.js:将Scala编译为JavaScript的编译器
  11. ubuntu16.04无法用网页播放音乐
  12. 推荐!可视化垃圾回收算法(转)
  13. [转]用了docker是否还有必要使用openstack?
  14. html——name与value的使用
  15. 第一次接触WebSocket遇到的坑以及感受
  16. 再硬写一个最简单的HTTPSERVER
  17. 关于合格工程师素养的一些思考
  18. Ubuntu安装aptitude,来解决软件包依赖关系的问题
  19. 御剑后台扫描工具下载、安装、使用教程
  20. 学习scratch3.0第2章

热门文章

  1. 中国手机地图用户超7千万 LBS开启掌上世界
  2. csgo连接服务器本地文件,【图片】CSGOKZ服务器架设教程(windows版)包含申请全球服务器。【csgokz吧】_百度贴吧...
  3. ASEMI贴片整流桥MB6S,LED驱动器电源适配
  4. 使用keil及proteus实现数码管循环显示“0“-“F“
  5. 游戏原画和3D游戏建模那个更好?
  6. 在计算机中排顺序用什么函数,实例教你学Excel:函数排序与筛选
  7. hi,我(屁孩君儿子)又回来啦!本次分享的是1087 级数求和
  8. 浅学C#(17)——Winform程序设计之ListBox、CheckListBox、ComboBox、ListView、ImageList、TabControl、PictureBox...
  9. 网易云音乐歌曲没歌词用酷狗展现的方式
  10. android 仿网易标签切换,Android 仿网易新闻客户端Tab标签