stm32f205VET6 的USB VCP(虚拟串口)发几个数就停止了

问题困惑admin 回复了问题 • 3 人关注 • 1 个回复 • 956 次浏览 • 2015-03-26 12:40 • 来自相关话题

STM32F207 CUBE 串口 DMA变长接收小结

经验分享自由泳 发表了文章 • 12 个评论 • 4635 次浏览 • 2015-03-25 07:54 • 来自相关话题

感谢【叫兽】担/xin的耐心指导,把我的做法发来请大家指正:
DMA变长接收,采取串口接受中断和空闲中断结合的办法。接手前先开串口接收中断、关空闲中断
一、当收到第一个字符时,关接收中断、开空闲中断,调用HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);开始接收。
二、当串口没有数据接收时,进入空闲中断,此时调用HAL_DMA_Abort(&hdma_usart3_rx);停掉DMA接收,读取接收的内容;
三、读取完接收内容后,再打开接收中断、关闭空闲中断,再次调用HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);开始接收,如此往复。

注意:cubemx中设置DMA接收为Normal,开DMA全局中断和串口全局中断

核心代码如下:


void USART3_IRQHandler(void)
{
/[i] USER CODE BEGIN USART3_IRQn 0 [/i]/

#if 1
uint32_t tmp1 = 0, tmp2 = 0,i,rx_len;

/[i] UART RXNE interrupt occurred ------------------------------------[/i]/
tmp1 = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE);
tmp2 = __HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_RXNE);
if((tmp1 != RESET) && (tmp2 != RESET))
{

HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);

__HAL_UART_DISABLE_IT(&huart3, UART_IT_RXNE);//close rx int
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//open idel int
}

/[i] UAR TIDLE interrupt occurred -------------------------------------[/i]/
tmp1 = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE);
tmp2 = __HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_IDLE);
if((tmp1 != RESET) && (tmp2 != RESET))
{
HAL_DMA_Abort(&hdma_usart3_rx);

rx_len = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);

if(rx_len < UART_RX_MAXLEN)
{
printf("\r\nUart3 DMA recv len = %d",UART_RX_MAXLEN-rx_len);

for(i=0;i<UART_RX_MAXLEN-rx_len;i++)
{
if(i == 0) printf("\r\n");

printf(" %3x",uart3_RX_data[i]);
}
}

HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);//open rx int
__HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);//close idel int

}

#endif


/[i] USER CODE END USART3_IRQn 0 [/i]/
HAL_UART_IRQHandler(&huart3);
/[i] USER CODE BEGIN USART3_IRQn 1 [/i]/

/[i] USER CODE END USART3_IRQn 1 [/i]/
}


经简单测试,不知道是否有隐含问题,请指点!
再次感谢叫兽】担/xin的耐心指导!!!

总觉得这种方法没有 DMA循环接收好,哪位大侠指点一下循环方式! 查看全部
感谢【叫兽】担/xin的耐心指导,把我的做法发来请大家指正:
DMA变长接收,采取串口接受中断和空闲中断结合的办法。接手前先开串口接收中断、关空闲中断
一、当收到第一个字符时,关接收中断、开空闲中断,调用HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);开始接收。
二、当串口没有数据接收时,进入空闲中断,此时调用HAL_DMA_Abort(&hdma_usart3_rx);停掉DMA接收,读取接收的内容;
三、读取完接收内容后,再打开接收中断、关闭空闲中断,再次调用HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);开始接收,如此往复。

注意:cubemx中设置DMA接收为Normal,开DMA全局中断和串口全局中断

核心代码如下:


void USART3_IRQHandler(void)
{
/[i] USER CODE BEGIN USART3_IRQn 0 [/i]/

#if 1
uint32_t tmp1 = 0, tmp2 = 0,i,rx_len;

/[i] UART RXNE interrupt occurred ------------------------------------[/i]/
tmp1 = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE);
tmp2 = __HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_RXNE);
if((tmp1 != RESET) && (tmp2 != RESET))
{

HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);

__HAL_UART_DISABLE_IT(&huart3, UART_IT_RXNE);//close rx int
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//open idel int
}

/[i] UAR TIDLE interrupt occurred -------------------------------------[/i]/
tmp1 = __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE);
tmp2 = __HAL_UART_GET_IT_SOURCE(&huart3, UART_IT_IDLE);
if((tmp1 != RESET) && (tmp2 != RESET))
{
HAL_DMA_Abort(&hdma_usart3_rx);

rx_len = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);

if(rx_len < UART_RX_MAXLEN)
{
printf("\r\nUart3 DMA recv len = %d",UART_RX_MAXLEN-rx_len);

for(i=0;i<UART_RX_MAXLEN-rx_len;i++)
{
if(i == 0) printf("\r\n");

printf(" %3x",uart3_RX_data[i]);
}
}

HAL_UART_Receive_DMA(&huart3, uart3_RX_data, UART_RX_MAXLEN);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);//open rx int
__HAL_UART_DISABLE_IT(&huart3, UART_IT_IDLE);//close idel int

}

#endif


/[i] USER CODE END USART3_IRQn 0 [/i]/
HAL_UART_IRQHandler(&huart3);
/[i] USER CODE BEGIN USART3_IRQn 1 [/i]/

