ARM的串口配置

本文档提供了ARM Cortex-M3处理器中UART(通用异步收发传输器)的初始化函数和相关通信函数的代码实现,包括设置数据位、停止位、校验位、波特率以及中断处理等。UART_INIT函数用于初始化UART,uart_send函数用于发送单个字符,uart_recv用于接收字符,uart_sendbuf和uart_sendstring分别用于发送缓冲区和字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“uart.c”:

#include "s2351_uart.h"
#include "string.h"
#include "stdarg.h"
#include "stdio.h"
#include "s3c2451_vector.h"
UART_Memptr constUART_BASE_PTR[4]={UART0_BASE_PTR,UART1_BASE_PTR,UART2_BASE_PTR,UART3_BASE_PTR};

void UART_INIT(UART_typedef uartx,UART_init_typedef uart_init_typedef)   //初始化函数数据位,停止位,校验位
{

UART_BASE_PTR[uartx]->ULCON &= ~(0x7f);           //0~6位初始化为0,0x7f为0111 1111
UART_BASE_PTR[uartx]->ULCON |=uart_init_typedef.wordwith;   //数据位
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.stop<<2);  //停止位
UART_BASE_PTR[uartx]->ULCON |=(uart_init_typedef.parity<<3);  //校验位

//波特率的选择
  if(uart_init_typedef.bobit == 115200)
{
UART_BASE_PTR[uartx]->UBRDIV = 34;
UART_BASE_PTR[uartx]->UDIVSLOT = 0xDFDD;
  }
if(uart_init_typedef.bobit == 9600)
{
UART_BASE_PTR[uartx]->UBRDIV = 428;
UART_BASE_PTR[uartx]->UDIVSLOT = 0xDDD5;
  }

UART_BASE_PTR[uartx]->UCON &= ~(0xf);
//中断函数的三个模式选择
if(uart_init_typedef.mode == mode_rx)
{UART_BASE_PTR[uartx]->UCON |= uart_init_typedef.mode;}
if(uart_init_typedef.mode == mode_tx)
{UART_BASE_PTR[uartx]->UCON |= uart_init_typedef.mode;}
if(uart_init_typedef.mode == mode_rx_tx)
{UART_BASE_PTR[uartx]->UCON |= uart_init_typedef.mode;}
}

void uart_send(UART_typedef uartx,U8 data)
{
UART_BASE_PTR[uartx]->UTXH = data;     //将要发送的数据存放到这个串口模块的发送寄存器中
while((UART_BASE_PTR[uartx]->UTRSTAT &0x4)==0); //判断停止位的位置,遇到停止位,跳出循环,数据发送完毕
}
void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len)
{
unsigned char i;
for(i = 0;i<len;i++)
{uart_send(uartx,data[i]);}
}
void uart_sendstring(UART_typedef uartx,U8 *string)       //字符串发送函数
{

U32 len = strlen((char*)string);
uart_sendbuf(uartx,string,len);
}
void uart_printf(char *fmt,...)             //串函数打印口

{
va_list ap;    //va_list 是C语言中解决变量问题的一组宏,变参可以是个数不固定,也可以是类型不固定
char string[1024];
va_start(ap,fmt);  //ap初始化,fmt是最后一个可见的参数
vsprintf(string,fmt,ap);  //将格式化的字符串存到string
va_end(ap);
}
U8 uart_receive(UART_typedef uartx)
{return UART_BASE_PTR[uartx]->URXH;}

void UART_interrupt_IRQ(UART_typedef uartx,U32 addr)
{
switch (uartx)
{
case UART0 :pISR_UART0 = addr;break;
case UART1 :pISR_UART1 = addr;break;
case UART2 :pISR_UART2 = addr;break;
case UART3 :pISR_UART3 = addr;break;
default :break;
  }
}


"uart.h":

#ifndef _S2351_UART_H
#define _S2351_UART_H
#include "typedef.h"
#include "stdarg.h"
#include "stdio.h"

//串口用到的所有寄存器放到一个结构体里
typedef struct {
    U32 ULCON;
    U32 UCON;
    U32 UFCON;
    U32 UMCON;
    U32 UTRSTAT;
    U32 UERSTAT;
    U32 UFSTAT;
    U32 UMSTAT;
    U32 UTXH;
    U32 URXH;
    U32 UBRDIV;
    U32 UDIVSLOT;
     } volatile *UART_Memptr;


#define UART0_BASE_PTR ((UART_Memptr)0x50000000)
#define UART1_BASE_PTR ((UART_Memptr)0x50004000)
#define UART2_BASE_PTR ((UART_Memptr)0x50008000)
#define UART3_BASE_PTR ((UART_Memptr)0x5000c000)

//串口的枚举
typedef enum {
UART0=0,
UART1,
UART2,
UART3
} UART_typedef;

//字节长度的枚举
typedef enum {
wordwith_5bit = 0,
wordwith_6bit,
wordwith_7bit,
wordwith_8bit
} WORDWITH_typedef;
//停止位的枚举
typedef enum {
stop_one = 0,
stop_two
} STOP_typedef;
//校验位的枚举
typedef enum {
        parity_no = 0,
parity_odd = 4,
parity_even,
parity_one,
parity_zero 
} PARITY_typedef;
//模式方式的枚举
typedef enum {
mode_rx = 1,
mode_tx = 4,
mode_rx_tx
} MODE_typedef;

typedef struct {
U32 bobit;              //波特率
WORDWITH_typedef wordwith;
STOP_typedef stop;
PARITY_typedef parity;
MODE_typedef mode;
} UART_init_typedef;

extern void UART_INIT(UART_typedef uartx,UART_init_typedef uart_init_typedef);      //串口初始化函数(选择串口,重命名)
extern void uart_send(UART_typedef uartx,U8 data);       //串口号和需要发送的数据
extern U8 uart_receive(UART_typedef uartx);
extern void uart_sendbuf(UART_typedef uartx,U8 *data,U8 len);
extern void uart_sendstring(UART_typedef uartx,U8 *string);
extern void uart_printf(char *fmt,...);
extern void UART_interrupt_IRQ(UART_typedef uartx,U32 addr);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值