TQQ2440第三节:串口

发布者:AngelicGrace最新更新时间:2024-11-06 来源: cnblogs关键字:串口  配置 手机看文章 扫描二维码
随时随地手机看文章

嵌入式的基本上都清楚,板子基本上跑起来了,第一个肯定要配置的是串口,便于我们后面调试信息的输出,和一些系统参数的输出,让我们有更直观看见程序的运行。

—————————————————————————————————————————————

硬件平台:TQ2440 (S3C2440A)

开发环境:ADS1.2

时      间:2010-12-12

—————————————————————————————————————————————

1:硬件电路:

  image image

                  底板电路                           核心板上的连接管脚

由于TQ2440的板子上只引出了一个串口,也就是用的UART0作为COM1,所以我吗只需要配置相关的引脚为串口功能即可。

接着参考2440的说明文档:

image

所以把GPH相关的GPH0-3都配置为第二功能UART功能。即可以上至完成了管脚的配置,接着对UART的功能进行配置。

A:UART寄存器:

image


从2440的数据手册上我们可以知道他的寄存器的地址都是连接着的,所以我们直接用结构体来表示,因为他有3个串口,所以,我们这里就可以用3个不同的结构体指针来操作不同的寄存器。代码如下:


   1: #define IO_CON_BASE 0x56000000

   2: #define IO_DAT_BASE 0x56000004

   3:  

   4: #define UART0_BASE  0x50000000  // UART0 Base Address

   5: #define UART1_BASE  0x50004000  // UART1 Base Address

   6: #define UART2_BASE  0x50008000  // UART2 Base Address

   7:  

   8: #define REG8(x)  (*((volatile unsigned char  *)(x)))

   9: #define REG16(x) (*((volatile unsigned short *)(x)))

  10: #define REG32(x) (*((volatile unsigned long  *)(x)))

  11:  

  12: typedef volatile unsigned char  reg8;

  13: typedef volatile unsigned short reg16;

  14: typedef volatile unsigned long  reg32;

  15:                         

  16: /*

  17: GPIO_CFG_SET说明:   group--表示是那组IO(注意没有GPA)

  18:                     index--表示这组中的那个引脚   

  19:                     type --表示是配置为输入还是输出等其他功能

  20: */

  21: #define GPIO_CFG_SET(group,index,type) do{

  22:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3<  23:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))|=(type<  24:                         }while(0)

  25:                         

  26: /*

  27: GPIO_DAT_SET说明:   group--表示是那组IO(注意没有GPA)

  28:                     index--表示这组中的那个引脚   

  29:                     val  --表示对此引脚写入的数据

  30: */

  31: #define GPIO_DAT_SET(group,index,val) do{

  32:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1<  33:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))|=(val<  34:                         }while(0)

  35: /*

  36: 因为GPA的控制寄存器,每个引脚只只占用一位,所以为了能统一这里,就没有把

  37: GPA加进来,而后面的GPB-GPJ的控制寄存器每个引脚对应2位

  38: */                        

  39: enum{GPB=1,GPC,GPD,GPE,GPF,GPG,GPH,GPI,GPJ};

  40: /*

  41: 从GPB开始由于用两位表示此引脚的功能所以有四种可能

  42: 0代表INPUT,1代表OUTPUT,2代表第三功能,3代表第四功能

  43: */

  44: enum{INPUT=0,OUTPUT,THI_FUNC,FOR_FUNC};

  45: /*

  46: 定义高低电平

  47: */

  48: enum{LOW=0,HIG};

  49:  

  50: // UART Registers

  51: typedef struct {

  52:   reg32 ULCON;              // UART Line Control          由于控制数据格式,常用的为N-8-1模式 

  53:   reg32 UCON;               // UART Control                控制UART的工作状态,例如DMA,中断等

  54:   reg32 UFCON;              // UART FIFO Control        控制UART的FIFO,这里没有用到

  55:   reg32 UMCON;          // UART MODEM Control    在MODEM模式下的控制寄存器,这里没有用到

  56:   reg32 UTRSTAT;        // UART Tx/Rx Status        UART发送和接受状态寄存器

  57:   reg32 UERSTAT;        // UART Error Status            UART错误状态寄存器

  58:   reg32 UFSTAT;             // UART FIFO Status        UART---FIFO状态寄存器

  59:   reg32 UMSTAT;         // UART MODEM Status    UART---MODEM状态寄存器

  60:   reg8  UTXH;               // UART Tx Hold                UART发送数据寄存器 ##注意这里是一个char类型的

  61:   reg8  pad0[3];

  62:   reg8  URXH;               // UART RX Buffer            UART接受数据寄存器 ##注意这里是一个char类型的

  63:   reg8  pad1[3];

  64:   reg32 UBRDIV;             // UART Baud Rate Divisor UART的波特率产生器的分频率

  65: } regUART;

  66:  

  67: #define pUART0 ((regUART *)UART0_BASE)

  68: #define pUART1 ((regUART *)UART1_BASE)

  69: #define pUART2 ((regUART *)UART2_BASE)

 2:2440的UART的配置


     上面已经把相关的寄存器介绍的很清楚了,所以这里的配置就直接给出代码了,因为可以直接参考数据手册得到:


   1: void uart_init(void)

   2: {

   3:     //设置GPH[0..3]为uart0的输出引脚

   4:     GPIO_CFG_SET(GPH,0,THI_FUNC);

   5:     GPIO_CFG_SET(GPH,1,THI_FUNC);

   6:     GPIO_CFG_SET(GPH,2,THI_FUNC);

   7:     GPIO_CFG_SET(GPH,3,THI_FUNC);

   8:     

   9:     pUART0->ULCON=    0x03;   //N-8-1

  10:     pUART0->UCON=    0x245; //中断和查询模式

  11:     pUART0->UFCON=    0x0;    //No Use

  12:     pUART0->UMCON=    0x0;      //No Use

  13:     pUART0->UBRDIV=    26;      //当前板子的速度是FCLK:400M,HCLK=100M,PCLK=50M,UATR=115200

  14: }

 


   这样串口就能工作起来的了,自己在把链接串口工具配置成相同的波特率就能正常工作了。


