历史上的今天
返回首页

历史上的今天

今天是:2024年09月04日(星期三)

正在发生

2019年09月04日 | cc2530裸机编程系列笔记6--外中断程序

2019-09-04 来源:eefocus

在做实验之前我们先来了解一下cc2530的51内核的外部中断的基本信息,同样我们去datasheet里面找找这些中断的说明文字:

         Interrupts
             The CPU has 18 interrupt sources. Each source has its own request flag located in a set of interrupt flag
             SFR registers. Each interrupt requested by the corresponding flag can be individually enabled or disabled.
             The definitions of the interrupt sources and the interrupt vectors are given in Table 2-5 .


就是说cc2530的51内核有18个中断源,每个中断源都有自己的中断标志SFR寄存器,每个中断源都可以开启或者关闭,具体的这18个中断源如下:

         

在上面我们可以看到这18个中断源的基本情况,以及他们被分开了三个中断控制小分队长寄存器IENX,以及对应关系


当然,这么多中断我不可能一一说明,所以这里我选择了一个最简单的,基本的io中断来做一个实验,来说明这些中断的初始化以及处理,其实讲中断主要是为了下面做休眠实验做准备。


好了,我现在不用上一节说的佳杰的板子了,直接用我们公司自己画的板子,因为我们做的板子就只有一块很小的板子,io口全是裸露出来的,我想怎么弄就怎么弄,为了方便我的按键也没有加上拉电阻,字节是从cpu的io口出来,然后接按键的一个脚,然后按键的另外一个脚接在了GND,就这么简单,当然,这肯定是不行的,你还得加该加的东西,我这里只是为了试验而已,并不是真正的产品。而且我不是硬件工程师,也不会这些东西。

    因为以前是学嵌入式linux的,还有就是大学的时候深受java编程的影响,一切都喜欢封装,来到了单片机这里,同样喜欢把不同的代码放在不同的代码实现文件中,不喜欢全部放在一个.c文件。我把led的操作和宏定义定义在了hal_led.h和hal_led.c中。


  1. hal_led.h  

  2.   

  3. #include   

  4.   

  5. #define LED_NUM_1   0x00  

  6. #define LED_NUM_2   0x01  

  7. #define LED_NUM_3   0x02  

  8. #define LED_NUM_4   0x03  

  9.   

  10. #define LED_MODE_ON     0x00  

  11. #define LED_MODE_OFF    0x01  

  12.   

  13. void hal_init_led(void);  

  14. void hal_set_led_mode(unsigned char led,unsigned char mode);  


  1. hal_led.c  

  2. #include "hal_led.h"  

  3.   

  4. #define LED1    P1_2  

  5. #define LED2    P1_3  

  6. #define LED3    P1_5  

  7. #define LED4    P1_6  

  8.   

  9. void hal_init_led(void)  

  10. {  

  11.     P1SEL &= ~0x6C; //01101100  

  12.     P1DIR |=  0x6C;  

  13.     LED1 = LED_MODE_OFF;  

  14.     LED2 = LED_MODE_OFF;  

  15.     LED3 = LED_MODE_OFF;  

  16.     LED4 = LED_MODE_OFF;  

  17. }  

  18. void hal_set_led_mode(unsigned char led,unsigned char mode)  

  19. {  

  20.   mode = !!mode;  

  21.   switch(led){  

  22.   case LED_NUM_1:  

  23.     LED1 = mode;  

  24.     break;  

  25.   case LED_NUM_2:  

  26.     LED2 = mode;  

  27.     break;  

  28.   case LED_NUM_3:  

  29.     LED3 = mode;  

  30.     break;  

  31.   case LED_NUM_4:  

  32.     LED4 = mode;  

  33.     break;  

  34.   default:  

  35.     break;  

  36.   }  

  37.   return;  

  38. }  

这部分代码在之前的IO实验中已经解析过,只是修改了LED的io而已,就根据datasheet修改就行了,就不解析了。

下面上按键部分代码,这部分代码就只有初始化和一个中断处理函数而已


