第011课 Jz2400串口(UART)的使用

发布者:书香墨意最新更新时间:2020-03-23 来源: eefocus关键字:Jz2400  串口  UART 手机看文章 扫描二维码
随时随地手机看文章

第001节硬件知识_UART硬件介绍


1.串口的硬件介绍 

UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。 

串口在嵌入式中用途非常的广泛,主要的用途有:


打印调试信息;

外接各种模块:GPS、蓝牙;

串口因为结构简单、稳定可靠,广受欢迎。 

通过三根线即可,发送、接收、地线。

这里写图片描述

通过TxD->RxD把ARM开发板要发送的信息发送给PC机。 

通过RxD->TxD线把PC机要发送的信息发送给ARM开发板。 

最下面的地线统一参考地。


2.串口的参数


波特率:一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。


起始位:先发出一个逻辑”0”的信号,表示传输数据的开始。

数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输。


校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。


停止位:它是一个字符数据的结束标志。


怎么发送一字节数据,比如‘A‘?


A 的ASCII值是0x41,二进制就是01000001,怎样把这8位数据发送给PC机呢?


双方约定好波特率(每一位占据的时间);

规定传输协议

a. 原来是高电平,ARM拉低电平,保持1bit时间;


b. PC在低电平开始处计时;


c. ARM根据数据依次驱动TxD的电平,同时PC依次读取RxD引脚电平,获得数据;


前面图中提及到了逻辑电平,也就是说代表信号1的引脚电平是人为规定的。 


如图是TTL/CMOS逻辑电平下,传输‘A’时的波形:

这里写图片描述

在xV至5V之间,就认为是逻辑1,在0V至yV之间就为逻辑0。


如图是RS-232逻辑电平下,传输‘A’时的波形:

这里写图片描述

在-12V至-3V之间,就认为是逻辑1,在+3V至+12V之间就为逻辑0。


RS-232的电平比TTL/CMOS高,能传输更远的距离,在工业上用得比较多。


市面上大多数ARM芯片都不止一个串口,一般使用串口0来调试,其它串口来外接模块。


ARM芯片上得串口都是TTL电平的,通过板子上或者外接的电平转换芯片,转成RS232接口,连接到电脑的RS232串口上,实现两者的数据传输。

这里写图片描述

现在的电脑越来越少有RS232串口的接口,当然USB是几乎都有的。因此使用USB串口芯片将ARM芯片上的TTL电平转换成USB串口协议,即可通过USB与电脑数据传输。

这里写图片描述

上面的两种方式,对ARM芯片的编程操作都是一样的。


ARM芯片是如何发送/接收数据?


如图所示串口结构图:

这里写图片描述

要发送数据时,CPU控制内存要发送的数据通过FIFO传给UART单位,UART里面的移位器,依次将数据发送出去,在发送完成后产生中断提醒CPU传输完成。


接收数据时,获取接收引脚的电平,逐位放进接收移位器,再放入FIFO,写入内存。在接收完成后产生中断提醒CPU传输完成。


第002节_S3C2440_UART编程

在uart.c这个文件里需要编写这样几个函数:


 uart0_init()  用于初始化串口

 putchar()   用于发送一个字符

 getchar()   用于接收一个字符

 puts()     用于发送一串字符


在uart0_init()需要做如下几件事:


1.设置引脚用于串口:根据原理图和参考手册设置GPH2,3用于TxD0, RxD0,并且为了将其保持为高电平,先设置其为上拉;


 GPHCON &= ~((3<<4) | (3<<6));

 GPHCON |=  ((2<<4) | (2<<6));

 GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */


2.设置波特率 

将uart 的时钟设置为PCLK,中断/查询模式:


UCON0 = 0x00000005; /* PCLK,中断/查询模式 */ 

uart clock=50M,波特率假设是115200, 

根据公式UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1 

得到UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 

UBRDIV0 = 26;


3.设置数据格式 

数据格式设置为常用的8n1:8个数据位, 无较验位, 1个停止位


ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */


读取UTRSTAT0寄存器,查询其第2位判断发送buff是否为空,即上一次发送是否完成,如果完成即向UTXH0写入要发送的新数据;查询其第0位判断接收buff是否为空,即本次接收是否完成,如果接收完成,读取URXH0的值。


int putchar(int c)

{

    /* UTRSTAT0 */

    /* UTXH0 */


    while (!(UTRSTAT0 & (1<<2)));

    UTXH0 = (unsigned char)c;


}


int getchar(void)

{

    while (!(UTRSTAT0 & (1<<0)));

    return URXH0;

}



循环输出字符,就可以实现字符串的输出



int getchar(void)

{

    while (!(UTRSTAT0 & (1<<0)));

    return URXH0;

}


int puts(const char *s)

{

    while (*s)

    {

        putchar(*s);

        s++;

    }

}


在main.c的主函数里,先调用初始化函数,然后循环获取用于输入的数据,然后回显出来。并且在收到r回车时,输出n换行,有些时候n是回车,则输出r换行。


#include "s3c2440_soc.h"

#include "uart.h"


int main(void)

{

    unsigned char c;


    uart0_init();

    puts("Hello, world!nr");


    while(1)

    {

        c = getchar();

        if (c == 'r')

        {

            putchar('n');

        }


        if (c == 'n')

        {

            putchar('r');

        }


        putchar(c);

    }

    return 0;

}

关键字:Jz2400  串口  UART 引用地址:第011课 Jz2400串口(UART)的使用

