历史上的今天

今天是:2024年10月12日(星期六)

正在发生

2021年10月12日 | STM8与汇编语言(11)--UART应用之三

发布者:RadiantExplorer 来源: eefocus关键字:STM8  汇编语言  UART 手机看文章 扫描二维码
随时随地手机看文章

下面这个实验程序是在上一个实验程序的基础上,将字符接收改成中断方式。每当接收到一个字符,进入中断服务程序,在中断服务程序中,从UART的接收数据寄存器中读出字符,然后通过字符发送子程序发送出去。如果与WINDOWS的超级终端相连,则键盘上按什么按键,则显示对应的字符。


同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。要注意的是,一定要将串口的接收中断服务程序的入口地址填写中断向量表中正确的位置。


编译通过后,下载到开发板,运行程序。在PC机上运行超级终端,波特率为9600,然后从键盘上输入按键,屏幕上就显示对应的字符。


stm8/


      #include "mapping.inc"

    

      #include "STM8S207C_S.INC"


; 定义堆栈空间的起始位置和结束位置

stack_start.w  EQU   $stack_segment_start

stack_end.w   EQU    $stack_segment_end


; 下面开始定义一个段,该段位于ROM中

             segment 'rom'             

; 定义复位后的第一条指令的标号(即入口地址)

main.l    

;

; 首先要初始化堆栈指针

         LDW    X,#stack_end        

         LDW    SP,X



;

         CALL   UART3_Init          ; 初始化串口3

         RIM                      ; 允许CPU全局中断

MAIN_LOOP.L

         JRA    MAIN_LOOP           ; 进入无限循环

;

; UART3接收中断服务程序

  interrupt UART3_Recv_ISR

UART3_Recv_ISR.L

            PUSH    A

            LD     A,LINUART_DR        ; 读入接收到的字符

            CALL   UART3_SendChar       ; 将字符发送出去

            POP    A

           IRET

                            

;

; 函数功能:初始化UART3

; 输入参数:无

; 输出参数:无

; 返 回 值:无

; 备    注:寄存器A -- 被修改掉

UART3_Init.l                    ; 串口初始化子程序

       LD     A,#0              ; 禁止UART发送和接收

       LD     LINUART_CR2,A  

      

       LD     A,#0

       LD     LINUART_CR1,A      ; b5 = 0,允许UART

                               ; b2 = 0,禁止校验

                              

       LD     A,#0              ; b5,b4 = 00,1个停止位

       LD     LINUART_CR3,A

                       

; 设置波特率,必须注意以下几点:

;    (1) 必须先写BRR2

;    (2) BRR1存放的是分频系数的第11位到第4位,

