打印
[STM32F1]

STM32F103ZET6 HAL库使用串口1DMA空闲中断接收数据时CNDTR寄存器问题,该如何解决?

[复制链接]
1465|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2023-10-23 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103ZET6开发过程中,用到HAL库中的串口1DMA空闲中断处理数据时发现:
当接收数据长度超过16字节后,(__HAL_DMA_GET_COUNTER(&huart1.hdmarx))也就是串口1的CNDTR寄存器会首先减16,然后恢复到给定长度,再次进入中断减去剩余长度(又或当长度超过16字节后空闲中断再次进入) 例如限定接收数据长度为0xFFF,当接收数据超过0x0F(例0x12)后,CNDTR寄存器会首先变为0xFF0,然后回到0xFFF,再变为0xFFE。
程序波特率115200,数据位8,停止位1。如何解决呢?
以下是部分代码块
#define UART_RX_LEN 4096uint8_t UART_RX_BUF[UART_RX_LEN];__IO uint16_t UART_RX_STA = 0;/************串口中断代码***********/void USART1_IRQHandler(void){  if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)  // 空闲中断标记被置位  {      __HAL_UART_CLEAR_IDLEFLAG(&huart1);  // 清除中断标记      HAL_UART_DMAStop(&huart1);           // 停止DMA接收      UART_RX_STA = UART_RX_LEN - huart1.hdmarx->Instance->CNDTR;  // 总数据量减去未接收到的数据量为已经接收到的数据量      UART_RX_STA |= 0X8000;         // 标记接收结束      HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);  // 重新启动DMA接收      __HAL_UART_ENABLE_IT((&huart1), UART_IT_IDLE);    //重新开启串口接收帧中断  }}int main(void){  HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_DMA_Init();  MX_USART1_UART_Init();  HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);  // 启动DMA接收  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);              // 使能空闲中断  while (1)  {      if(UART_RX_STA & 0X8000)    {      /**********接收数据处理代码*****************/      UART_RX_STA = 0;  // 清除标记      UART_RX_FLAG=0;    }  }}

使用特权

评论回复
沙发
jcky001| | 2023-11-16 11:19 | 只看该作者
检查DMA控制器的配置

使用特权

评论回复
板凳
cr315| | 2023-11-16 11:20 | 只看该作者
检查一下程序代码是否有错误

使用特权

评论回复
地板
elephant00| | 2023-11-16 11:20 | 只看该作者
在接收数据时,请确保DMA传输正常进行,没有发生任何错误。

使用特权

评论回复
5
未说出口的像你| | 2023-11-19 14:28 | 只看该作者
可能是你DMA设计的触发有问题

使用特权

评论回复
6
温室雏菊| | 2023-11-19 17:00 | 只看该作者
这个你可以一个字节就触发DMA的吧

使用特权

评论回复
7
她已醉| | 2023-11-19 19:00 | 只看该作者
一般可以这么做,就是做个缓冲,接受到一定量数据之后,再触发DMA试试

使用特权

评论回复
8
将爱藏于深海| | 2023-11-19 21:00 | 只看该作者
还是配置DMA部分不太对吧,可能是数据太少就触发了

使用特权

评论回复
9
我吃小朋友| | 2023-11-19 23:00 | 只看该作者
你试试用cubemx来配置呢?也许DMA这部分就好弄了

使用特权

评论回复
10
失物招領| | 2023-11-20 03:00 | 只看该作者
要不你先发16个空数据试试?

使用特权

评论回复
11
故意相遇| | 2023-11-20 05:00 | 只看该作者
这种问题我还没遇到过,不过一般看你描述应该就是在DMA的配置上了

使用特权

评论回复
12
西洲| | 2023-11-20 07:00 | 只看该作者
建议直接先看看其他关于F103芯片的DMA应用的例程,看看

使用特权

评论回复
13
捧一束彼岸花| | 2023-11-20 09:00 | 只看该作者
是不是DMA得长度设计的不合理

使用特权

评论回复
14
一只眠羊| | 2023-11-20 14:00 | 只看该作者
你每次发送多少数据啊?利用DMA来说

使用特权

评论回复
15
周半梅| | 2024-8-11 08:03 | 只看该作者

整流器或功率开关管与每个电容端的连线长度和宽度都要一样

使用特权

评论回复
16
Pulitzer| | 2024-8-11 09:06 | 只看该作者

不要根据不同的参数类型走不同的代码逻辑

使用特权

评论回复
17
童雨竹| | 2024-8-11 11:02 | 只看该作者

其他的信号和地要与这些高压引线和它的散热部分隔开

使用特权

评论回复
18
Wordsworth| | 2024-8-11 12:05 | 只看该作者

对于没有else的场景,使用ifPresent即可

使用特权

评论回复
19
Clyde011| | 2024-8-11 13:08 | 只看该作者

每个Strategy交由Spring管理,并在构造后注册

使用特权

评论回复
20
公羊子丹| | 2024-8-11 14:01 | 只看该作者

变压器隔离拓扑中,变压器有多少个绕组

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2034

主题

7335

帖子

10

粉丝