在STM32里面一般有五组寄存器分别是A——E组,每组寄存器的端口基本都有复用功能,这样可以使得端口的不被浪费,而达到极致利用。

使用复用端口的时候需要打开AFIO的时钟才能使用IO口的复用端口。每个端口基本都要外部中断复用功能,如果需要用的话就要配置端口以及外部中断。这里也要注意的是端口的每个Pin只能是不用组别的Pin才能同时用,否则会发生中断冲突。就好像:A组的Pin_0和B组的Pin_0和C组的Pin_0和D组的Pin_0和E组的Pin_0是不能同时用的也就是说引脚号是不能同时使用这个外部中断的,因为外部中断有一个中断优先响应组别。只能是Pin0,Pin1, Pin2,Pin3....Pin15这样子。分别是0~15.所以当中断进入的时候这个组别只能是不同的引脚端口才可以同时进入,否则会冲突。

下面来配置一下B组的Pin13引脚的外部中断

首先把引脚号初始化,这里是读取引脚的电平,用的是红外传感器模块。

void Cont_Init(void)
{GPIO_InitTypeDef  Cont_InitStruct;  // 定义结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    //打开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //AFIO复用功能端口钟时钟Cont_InitStruct.GPIO_Mode=GPIO_Mode_IPU;    //上拉输入模式 ,读取电平Cont_InitStruct.GPIO_Pin=GPIO_Pin_13;          //选择引脚13Cont_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //速度GPIO_Init(GPIOB,&Cont_InitStruct); //写入寄存器B组

下面是配置外部中断相应的引脚,和上面的代码是在同一个初始化函数里面的,配置中断引脚其实跟配置引脚差不多一样的,只是这个中断不用打开时钟,因为内部是一直打开的。根本不需要,然后一样用结构体定义,然后配置里面的模式,和一些触发方式。以及触发的模式。

触发方式有三种:上升沿触发就是识别了之后,拿开就是上升沿触发。下降沿就是一放下去识别就是下降沿触发,还有就是上升和下降沿触发。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);          //配置相应的外部中断引脚EXTI_InitTypeDef  EXTI_ContInit;         //EXTI外部中断结构体初始化 由于时钟一直打开的所以不需要开启时钟使能EXTI_ContInit.EXTI_Line=EXTI_Line13;     //选择中断的引脚EXTI_ContInit.EXTI_LineCmd=ENABLE;  //   打开使能EXTI_ContInit.EXTI_Mode=EXTI_Mode_Interrupt; //中断触发模式。分别由中断触发和事件触发EXTI_ContInit.EXTI_Trigger=EXTI_Trigger_Rising;   //触发方式为上升沿EXTI_Init(&EXTI_ContInit);   //结构体初始化。

下面的就是配置中断的优先级了,优先级这个代码比较少,所以内容放在的文件都比较杂,需要在misc.c和.h和stm32f10x.h文件以及startup_stn32f10xx_hd.s启动文件里面查看。

首先在misc.h文件的最下面看到一样的配置功能函数。以及初始化结构体,然后把每个结构的定义放出来后,可以看到配置引脚中断号这个定义,需要在stm32f10x.h找到配置的EXTI开头宏定义,分别就是上面说的0~15个。需要看好自己配置的引脚来配置中断号,这里是13引脚所以是10-15中断号,然后抢占优先级和响应优先级,这里只用一个引脚,所以可以随便配置,可以在misc.h文件的注释表里面看到。大概意思反正就是数字越小优先级就越高。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组,先占优先级是抢占优先级,从占是响应优先级。NVIC_InitTypeDef   NVIC_ContInit;    //中断优先级响应结构体  由于时钟一直是打开的不需要开启时钟NVIC_ContInit.NVIC_IRQChannel=EXTI15_10_IRQn;  //根据引脚中断号需要在#include "stm32f10x.h"文件查看自己选择的启动容量文件的密度  NVIC_ContInit.NVIC_IRQChannelCmd=ENABLE;       //打开使能NVIC_ContInit.NVIC_IRQChannelPreemptionPriority=1;    //抢占优先级  数字越小,优先级越高NVIC_ContInit.NVIC_IRQChannelSubPriority=1;         //响应优先级    数字越小,优先级越高NVIC_Init(&NVIC_ContInit);

到这里的初始化函数就完成了。

最后需要配置中断函数,每个只能引脚都对应着不同的中断通道,但是中断函数的名字是固定的不可以随便起,中断函数可以在startup_stn32f10xx_hd.s启动文件里面看到一些宏定义,也是一样对应着自己配置的引脚号就选择对应的中断函数通道。这里是13,所以也是用10—15 这个函数通道

,中断函数里面需要设置一些标志号,在EXTI.h文件后面找到,这里需要设置标志位,如果这个配置的触发方式,得到触发那么就会进入到中断,但是每次进入中断都需要清除标志位,不然就会卡死在中断循环里面,怎么样判断有没有进入中断成功呢,