3: 相关代码的实现


 接下来就是串口发送和接受数据的一些功能函数的实现了,下面也只实现了一些简单的函数:


输出部分:


   1: void u_printf(char *fmt,...)  //格式化输出

   2: {

   3:     va_list ap;

   4:     char str[100];

   5:     va_start(ap,fmt);

   6:     vsprintf(str,fmt,ap);

   7:     send_str(str);

   8:     va_end(ap);

   9: }

  10: void send_str(char *p_str)   //发送一个字符串

  11: {

  12:     while(*p_str!='')

  13:     {

  14:         if(*p_str=='n')

  15:         {

  16:             send_char('r');

  17:         }

  18:         

  19:         send_char(*p_str);

  20:         p_str++;

  21:     }        

  22: }

  23: void send_char(char cc)    //发送一个字符

  24: {

  25:     while(!(pUART0->UTRSTAT& 0x2));

  26:     pUART0->UTXH=cc;

  27: }

输入部分:


   1: char get_char(void)             //接受一个字符

   2: {

   3:     char cc;

   4:     while(!(pUART0->UTRSTAT& 0x1));

   5:     cc=pUART0->URXH;

   6:     return cc;

   7: }

   8:  

   9: void get_str(char *str)    //接受一个字符串

  10: {

  11:     /*

  12:     str_bak是为了存储str地址的,是为了在没有输入的情况下

  13:     输入退格,造成程序的崩溃

  14:     */

  15:     char *str_bak=str,cc; 

  16:     do{

  17:         cc = get_char();

  18:          if(cc=='b')

  19:         {

  20:             if( (int)str_bak < (int)str)

  21:             {

  22:                 //u_printf('b b');

  23:                 send_char('b');

  24:                 send_char('b');

  25:                 str--;

  26:             }

  27:         }

  28:         else 

  29:         {

  30:             *str++ = cc;

  31:             send_char(cc);

  32:         }

  33:     }

  34:     while(cc!='r');

  35:     

  36:     *str = '';

  37:     send_char('n');

  38: }

[1] [2]
关键字:串口  配置 引用地址:TQQ2440第三节:串口

上一篇:TQQ2440第一节:启动代码
下一篇:u-boot2010.03 移植篇(一) 建立编译目标

推荐阅读最新更新时间:2026-03-25 11:30

