stm32L100串口空闲中断开启

回复

问题困惑bme_bright 回复了问题 • 1 人关注 • 2 个回复 • 1664 次浏览 • 2015-04-01 13:23 • 来自相关话题

cube生成的工程文件中有错误提示,但编译能通过,这有问题吗?

问题困惑admin 回复了问题 • 2 人关注 • 1 个回复 • 1100 次浏览 • 2015-03-30 19:53 • 来自相关话题

RE:stm32cubemx 生成的STM32F051K8代码在MDK下无法软件debug

问题困惑admin 回复了问题 • 2 人关注 • 4 个回复 • 3297 次浏览 • 2015-03-28 19:11 • 来自相关话题

使用stm32cube生成的 usb MSC程序需要修改哪些文件

回复

问题困惑mantishell 发起了问题 • 2 人关注 • 0 个回复 • 1756 次浏览 • 2015-03-28 09:16 • 来自相关话题

STM32的I2C可以接SCCB吗?

回复

问题困惑seuliang 回复了问题 • 1 人关注 • 1 个回复 • 1609 次浏览 • 2015-03-28 09:08 • 来自相关话题

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

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

STM32F207 CUBE 串口 DMA变长接收小结

经验分享自由泳 发表了文章 • 12 个评论 • 4482 次浏览 • 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 个回复 • 2119 次浏览 • 2015-03-24 22:53 • 来自相关话题

uart_dma数据传输问题

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

关于UART中断接收函数HAL_UART_Receive_IT

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

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

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

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

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

回复

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

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

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

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

经验分享admin 发表了文章 • 1 个评论 • 2382 次浏览 • 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 个回复 • 1207 次浏览 • 2015-03-20 12:31 • 来自相关话题