上一篇:第010课 掌握Jz2440_ARM芯片时钟体系
下一篇:第012课 内存控制器与SDRAM

推荐阅读最新更新时间:2024-11-17 02:44

使用STM32CubeMX捕获外来PWM高低电平并在串口调试助手显示
大家好,本人也是最近才开始接触STM32Cube,它极大的提高了软件开发的速度。 闲话少说,切入正题。本人使用的芯片是STM32L151C8T6一款低功耗的芯片。前提条件是:已知外来传感器PWM波周期是1S,通过低电平脉宽来发送有效数据,我们使用PWM捕获,将低电平时间显示在串口调试助手。所使用的管脚配置图如下: 接下来本人将详细的操作顺序一步一步给出,方便初学者学习。 1.配置RCC时钟,本人使用外部高速时钟,如下图。 2.配置PWM输入捕获通道,这里本人采用到的是TIM2CH1(这个根据自己MCU情况设定,没有太多要求),如下图: 3.配置串口输出,这里我们只是用到了RX,如下图: 4.配置时
[单片机]
使用STM32CubeMX捕获外来PWM高低电平并在<font color='red'>串口</font>调试助手显示
Launchpad的温度测量及串口发送
1 #include msp430g2553.h 2 3 void sendChar(unsigned char c) 4 { 5 while(!(IFG2&UCA0TXIFG)); 6 UCA0TXBUF=c; 7 } 8 9 void sendStr(unsigned char *s) 10 { 11 while(*s!='\0') 12 { 13 sendChar(*s); 14 s++; 15 } 16 } 17 18 void main(void) 19 20 { 21 22 unsigned char i; 23 unsigned
[单片机]
通过STM32 UART及DMA修改TIMER占空比示例
现在有人谈到这样一个需求,他使用STM32F429芯片做开发,其中用到TIM2做3路PWM输出。另外有个上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个输出通道的比较参数。如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。 STM32F429的TIM2是32位定时器,3个通道的CCR寄存器也是32位的。那么上位机每次发3个通道的参数对应12字节的数据。 显然,整体上功能不算复杂。我们可以先通过UART收到12字节数据,稍加整理后手动将数据逐字写到3个CCR寄存器来改变PWM输出。说实在的,这个方案的实现过程还是很清晰的,相信也是
[单片机]
通过STM32 <font color='red'>UART</font>及DMA修改TIMER占空比示例
通过USB转TTL串口下载stm32程序
目录: 1.硬件及其接线 2.驱动及软件 3.下载程序测试 1.硬件及其接线 1.1 USB转TTL刷机板(CH340模块升级小板) 1.2 主芯片STM32F103C8T6开发板 1.3接线 1.3.1 转串口模块接线 注:3V3和5V由短路冒选择。 1.3.2 核心板接线 其中 BOOT0置1,BOOT1置0。 2.驱动及软件 2.1 CH340驱动及安装方法 2.2 程序下载软件 3.下载测试 下载实验一流水灯程序测试。 实验一流水灯 写入程序成功后,将BOO0与BOOT1均置为0。 实验结果显示程序按预定设想成
[单片机]
通过USB转TTL<font color='red'>串口</font>下载stm32程序
UART和USART有区别
  UART   UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。   UART的功能计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。它是用于控制计算机与串行设备的芯片。有
[单片机]
开启Cache后UART无法发送新数据
有人使用STM32H743做产品开发, DMA 传输待发送的数据到 UART 发送寄存器做后续UART通信。在开启D-Cache的情况下,发现UART没法发送更新过的数据。 具体应用场景是这样的,源数据放在STM32H743片内D1域的AXI-SRAM区,数据会不定期地被CPU修改,然后让DMA将数据传输到USART3的发送寄存器进行后续UART通信。结合手册可以查得USART3位于D2域。 目前开启了D-Cache/I-Cache。我基于现有场景写了一段简单的如下测试代码【编译环境使用STM32CubeIDE】: __attribute__((section( .Source ))) uint8_t Source ; uin
[单片机]
开启Cache后<font color='red'>UART</font>无法发送新数据
STM32之USART 232串口通信<一>
1、串口的操作步骤 1)打开GPIO的时钟使能和USART的时钟使能。 2)设置串口 IO 的 IO 模式(一般输入是浮空输入,输出是复用推挽输出) 3)初始化USART。(包括设置波特率、数据长度、停止位、校验位等) 4)如果使用中断接收的话,那么还要设置 NVIC 并打开中断使能。(即设置 它的中断优先级) 2、库函数说明 1)RCC_)APB2PeriphClockCmd()函数 开启时钟函数,我们要打开时钟有两个 GPIO 口时钟和 USART 时钟。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Pe
[单片机]
高速DSP与PC实现串口通信的方法
数字信号处理器(Digital Signal Processor,DSP)在图形图像处理、高精度测量控制、高性能仪器仪表等众多领域得到越来越广泛的应用,实际运用中,通常须将DSP采集处理后的数据传送到PC机,然后进行存储和处理。 T1公司的TMS320VC33微处理器具有性价比高,同时,该芯片的I/O电平、字长、运行速度、串口功能具有大多数DSP的共同特点。本文针对TMS320VC33与PC RS-232的通讯,分析三种具体的接口电路和软件设计方法,实现高速DSP与低速设备的通讯:①通过TMS320VC33的通用I/O口实现通信;②通过TMS320VC33中可设置为通用I/O的串行引脚实现通信;③直接利用TMS320VC33的串
[应用]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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