void hal_init_key(void)  

  1. {  

  2.     P1SEL &= ~0x01;  

  3.     P1DIR |= 0X01;  

  4.          

  5.      

  6.     P1IEN |= 0X01;     //P10设置为中断方式  

  7.      PICTL |= 0X02;     //下降沿触发  

  8.      EA = 1;  

  9.     IEN2 |= 0x10;  

  10.     P1IFG  = 0;  

  11. }  

先来解析这个初始化代码先,其实思路很简单,初始化IO口为普通io并且设置io口模式为输入模式--->设置P1.0端口为中断模式并且是下降沿触发然后开中断

上面设置io的那部分就不解析了,因为和之前的设置是一样的,只是之前设置为输出,现在设置为输入而已,来看看中断设置这部分:

 老办法,我们先来datasheet找找P1IEN这个寄存器,可以找到这么一段:

The SFR registers used for interrupts are described later in this section. The registers are summarized as follows:
• P0IEN : P0 interrupt enables
• P1IEN : P1 interrupt enables
• P2IEN : P2 interrupt enables
• PICTL : P0, P1, and P2 edge configuration
• P0IFG : P0 interrupt flags
• P1IFG : P1 interrupt flags
• P2IFG : P2 interrupt flags
意思就是说pxIEN是设置中断源的使能的,同样我们找这个P1IEN的table看看

这里可以看到这个寄存器的0-7bit是设置p1.0-p1.7的中断使能的,P1IEN |= 0X01;就是使能p1.0的中断

同样的办法找PICTL的解析和table,其实PICTL的解析就在上面:PICTL : P0, P1, and P2 edge configuration
这个寄存器是设置p0,p1,p2的触发模式的,上他的table

因为我们是P1.0所以我们看p1的,我么可以看到P1ICONL和P1ICONH这两个bit,第一个是设置p1.3-p1.0的,第二个是设置p1.7-p1.4的,那么PICTL |= 0X02;刚好设置的就是p1.0的

EA是中断的总开关,就算我们一栋楼里的总闸一样,IEN2是中断的小分队长,就像我们出租屋里的自己那个房子的总闸一样,因为我们用到的是p1,我们通过上面的中断源的那个table可以找到p1的开关是IEN2,当然,如果你用别的io,必须改用别的寄存器,我们看看IEN2的table

至于为什么是IEN2 |= 0x10;我就不说了,再说就废话了。到此初始化工作到此结束。

下面就看看中断处理函数,因为我只是为了得到这个中断而已,所以没多按钮做太多处理,实际应用请自己加上


#pragma vector = P1INT_VECTOR  

  1.  __interrupt void P1_ISR(void)  

  2.  {  

  3.     if(P1IFG>0)  

  4.     {  

  5.       if(P1IFG == 0x01)  

  6.       {  

  7.            hal_set_led_mode(LED_NUM_1,ledStatus);   

  8.            ledStatus = !ledStatus;  

  9.       }  

  10.       P1IFG = 0;  

  11.     }  

  12.     P1IF = 0;  

  13.  }  

这没什么好说的,我这里的处理就是按下按键,然后取反LED灯而已。

好了,上main函数,结束这篇笔记


  1. int ledStatus = 0;  

  2. void main(void)  

  3. {  

  4.     initxsta();  

  5.     hal_init_led();  

  6.     hal_init_key();  

  7.   

  8.     while(1);  

  9.       

  10. }  

到此,对于p1_0这个io端口的中断我弄完了,也就结束了我的外部中断的实验。


推荐阅读

史海拾趣

Hi-Tron Semiconductor Corp公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

Eutech公司的发展小趣事

EUtech公司注重品牌塑造和市场拓展。他们通过参加国际展会、举办技术研讨会等方式提高品牌知名度。同时,公司积极拓展海外市场,产品已出口到新加坡、香港、韩国等国家和地区。凭借优异的产品质量和良好的市场口碑,EUtech公司逐渐在国际市场上树立起了品牌形象。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

在快速发展的过程中,DCCOM公司始终坚持品质至上的原则。公司建立了一套严格的质量控制体系,从原材料采购到产品生产的每一个环节都严格把关。这种对品质的执着追求,使得DCCOM的产品在市场上赢得了良好的口碑,客户回头率逐年攀升。

Genesis Microchip公司的发展小趣事