uint16_t Count=0;
void  EXTI15_10_IRQHandler (void)
{if(EXTI_GetITStatus(EXTI_Line13) == SET)   //设置中断标志位{Count++;EXTI_ClearITPendingBit(EXTI_Line13);  //清除中断标志位,每次进来都要清楚,不然就会一值在这里循环,出不去中断}}

可以定义一个全局变量,注意只有全局变量好使,然后再利用keil软件的模拟仿真,然后在里面设置一个断点,再中断函数的if(EXTI_GetITStatus(EXTI_Line13) == SET)  这里,然后运行仿真,这个就会跑到这个断点这里,然后还可以再仿真里面新建一个watch窗口,新建一个值,就是全局变量的值。把鼠标放在value那里右键去掉十六进制显示。注意进入放在需要插上STM-Link和模块连接着才行。点击1仿真,2设置断点,3点击watch,4新建值,5运行。然后运行的时候,可以触发红外模块,这里就可以看到这个值的变化,然后也会运行到这个断点这里了。

这个仿真模式有很大作用,可以很好的测式运行的每一步代码。同时也可以定一个全局变量来计次,包括定时器计数,等等很多功能以及作用。对编写代码以及测试提供了很大的方便。

这里是主函数

#include "cont_cor.h"
int main(void)
{Cont_Init();while(1){   }}

笔记:STM32——IO口的复用功能外部中断相关推荐

  1. stm32的IO口的复用功能(即AFIO)

    关于stm32的IO口的复用功能,可以参考这篇博客,写的不错. https://blog.csdn.net/u013082827/article/details/77543394

  2. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  3. STM32 IO口的8中配置方式解读(推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟)

    转自:http://blog.csdn.net/u010592722/article/details/45746079 STM32  IO口的8中配置方式: (1)GPIO_Mode_AIN 模拟输入 ...

  4. STM32 IO口模拟ISO7816(PSAM卡)协议

    单片机:stm32f103c8t6   实现方式:纯IO口模拟(RST.I/O.CLK均为普通IO口) 实现功能:接触式CPU卡.PSAM.SIM读(写) 网上有很多相关的代码,有的是用自带的智能卡接 ...

  5. stm32 IO口的八种输入输出模式

    记录一下stm32 IO口的八种输入输出模式的学习 首先,可以看见stm32的输入输出模式有以上8种 先从简单的开始说吧 上拉输入和下拉输入: 看图: 由上图可见,当IO口设置为上拉输入的时候,IO口 ...

  6. STM32 IO口三种配置方式

    浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了. 开漏,就等于输出口接了个NPN三极管,并且只接了e,b. c极 是开路的,你可以接一个电阻到3.3V,也可以接一个电阻到 ...

  7. STM32 IO口的八种模式

    [冉冰的成长日记007] STM32 的 IO 口可以由软件配置成如下 8 种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复 ...

  8. STM32 IO口的八种模式使用小结

    /** * @brief Configuration Mode enumeration */typedef enum { GPIO_Mode_AIN = 0x0, //模拟输入GPIO_Mode_IN ...

  9. [技术讨论]STM32 IO口输出之推挽输出和开漏输出对比

    先上一个总览图 众所周知STM32的IO口可配置成输出和输出,其中输入有四种模式,输出也有四种模式,分别如下: 输入: GPIO_Mode_AIN-----------------模拟输入 GPIO_ ...

最新文章

  1. 卸载Notepad++!事实已证明,它更牛逼……
  2. Android m 自定义下拉菜单,Android实现动画效果的自定义下拉菜单功能
  3. 【转载】突然觉得今年的时间过得太快了,不知不觉中还剩下四个多月就步入2017年了,回首一下,好像什么都还没做呢。...
  4. 建立稳定安全的SSH隧道
  5. fundamental-react在POC中的一个应用
  6. java 前置通知_spring aop中的前置通知
  7. python教程闭包_Python教程 闭包的特性
  8. Java LinkedList对象的clone()方法和示例
  9. shell下将文件中的分隔符从‘\t‘转换成‘,‘
  10. SpringCloud之良心入门干货(Eureka入门)
  11. java panel边框_java – 如何在jPanel上设置边框?
  12. flink写入 mysql_基于 Binlog + Flink 实现多表数据同构/异构方案
  13. 用java编写录音机类_java实现录音机
  14. git pull没有更新成功_git冲突平滑解决的巧方法
  15. 最新版idm下载器(Internet Download Manager)视频嗅探神器
  16. Autodesk AutoCAD 2018 for mac
  17. 服务器进入bios修改硬盘启动项,bios设置硬盘启动安装方法
  18. Adjust接入注意事项
  19. Codeup100000609问题 A: Jugs
  20. uniapp ->video 黑屏 无时长(新手容易遇到的坑)

热门文章

  1. html中的tr,td,th标签
  2. 【EXCEL实战】-- 格式全部变为日期格式
  3. linux判断没有文件夹建一个,2,shell 脚本, 判断一个文件是否存在, 不存在就创建, 存在就显示其路径...
  4. 【OpenCV】图像的特效变换扭曲变换、球形变换、波动变换
  5. 苍蓝誓约pc_我们伟大的15年大誓约续约
  6. (视频+源码)助力年后跳槽:对标阿里P8的大数据开发全套教程
  7. 华为畅享max支持鸿蒙,华为畅享MAX真机上手 皮纹后盖很吸睛
  8. Echarts 极坐标系下的多色柱状图
  9. win 10 又来骚操作!真绝了啊……
  10. Windows - bat 文件目录处理、生成