紧急求助关于STM8 UART华为mate8通讯录问题问题

stm8s串口通信(uart)
最近开始使用stm8s103k3单片机了。据说很好,确实不错。前几天已经试过了GPIO,Timer2,ADC的功能,都比较容易,唯独串口UART使用,破费周折,写出来,供大家借鉴。
我使用的是stm8s103k3,32脚单片机,这个使用手册上说了UART1,UART2,UART3。但是引脚的功能图上只有UART1,并且你打开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程序如下:
"stm8s103k.h"
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::2400
UART1_CR2=0x08;
&& //fmaster=fcpu=2MHz
& &CLK_ECKR=0x00;
& &CLK_ICKR=0x01;
& &CLK_CMSR=0xe1;
&& CLK_SWR=0xe1;
&& CLK_CKDIVR=0x18;
&&&UART1_Init();
& &while (1)
&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()函数:
(!(UART1_SR & 0x20));//Loop until the UART1 Receive Data
Register is not empty
RxBuffer& = UART1_DR; //Store the received byte in
中断方式:
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
UART1接收中断向量(设置中断向量,即将中断服务程序的入口填写到中断向量表中)
struct interrupt_vector const _vectab[] =
& {0x82, UART1_RX_IRQHandler},
(3)特别注意波特率的计算设置方式
波特率通过配置16位除法器UART_DIV来设置
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。STM8S103xx串口一直中断
&&& 前段时间做了一个项目,有部分功能是接收串口命令,根据命令保存一些系统数据(用STM8S内自带的EEPROM)。项目完成之初用串口调试工具发单条命令可以正常接收保存,但用一个上位机软件连续发命令(约20ms)时单片机死机了。IDE用的是IAR,虽说可以直接在线调试,但这个IDE不能在运行时设置断点,所以找了好久一直没有查到程序停在了哪里,直接代码单步执行跑得有点奇怪,但进出中断也正常。后来改用汇编界面单步,发现程序都是在进栈出栈这些指令才怀疑是不是有一直进出中断,而进出中断肯定是中断标志置位了。找出STM8S规定书仔细一查才发现STM8S的UART还有个&过载错误&,要命的是此&过载错误&是产生中断的,以前用的51没发现有过载错误这一说,AVR有,但不产生中断。呵呵,知道原因了问题当然好解决。下面我最新的一个处理UART中断的方法,给新手参考参考,我想用到其它MCU也是一样的道理;如果是老手路手请多指点以完善UART的接收。
#pragma vector = UART1_R_RXNE_vector // 20__interrupt void ISR_UART1_RECEIVE(void){&& &&& BYTE tempDa;&&& &&& if (UART1_SR_OR_LHE) &&& {&&&&&&& // 发生过载错误,顺序读UART1_SR, UART1_DR来清UART1_SR_OR_LHE位&&&&&&& tempDa = UART1_SR;&&&&&&& tempDa = UART1_DR;&&&&&&
  // 做一些错误处理