TQQ2440第二节:流水灯
我是从学单片机才开始接触嵌入式,所以我一直都感觉还是从硬件在到上面的驱动,这样的而学习流程让我更加容易懂的一些,但是上班了发现公司没让我那样,一开始就给我一大批的代码,让我一段时间很消沉,不过现在也差不多熬过来了,但是回首这段时间,发现自己阅读那些令人费解的代码的能力有所提升把,但是现在自己还是打算从硬件到驱动好好的学习个彻底,上面启动代码没什么好说的,接着程序已经跳转到了c语言的入口Main函数这里了,接下来就会觉得很熟悉了(我也还是建议和我一样菜鸟的先不看那段启动代码,曾经在学校哪个启动代码让我费了很多的时间,想起来真的好不值,把其他的都会了,在回头看也就差不多了),好了开始正文了。 ———————————————————
[单片机]
<font color='red'>TQQ2440</font>第二节:流水灯
STM32串口——中断方式的一般配置方法
#include stm32f10x.h /************************************************ 该程序讲解串口程序的一般配置方法: 步骤为: 1、先对端口进行复用或者重映射操作(该程序中是对端口进行复用操作) 2、串口复位,函数为USART_DeInit(); 3、串口初始化:USART_Init(); 4、中断初始化: NVIC_Init(); 5、串口使能:USART_Cmd(); 6、开启中断:USART_ITConfig(); 7、编写中断处理函数:void USART1_IRQHandler(void)
[单片机]
STM32<font color='red'>串口</font>——中断方式的一般<font color='red'>配置</font>方法
STM32WB55开发(4)----配置串口打印Debug调试信息
概述 在STM32WB55系列微控制器上进行开发时,实时监控应用程序的运行情况和调试潜在问题是至关重要的。使用串口(USART/UART)进行Debug信息打印是一种简便、高效的方法。下面是如何在STM32WB55上配置串口来打印调试信息的概述。 硬件准备 首先需要准备一个开发板,这里我准备的是WB55RG 的开发板: 视频教学 样品申请 源码下载 选择芯片型号 配置时钟源 HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用外置的时钟源,故都选择Crystal/Ceramic Resonator选项,如下所示: 配置时钟树 RTC时钟配置 RFWKP时钟配置 查看开启STM32_WPAN条件
[单片机]
STM32WB55开发(4)----<font color='red'>配置</font><font color='red'>串口</font>打印Debug调试信息
S3C2440串口通讯的相关配置
UART配置的相关寄存器如下(按s3c2440手册中的顺序列出): 1. ULCONn寄存器:线性控制寄存器 功能:设置奇偶校验,停止位, 数据位(5-8位) 注意:一般设置为无校验,一个停止位,数据位为8位,也就是常说的“8N1”,此时寄存器值为0x3。(bit =0为正常模式,否则为红外模式); 2. UCONn寄存器:通道n控制器 功能:选择UART时钟源、设置UART中断方式 注意:可选择PCLK、UEXTCLK或FCLK/n。bit =1为回送模式,用于测试;bit 和bit 分别控制传输和接收模式,初学者常设置为中断请求或查询模式,bit =bit =01。 3. UFCONn寄存器:FIFO控制寄存器 功能:用于设置
[单片机]
STM32CUBEIDE----配置输出串口中文和文本大小
概述 TM32CubeIDE是一体式多操作系统开发工具,是STM32Cube软件生态系统的一部分。 STM32CubeIDE是一种高级C/C++开发平台,具有STM32微控制器和微处理器的外设配置、代码生成、代码编译和调试功能。它基于Eclipse®/CDT™框架和用于开发的GCC工具链,以及用于调试的GDB。它支持集成数以百计的现有插件,正是这些插件使Eclipse® IDE的功能趋于完整。 STM32CubeIDE集成了STM32CubeMX的STM32配置与项目创建功能,以便提供一体化工具体验,并节省安装与开发时间。在通过所选板卡或示例选择一个空的STM32 MCU或MPU,或者预配置微控制器或微处理器之后,将创建项
[单片机]
STM32CUBEIDE----<font color='red'>配置</font>输出<font color='red'>串口</font>中文和文本大小
STM32 DMA串口发送模式配置及使用简单分享
  赠人玫瑰,手有余香;很感谢网上其他楼主的分享;我这个贴子是关于STM32 DMA USART 发送模式的调试分享,我为什么要建这个帖子呢,因为我不想看到还有其他人跟我一样,为了调通DMA串口,而花上大半天的时间,这很不利于大家高效率的开发,网上的经验都是从头教到尾的,内容极多,对于有点小经验的人,或者是想很快达到目的的人,这个很不适合他们;我的这个很简单(本帖不适合不熟悉配置STM32串口的玩家),他只是说串口的DMA怎么配置,还有我用的是DMA1_通道4,因为我的是串口1的TX长话短说:直接po代码:   DMA_InitTypeDef DMA_InitStruct; //DMA类型声明   RCC_AHBPeriphC
[单片机]
STM32F103标准库开发---Uart串口通信实验---初始化配置
一、Uart 串口通信 1. Uart 简介 UART 全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器 ,是一种通用串行数据总线,用于异步通信。 该总线双向通信,可以实现全双工数据发送和接收。 常用于单片机和电脑之间以及单片机和单片机之间的板级通信。 2. 接口连接方式 Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口,硬件连接比较简单,仅需要3条线。 具体连接图如下: 3. 传输方式 Uart 串口通信的数据由发送设备通过自身的TXD接口传输到接收设备的RXD接口, 一个字符一个字符地传输,每个字符一位一位地传输,并且传输
[单片机]
STM32F103标准库开发---Uart<font color='red'>串口</font>通信实验---初始化<font color='red'>配置</font>
STM32F103串口配置
/*usart.c*/ #include usart.h int fputc(int ch, FILE *f) //printf函数重定向(使用printf可通过USARTx打印数据) { USART_SendData(USART1,(uint8_t)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET) ; return ch; } /*初始化串口,baud:波特率*/ //接收:PA10 //发送:PA9 void Init_USART1(unsigned int baud) { USART_InitTypeDe
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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