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

日志

一天天学用IAR+STM8——UART串口发送与中断接收

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

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


#include <iostm8s207sb.h>

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);
}


 


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (2 个评论)

回复 xiao4933 2010-8-6 07:18
lz能不能告诉我串口是怎么调试。
回复 dadodo 2010-8-9 05:43
IAR提供了UART3_SR_RXNE这样的位变量来判断是否收到数据,应该说很容易使用查询方式接收UART数据,但实际测试中发现,当使用while(!UART3_SR_RXNE);来等待接收数据时,程序并没有在while循环里一直等下去,而是在循环若干次后退出了,但UART并没有收到任何数据。 经测试,只有使用while(!(UART3_SR&0x20);才能正确判断是否接收到数据。 这个问题的具体原因要查看IAR编译后的汇编代码来分析。 while(!(UART3_SR & 0x20); ??ReceivedChar_0: LD A, #0x20 AND A, L:0x5240 TNZ A JREQ L:??ReceivedChar_0 while(!UART3_SR_RXNE); ??ReceivedChar_0: LD A, L:0x5240 CALL L:?srl8_a_a_6 -->这个是做什么? AND A, #0x1 TNZ A JREQ L:??ReceivedChar_0 CALL L:?srl8_a_a_6究竟做了什么?lst文件中没找到srl8_a_a_6,动用仿真器跟踪吧! :?srl8_a_a_6 SRL A SRL A SWAP A AND A, #?b15 RET 对比一下汇编代码,区别还是很大的。从代码分析结果来看,还是前一种方式更直观、简洁。