深圳中企芯科电子有限公司

首页

| 单片机解密

ARM解密

| 付款指南   | 联系我们

 
 
 

STM8串口收发(典型)

作者:不详 阅读:662 次 时间:2016/2/22 12:37:43 
最近开始使用
stm8s103k3
单片机了。据说很好,确实不错。前几天已经试过了
GPIO

Timer2

ADC
的功能,
唯独串口
UART
使用,破费周折,写出来,供大家借鉴。
 
 
我使用的是
stm8s
103k3,32
脚单片机,这个使用手册上说了
UART1,UART2,UART3
。但是引脚的功能图上只有
你打开
stm8s103k.h
的头文件,里面也只有
UART1
寄存器的定义说明。所以我认为只有
UART1
。既然有这个功
吧,我以为直接可以连接到电脑的串口(
COM1),
就可以使用了,其实不可以。单片机即使写着提供
UART
通讯

MAX232
转接芯片,我就在这里耽误了许多时间。
 
 
1
、使用
stm8s103
上的串口和计算机
com
口通许的硬件连接:
 
 
 
 
2
、软件设置
 
 
  
 

1
)发送数据配置
 
1
)编程
UART_CR1

M
位来定义字长。
 
2
)在
UART_CR3
中编程停止位的位数。
 
3
)按下列顺序编写波特率寄存器选择要求的波特率。
 
 
  
 
a

UART_BRR2
 
  
 
b

UART_BRR1 
4
)设置
UART_CR2
中的
TEN
位来使能发送
 
5
)把要发送的数据写进
UART_DR
寄存器
 
 
main.c
程序如下:
 
 
#include "stm8s103k.h"
void UART1_Init(void)

 
 
UART1_CR2=0x00;//
使发送禁用
TEN=0

 
 
 
UART1_CR1=0x00;//
设置
M
字长,
8
位数据位
 
 
 
UART1_CR3=0x00;//1
位停止位
 
 
 
 
UART1_BRR2=0x00;//00-0d:9600

fcpu=fmaster=2MHz)
 
 
UART1_BRR1=0x0d;//00-1a:4800; 01-34:2400
 
 
 
UART1_CR2=0x08;

main()

 
 //fmaster=fcpu=2MHz
 
 CLK_ECKR=0x00;
 
 CLK_ICKR=0x01;
 
 CLK_CMSR=0xe1;
 
 
 CLK_SWR=0xe1; 
    
 CLK_CKDIVR=0x18;
 
 
 UART1_Init();
 
 
 while (1)
  { 
 
  
 unsigned char i;
 
 
  
 while(!(UART1_SR & 0x80));//
发送寄存器数据是否转移完
 
 
 
   UART1_CR2=0x00;//a

 
 
   UART1_DR=0xB6;//
要发送的数据
 
 
   UART1_CR2=0x08;//b

 
 
 
   while((UART1_SR & 0x40) ==0);//
发送是否完成
 
 
  }

上面的代码是我反复实验过的,如果不加
a

b
处代码,则接收的数据不稳定,比如发送
5
,接收到的数据的串
则接收的数据可能是
0xB6,

0x67,

0x3B.
(2)
接收数据
 
1
)编程
UART_CR1

M
位来定义字长。
 
2
)在
UART_CR3
中编程停止位的位数。
 
3
)按下列顺序编写波特率寄存器选择要求的波特率。
 
 
  
 a

UART_BRR2
 
  
 b

UART_BRR1 
4
)设置
UART_CR2
中的
REN
位来使能接收
 
5
)读
UART_DR
寄存器
 
 
  
 a
)查询
:
查询
SR
中标志位
RXNE (
读数据寄存器非空
)
 
  
 b
)中断
:
需使能
CR2
中的
RIEN
(接收中断使能)
 
 
标志位查询方式:
 
初始化:
 
void UART1_Init(void)

UART1_CR1 = 0x00; //8bit 
UART1_CR3 = 0x00;//1 stop bit
UART1_BRR2 = 0x01; 
UART1_BRR1 = 0x1A;//4800 baud rate
UART1_CR2 = 0x04;//enable REN

Main()
函数:
 
while (!(UART1_SR & 0x20));//Loop until the UART1 Receive Data Register is not empty
RxBuffer  = UART1_DR; //Store the received byte in RxBuffer 
 
 
中断方式:
 
初始化:
 
void UART1_Init(void)

UART1_CR1 = 0x00; //8bit 
UART1_CR3 = 0x00;//1 stop bit
UART1_BRR2 = 0x01; 
UART1_BRR1 = 0x1A;//4800 baud rate 
UART1_CR2 = 0x24;//enable REN and RIEN

UART1
接收中断函数:
 
@far @interrupt void UART1_RX_IRQHandler (void)

 
 RxBuffer = UART1_DR; //Store the received byte in RxBuffer
 
 return;

UART1
接收中断向量(设置中断向量,即将中断服务程序的入口填写到中断向量表中)
 
struct interrupt_vector const _vectab[] =

 
 
……
 
  {0x82, UART1_RX_IRQHandler},
 
 
……
 


3
)特别注意波特率的计算设置方式
 
波特率通过配置
16
位除法器
UART_DIV
来设置
来源:飞翔电子技术-单片机解密加密研究中心

解密流程| 付款指南| 公司简介| 合同范本下载| 网站地图| 芯片解密| PCB抄板| 单片机开发| IC解密| 芯片资料

Copyright© 2003-2022 www.jm8.cn All rights reserved -电子时代 任你飞翔
从事于单片机解密加密技术研究,提供解密服务,仅供合法研究学习用途
联系方式:18811880101
粤ICP备16022229

 

 

本站关键词:单片机破解 单片机解密 芯片解密 芯片破解 PCB抄板