【dsPIC33】UART收发数据
前言
串口是一个非常重要的工具,用这个可以非常简单的收发一些数据,串口的操作还是比其他协议简单很多,因此在工控芯片上串口非常普遍。本节就详细记录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收发数据相关推荐
- Keil实例仿真AT89C51串口UART收发数据(附程序)
目录 一.引言 二.所用软件 1.串口调试工具 2.虚拟串口软件 3.Keil μVision5 三.软件设置 1.串口调试助手软件设置 2.虚拟串口软件设置 3.Keil C51设置 A.调试(.i ...
- AC695X_独立3路串口UART收发数据配置
SDK:AC695N_soundbox_sdk_release_3.1.0 AC695X目前这个SDK是最新的,普通音响的软件包. 其实AC608_AC696X_也可以类似配置,也可以3路串口独立收发 ...
- MTK:UART串口收发数据
MTK之UART串口收发数据 转:https://blog.csdn.net/ivy_reny/article/details/51192110 寄存器 UARTn_RBR: Rx Buffer Re ...
- c8051f020C语言程序,C8051F020编程UART串口收发数据
C8051F020编程UART串口收发数据 我编了一个 老是编译不过去 求高手改正 我用的是UART0端口 方式2 程序如下 //>>UART0串口编程--向PC发送和接受字符串<& ...
- STM8S UART串口使用中断收发数据
STM8S UART串口使用中断收发数据 原来调过STM8L的串口,逻辑简单,中断清晰,换成STM8S105K4后,虽然也是用STD库, 除去函数名.宏名等语言层面的差异以外,中断处理方面也有些不一样 ...
- can总线配置读入是什么意思_STM32学习笔记—CAN总线收发数据常见问题分析
CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...
- 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭
实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...
- NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据
NXP JN5169 JN-AN-1189-ZigBee-HA-Demo 使用UART0打印调试信息,UART1和其他设备收发数据 一.JN-AN-1189 介绍 二.导入工程 三.修改工程 1.典型 ...
- dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析
CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...
最新文章
- Nat Commun:宏基因组学提示曙古菌门的代谢和进化(中大李文均组)
- Vue 实现的音乐项目 music app 知识点总结分享
- [SimpleOJ238]宝藏探寻
- 【转】Win7+Ubuntu12.04.1硬盘安装错误及解决方案----不错
- php分享三十三:用php中的register_shutdown_function和fastcgi_finish_request
- php图形图像,php图形图像处理
- OpenCASCADE可视化:3D演示之3D视图设施
- java添加文字水印插件_java之io添加文字水印
- HTML里Dom onload和jQuery document ready这两个事件的区别
- Springboot整合ActiveMQ发送邮件
- idea 使用 Gradle 构建过程中控制台中文显示乱码解决
- 绿坝现漏洞政府天价难护航
- Java批量下载有道单词发音+与Anki卡片整合
- 华为交换机配置syslog发送_华为交换机的 syslog功能
- Python基础(3)——北京市地铁买票问题(思维练习题)
- 监控格式化了还能恢复吗?
- python 需要在什么环境下运行_运行Python需要什么环境?也需要虚拟机吗?
- 大漠Android模拟器中控,最新如意大漠多线程中控模板,适用于手游模拟器脚本...
- 学生DW静态网页设计我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品
- k30pro杀进程严重怎么解决_狗狗总是不吃饭,严重挑食怎么办?学会这三招,快速解决不吃饭...