&&& }&&& else&&& {&&&&&&& tempDa = UART1_DR;&// 之所以用临时变量是因为UART1_DR随时会变&&&&&&&&&&&&&&& switch (RecvStatus)&&&&&&& {&&&&&&&&&&& case XXXX:&&&&&&&&&&&&&&&&
      
&&&&&&& }&&& }}
阅读(...) 评论()STM8 UART2
STM8 UART2
发布时间: 7:14:31
编辑:www.fx114.net
本篇文章主要介绍了"STM8 UART2",主要涉及到STM8 UART2方面的内容,对于STM8 UART2感兴趣的同学可以参考一下。
&声明外部变量
现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是
互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程,里面含有和两个简单的源文件:
这两个文件极为简单,在中我们定义了一个全局变量,在中我们也定义了一个全局变量。
我们对和分别编译,都可以正常通过编译,但是进行链接的时候,却出现了错误,错误提示如下:
这就是说,在编译阶段,各个文件中定义的全局变量相互是透明的,编译时觉察不到中也定义了,同样,编译时觉察不到中也定义了。
但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。
因此,各个文件中定义的全局变量名不可相同。
在链接阶段,各个文件的内容(实际是编译产生的文件)是被合并到一起的,因而,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。
这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果文件中定义了某全局变量,那么文件中应可以该变量。修改我们的程序,加以验证:
试图使用中定义的全局变量
编译结果如下:
编译错误。
其实出现这个错误是意料之中的,因为:文件中定义的全局变量的可见性扩展到整个程序是在链接完成之后,而在编译阶段,他们的可见性仍局限于各自的文件。
编译器的目光不够长远,编译器没有能够意识到,某个变量符号虽然不是本文件定义的,但是它可能是在其它的文件中定义的。
虽然编译器不够远见,但是我们可以给它提示,帮助它来解决上面出现的问题。这就是的作用了。
的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
我们为上面的错误程序加上关键字:
试图使用中定义的全局变量
顺利通过编译,链接。
&在文件中调用方式编译的函数
方式编译和方式编译
相对于,中新增了诸如重载等新特性,对于他们的编译,必然有一些重要的区别。
我们将下面的小程序分别按和方式编译,来探讨两种编译方式的区别。
以方式编译的结果:
以方式编译的结果:
可见,方式编译下,变量名和函数名之前被统一加上了一个下划线,而编译后的结果却复杂的多,变成了,变成了。中的这种看似复杂的命名规则是为中的函数重载,参数检查等特性服务的。
多文件程序中的函数调用
一般情况下,工程中的文件都是文件(以及头文件)。如下面的程序仅包含两个文件:和:
程序的结构是这样的:在文件中定义了一个函数,函数位于文件,在函数中调用了中定义的函数。
要在中调用中定义的函数,必须要加上该函数的声明。如本例中的就是对函数的声明。
如果没有声明的话,编译时就会出错。因为编译器的目光只局限于被编译文件,必须通过加入函数声明来告诉编译器:“某个函数是定义在其它的文件中的,你要放行!”,这一点跟用来声明外部全局变量是一个道理。
需要注意的是,一般的程序都是通过包含头文件来完成函数的声明。拿本例来说,一般是创建一个头文件,在头文件中加入声明语句并且在中加入包含语句:。
在程序中,头文件的功能从函数声明被扩展为类的定义。
不同编译方式下的函数调用
如果在工程中,不仅有文件,还有以方式编译的文件,函数调用就会有一些微妙之处。我们将改作:
对和分别编译,都没有问题,但是链接时出现错误。
原因就在于不同的编译方式产生的冲突。
对于文件,是按照的方式进行编译的,其中的调用被编译成了
如果文件也是按照方式编译的,那么中的函数名也会被编译器改成,这样的话,就没有任何问题。
但是现在对文件,是按照方式编译的,中的函数名被改成了,这样一来,中的这个函数调用就没有了着落,因为在链接器看来,文件中没有名为的函数。
事实是,我们编程者知道,文件中有中调用的函数的定义,只不过它是按照方式编译的,故它的名字被改成了。因而,我们需要通过某种方式告诉编译器:“中定义的函数经编译后命名成了,而不是,你必须通过来调用它,而不是。”简单的说,就是告诉编译器,调用的函数是以方式编译的,语句必须被编译成而不是。
我们可以通过关键字,来帮助编译器解决上面提到的问题。
对于本例,只需将改成如下即可:
察看汇编代码,发现此时的语句被编译成了。
同一样,仍然是,混合编程的情形,考虑下面的程序:
程序很简单:在文件中定义了一个全局变量,在中使用了这个全局变量。
编译没有问题,链接时却出现错误:
这是因为,在方式编译下,被重命名为,而在方式下,会被重命名为。
因而,我们只用来声明还不够,必须告诉编译器,全局变量是以方式编译的,
它会被重命名为,而不是。
我们修改,如下:
程序正常通过编译和链接。
我们察看一下汇编代码,发现语句被编译成了。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:STM8S 串口接收问题
进入接收中断
但 UART1_DR确没有数据进入 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [直播]
STM8S 串口接收问题
进入接收中断
但 UART1_DR确没有数据进入
20:10:13  
我使用&&stm8s 与GPRS模块&&进行通信&&在电脑上模拟 都通过&&但单片机 与SIM800L连接时&&确不能接到信息&&但SIM800L能接到stm8s得信息, 仿真发现 进入了接收中断&&但UART1_DR确没有数据进入, stm8s与电脑相连能接到信息&&SIM800L也能与电脑通讯 但sim800l不能发信息给 stm8s&&我用的是IAR软件
已退回57积分
04:55:05  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
STM8先不要用中断 用轮询方式试试看
04:56:07  
就是不停的读 RX_BUFFER
17:27:05  
我用STM8S105K4, 写UART时,程序总是停留在发送中断中?主程序中的语句都不能运行了
12个问题&&&&&&&&6820个浏览
21个问题&&&&&&&&21026个浏览
32个问题&&&&&&&&7710个浏览
即日起至6月15日,参与英蓓特NXP产品知识小测验,即有机会赢取最新系列开发板。特别奖SBC-EC9100开发板1套,幸运奖FRDM系列最新开发板(型号随机,共10套)。快来参加吧! >> 立即参加
Powered by

我要回帖

更多关于 日本旅游通讯问题 的文章

 

随机推荐