目录

1.带参数的宏定义

2.外部中断


1.带参数的宏定义

下面这段代码是实现单片机上三个LED灯控制的宏定义的原代码

首先宏定义了ON为0,OFF为1,这是由于单片机的硬件决定的(如下图)。

注:(1)上面意思是: LED1(a) 替换后面的if...else语句,并传递参数;

(2)c语言 中 反斜杠( \)的作用:语义上表示,下一行是上一行的延续。也就是同一行。
当你的代码一行写的时候会太长,需要分行方便显示时,但代码又不能分行时,例如这里的宏定义,只能在一行定义好,那样就可以用过在结尾添加 反斜杠( \) 来换行。表示 接着下一行,就是例子中的整个 if-else 语句都被 反斜杠( \) 连接在同一行,所以替换后就仅仅一行而已。反斜杠( \) 后面不能有任何字符,包括空格。

以LED1(a)为例,上面的代码就可以这样理解了:

#define LED1(a) if (a)GPIO_SetBits(GPIOB,GPIO_Pin_0);else GPIO_ResetBits(GPIOB,GPIO_Pin_0);

2.外部中断

(1)从 main 函数开始分析

int main(void)
{LED_GPIO_Config();LED1_ON;CLI();SEI();EXTI_PC13_Config(); while(1){}
}

(2)配置中断函数

 /*** @brief  配置 PC13 为线中断口,并设置中断优先级* @param  无* @retval 无*/
void EXTI_PC13_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;/* config the extiline(PC13) clock and AFIO clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);/* config the NVIC(PC13) */NVIC_Configuration();/* EXTI line gpio config(PC13) */   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     // 上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);/* EXTI line(PC13) mode config */GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); EXTI_InitStructure.EXTI_Line = EXTI_Line13;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}

(3)NVIC初始化设置

 /*** @brief  配置嵌套向量中断控制器NVIC* @param  无* @retval 无*/
static void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* 配置P[A|B|C|D|E]13为中断源 */NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

(4)抢占优先级和响应优先级

STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号
越小,表明它的优先级别越高。而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达则先处理响应优先级高的中断,响应属性由NVIC_IRQChannelSubPriority参数配置。

(5)NVIC 的优先级组

在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC 只可
以配置 16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个 4 位的
数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。有 5 组分
配方式 :

第 0 组: 所有 4 位用来配置响应优先级。即 16 种中断向量具有都不相同的响应优先
级。
第 1 组:最高 1 位用来配置抢占优先级,低 3 位用来配置响应优先级。表示有 21=2 种
级别的抢占优先级(0 级,1 级),有 23=8 种响应优先级,即在 16 种中断向量之中,有
8 种中断,其抢占优先级都为 0 级,而它们的响应优先级分别为 0~7,其余 8 种中断向
量的抢占优先级则都为 1 级,响应优先级别分别为 0~7。
第 2 组:2 位用来配置抢占优先级,2 位用来配置响应优先级。即 22=4 种抢占优先
级,22=4 种响应优先级。
第 3 组:高 3 位用来配置抢占优先级,最低 1 位用来配置响应优先级。即有 8 种抢占
优先级,2 种响应 2 优先级。
第 4 组:所有 4 位用来配置抢占优先级,即 NVIC 配置的 24 =16 种中断向量都是只有
抢占属性,没有响应属性。
要配置这些优先级组,可以采用库函数 NVIC_PriorityGroupConfi g(),可输入的参数为
NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的 5 种分配组。

(6)编写中断服务函数

中断服务函数的名字必须要与启动文件startup_stm32f10x_hd.s 中的中断向量表定义一致。

中断函数入口的时候要注意函数名的写法,函数名只有两种命名方法 :
EXTI0_IRQHandler ; EXTI Line 0
EXTI1_IRQHandler ; EXTI Line 1
EXTI2_IRQHandler ; EXTI Line 2
EXTI3_IRQHandler ; EXTI Line 3
EXTI4_IRQHandler ; EXTI Line 4
EXTI9_5_IRQHandler ; EXTI Line 9..5
EXTI15_10_IRQHandler ; EXTI Line 15..10
中断线在 5 之后的就不能像 0 ~ 4 那样只有单独一个函数名,都必须写成EXTI9_5_IRQHandler 和 EXTI15_10_IRQHandler 。 假 如 写 成 EXTI5_IRQHandler 、EXTI6_IRQHandler、EXTI15_IRQHandler 编译器是不会报错的,不过中断服务程序不能工作。

/// IO 线中断,中断口为PC13
//void EXTI13_IRQnHandler(void)
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13) != RESET) //确保是否产生了EXTI Line中断{LED3_TOGGLE;EXTI_ClearITPendingBit(EXTI_Line13);     //清除中断标志位}
}

