前言
上一节我们讲过nrf51822的gpiote功能,利用GPIOte的Event,中断,和Task做了一个简单的用按键控制LED的实验,其间用到了中断,涉及到中断的开启,优先级设置,中断响应函数的实现等等,
nrf51822 cpu使用的是M0核心,其中断的控制也是由内部的NVIC模块进行控制,关于NVIC的详细操作如果有STM32开发基础的话,这边基本也不会有会什么障碍,本节将会以上一讲gpiote的代码为例,重点给大家介绍始何在 nrf51822 中实现中断操作。
示例详解
基于硬件平台: nrf51822ek_tm开发板。
本示例所用的最小系统板原理图:
-
- 工程创建:
- 打开KEIL,新建一个空工程:Project->New uVision Project
- 工程创建:
工程名为nrfxx-Int确认后按下图选择芯片为nrf51822_xxAA->ok
在弹出的对话框中勾选CMSIS中的CORE;Device中的Startup(后面有nrf51 Series字样的);在nrf_device中勾选nrf_gpio, nrf_gpiote,nrf_delay.
OK之后工程自动生成如下代码:
新建一个空白文档,保存为main.c,并加入工程中:
配置工程,选择使用MicroLIB库,可以减小程序体积:
加入NRF51定义,并选择化等级3,可以减小程序体积,但仿真运行时可能会出现与代码顺序不一致现象:
调试工具选择J-LINK,并将接口设置为SW口勾选下载程序后自动复位及运行:
-
- 工程代码
- OK之后在man.c中加入如下代码:
- 工程代码
下面重点解析一下实现中断响应的相关代码:
首先我们用到的是GPIOTE模块及其中断,打开arm_startup_nrf51.s文件,找到GPIOTE模块对应的中断响应函数GPIOTE_IRQHandler:
复制GPIOTE_IRQHandler到main.c ,并补齐形参及返回值,加入响应代码:
然后在main函数使能中断:
NVIC_SetPriority(GPIOTE_IRQn, 1); // 设置中断优先级
NVIC_ClearPendingIRQ(GPIOTE_IRQn); // 清除中断标志
NVIC_EnableIRQ(GPIOTE_IRQn); // 使能中断 – 必需
__enable_irq(); // 开启全局中断 – 默认也是开的
其中GPIOTE_IRQn为 GPIOTE_IRQHandler 中将 “Handler”变成”n”即可,上面四行代码中,其实就第三行是必需,其它三行在本例为非必需代码。
-
- 编译工程,仿真调试-》全速运行并在GPIOTE_IRQHandler中放入一个断点:
按下按键,程序成功进入到中断函数中:
可以看到NRF中断的操作与STM32 的mcu很类似,就三步,开总中断,使能指定中断,实现中断响应函数,其它模块的中断操作也是类似。
OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!
文中源码资料下载,在公众号里给十三发消息:
下载|一起学nRF51xx 4
关注十三公众号