GreenTco https://passport2.21ic.com/?49073 [收藏] [复制] [RSS]

日志

一天天学用IAR+STM8——EXTI外部中断控制寄存器

已有 6061 次阅读2010-7-28 14:25 |个人分类:软件专题|系统分类:单片机| 学习, 编程, IAR, STM8

  这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。吸取前面UART3的教训,先看开发板的原理图吧。这个按键被接到了STM8S207SB的PD7上,已做了上拉处理。为了简单明了,还是点LED1吧。按一下LED1亮,再按一下LED1灭。好了,写程序吧。


#i nclude <iostm8s207sb.h>

#define LED1_FLASH  PD_ODR_ODR3 =  !PD_ODR_ODR3  // 开发板上的LED1接在PD3上

void GPIO_init(void)
{
  PD_DDR = 0x08;             // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0x08;             // 设置PD3为推挽输出
  PD_CR2 = 0x80;             // 使能PD7外部中断
}


void EXTI_init(void)
{
  EXTI_CR1 = 0x80;           // PD口下降沿触发中断
}


#pragma vector=0x02      // 这里很关键!看下面说明。
__interrupt void EXTI_PD7_TLI(void)
{
  LED1_FLASH;
}
void init_devices(void)
{
  asm("sim");  // 关全局中断
  GPIO_init();
  EXTI_init();
  asm("rim");  // 开全局中断
}


void main( void )
{
  init_devices();


// 主循环里没有程序需要执行
  while(1);
}


  这里着重要说明的一点是PD7的外部中断程序。看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。接下来只能另想办法,仔细翻了资料后发现,PD7和PD其他端口不一样,PD7后面拖了个小尾巴TLI,再看手册上的TLI描述,乖乖,TLI拥有芯片最高级别中断,享有独立专用的中断向量号0,这下就好办了,按IAR的规矩,向量号加2,程序改成#pragma vector=0x02,重新来一遍编译、下载、运行,按键终于听话了。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)