/[i] USER CODE END USART3_IRQn 1 [/i]/
}


经简单测试,不知道是否有隐含问题,请指点!
再次感谢叫兽】担/xin的耐心指导!!!

总觉得这种方法没有 DMA循环接收好,哪位大侠指点一下循环方式!

stm32L100读取eeprom问题

问题困惑bme_bright 回复了问题 • 3 人关注 • 6 个回复 • 2239 次浏览 • 2015-03-24 22:53 • 来自相关话题

uart_dma数据传输问题

问题困惑bme_bright 回复了问题 • 4 人关注 • 4 个回复 • 1936 次浏览 • 2015-03-24 10:49 • 来自相关话题

关于UART中断接收函数HAL_UART_Receive_IT

问题困惑木风 发表了文章 • 3 个评论 • 3299 次浏览 • 2015-03-24 00:50 • 来自相关话题

为什么配置完uart后打开uart中断接收中断接收不到数据,只有先使用阻塞或者中断方式发送数据后才能收到数据呢,有没有遇到这个问题的?
为什么配置完uart后打开uart中断接收中断接收不到数据,只有先使用阻塞或者中断方式发送数据后才能收到数据呢,有没有遇到这个问题的?

SPI 断电在上电无法正常工作??!求解啊~~

问题困惑那时花开 回复了问题 • 2 人关注 • 3 个回复 • 1077 次浏览 • 2015-03-23 19:00 • 来自相关话题

(转)再讨论延时方法! 不占用定时器(包括SysTick)实现精确延时又一方法

回复

经验分享admin 回复了问题 • 5 人关注 • 1 个回复 • 2514 次浏览 • 2015-03-23 17:19 • 来自相关话题

cubeMX F103生成的工程经常少文件

问题困惑admin 回复了问题 • 3 人关注 • 1 个回复 • 1593 次浏览 • 2015-03-23 17:16 • 来自相关话题

(转)STM32中使用systick的方式不使用中断,来精确延时

经验分享admin 发表了文章 • 1 个评论 • 2476 次浏览 • 2015-03-23 17:00 • 来自相关话题

很多人都是使用for循环(for(i=n; i>0; i--);)来实现的,这样的操作的确也太不准了
很多时候在延时要求不是很严格的情况下,使用定时器又麻烦.
采用systick,没有使用中断,直接使用寄存器操作的,复制可用,非常的方便,也无需多余的配置。










希望帮到大家。把这两个函数直接复制过去,直接可用(我说的不清楚,我设置的系统时钟是72M,程序注释也有)。很多人对我的程序有质疑,说应该是9*nTime,说时钟是9M,还有就是说关闭定时器应该赋值给00,而不是04,欢迎拿示波器对质。

本文相关程序包以上传至本站专用网盘,请前去下载
文件名:LED(Systick(非中断方式)精确定时闪烁).zip


以上内容来自:http://www.stmcu.org/module/fo ... .html 查看全部
很多人都是使用for循环(for(i=n; i>0; i--);)来实现的,这样的操作的确也太不准了
很多时候在延时要求不是很严格的情况下,使用定时器又麻烦.
采用systick,没有使用中断,直接使用寄存器操作的,复制可用,非常的方便,也无需多余的配置。

125915fssq4c4rzslr5rlp.jpg


100822vxofsrmx0s5gxt6x.jpg

希望帮到大家。把这两个函数直接复制过去,直接可用(我说的不清楚,我设置的系统时钟是72M,程序注释也有)。很多人对我的程序有质疑,说应该是9*nTime,说时钟是9M,还有就是说关闭定时器应该赋值给00,而不是04,欢迎拿示波器对质。

本文相关程序包以上传至本站专用网盘,请前去下载
文件名:LED(Systick(非中断方式)精确定时闪烁).zip


以上内容来自:http://www.stmcu.org/module/fo ... .html

TIM11_PWM应用

问题困惑bme_bright 回复了问题 • 2 人关注 • 3 个回复 • 1251 次浏览 • 2015-03-20 12:31 • 来自相关话题

DCMI如何使用

问题困惑admin 回复了问题 • 2 人关注 • 1 个回复 • 2302 次浏览 • 2015-03-16 16:37 • 来自相关话题

求:STM32CubeMX函数库的中文注解

问题困惑Xujf 回复了问题 • 5 人关注 • 4 个回复 • 1925 次浏览 • 2015-03-14 10:26 • 来自相关话题

垃圾堆里又找到一个LCM板,型号YXD-1602G02,有木有人用的?呵呵

回复

问题困惑admin 回复了问题 • 2 人关注 • 3 个回复 • 2866 次浏览 • 2015-03-12 20:06 • 来自相关话题

HAL库的中断函数到底在哪里?

问题困惑seuliang 回复了问题 • 5 人关注 • 2 个回复 • 11798 次浏览 • 2015-03-12 09:56 • 来自相关话题

不要告诉我只有我一个遇到这种奇葩问题

问题困惑admin 回复了问题 • 1 人关注 • 1 个回复 • 1211 次浏览 • 2015-03-11 18:43 • 来自相关话题