;    (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位

; 例如对于波特率位9600时,分频系数=2000000/9600=208

; 对应的十六进制数为00D0,BBR1=0D,BBR2=00

       LD     A,#$00

       LD     LINUART_BRR2,A

       LD     A,#$0D

       LD     LINUART_BRR1,A     ; 实际的波特率分频系数为00D0(208)

                                      ; 对应的波特率为2000000/208=9600

       LD     A,#$2C            ; b3 = 1,允许发送

                               ; b2 = 1,允许接收

                               ; b5 = 1,允许产生接收中断

       LD     LINUART_CR2,A  

       RET

;

; 函数功能:从UART3发送一个字符

; 输入参数:寄存器A -- 要发送的字符

; 输出参数:无

; 返 回 值:无

; 备    注:无

UART3_SendChar.l                 ; 发送字符的子程序

       PUSH   A                ; 将要发送的字符保存到堆栈中

SENDCHAR_1.L                  

       LD     A,LINUART_SR       ; 读取当前状态寄存器的值

       AND    A,#$80            ; 若发送寄存器不空,则等待

       JREQ   SENDCHAR_1

       POP    A                ; 从堆栈中恢复要发送的字符

       LD     LINUART_DR,A       ; 将要发送的字符送到数据寄存器

       RET

                            

  interrupt NonHandledInterrupt

NonHandledInterrupt.l

            iret



; 下面定义中断向量表    

          segment 'vectit'

          dc.l {$82000000+main}                         ; reset

          dc.l {$82000000+NonHandledInterrupt}   ; trap

          dc.l {$82000000+NonHandledInterrupt}   ; irq0

          dc.l {$82000000+NonHandledInterrupt}   ; irq1

          dc.l {$82000000+NonHandledInterrupt}   ; irq2

          dc.l {$82000000+NonHandledInterrupt}   ; irq3

          dc.l {$82000000+NonHandledInterrupt}   ; irq4

          dc.l {$82000000+NonHandledInterrupt}   ; irq5

          dc.l {$82000000+NonHandledInterrupt}   ; irq6

          dc.l {$82000000+NonHandledInterrupt}   ; irq7

          dc.l {$82000000+NonHandledInterrupt}   ; irq8

          dc.l {$82000000+NonHandledInterrupt}   ; irq9

          dc.l {$82000000+NonHandledInterrupt}   ; irq10

          dc.l {$82000000+NonHandledInterrupt}   ; irq11

          dc.l {$82000000+NonHandledInterrupt}   ; irq12

          dc.l {$82000000+NonHandledInterrupt}   ; irq13

          dc.l {$82000000+NonHandledInterrupt}   ; irq14

          dc.l {$82000000+NonHandledInterrupt}   ; irq15

          dc.l {$82000000+NonHandledInterrupt}   ; irq16

          dc.l {$82000000+NonHandledInterrupt}   ; irq17

          dc.l {$82000000+NonHandledInterrupt}   ; irq18

          dc.l {$82000000+NonHandledInterrupt}   ; irq19

[1] [2]
关键字:STM8  汇编语言  UART 引用地址:STM8与汇编语言(11)--UART应用之三

上一篇:STM8与汇编语言(10)--UART应用之二
下一篇:STM8与汇编语言(12)--EEPROM应用

推荐阅读

   2012年,英特尔、三星、台积电一起注资ASML以支持下一代EUV光刻机的研发,三家公司所占ASML的股份合起来大约是23%,金额达到38.5亿欧元。随后,三家公司均陆续减持 了所持股份。集微网消息,本周五荷兰金融市场管理局(AFM)登记处周五发布的公告显示,英特尔已将所持半导体设备制造商ASML Holding的股份减少至略低于3%。ASML是全球最大的半导体...
关于“华为造车”的消息在业内传了很多年,今年终于尘埃落定,最终的结果是华为不造车,而是聚焦ICT技术,帮助车企造好车。更具体一点,就是华为将依托于在ICT领域的长期积累,如华为的芯片、操作系统、算法、云服务、5G通信等来做智能汽车的基础零部件,使能车企打造他们理想的智能网联汽车,可谓理想很丰满。 2019上海车展期间的 “第五届国际汽车关键...
从家庭控制中智能门铃和安全摄像头的存在检测,到零售应用中用于库存的对象计数,再到工业应用中物体和存在检测,越来越多的网络边缘应用正在不断推动新型AI解决方案面市。根据IHS Markit(现Omida)的预测,2018-2025年物联网设备数量将达到400亿,截至2022年,所有企业产生的数据中近50%会在传统数据中心或云端以外的地方进行处理。 但与此同时,市场一...
在测量电源噪声中我们会面临各种挑战,包括RF干扰和信噪比(SNR),接下来我们来看如何在测量中实现高带宽,同时最大限度地减少DUT上的电流负载?鉴于DUT是电源轨,我们不希望从它汲取太多电流。但是这两个测量要求是相互矛盾的,它与互连信号的基本特性有关。假设探头是一根同轴电缆,示波器的输入阻抗设置为1MΩ,利用次探头探测低阻抗的电源,从该电源...

史海拾趣

问答坊 | AI 解惑

有利用单片机实现数据采集之后再串口传输的实例吗?

因为接触单片机应用的时间不常,想看看有没有这方面的实例可以参考的 谢谢啦!!…

查看全部问答∨

哪位在本本上用并口连接过H-Jtag 调试?

这样的是: 在PC上我跑IAR, 和 ADS 的两个工程文件,都没有问题, 用自己做的调试板+H-JTAG,都能正常 而换到本本上,在H-JTAG时,检测硬件都没问题,但调试时,分别出了问题: 1 在ADS 上, 按F5后,跑不到,MAIN() 函数那,发现死在 PLL初 ...…

查看全部问答∨

【求助】关于延时的问题!

我用C写延时子程序,请问怎么样才可以算出延时了多久呀!好像430讲时序方面也讲的很少,哪位高手有这方面的资料或程序,可否借光参考一下。…

查看全部问答∨

求帮忙打开一个文件

  请问下 谁能打开pcbdoc 6.0版本的 文件的.    AD9或者protel dxp2009 才能打开..  哪位大大能打开的 麻烦给转成版本低点的文件.  帮帮忙``   请留一个联系方式. 我邮件发过去~~~…

查看全部问答∨

单片机C语言应用100例的源代码和仿真

单片机C语言应用100例的源代码和仿真…

查看全部问答∨

基于TMS320F28335的光伏并网模拟装置

基于TMS320F28335的光伏并网模拟装置…

查看全部问答∨

LPC2131的ADC与SPI

ZLG的深入浅出ARM7中采用LPC2131。本人看了 SPI 后又去看了下ADC。 单独的 SPI 没有问题。然后我想用ADC后把显示的数据通过SPI,然后在LED显示。发现只要在 AD的有关引脚有电压输入就会使现实乱码。想请教一下是不是 ADC会影响 SPI 。  其中 ...…

查看全部问答∨

0-10mv交流经过运放输出0-5v的直流

本帖最后由 dontium 于 2015-1-23 13:11 编辑 设计电路,在模电书上看到信号放大的电路,是三个运放,有没有两个运放的还有就是单电源运放放大的 …

查看全部问答∨

TI M4处理器

以前主要搞PIC单片机软件,现在想学习TI  M4处理器 能给点的建议吗?(最好能推荐款开发板)。…

查看全部问答∨

台积电20纳米明年出货

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 台积电董事长张忠谋(19)日表示,台积电高资本支出政策目前不会改变,藉此带动2015年前的税前获利年复合成长率高于10%。台积电20纳米明年首季开始供应客户,持续领先业界,绝对会是客户第一选 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved