nrf52832 Uart 调试
概述:
UARTE 是带有 EasyDMA 的通用异步接收器/发送器 UART。提供快速、全双工、异步的串口通信,内置流量控制(CTS,RTS)支持硬件,速率高达 1 Mbps。
官方Demo使用
SDK版本: nRF5_SDK17
example: nRF5_SDK_17.0.2_d674dde\examples\peripheral\uart
运行Demo 是很OK的
uint32_t err_code;bsp_board_init(BSP_INIT_LEDS);const app_uart_comm_params_t comm_params ={RX_PIN_NUMBER,TX_PIN_NUMBER,RTS_PIN_NUMBER,CTS_PIN_NUMBER,UART_HWFC,false,
#if defined (UART_PRESENT)NRF_UART_BAUDRATE_115200
#elseNRF_UARTE_BAUDRATE_115200
#endif};APP_UART_FIFO_INIT(&comm_params,UART_RX_BUF_SIZE,UART_TX_BUF_SIZE,uart_error_handle,APP_IRQ_PRIORITY_LOWEST,err_code);APP_ERROR_CHECK(err_code);#ifndef ENABLE_LOOPBACK_TESTprintf("\r\nUART example started.\r\n");
但是如果,要多打印一些东西了,发现只能打印前面一部分数据;,比如这样的:
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
注: Board_UARTPutSTR是基于app_uart_put实现的,如下:
void Board_UARTPutSTR(char *str)
{int len = 0; int i = 0;len = strlen(str);while(i<len){app_uart_put(str[i++]);}
}
为什么只能打印前面一个部分呢?
因为FIFO, Noric的Uart的lib 帮我们实现了fifo,待发送数据是先存放在fifo中,然后进行发送。
由于CPU存放的速度远远大于Uart Tx速度,所以,会很容易造成FIFO溢出,所以后面的数据被覆盖,出现乱码;
查看app_uart_put的源码,很容易理解
uint32_t app_uart_put(uint8_t byte)
{
uint32_t err_code;
err_code = app_fifo_put(&m_tx_fifo, byte); //先将数据存放到fifo中
if (err_code == NRF_SUCCESS)
{
// The new byte has been added to FIFO. It will be picked up from there
// (in 'uart_event_handler') when all preceding bytes are transmitted.
// But if UART is not transmitting anything at the moment, we must start
// a new transmission here.
if (!nrf_drv_uart_tx_in_progress(&app_uart_inst)) //如果tx 空闲,启动发送
{
// This operation should be almost always successful, since we've
// just added a byte to FIFO, but if some bigger delay occurred
// (some heavy interrupt handler routine has been executed) since
// that time, FIFO might be empty already.
if (app_fifo_get(&m_tx_fifo, tx_buffer) == NRF_SUCCESS)
{
err_code = nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1);
}
}
//else 如果tx 工作中,不用管,uart lib会一直将tx fifo中的数据发送,直到为空;
}
return err_code;
}
fifo 引入本意是减少tx 外设占用过长时间,提供CPU效率;
有的时候,需要输出大量数据,比如,使用串口进行交互,比较容易造成溢出;解决方法,同步一下uart 的发送和fifo 的写入问题,解决方法继续往下看。。。
同步方法:
方法一:
增加UART_TX_BUF_SIZE 大小,即增加TX FIFO大小,就没有那么容易溢出了;不过缺点很明显,消耗更多ram资源,依旧存在溢出风险
方法二:
在需要连续打印的地方增加延时,比如:
Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
delay(5);Board_UARTPutSTR("-------------------------------start-------------------------------------\n");Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
delay(5);Board_UARTPutSTR("-------------------------------start-------------------------------------\n");Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
delay(5);Board_UARTPutSTR("-------------------------------start-------------------------------------\n");Board_UARTPutSTR("-------------------------------start-------------------------------------\n");
确定同样十分明显
方法三:
在发送string之前,先检查tx FIFO是否为空,等空闲之后,在发送string,改造如下:
1 在app_uart_fifo.c 增加一个函数获取fifo 的tx是否空闲,如下
bool get_app_uart_tx_in_progress()
{
return nrf_drv_uart_tx_in_progress(&app_uart_inst) ;
}
2 将Board_UARTPutSTR 改造如下:
/* Outputs a string on the debug UART */
void Board_UARTPutSTR(char *str)
{
int len = 0;
int i = 0;
len = strlen(str);
while( get_app_uart_tx_in_progress()); //增加uart tx fifo 是否空闲判断
#if defined(DEBUG_UART)
while(i<len)
{
app_uart_put(str[i++]);
}
#endif
}
综上:
方法3 比较好的解决了,UART FIFO 溢出问题
nrf52832 Uart 调试相关推荐
- WK2204 - spi转uart调试记录
WK2204 - spi转uart调试记录 硬件 芯片简介 电路设计 驱动 添加设备树 添加驱动 调试 查看启动加载 检查串口通信 数据乱码或丢失 RS485只能收不能发 系统中断响应异常 思考 硬件 ...
- STM32F105RBT6 uart调试
uart初始化: void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef U ...
- UART配置调试指南
UART配置(硬件描述) 1.根据原理图,查找相关的i2c引脚对应的GPIO值,以GPIO16作为UART1_TX,GPIO17作为UART1_RX为例. 2.查找GPIO16与GPIO17对应的BL ...
- HiKey软硬件开发环境及其调试
HiKey是一款搭载华为海思麒麟620芯片,符合Linaro 96Boards标准的SBC开发板.它采用8核64位Cortex-A53处理器,主频高达1.2GHz. HiKey作为AOSP支持的一款产 ...
- 物联网硬件安全分析基础-串口调试
前言 上节介绍了关于通过编程器直接读取芯片获取固件用来静态分析的一点思路,本篇将介绍通过UART串口来直接与机器交互,通过串口输出输入信息,做动态调试. 通用异步收发传输器(Universal Asy ...
- 【瑞萨RA_FSP】UART 编程实战
文章目录 一.UART收发回显 二.UART指令控制RGB灯 三.基于环形队列的UART收发回显 一.UART收发回显 UART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留UART ...
- 高通QM215 高速串口调试总结
高通QM215 高速串口调试总结 参考文档 硬件和复用情况确认 修改如下 串口调试 测试程序代码: 将串口设置为高速串口,AP端收到的数据一直为0XFD 参考文档 1.sp80-pk881-6_a_q ...
- 如何提取D-Link解密密钥
如何提取D-Link解密密钥 当我们在分析固件镜像时,遇到的最常见障碍之一便是加密.虽然已经有一些方法可用于解密固件镜像,但今天我们仍将简要介绍一下,如何提取D-Link部分路由器型号中的加密密钥,特 ...
- NetGear 夜鹰 RAX40V2 设备与固件分析
前言 NetGear 厂商的路由器设备中,拆解开经常会带有UART 调试串口,并且以往的NetGear 设备UART调试口往往只需要正确的检测出UART引脚的类型,设置波特率为115200,然后直接用 ...
最新文章
- 机器学习-Sklearn
- Java传输对象模式
- python开发一个区块链只需40多行
- 造轮子是什么意思_程序员发文质疑阿里天启为kpi项目,重复造轮子,阿里回应:诽谤...
- 女生长胖是一种什么样的体验?
- 应用Canary文件类型阻击勒索软件
- Android项目实战(二):安卓应用程序退出的三种方法
- 《流畅的Python》读书笔记——Python序列的修改、散列和切片
- 计算机无法安装蓝牙驱动,win10蓝牙驱动装不了怎么办_win10电脑蓝牙驱动无法安装处理方法-win7之家...
- html中如何淡化背景图片,如何去除图片背景?
- 计算机拼音排序怎么操作,Excel如何按笔画和拼音进行排序,并且以下数字也会随之改变...
- shell技巧4 - nm命令解决AppStore2.5.2被拒问题
- SQL数据库不用SQL语句能显示全表的内容_MySQL DBA必读:万字归总表设计与SQL编写技巧...
- 详谈PCB电路板结构系列之PCB材料组成笔记
- VUE三目运算使用 :style与:class
- MuleSoft知识总结-13.Mule组件(Set Variable,For Each,Choice)
- Python的布尔类型和True/False的各种形式
- 密码学1: 对称加密体系
- win10装系统时分区报错解决方法 无法找到新的分区也找不到现有分区
- python爬虫报错:不信任证书问题的解决
热门文章
- Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
- 跳槽穷半年,转行穷三年,死守会穷一辈子
- css实现背景动态效果图
- STM32串口屏应用
- 三体计算机原理,“三体”你必须知道的4个理论
- Java百宝箱——实现ip地址、手机号、身份证号归属地查询
- R语言 霍尔特指数平滑法(Holt)
- 软件工程复习笔记 类图
- 基于vue3的移动端音乐播放器
- 数字化改革“1612”详解