MSP430中断的一个细节问题

发布者:HeavenlyLove最新更新时间:2020-02-06 来源: eefocus关键字:MSP430  中断  细节问题 手机看文章 扫描二维码
随时随地手机看文章

关于中断标志:


SPI发送一字节数据:


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


         while ((UCB0IFG & UCTXIFG) == 0); // 等待发送完毕


}


分析:以9600bps 发送一字节 1ms估算,而以12MHz时钟执行(UCB0TXBUF = txData;)需要时间大概1us,


因此可怕的事情发生了,要等待发送完毕需要浪费3999个CPU周期去查询。如果等待过程换成休眠多好啊!


看下面程序:


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


       LPM3;


}


#pragma vector=USCI_B0_VECTOR   



__interrupt void USCI_B0_ISR(void)

{

  //order interrupt service

  switch (__even_in_range (UCB0IV,8))

  {


        case 0: break;


        case 2: break;


case 8: while (!(UCB0IFG&UCTXIFG)); 


break;


        LPM3_EXIT;

  }


巧妙地事情发生了,你CPU先歇着,让我SPI单独工作。

但系统中开启仅SPI发送中断时,上面是OK的,可问题来了,只发送不接受吗?有时候SPI通信未必


只有一个外设,为了实现低功耗,常常会唤醒低功耗在中断。


你怎能保证其他终端唤醒CPU时,SPI已发送完毕呢?


本文的重点来了,全局通信变量标志位是一把利剑。


void SPI_Set_SD_Byte(unsigned char txData)


{


UCB0TXBUF = txData; // 写入发送缓冲区


       SPI_TxFlag_sd = 0;// 清除全局标志位


        while (SPI_TxFlag_sd == 0 ) // 发送过程中CPU才唤醒


        {


LPM3;


        }


}


__interrupt void USCI_B0_ISR(void)

{

  //order interrupt service

  switch (__even_in_range (UCB0IV,8))

  {


        case 0: break;


        case 2: break;


case 8: SPI_TxFlag_sd = 1; 


     LPM3_EXIT;


     break;    


  }


分析:任何中断都可能把CPU唤醒,但是只有SPI发送完毕后,SPI_TxFlag_sd 才置1 。


小编看过很多MSP430文章,可诸如小编这样的看待中断的角度展开叙述的,颇少!

关键字:MSP430  中断  细节问题 引用地址:MSP430中断的一个细节问题

上一篇:简要理解MSP430的中断(以IO和定时器为例)
下一篇:MSP430中断参数

推荐阅读最新更新时间:2024-11-12 06:21

C51入门2,定时器和中断应用
实验一:定时器中断闪灯 程序: #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #include reg52.h //端口设置 sbit P10=P1^0; sbit K1=P3^2; char code dx516 _at_ 0x003b; //主函数 void main(void) { TMOD=0x01; //设置定时器0工作再方式1 TR0=1; //启动定时器0,TR0必须置1 ET0=1; //开定时器中断 EA=1; //开总中断 while(1) //死循环 { ;
[单片机]
STM32 LL库中断配置引脚外部中断的方式
中断原理图 很多情况可以产生中断,开发者可以在CubeMx中NVIC选单、通讯模块选单处配置。请自行探索;部分中断有关的内容在模块讲解时·将会提到。 ※启用中断后,注意在System Core- NVIC- Code Generation中勾选生成IRQ Handler和 Select for init Sequence Ordering。 ※生成的中断函数定义在stm32fxxx_it.h和stm32fxxx_it.c中,向函数中填要执行的代码即可。 对于外部中断的事件分配,多个引脚将被分配到中断事件(具体可以参考文档),若需要区分则须在中断程序内写判断。判断方式之后给到 配置引脚外部中断的方式: ①在引脚图上选中需
[单片机]
STM32 LL库<font color='red'>中断</font>配置引脚外部<font color='red'>中断</font>的方式
单片机INT0外部中断脉冲计数
主要是用单片机 INT0 的中断进行脉冲计数 脉冲是由Clock元器件产生。 INT0外部中断输入脉冲。 设置举例,设置高低高时钟,频率为10,则设置第一个边沿出现时间为1.1。 INT0是低电平触发,设置出现时间为1.1刚好每秒增加数为10,并且每次都是10的倍数。 开关型霍尔元器件刚好是低电平,可以直接使用。 仿真原理图如下 单片机源程序如下: // 脉冲计数 // INT0中断计数 #include reg51.h sbit P2_0 = P2^0;//数码管选定位 sbit P2_1 = P2^1;//数码管选定位 sbit P2_2 = P2^2;//数码管选定位 sbit P2_3 = P2^3;//数码管选定
[单片机]
单片机INT0外部<font color='red'>中断</font>脉冲计数
实验二:MSP430简单程序设计
1.实验目的 学会用C语言进行简单程序设计。 2.实验要求 掌握编写排序程序。 3.实验内容 (1)设计一个对8个数据(0-255,任意设置)的由小到大排序程序。 (2)将结果显示在LCD显示器上。 4.参考资料 MSP430光盘资料 #include msp430x14x.h #include Config.h //************************************************************************* // 初始化IO口子程序 //*****************************************
[单片机]
基于MSP430的直流接地检测系统
  直流电源系统主要负责为电力生产过程中的控制设备、保护设备等供电。绝缘性能下降和直流母线接地是直流电源系统常见的故障。一旦直流电源发生故障后,会影响控制设备和保护设备的正常工作,故障严重时甚至会导致控制设备的错误控制和保护设备的拒保护,从而引发生产事故。因此对直流电源系统的绝缘性能检测和接地检测是值得重视的问题。常见的直流接地检测系统,多采用平衡电桥原理检测母线的绝缘电阻,采用双频探测原理检测支路的绝缘电阻,并查找接地支路。但平衡电桥原理不能检测正负母线绝缘电阻等比例下降情况下的电阻值,而双频探测原理需要向系统中注入交流信号,会加大直流电源系统的纹波。本文介绍的直流接地检测系统采用“平衡-不平衡法”检测母线电压,采用漏电流传感器
[单片机]
基于<font color='red'>MSP430</font>的直流接地检测系统
单片机学习之STM32中断
简介:STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 1.中断优先级管理 嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。 STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 STM32F103系列上面,又只有60个可屏蔽中断(在
[单片机]
MSP430F1232针对ADC10(使用DTC+SA)的内存中采样结果读取
定义一个指针,让它指向内存的某个地址,然后通过指针就可以访问。如果需要访问地址为0x210的内存单元(MSP430的ram起始地址是0x200),则可以这样: char a; char *p; p=0x210; *p=90;//在地址为0x210的内存单元存入一个数字90 a= *p;//将地址为0x210的内存单元中的数字读出赋值给a其实不光是430单片机,其他各种单片也是如此操作,这是由C语言决定的,与具体CPU无关,但各种单片机内存的地址范围不同,这个需要注意。 ==============以上内容引自“百度知道”================== 地址空间的0x0200为起始地址,往高地址增长是RAM占用的地
[单片机]
msp430f2272控制1602LCD
#include io430.h #define uchar unsigned char; #define uint unsigned int; int ch1 ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x81,0x42,0x24,0x18, 0x00,0x18,0x24,0x42,0x81,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, 0x00,0x30,0x00,0x03,0x00,0x70,0x00,0x07,0x00,0xf0,0x00,0x0f,0x00, 0xff,0x00,0x7f,0x00,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved