nmi中断配置_C6748 NMI不可屏蔽中断和GPIO
http://blog.csdn.net/zengaliang/article/details/78705019
1.主函数流程
此程序的作用是实现不可屏蔽中断功能。NMI(NonMaskableInterrupt)——不可屏蔽中断(即CPU不能屏蔽),无论状态寄存器中IF位的状态如何,CPU收到有效的NMI必须进行响应。主函数如下:
intmain(void)
{
//外设使能配置
PSCInit();
// GPIO管脚复用配置
GPIOBankPinMuxSet();
// DSP中断初始化
InterruptInit();
// GPIO管脚初始化
GPIOBankPinInit();
//主循环
for(;;)
{
}
}
2.外设使能配置
函数首先在PSC模块中使能外设,这里是GPIO模块。外设使能配置函数PSCInit如下:
voidPSCInit(void)
{
//使能GPIO模块
//对相应外设模块的使能也可以在BootLoader中完成
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}
函数在PSC中使能HW_PSC_GPIO(#3)模块,该模块的Power Domain是ALWAYS_ON域(POWER DOMAIN 0),PSCModuleControl细节可参考这里:
(指南P163)
3.GPIO管脚复用配置
GPIO管脚复用配置函数如下:
voidGPIOBankPinMuxSet(void)
{
//配置相应的GPIO口功能为普通输入输出口
//核心板LED
GPIOBank6Pin12PinMuxSetup();
GPIOBank6Pin13PinMuxSetup();
}
GPIOBank6Pin12PinMuxSetup函数和GPIOBank6Pin13PinMuxSetup函数将GPIO[12]和GPIO[13]这两个引脚设为普通输入输出口(即GPIO口)。这两个函数在demo\StarterWare\Application\Platform工程下的GPIO.c文件中,GPIOBank6Pin12PinMuxSetup函数如下:
voidGPIOBank6Pin12PinMuxSetup(void)
{
unsignedintsavePinmux
=0;
savePinmux
=(HWREG(SOC_SYSCFG_0_REGS
+SYSCFG0_PINMUX(13))
&
~(SYSCFG_PINMUX13_PINMUX13_15_12));
HWREG(SOC_SYSCFG_0_REGS
+SYSCFG0_PINMUX(13))
=
(PINMUX13_GPIO6_12_ENABLE
|savePinmux);
}
GPIOBank6Pin13PinMuxSetup函数如下:
voidGPIOBank6Pin13PinMuxSetup(void)
{
unsignedintsavePinmux
=0;
savePinmux
=(HWREG(SOC_SYSCFG_0_REGS
+SYSCFG0_PINMUX(13))
&
~(SYSCFG_PINMUX13_PINMUX13_11_8));
HWREG(SOC_SYSCFG_0_REGS
+SYSCFG0_PINMUX(13))
=
(PINMUX13_GPIO6_13_ENABLE
|savePinmux);
}
4.DSP中断初始化
DSP中断初始化函数InterruptInit如下:
voidInterruptInit(void)
{
//初始化DSP中断控制器
IntDSPINTCInit();
//注册中断服务函数
IntRegister(C674X_MASK_NMI, NMIIsr);
}
该函数中,首先初始化DSP中断控制器,IntDSPINTCInit函数细节见这篇博文:
然后,程序将CPU不可屏蔽中断C674X_MASK_NMI(#1)的中断服务函数注册为NMIIsr函数。IntRegister函数参考这里:
NMI引脚低电平有效,当该引脚输入低电平时,将会发送不可屏蔽中断(NMEVT)。
(指南P27)
(Megamodule手册P167)
5.GPIO管脚初始化
GPIO管脚初始化函数GPIOBankPinInit如下:
voidGPIOBankPinInit(void)
{
//配置LED对应管脚为输出管脚
// OMAPL138及DSP C6748共有144个GPIO
//以下为各组GPIO BANK起始管脚对应值
//范围1-144
// GPIO0[0] 1
// GPIO1[0] 17
// GPIO2[0] 33
// GPIO3[0] 49
// GPIO4[0] 65
// GPIO5[0] 81
// GPIO6[0] 97
// GPIO7[0] 113
// GPIO8[0] 129
//核心板LED
GPIODirModeSet(SOC_GPIO_0_REGS,
109, GPIO_DIR_OUTPUT); // GPIO6[12]
GPIODirModeSet(SOC_GPIO_0_REGS,
110, GPIO_DIR_OUTPUT); // GPIO6[13]
}
该函数将GPIO6[12]脚和GPIO6[13]脚方向设为输出,GPIODirModeSet函数如下:
voidGPIODirModeSet(unsignedintbaseAdd, unsignedintpinNumber,
unsignedintpinDir)
{
unsignedintregNumber
=0;
unsignedintpinOffset
=0;
/*
** Each register contains settings for each pin of two banks. The 32 bits
** represent 16 pins each from the banks. Thus the register number must be
** calculated based on 32 pins boundary.
*/
regNumber
=(pinNumber -1)/32;
/*
** In every register the least significant bits starts with a GPIO number on
** a boundary of 32. Thus the pin offset must be calculated based on 32
** pins boundary. Ex: 'pinNumber' of 1 corresponds to bit 0 in
** 'register_name01'.
*/
pinOffset
=(pinNumber -1)
%32;
if(GPIO_DIR_OUTPUT
==pinDir)
{
HWREG(baseAdd
+GPIO_DIR(regNumber))
&=~(1<
}
else
{
HWREG(baseAdd
+GPIO_DIR(regNumber))
|=(1<
}
}
该函数设置GPIO_DIRn寄存器,从而配置GPIO引脚的输入输出方向。
6.中断服务函数
中断服务函数如下:
#pragmaNMI_INTERRUPT(NMIIsr)
voidNMIIsr(void)
{
GPIOPinWrite(SOC_GPIO_0_REGS,
109, Flag);
//翻转标志位
Flag=!Flag;
GPIOPinWrite(SOC_GPIO_0_REGS,
110, Flag);
}
其中,第一条语句为Pragma预处理指令,该指令使能直接用C代码处理不可屏蔽中断。
(CCS帮助文档)
在中断服务函数中,程序实现GPIO6[12]和GPIO6[13]两个引脚的输出翻转,GPIOPinWrite函数如下:
voidGPIOPinWrite(unsignedintbaseAdd, unsignedintpinNumber,
unsignedintbitValue)
{
unsignedintregNumber
=0;
unsignedintpinOffset
=0;
/*
** Each register contains settings for each pin of two banks. The 32 bits
** represent 16 pins each from the banks. Thus the register number must be
** calculated based on 32 pins boundary.
*/
regNumber
=(pinNumber -1)/32;
/*
** In every register the least significant bits starts with a GPIO number on
** a boundary of 32. Thus the pin offset must be calculated based on 32
** pins boundary. Ex: 'pinNumber' of 1 corresponds to bit 0 in
** 'register_name01'.
*/
pinOffset
=(pinNumber -1)
%32;
if(GPIO_PIN_LOW
==bitValue)
{
HWREG(baseAdd
+GPIO_CLR_DATA(regNumber))
=(1<
}
elseif(GPIO_PIN_HIGH
==bitValue)
{
HWREG(baseAdd
+GPIO_SET_DATA(regNumber))
=(1<
}
}
函数根据要输出的电平是高还是低,往GPIO_CLR_DATA寄存器和GPIO_SET_DATA寄存器的相应位写1,如果输出的是低电平,则往GPIO_CLR_DATA寄存器的相应位写1;如果输出的是高电平,则往GPIO_SET_DATA寄存器的相应位写1。
(指南P853)
(指南P854)
(指南P855)
(指南P856)
nmi中断配置_C6748 NMI不可屏蔽中断和GPIO相关推荐
- nmi中断配置_关于单片机中的NMI_Handler(不可屏蔽中断处理器)
该博客文章以MKL15Z4系列单片机为例,参考文档均来自NXP官方提供的芯片用户手册和数据手册:所使用的的开发环境是MCUXpresso. 一.简单的介绍 首先请看两张截图: 一张是截取于单片机工程的 ...
- nmi中断配置_外部中断NMI中断.ppt
外部中断NMI中断.ppt * 1.先看其引脚结构再看功能1. 可编程的含义:通过对芯片编程,使芯片实现不同的功能. 中断比较多的情况下,使用中断控制器来管理中断. 用来管理系统的硬件中断. * 1. ...
- linux内核nmi中断,LINUX AM335X NMI中断使用方法
首先高清楚你要用什么中断,如果是用普通的GPIO去申请中断,那在网上百度就可以了,这里主要讲一下如何使用NMI中断(不可屏蔽中断),自己在这里走了很多弯路,希望可以帮助大家理解,有其他看法的大家在这里 ...
- STM32Gx系列进入NMI中断造成芯片死机的解决办法
STM32Gx系列进入NMI中断造成芯片死机的解决办法 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 STM32Gx系列进入NMI中断造成芯片死机的解决办法 前言 一.问 ...
- 解析kernel 2.6.24使用NMI中断对Hard lock的处理
CPU的NMI中断常用作Hard lock检测.无论CPU是否lock,硬件始终要保证NMI中断能够被响应.作为Hard lock检测的方法,当CPU硬件锁死后,其时钟中断可能无法被响应,导致时钟计数 ...
- 28335GPIO及外部中断配置介绍
本文转载连接: https://blog.csdn.net/E_ROAD_BY_U/article/details/53083151 弄了两周终于把28335的启动流程.寄存器及中断向量表的映射方法. ...
- 【STM32】FreeRTOS中断配置
00. 目录 文章目录 00. 目录 01. 概述 02. 中断管理 03. 优先级分组 04. 优先级设置 05. 特殊寄存器 06. FreeRTOS中断配置宏 07. FreeRTOS开关中断 ...
- (二)stm32之中断配置
一.stm32的中断和异常 Cortex拥有强大的异常响应系统,它能够打断当前代码执行流程事件分为异常和中断,它们用一个表管理起来,编号为0~15为内核异常,16以上的为外部中断,这个表就是中断向量表 ...
- FreeRTOS源码分析与应用开发01:中断配置与临界段
目录 1. 异常与中断的基本概念 1.1 异常分类 1.2 中断概述 1.2.1 中断处理宜短暂 1.2.2 临界段影响中断实时性 1.3 中断硬件基础 1.3.1 外设 1.3.2 中断控制器 1. ...
最新文章
- linux 命令之文件读取,head, tail, tailf, sed
- 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
- PJ:细菌挥发性物质和光合信号激活低铁响应途径
- java安卓浏览器下载文件,JAVA实现文件下载,浏览器端得到数据没反应解决方案
- 彭博社“机器学习基础”视频教程已经全部搬到腾讯视频
- mysql事务、视图
- 屏幕录像软件Community Clips Recorder简介及其使用技巧
- 使用 Laravel 5.5+ 更好的来实现 404 响应
- Linux 内存管理:DAX(Direct Access)机制的作用及实现原理
- OA办公系统 Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器
- Dump+mysql导入_mysql mysqldump导入数据库
- 全面理解面向对象的 JavaScript
- Eclipse中pep8规范,修改每行字符长度
- bitwarden_rs数据备份迁移到个人window电脑上
- leetcode 714. 买卖股票的最佳时机含手续费(java)
- 数字化转型再下一城,数字孪生厂商优锘科技宣布完成超3亿元融资
- 微信程序开发之微信接入篇
- 报关单上常出现的英文单词缩写
- 常见的CSS页面布局方式
- android自动秒杀脚本,gg修改器执行脚本按键代码秒杀安卓
热门文章
- webpack打包你的es6模块工具库
- html div相对位置,div的相对定位与绝对定位
- 百度地图 baiduMap(一) 基本显示
- recast 1 rasterizeTri dividePoly
- contains invalid call from '~PRES8 (The user did n......
- Airtest快问快答,你们想问的这里都有!(第2期)
- 深度(穿透)选择器 >>> /deep/ ::v-deep
- MFC 编程从入门到精通
- ubuntu 登录界面 KDM改回GDM
- P45 lets talk in english