STM8L的io中断功能与STM8S有些差异,
1.stm8l的IO中断除了与stm8s一样的同一端口不同引脚进入一个中断向量外还支持不同端口相同序号的引脚进入同一中断向量的模式,此示例使用了stm8s一样的模式,即pb7上的按键中断进入PORTB对应的中断向量。
2.stm8l的IO中断有中断标志位,需要在中断中清除
#include "stm8l15x.h"
#define LED_ON GPIOD->ODR|=(1<<0)
#define LED_OFF GPIOD->ODR&=~(1<<0)
#define LED_TOGGLE GPIOD->ODR^=(1<<0)
#define PWR_ON GPIOB->ODR|=(1<<1)
#define PWR_OFF GPIOB->ODR&=~(1<<1)
#define KEY_INT_EN GPIOB->CR2|=(1<<7)
#define KEY_INT_DS GPIOB->CR2&=~(1<<7)
void io_init(void)
{
//LED口初始化
GPIOD->DDR|=(1<<0);
GPIOD->ODR&=~(1<<0);//输出低
GPIOD->CR1|=(1<<0);//推挽输出
GPIOD->CR2|=(1<<0);//10MHz
//控制端口 PB1:PWM PB2:PWR_EN
GPIOB->DDR|=(1<<1)|(1<<2);
GPIOB->ODR&=~((1<<1)|(1<<2));//输出低
GPIOB->CR1|=(1<<1)|(1<<2);//推挽输出
GPIOB->CR2|=(1<<1)|(1<<2);//10MHz
//KEY PB7
GPIOB->DDR&=~(1<<7);//输入模式
GPIOB->CR1|=(1<<7);//上拉打开
GPIOB->CR2&=~(1<<7);//关闭外部中断
EXTI->CONF1|=(1<<1);//PB7选择EXTIB端口中断方式
EXTI->CR3|=(1<<1);//下降沿触发
}
void DelayMs(uint16_t ms) //2MHZ 延时1ms
{
volatile uint16_t ti;
while(ms--)
{
for(ti=0;ti<80;ti++){}
}
}
//按键中断
INTERRUPT void GPIOB_IRQHandller(void)
{
EXTI->SR2|=(1<<0);//清中断标志
KEY_INT_DS;//关闭中断
}
main()
{
io_init();//GPIO初如化,需要将未用IO设置成输出低电平,并设置好唤醒中断
enableInterrupts();//总中断打开
while (1)
{
//被中断唤醒后干的事情
LED_ON;
DelayMs(500);
LED_OFF;
//进入停机模式准备工作:1.外设关闭 2.唤醒中断打开
KEY_INT_EN;
halt();//进入停机模式
}
}
|
|