STM8与汇编语言(10)--UART应用之二

发布者:Yudie最新更新时间:2021-10-12 来源: 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


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

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

;

; 首先要初始化堆栈指针

       LDW    X,#stack_end        

              LDW    SP,X


             CALL   UART3_Init         ; 初始化串口3

MAIN_LOOP.L

            CALL   UART3_RecvChar

            CALL   UART3_SendChar

            JRA    MAIN_LOOP           ; 进入无限循环



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,#$0C            ; b3 = 1,允许发送

                               ; b2 = 1,允许接收

            LD     LINUART_CR2,A  

            RET

;

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

                            

; 函数功能:从UART3接收一个字符

; 输入参数:无

; 输出参数:无

; 返 回 值:寄存器A -- 从串口读回的字符

; 备    注:无

UART3_RecvChar.l

RECVCHAR_1.L                  

            LD     A,LINUART_SR

            AND    A,#$20

            JREQ   RECVCHAR_1

            LD     A,LINUART_DR

            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

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

上一篇:STM8与汇编语言(9)--UART应用之一
下一篇:STM8与汇编语言(11)--UART应用之三

推荐阅读最新更新时间:2024-11-04 10:56

STM8 时钟/触发控制器
STM8时钟/触发控制器 时钟/触发控制器允许用户选择计数器的时钟源,输入触发信号和输出信号,框图如图40所示。 (图40:STM8时钟/触发控制器框图) 预分频时钟(CK_PSC) 时基单元的预分频时钟(CK_PSC)可以由以下源提供: 内部时钟(fMASTER) 外部时钟模式1:外部时钟输入(TIx) 外部时钟模式2:外部触发输入ETR 内部触发输入(ITRx):使用一个定时器做为另一个定时器的预分频时钟。更多信息请参考图52的例子。 内部时钟源(fMASTER) 如果同时禁止了触发模式控制器和外部触发输入(TIM1_SMCR寄存器的SMS=000,TIM1_ETR寄存器的ECE=0),则CEN、DIR
[单片机]
<font color='red'>STM8</font> 时钟/触发控制器
PIC32MZ tutorial -- UART Communication
  At this moment, I accomplish the interface of UART communication for PIC32MZ EC Starter Kit. This interface configures the PIC32MZ for communication with a host PC at 115200 baud. There are five functions in the interface -- Uart_Init(), Uart_Getc(), Uart_Gets(), Uart_Putc() and Uart_Puts().   Uart_Init() configure
[单片机]
通过先进的高性能UART提高串行I/O的连接性能
市场融合正在推动对开发新接口的需求,但这也在影响已有接口类型的性能和特性。在目前已有的接口类型中,最常见的是广泛用作标准串行连接的通用异步收发器(UART)。UART可以用做主处理器(如微控制器或嵌入式处理器)和外设之间的通讯接口。在从工业控制到智能手机的大量应用中,这些独立的解决方案变得越来越有吸引力。   UART是在特定模块(如蓝牙、GPS、RFID、多端口以太网服务器)和主处理器或芯片组之间进行通讯的首选接口。因为无论从应用端还是从软件驱动端来看,UART都是一个软件开销最小和复杂性最低的高效接口。尽管UART的发展趋势是更多地集成在处理器或者芯片组中,但这里也存在一个折衷,那些关键芯片需要平衡芯片的面积/成本和性能以
[工业控制]
通过先进的高性能<font color='red'>UART</font>提高串行I/O的连接性能
STM8固件库+IAR 之--UART3
Stm8的串口:主要功能: 1:支持异步传输所以成为UART 2:lin模式 主从 3:红外编码模式 4:智能卡模拟功能 以上功能并不是所有串口都支持,stm8最多的是3个串口,配置简单,多说无益 本来想先写定时器1来着,可手头上正好有串口的程序,整理整理先贴上来呗~ 首先到stm8s_conf.h把 #define _UART3 (1) 打开,否则uart3不能用,重新编译一下静态库 贴main.c代码: #include stm8s.h /*========内部高速时钟初始化========*/ void init_hsiclk(void) { CLK_DeInit(); //寄存器复位 CLK_HSICmd(ENABL
[单片机]
STM32开发 -- UART应用层通信协议分析
拿到一份UART的通信协议,上手来操作之前先做一下分析。 一、帧格式说明 先看一下它的帧格式说明: 1、 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92。 2、 协议版本 协议版本号(4bit),目前值为1 加密方式(4bit),0表示采取“数据不加密+校验和”方式。 所以,当前此字段完整值为0x10 3、 控制字段中的C/R比特 用于指示该帧是命令帧还是应答帧,1表示命令帧,0表示应答帧。 4、 控制字段中的T/F比特 用于指示传输数据类型,1表示透明的非结构化数据,0表示正常的数据帧。 5、 虚拟通道 虚拟地址(4bit):代表数据帧的源地址标识。目前为保留位,取值为0。 通道序号(4bit):0表示虚通道0
[单片机]
ARM11-S3C6410 UART
我想串口程序应该是ARM程序中最简单的了吧。尽管如此,做个记录吧 。 具体设置如下: #define ULCON0 (*((volatile unsigned long *)0x7F005000)) #define UCON0 (*((volatile unsigned long *)0x7F005004)) #define UFCON0 (*((volatile unsigned long *)0x7F005008)) #define UMCON0 (*((volatile unsigned long *)0x7F00500C)) #define UTRSTAT0 (*((vola
[单片机]
ARM11-S3C6410 <font color='red'>UART</font>
TX2440裸机程序-uart
一、uart原理简介 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送。 它的特点是:传输速度快,是用于短距离通信; §串行通信:利用一条数据线将数据一位位地顺序传送。 特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信。 异步通信: ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的。 ª通信协议:是指通信双方约定的一些规则。在异步通讯时,对数据格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。 起始位:先发一个逻辑“0”信号,表示传输字符的开始;
[单片机]
TX2440裸机程序-<font color='red'>uart</font>
STM8“线反转式”扫描矩阵键盘
线反转法接线图如下。其原理简单来说就是: 四个行引脚推挽输出低电平(置0), 四个列引脚上拉输入, 如果有按键按下,会连通行与列,导致某个列引脚电压被拉低,故输出寄存器不再是0X0F,而是0X0E,0X0D,0X0B,0X07, 这样就判断出了那一列被按下。 此时反转输入输出,用同样的方法监测那一行被按下。 最后返回键值。 //------------------------------header------------------------------------------ #include iostm8s208mb.h //------------------------------commo
[单片机]
<font color='red'>STM8</font>“线反转式”扫描矩阵键盘
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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