搜索
bottom↓
回复: 12

采用STM32cubeMX配置串口接收中断的方法

[复制链接]

出0入0汤圆

发表于 2015-1-7 10:03:03 | 显示全部楼层 |阅读模式
STM32cubeMX推出一久了,而且现在除了F1以外基本上都有了。这段时间乘有点时间,来试试这个工具。
硬件资源:采用STM32F0的探索套件
实验目的:
1、完成串口发送8个数据功能,配置串口为接收中断,当串口接收到指定数目的数据时,产生中断,中断函数将接收的数据发送出来
2、本实验具有按键(PA0)中断功能,当按下按键,串口发送数据。
具体配置:
1、选择管脚,PA0用于按键,点击该引脚选择输入。
             PC8,PC9用于LED灯。点击该引脚选择输出。
             PA9,PA10用于串口1,串口模式选择Asynchronous。(但选择并配置了串口,这两个引脚自动就变绿了)


2、串口配置:(这个类似于我们以前编程时的串口初始化部分,包括波特率、数据位、停止位等)

这里需要注意的是:波特率最小都是115200,想设置9600,那只能最后在程序中改了。
3、串口中断配置:

4、完了以后就可以生成IAR或KEIL程序了,这一步大家都知道了,就不截图说明了。
以下是我的测试程序。
程序说明:
1、首先定义发送接收数组
uint8_t TxData[8]= {0x55,0x65,0x01,0x02,0x03,0x04,0x05,0x06};
uint8_t RxData[8];
2、如果是轮询方式发送数据,采用HAL_UART_Transmit(&huart1, TxData,8,10);  
如果是中断方式接收数据,采用HAL_UART_Receive_IT(&huart1, RxData,8);  
while (1)
  {
           HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
           HAL_Delay(1000);
           //HAL_UART_Transmit(&huart1, TxData,8,10);  /* 通过串口1发送数组TxData的8个数据 */
           HAL_UART_Receive_IT(&huart1, RxData,8);     /* 采用中断方式接收8个数据 */
  }
3、串口接收中断服务程序:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
         HAL_UART_Transmit(&huart1, RxData,8,10);
}
4、按键中断服务程序:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
      HAL_UART_Transmit(&huart1, RxData,8,10);
  }
}
使用总结、疑问及需要注意的地方:
1、串口中断配置只是具有串口全局中断,如何配置接收中断或发送中断,或空闲中断?(这点等待高手帮忙)
2、HAL_UART_Receive_IT(&huart1, RxData,8);   如果放置在while循环中,那么就可以连续进行接收中断,RxData的值就会根据接收的数据发生变化,如果放在while外面,那么只进行一次接收中断。
3、针对第2点,那么如果要一直进行中断配置,就要在主程序的while中调用,如果只是进行一次,那么就在需要的时候调用。
4、由于不能配置中断类型,所以如果把中断服务函数HAL_UART_Transmit(&huart1, RxData,8,10);放在void USART1_IRQHandler(void)里面就只能收到第一个数据,其他是0。比如串口调试助手发送0x55,0x65,0x01,0x02,0x03,0x04,0x05,0x06,那么中断中发送出来的数据就是0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-7 14:48:28 | 显示全部楼层
关注学习下,还没玩过这个

出0入0汤圆

发表于 2015-1-8 08:45:29 | 显示全部楼层
这个软件真心不好用

出0入0汤圆

 楼主| 发表于 2015-1-8 08:59:23 | 显示全部楼层
xyz2008 发表于 2015-1-8 08:45
这个软件真心不好用

你觉得哪里不好用呢?一起交流下

出0入0汤圆

发表于 2015-1-11 18:07:00 | 显示全部楼层
我的总是进入错误服务函数,想请教一下为什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-1-11 23:35:14 | 显示全部楼层
还没用过STM32 的 cube ,学习一下

出0入42汤圆

发表于 2015-1-27 15:51:34 | 显示全部楼层
so,关于接收的问题,接收到指定个数就中断,如果不知道对方发多少个数,没法指定接收个数,那该怎么办,为此我把它的接收函数改了,改了个乱七八糟,才实现了接收超时后就认为接收完成....但是后来一想,既然把它这东西改了个乱七八糟,还有啥必要再用它这个东西

出0入0汤圆

发表于 2015-2-11 15:00:53 | 显示全部楼层
着手接触!学习中

出0入0汤圆

发表于 2016-6-21 11:22:30 | 显示全部楼层
在使用HAL_UART_Receive_IT(&huart1, RxData,8)函数后,接收到数据进入中断处理
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{
   uint32_t isrflags   = READ_REG(huart->Instance->SR);
保存SR寄存器之前RXNE已经被清零,后面对RXNE的判断实际上是已经清零后的数据
   /* UART in mode Receiver -------------------------------------------------*/
    if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
    {
      UART_Receive_IT(huart);
      return;
    }

所以根本不会进入     UART_Receive_IT(huart);也就谈不上接受到数据。
不知道怎么回事。

出0入0汤圆

发表于 2017-11-26 21:16:12 | 显示全部楼层
不错不错啊

出0入0汤圆

发表于 2018-5-22 21:00:59 | 显示全部楼层
现在准备试下,据说还蛮好用的;

出0入0汤圆

发表于 2018-5-22 22:03:19 来自手机 | 显示全部楼层
这个不错,赞一下

出0入0汤圆

发表于 2019-2-24 16:14:24 | 显示全部楼层
自从强制使用cubemx和hal,使用stm32更浪费时间了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 06:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表