野火ISO-V2学习相关推荐

  1. 第八课:ShuffleNet v1、ShuffleNet v2学习

    前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容.来源于哔哩哔哩博主"霹雳吧啦Wz",博主学习作为笔记记录,欢 ...

  2. 1120_野火RT-Thread教程学习4_RTT学习基础知识梳理

    野火RT-Thread教程学习笔记4_RTT学习基础知识梳理 Grey 全部学习汇总:GitHub - GreyZhang/g_RT-Thread: learning and hacking RT-T ...

  3. ant design pro V2 学习笔记

    该笔记分为两部分,前面部分为官方文档介绍,后面为实际项目改造的历程 本文档不定时更新,你想要的在实战部分 如果你对react.dva等一些概念不是很清晰,建议先看以下概念: react:https:/ ...

  4. 性能猛兽野火STM32H743 V2开发板跑Linux 5.10,分数爆炸1836.884644

    研究了三个月的移植过程,终于能运行了.用户名:root 密码:123 附件附上二进制文件: 1.将uboot.bin下载到stm32 flash 0x08000000 2.将stm32h743-fir ...

  5. ShuffleNet V2学习笔记

    paper:<ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design> 导语 神经网络架构的设计 ...

  6. DeepLab V2学习笔记

    DeepLab V2 遇到的相关问题以及解决方法 对于DeepLab V1的优化 模型总结 补充的一个小知识点 ASPP Learning rate policy 消融实验 实验结果 遇到的相关问题以 ...

  7. Background Matting V2 学习

    论文: [2012.07810] Real-Time High-Resolution Background Matting (arxiv.org) GitHub项目源码:GitHub - PeterL ...

  8. NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导

    前言 业务组件的设计是非常重要的工作,如果你没有正确的设计业务组件的话,结果很可能就是代码难以维护和扩展.在设计和实现应用的时候,有多种类型的业务组件.包括业务逻辑组件,业务实体,业务流程或者是工作流 ...

  9. NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导

    5 决定数据绑定的需求 数据绑定在应用中,提供了一种在用户界面的控件和数据或者逻辑组件建立连接的方式.数据绑定允许你将数据库的数据,或者是其他结构的数据进行显示或者和他们进行交互.数据绑定是绑定目标( ...

  10. 野火STM32例程学习笔记

    一.GPIO 1.点亮小灯 地址 GPIOx的基地址&RCC基地址:官方手册->存储器和总线构架->存储器映像. 注意:数值变量应是指针所指位置的值*( unsigned int ...

最新文章

  1. Markdown上下标内容多于一项
  2. python爬歌词生成词云图_爬取每日热搜词,生成地图词云图
  3. SqlServer 中的临时表与表变量
  4. 我爱Java系列---【mysql基础约束】
  5. 博图编写温度程序_NTC测量温度的两个不同的数值转换程序,你会选择哪一个
  6. Android插件化原理解析——Hook机制之动态代理
  7. 程序员的4种心态与4种将来
  8. Java队列与栈转换中String.Valueof()使用
  9. ⅰcp经济模型_干货!来自清华小哥哥的全家桶教程——手把手教你在本地构建 Nervos AppChain...
  10. 西南联大数学名师的“治学经验之谈”及启示
  11. windows qt 不能debug_linux配置vlc-qt
  12. 深度可分离卷积Depthwise Separable Convolution
  13. 4G换5G关口,智能手机如何抢回“失去的一个月”
  14. cytoscape插件下载_Cytoscape
  15. (转)招商银行这一招,引起了各大银行的注意
  16. MFC的API函数大全
  17. 8 款好用的 React Admin 管理后台模板推荐
  18. 中文用户名改为英文只要3步复制黏贴
  19. 衬线字体和无衬线字体
  20. PHP训练聊天机器人,智能聊天机器人,陪你聊天练口才!

热门文章

  1. 【集训DAY3】挖金矿【二分答案】
  2. 解决Win10打开可执行文件提示为了对电脑进行保护,已经阻止此应用的问题
  3. macpro下docker安装目录_macos – 在mac os下的Docker deamon配置路径
  4. 4k视频分辨率的码流_拍摄4K,30帧视频,多少码率合适?
  5. keepalved(DR模式群集冗余备份)
  6. 用了这么多年Redis,你知道Redis名字的由来吗?
  7. 众包专访:开源中国众包,让未来多一种可能
  8. Arcgis用矢量文件裁剪栅格图像
  9. 7-3 约分最简分式
  10. PHP中 逗号,和句号.的区别