你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBEMX UART中断问题

[复制链接]
stmcuman 提问时间:2016-5-9 14:54 /
STM32F405做的实验

首先我定义了3字节的数组
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t uart_receive[3]={0};    //看这里
uint8_t uart_transmit[3]={0};
uint16_t uart_len =3;
uint8_t  *uart_recv =(uint8_t  *)&uart_receive;
uint8_t  *uart_tran =(uint8_t  *)&uart_transmit;
/* USER CODE END PV */

然后再main()里面开接收中断
  MX_USART2_UART_Init();

  /* USER CODE BEGIN 2 */
    HAL_UART_Receive_IT(&huart2,uart_recv, uart_len);    //看这里

再然后中断里什么都没写
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);//清中断
HAL_UART_Receive_IT(&huart2,uart_recv, 1);//开中断
}


上位机随意发送3字节,进了3次中断
所以,STM32FCUBEMX的UART进中断
不是根据用户数组字节长度进中断,而是接一字节进一次中断
所以长数组接收的,或者较高波特率通讯的,最好不要在中断里做数据处理

收藏 1 评论11 发布时间:2016-5-9 14:54

举报

11个回答
stmcuman 回答时间:2016-5-9 16:00:57
本帖最后由 0721de 于 2016-5-9 16:22 编辑

当中断次数达到数组长度时,会关闭接收中断

所以HAL_UART_Receive_IT(&huart2,uart_recv, uart_len);
的意思是开uart2接收中断,完成uart_len次中断后,
在HAL_UART_IRQHandler(&huart2)里关闭中断

为什么HAL_UART_Receive_IT()的uart_len会影响中断次数呢?

因为 uart_len在HAL_UART_Receive_IT()中传递给了RxXferCount
中断里HAL_UART_IRQHandler()里面有UART_Receive_IT()
而UART_Receive_IT(huart)里面有RxXferCount自减
chenbourne 回答时间:2016-5-10 09:25:00
感谢分享 楼主 什么时候能发一个关于HAL_UART_Transmit()和HAL_UART_Receive()分析的帖子呢 我不是很明白这两个函数的意思 就不知道怎么用 希望楼主能写一个
Dylan疾风闪电 回答时间:2016-5-10 11:10:24
中断处理函数,还是不要做过多的操作。
建议仅执行:数据<->缓冲区,这样可以节省中断占用的时间。保证其他任务/主循环等函数的及时响应。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wenyangzeng 回答时间:2016-5-10 11:18:20

楼主:每次接收中断里uart_receive指针好像应该++?

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wtliu 回答时间:2016-5-10 12:19:53
在接收中断中要将所接收数据放入缓存,并将接收缓存指针下移。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

中山无雪 回答时间:2016-5-10 12:38:23
因为ST的MCU没有FIFO,所以操作UART、I2C等时还是使用DMA更好些

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

power568 回答时间:2016-5-10 14:44:08
      STM32F4的Usart接收数据如果不使用DMA的话肯定是中断一次接收一个字节,至于是否能在中断里面处理数据要具体情况具体分析...
      为什么HAL_UART_Receive_IT()的uart_len?应该是MxCube对串口接收进行了封装,对串口接收数据提供了几种接口,你可以找MxCube相关的文档看看...

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

Dylan疾风闪电 回答时间:2016-5-11 20:21:42
中山无雪 发表于 2016-5-10 12:38
因为ST的MCU没有FIFO,所以操作UART、I2C等时还是使用DMA更好些

非固定长度报文的 协议,DMA用起来还是比较不方便的。
比如modbus。
中山无雪 回答时间:2016-5-23 19:08:05
Dylan疾风闪电 发表于 2016-5-11 20:21
非固定长度报文的 协议,DMA用起来还是比较不方便的。
比如modbus。

ST提供了一份文档

介绍使用DMA超时方式接收不定长报文的方法,你可以找一下(我忘记文档号了),就在使用说明里面

主要方式就是使用DMA模拟了FIFO,解决了STM32没有FIFO的问题,当然了,虽然解决了问题,但是从开发者角度和系统性能而言还是不如FIFO,不知为何ST为何不为通讯提供FIFO,成本没多少的,唉!一个公司一个发展思路,既然图便宜了,那么就免不了在很多地方要凑合一下。
Dylan疾风闪电 回答时间:2016-5-24 09:49:04
中山无雪 发表于 2016-5-23 19:08
ST提供了一份文档

介绍使用DMA超时方式接收不定长报文的方法,你可以找一下(我忘记文档号了),就在使 ...

涨姿势了,下次去看看。
modu8888 回答时间:2016-8-17 14:29:39
学习了  刚好要用。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版