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

【经验分享】STM32CubeMX— 配置串口1 接收中断

[复制链接]
STMCU小助手 发布时间:2022-5-15 16:41
实验操作
1、打开cubemax ,芯片选取。
选取STM32F103RCt6 (根据实际情况选择),LQFP64封装的。然后鼠标双击中间那个圈住的地方就可以进入配置界面。

20201021113415189.png 图1、芯片选取界面


20201021114212900.png

图2、配置界面

如上图:

            (1)、标号1 为系统核心的配置,其中由晶振的配置。

            (2)、标号2为模拟量相关的外设配置,如adc,dac,等。

            (3)、标号3为定时器配置。

            (4)、标号4为通信相关的外设。比如串口,CAN等。

其他图中有标注。

2、晶振配置
        晶振是单片机的时钟来源,相当于心脏,先添加晶振,点击上图编号1,然后出现下图,在点击RCC,进入晶振

20201021114516692.png

20201021114618318.png

如上图:HSE 和LSE 都选择Crystal..选项。然后注意芯片示意图上有四个引脚变为绿色。

3、时钟树配置

点击 20190713232239519.png   出现下图,时钟树:

20201021114759826.png


配置时钟树如上图,改好后按回车键生效。

4、中断管理配置:

20201021114926115.png

点击NVIC 后,进入如下界面:

20201021115138715.png

到这里我们STM32的系统基础配置就完成了!

5、外设配置

下面就是结合具体需求来进行配置,例如我们这里讲的是串口1以及串口1的接收中断配置,那么下面开始配置串口1 及其中断。

2020102111545925.png

20201021115640761.png

这里只要选好模式就行,可以注意到,芯片示意图上已经出现了串口1引脚 。但要记住这里的波特率设置为115200了。这里串口就可以正常使用了。但是,我们还需要使用中断,所以还需要配置串口中断。

20201021115807741.png

中断最后还需要设置好优先级:

20201021121247742.png

到这里,串口1的中断就算是配置好了。接下来可以生成代码了,但是需要几个小的配置,点击工程管理

20190713232951864.png

进入管理工程界面,

$UJ`L$WM4FUXEJE`EC(PG$N.png

OPZRWX~K_RINCGJ]M@$Q{KM.png

到这里软件的工程的软件配置部分就结束了,然后生成工程代码,

MGBK@(SYSJDZ4EEO`J6`9}V.png


6、工程代码上的配置以及修改

使用keil5 打开刚刚生成的工程代码。

`RD45$TRIFV7R)1QF[9WG3C.png

KJDYCSUJT7YY@NNNB4UZA%A.png

找到main.c, 会发现如上图的主函数结构,其中

MX_USART1_UART_Init(); 就是软件生成的串口1初始化配置。

如下图,光标放在相应的函数上,鼠标右击,选择GO TO Definetion..  选项即可进行跳转。

HPN1O[VAM@HWG_5J062R_W2.png

跳转进入usart.c 文件,会看到,MX_USART1_UART_Init();的函数体。

  1. #if 1

  2. #pragma import(__use_no_semihosting)                             

  3. struct __FILE

  4. {

  5. int handle;

  6. };

  7. FILE __stdout;      

  8. void _sys_exit(int x)

  9. {

  10.    x = x;

  11. }

  12. int fputc(int ch, FILE *f)

  13. {     

  14.      while((USART1->SR&0X40)==0);  

  15.     USART1->DR = (uint8_t) ch;     

  16.      return ch;

  17. }

  18. #endif
复制代码


在这个usart.c文件中添加如下代码:,如下图所示

这段代码可以在STM32中正常使用printf()函数。具体添加位置可以如下图,注意所在的文件和位置。同时不要忘了在usart.h 文件中添加#include “stdio.h”


AYV@XN$C3F@BP~]MHI)$PRF.png


添加 #include “stdio.h”

AJ7OGS8PM5X7(45N[[MSM59.png


经过上述两步就可以正常使用printf() 函数了。

最后配置中断相关的函数,

(1)、找到中断服务函数

位于stm32f1xx_it.c 文件中

DX3B~I(B{%R7O$DG)~$IQ%6.png

(2)、找到中断回调函数

1)、HAL_UART_IRQHandler(&huart1);

2)、UART_Receive_IT(huart);

3)、HAL_UART_RxCpltCallback(huart);

  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

从1)可以跳转到3),                                    

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 就是串口中断回调函数 。

并且将void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)复制到usart.c文件中,如下图。在这个函数中就可以写中断逻辑




(3)、开启接收中断

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

在这个函数中会使能接收中断,需要三个参数,分别为

1)、串口句柄,

2)、保存接收数据的数组,

3)、每次接受的数据字节数,

所以我们需要首先定义一个保存接收数据的数组。

B@UB)H5%G5YQUN)QRRQG5XH.png

然后开启中断,需要写在两个地方,分别是串口初始化的时候和回调函数的最后,如下图所示,

([LNTPKDAX)CR@WNKAS62BW.png


最后 在回调函数里加入如下代码进行测试:

)2VINME338U5}4GM9Z[`{CV.png

最后下载程序测试,

点击发送,单片机收到数据,就会打印出123.(因为我们使用的是串口1的接收中断,所以通过串口助手给串口一发数据,串口1接收到数据,就会触发接收中断,执行中断服务函数,最终执行到回调函数也就是我们的中断逻辑。这里的回调函数只是为了说明问题,实际使用时还需要判断是哪个串口触发的中断。



收藏 评论0 发布时间:2022-5-15 16:41

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版