IAR FOR STM8例程要点

  • 格式:doc
  • 大小:111.50 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IAR+STM8——EXTI外部中断控制寄存器

2013-03-21 23:23:15| 分类:STM8|举报|字号订阅

这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。吸取前面UART3的教训,先看开发板的原理图吧。这个按键被接到了

STM8S207SB的PD7上,已做了上拉处理。为了简单明了,还是点LED1吧。按一下LED1亮,再按一下LED1灭。好了,写程序吧。

#i nclude

#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,重新来一遍编译、下载、运行,按键终于听话了。

IAR+STM8——UART串口发送与中断接收

2013-03-21 23:22:34| 分类:STM8|举报|字号订阅

STM8的UART功能强大,除了常规的串口异步通讯外,还拥有LIN主模式、红外编解码器、智能卡模拟等功能。新手还是从基本的串口通讯入手,那些高级功能等熟练以后再慢慢研究吧。

#i nclude

void CLK_init(void)

{

CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M

}

void UART3_init(void)

{

UART3_BRR2 = 0x01; // 设置波特率9600

UART3_BRR1 = 0x34; // 8M/9600 = 0x341

UART3_CR2 = 0x2C; // 允许接收中断,允许接收,允许发送

}

#pragma vector=UART3_R_RXNE_vector

__interrupt void UART3_RX_RXNE(void)

{

unsigned char c;

c = UART3_DR; // 接收到数据了

while(!UART3_SR_TXE);

c++; // 把接收到的数据加1

UART3_DR = c; // 再发回去,为什么这么做?在电脑上串口调试软件里发1就收到2,发A就收到B,看运行结果比较方便

}

void init_devices(void)

{

asm("sim"); // 关全局中断

CLK_init();

UART3_init(); // 开发板上的串口接的是UART3,刚开始想当然的认为UART1,浪费我半个小时

asm("rim"); // 开全局中断

}

void main( void )

{

init_devices();

// 主循环里没有程序需要执行

while(1);

}

IAR+STM8——TIM1定时溢出中断

2013-03-21 23:20:56| 分类:STM8|举报|字号订阅

STM8的TIM1是16位高级控制定时器,作为新手不要急着玩高级功能,先从简单的定时溢出中断开始。那么这个简单的目标就定为LED1亮500ms,灭500ms,循环往复,如此而已。

#i nclude

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

void CLK_init(void)

{

CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M

}

void GPIO_init(void)

{

PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出

PD_CR1 = 0x08; // 设置PD3为推挽输出

}

void TIM1_init(void)

{

TIM1_PSCRH = 0x1F; // 8M系统时钟经预分频f=fck/(PSCR+1)

TIM1_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计