前言

串口是一个非常重要的工具,用这个可以非常简单的收发一些数据,串口的操作还是比其他协议简单很多,因此在工控芯片上串口非常普遍。本节就详细记录dsPIC33E芯片的串口寄存器配置以及使用过程。

首先需要把串口的硬件环境搭建好,我这里使用了一对蓝牙主从机,蓝牙主机连接USB转TTL模块连接电脑,蓝牙从机连接单片机芯片,蓝牙的无线传输距离还是比较短的,有效距离只有10几米,不过无所谓了,重点并不是距离,只需要它能够正常收发即可,连接图如下:

我将蓝牙主从机包括密码,名字,波特率等配置好后,测试他们两个之间的数据交互是没问题的,也就是确保了蓝牙是正常的。之后便可以开始UART的配置过程。

1.第一步:配置引脚复用

第一步配置肯定就是引脚配置了,需要把指定的引脚配置为UART模式,包括TX,RX引脚,查看手册中的IO端口章节:

这句话也就是说,如果该端口由AD/DA功能,那么如果要使用这个端口的数字功能,就要将ANSELx寄存器相应的位置0。

也就是说,如果使用UART功能,相关引脚不能使用PORT和TRIS寄存器来进行读写操作。这个关系不大,应该不会有这样的操作。

输入映射与输出映射:

需要知道可用的引脚以及引脚对应的外设:

这里就需要我们在查看芯片手册中,我们具体的芯片型号对应的电路中需要的引脚是什么编号,也就是说查找RPn。

由上可知,TX是RP40,RX是RP41。
如果使用RX接收引脚,需要配置输入映射:(RPINRx寄存器)

如果使用TX发送引脚,需要配置输出映射:(RPORx寄存器)

配置TX:

配置引脚为TX首先需要禁用引脚的模拟模式,将引脚配置为IO,之后配置为输出:

 ANSELBbits.ANSB8 = 0;  //关闭模拟模式,设置B9为数字IOTRISBbits.TRISB8 = 0;  //设置B8为输出

之后,便将此引脚配置为UART1_TX功能:

也即,需要将RPOR寄存器的RP40位中写入二进制的000001,也就是0b000001:

RPOR3bits.RP40R = 0b000001;   //选择为TX模式

配置RX:

也就是说要把RPINR18寄存器的U1RXR位接入需要接入的引脚,电路上是PB9,也就是PR41,就配置位了RX模式,在此之前要把此引脚设置为输入。

2.第二步:配置波特率

波特率就很好配置了,按照这个图,配置相应的BRGH位,然后根据BRGH位计算,这里我使用的BRGH就为0,由于我配置的时钟频率为60M,(关于时钟频率配置,请看此dsPIC系列的振荡器相关文章)按照这个公式计算即可,波特率宏定义:

#define FCY 60000000          //工作频率
#define BAUDRATE 9600         //设定波特率
#define BRGVAL ((FCY/BAUDRATE)/16)-1

3.第三步:发送功能程序

完成TX配置之后,就需要编写发送函数,从主要的还是发送一个字节函数,只要可以发送一个字节,那么发送字符串函数什么的,就可以迎刃而解。发送功能函数的最主要的就是数据缓冲区以及发送完成标志:

则,发送函数编写就可以这样:

void uart_SendByte (uint8_t val)
{U1TXREG = val;  //将数据写入发送缓冲区/@@*等待发送完成*/while(!U1STAbits.TRMT);   //等待发送移位寄存器为空 即上次发送已完成
}

完整TX配置以及发送函数如下:

/@@****************发送配置***************/ ANSELBbits.ANSB8 = 0;  //关闭模拟模式,设置B9为数字IOTRISBbits.TRISB8 = 0;  //设置B8为输出RPOR3bits.RP40R = 0b000001;   //选择为TX模式U1MODEbits.STSEL = 0;//一个停止位U1MODEbits.PDSEL = 0;//8数据位 无奇偶校验U1MODEbits.ABAUD = 0;//禁止波特率测量或测量已完成U1MODEbits.BRGH = 0;//BRG 在每个位周期内产生 16 个时钟信号 ( 16 倍频波特率时钟,标准模式)U1BRG = BRGVAL;     //60MHz波特率9600(按照计算公式)U1STAbits.UTXISEL0 = 0;U1STAbits.URXISEL1 = 0;//当接收到一个字符且该字符从 UxRSR 传输给接收缓冲区,//使接收缓冲区有一个或多个字符时,中断标志位置 1。IEC0bits.U1TXIE = 0;  //不使能发送中断U1MODEbits.UARTEN = 1;//使能UARTU1STAbits.UTXEN = 1;  //使能发送
void uart_SendByte (uint8_t val)
{U1TXREG = val;  //将数据写入发送缓冲区/@@*等待发送完成*/while(!U1STAbits.TRMT);   //等待发送移位寄存器为空 即上次发送已完成
}

我使用了此函数在main函数中一直发送 ff,测试效果如图:

4.第四步:接收功能程序

接收部分就使用中断会更好一些,因此,需要配置RX的中断:

配置代码:

TRISBbits.TRISB9 = 1;  //设置B9为输入  RPINR18bits.U1RXR = 41;  //设置B9为RX模式U1MODEbits.STSEL = 0;//一个停止位U1MODEbits.PDSEL = 0; // 8数据位 无奇偶校验U1MODEbits.ABAUD = 0; // 禁止波特率测量或测量已完成U1MODEbits.BRGH = 0; // BRG 在每个位周期内产生 16 个时钟信号 ( 16 倍频波特率时钟,标准模式)U1BRG = BRGVAL;//80MHz波特率9600(按照计算公式)U1STAbits.URXISEL = 0b00;//当接收到一个字符且该字符从 UxRSR 传输给接收缓冲区,//使接收缓冲区有一个或多个字符时,中断标志位置 1。U1STAbits.ADDEN = 1;IEC0bits.U1RXIE = 1;//使能接收中断IPC2bits.U1RXIP = 0b100;   //接收中断优先级设置为4U1MODEbits.UARTEN = 1;//使能UART
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)//接收中断
{uint8_t data = 0;IFS0bits.U1RXIF = 0;data = U1RXREG;if(data == 0xff){PORTBbits.RB4 = 0;  //点亮LED}else{PORTBbits.RB4 = 1;  //熄灭LED}
}

上面接收部分的功能就是电脑发送 ff ,则点亮LED1,发送其他数据则熄灭LED1,效果如下:

如上所示:当发送 ff 时,丝印编号为D1的LED点亮,发送其他时,D1熄灭(可能由于GIF转换的原因有些模糊)。

当然,也可以做一个更有趣的实验,既然用电脑的串口软件可以控制了,那么用手机蓝牙自然也是可以控制的,因为手机自带蓝牙,因此就不需要哪个USB转TTL以及蓝牙主机了,之间下载一个蓝牙app即可,我下载了一个蓝牙串口app,可以自定义按键发送的内容,那么就可以近距离无线控制我的板子上的led灯了,效果:

【dsPIC33】UART收发数据相关推荐

  1. Keil实例仿真AT89C51串口UART收发数据(附程序)

    目录 一.引言 二.所用软件 1.串口调试工具 2.虚拟串口软件 3.Keil μVision5 三.软件设置 1.串口调试助手软件设置 2.虚拟串口软件设置 3.Keil C51设置 A.调试(.i ...

  2. AC695X_独立3路串口UART收发数据配置

    SDK:AC695N_soundbox_sdk_release_3.1.0 AC695X目前这个SDK是最新的,普通音响的软件包. 其实AC608_AC696X_也可以类似配置,也可以3路串口独立收发 ...

  3. MTK:UART串口收发数据

    MTK之UART串口收发数据 转:https://blog.csdn.net/ivy_reny/article/details/51192110 寄存器 UARTn_RBR: Rx Buffer Re ...

  4. c8051f020C语言程序,C8051F020编程UART串口收发数据

    C8051F020编程UART串口收发数据 我编了一个 老是编译不过去 求高手改正 我用的是UART0端口 方式2 程序如下 //>>UART0串口编程--向PC发送和接受字符串<& ...

  5. STM8S UART串口使用中断收发数据

    STM8S UART串口使用中断收发数据 原来调过STM8L的串口,逻辑简单,中断清晰,换成STM8S105K4后,虽然也是用STD库, 除去函数名.宏名等语言层面的差异以外,中断处理方面也有些不一样 ...

  6. can总线配置读入是什么意思_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

  7. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  8. NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据

    NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据 一.JN-AN-1189 介绍 二.导入工程 三.修改工程 1.典型 ...

  9. dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

最新文章

  1. Nat Commun:宏基因组学提示曙古菌门的代谢和进化(中大李文均组)
  2. Vue 实现的音乐项目 music app 知识点总结分享
  3. [SimpleOJ238]宝藏探寻
  4. 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
  5. php分享三十三:用php中的register_shutdown_function和fastcgi_finish_request
  6. php图形图像,php图形图像处理
  7. OpenCASCADE可视化:3D演示之3D视图设施
  8. java添加文字水印插件_java之io添加文字水印
  9. HTML里Dom onload和jQuery document ready这两个事件的区别
  10. Springboot整合ActiveMQ发送邮件
  11. idea 使用 Gradle 构建过程中控制台中文显示乱码解决
  12. 绿坝现漏洞政府天价难护航
  13. Java批量下载有道单词发音+与Anki卡片整合
  14. 华为交换机配置syslog发送_华为交换机的 syslog功能
  15. Python基础(3)——北京市地铁买票问题(思维练习题)
  16. 监控格式化了还能恢复吗?
  17. python 需要在什么环境下运行_运行Python需要什么环境?也需要虚拟机吗?
  18. 大漠Android模拟器中控,最新如意大漠多线程中控模板,适用于手游模拟器脚本...
  19. 学生DW静态网页设计我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品
  20. k30pro杀进程严重怎么解决_狗狗总是不吃饭,严重挑食怎么办?学会这三招,快速解决不吃饭...

热门文章

  1. 计算机《展示设计》教案,新颖的电脑教案
  2. 快速了解Maven核心概念和工程实践
  3. Oracle 中关于差异增量备份与累积增量备份原理与区别
  4. 人体的99个秘密,男女生都该看,绝对受益终生 !!!
  5. 【转】【互联网颠覆传统行业的巿场如何才能做好?】互联网执行力的生动实践:一款软硬结合产品“迭代”诞生的创业者手记...
  6. 计算机组成原理|定点数和浮点数的运算
  7. 爱因斯坦在63岁时说
  8. 大屏自适应方案之scale
  9. sqlmap的基本命令使用
  10. 绿色高效办公,华为云桌面不可或缺