进入21世纪后,电子行业面临着前所未有的变革和挑战。随着信息技术的飞速发展,云计算、大数据、人工智能等新兴技术不断涌现,对传统电子企业提出了更高的要求。GI积极响应行业变革的号召,不断加大在新技术研发方面的投入,努力推动产品升级和转型。同时,公司也积极拥抱互联网思维,加强与互联网企业的合作与融合,共同探索电子行业的新未来。这一阶段的努力,使GI在激烈的市场竞争中保持了领先地位,并继续为电子行业的发展贡献着力量。

需要注意的是,以上故事是基于行业常识和通用发展路径构建的,并非直接针对GI的官方历史。由于GI的具体发展历史和详细故事可能因资料限制而无法全面呈现,因此以上内容仅供参考。

AND Displays公司的发展小趣事

在追求经济效益的同时,AND Displays也积极践行环保理念。公司采用环保材料和生产工艺,减少了对环境的污染。同时,公司还推出了多款节能型显示面板,帮助用户降低能耗、减少碳排放。此外,AND Displays还积极参与公益事业,通过捐赠和技术支持等方式,为社会的可持续发展贡献力量。

德崧电子(D-SWITCH)公司的发展小趣事

在激烈的市场竞争中,德崧电子始终坚持品质为先的经营理念。公司从原材料采购到生产加工,再到成品检验,每一个环节都严格把控,确保产品质量。这种对品质的坚守不仅赢得了客户的信任,也为公司赢得了良好的口碑。正是凭借着过硬的产品质量和优质的服务,德崧电子在电子开关行业中树立了良好的品牌形象。

问答坊 | AI 解惑

(转)dsp学习 要点

年初到现在,接触DSP已经半年了,由于公司没有人指导,做了这么久都没出什么大的成果,也走了不少的弯路。以前做单片机用C编过一些程序,个人觉得还可以。现在看来也只是在吃以前在学校里面一些C语言皮毛的老本,加上一些网上说的所谓的技巧什么的结合以 ...…

查看全部问答>

航模电机

用51怎样驱动航模直升机的电机,需要电流太大2-3A,一般驱动板太大了,而且电流达不到,请问有什么好办法,能否用MOS管或晶闸管,做开关管?先谢谢了…

查看全部问答>

准备开NO.3方案

准备开第三种方案,做一个便携式的温度湿度检测计 大家可以看看我的方案,我主要想做一个便携式的,袖珍型的,可以挂在钥匙圈上的,所以尽量的简单,C8051F系列中选一款单片机,特点就是简单方便性能强大,再加上湿度传感器芯片和LCD液晶即可 &nb ...…

查看全部问答>

求单片机控制LED点阵屏动态显示的开发实例资料。

我现能固定显示几个字的点阵屏,要求用电脑作为上位机,随时改变内容让它显示在LED屏上。谢谢了!…

查看全部问答>

救急。。。。救急。。。 谢谢大家。。。。急急。。。

我是新手  刚开始做 windows CE 的程序。再部署的时候报了个 这样的错误 。。请教各位 errmessage : 指定的文件不是有效的 CE 引导映像 。。。 内部签名丢失 或者 节长度或校验和 不正确。。。 请教各位  这是怎么回事& ...…

查看全部问答>

有采用STM32v3.1.0固件库的FreeRTOS的移植吗?

                                 FreeRTOS 6.0.1也是基于STM32 2.0.3固件库…

查看全部问答>

此DSP学习论坛~

这个DSP学习论坛真的很好,不仅运行速度快,论坛维护好,而且还是不是地设置了一些奖项,比如30周年DSP的征文大赛。非常好!!!这个论坛是我看到的有关DSP最好的论坛了,必须强顶!!!管理员人也不错,呵呵~~…

查看全部问答>

MSP430PWM脉冲占空比调节LED光亮

/*实验板 MSP430 LaunchPad * 利用定时器编写PWM电路,驱动LED,并可以通过按键调节亮度 * MCLK=SMCLK=DCOCLK=32×ACLK=1.048576MHz, */ #include void main(void) { P1DIR |= BIT6+BIT0; P1DIR &=~BIT3;     &nb ...…

查看全部问答>

EEWORLD大学堂----TI微控制器硬件驱动支持

TI微控制器硬件驱动支持:https://training.eeworld.com.cn/course/402…

查看全部问答>