【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记4--USART1(串口接收发送任意长度,任意格式数据)

本文介绍如何在STM32F303RE开发板上使用MDK-5.25软件,通过自定义中断处理函数实现USART2的任意长度数据收发。详细步骤包括工程创建、时钟配置、USART2配置、代码编写等,避免官方中断处理函数的资源占用问题。

一、 实验说明

实验硬件平台:NUCLEO-F303RE开发板
实验软件平台:MDK-5.25
实验内容:实现USART2的发送和接收 中断接收任意长度和任意格式的数据
实验的资源:(USART2_TX PA2) (USART2_RX PA3)

二、实验操作

1.硬件分析

1.NUCLEO-F303RE开发板自带的ST-Link调试器具备成串口调试功能。查看开发板的原理图,我们可以得知STM32F303RET6的PA2和PA3(USART2)和ST-Link的串口相连接。
2.检查跳线电阻SB61,SB62,SB63,SB13,SB14的情况。保证SB61,SB62,SB63处于断开状态。SB13和SB14处于连接状态。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.新建工程

打开STM32CubeMX,创建名为“USART2”的工程。工程创建过程参考下面链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记2–新建工程

3.时钟配置

时钟配置参考下面的链接
【NUCLEO-F303RE】【HAL】STM32F303RET6学习笔记3–创建工程以及GPIO的控制(按键控制LED灯)

3.USART2配置

1.打开Pinout&Configuration->Categories->Connectivity->USART2,选择Asynchronous。
在这里插入图片描述
2.设置参数,将波特率改成115200,其他的使用默认值
在这里插入图片描述
3.开启USART2中断。
在这里插入图片描述
4.修改管脚的别称(选做)
在这里插入图片描述

4.工程生成

配置已完成,点击“GENERATE CODE” 重新生成工程

5.代码编写

1.在usart.c中编写如下代码

/* USER CODE BEGIN 1 */

uint8_t   buff[1024];
uint16_t  buff_len=0;
uint8_t   buff_Flag=0;
void USART2_IT_Enable(void)
{
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
}

/* USER CODE END 1 */

2.在stm32fxxx_it.c中编写如下代码
不使用官方的中断处理函数
不使用官方的中断处理函数
不使用官方的中断处理函数

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
  uint8_t Res=0;
  /* USER CODE END USART2_IRQn 0 */
     //HAL_UART_IRQHandler(&huart2);   //注释这条语句,不使用HAL库的回调处理
  /* USER CODE BEGIN USART2_IRQn 1 */
    
    //判读是否为接收中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
    {
        HAL_UART_Receive(&huart2,&Res,1,1000);
        buff[buff_len]=Res;
        buff_len++;
    }
    //判读是否为溢出中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_ORE)!=RESET))
    {
        __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_OREF);
    }
    //判读是否为接收空闲中断
    if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
    {
        __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_IDLEF);
        buff_Flag=1;
    }
  /* USER CODE END USART2_IRQn 1 */
}

3.在main.c中编写如下代码

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  USART2_IT_Enable();  //使能一些中断
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(buff_Flag==1)
    {
      HAL_UART_Transmit(&huart2 ,buff,buff_len,0xffff);
      buff_Flag=0;
      buff_len=0;   
    }
  }
  /* USER CODE END 3 */

三、实验结果

在这里插入图片描述
在这里插入图片描述

四 、实验总结

不使用的官方提供的中断处理函数的原因是:官方提供的中断处理函数逻辑太过复杂,函数处理是占用的资源过大。在使用115200波特的的情况下,发送速度过快时(50ms),极其容易造成程序卡死,而且无法恢复(本人研究了好久,也参考了网上的一些说明,但是一直无法解决,所以参考标准库的写法)。初步怀疑是官方中断服务函数占用的时间过长,导致上次接收中断还没用处理完,下一次中断就被触发了。若是你有好的处理方法,可在评论区交流下。

五、实验代码

实验代码下载

Product Name : NT Locale Emulator Advance (NT全域通) short for NTLEA Component Description: ntlea.exe - NTLEA GUI shell and shortcut launcher ntleac.exe - NTLEA core launcher ntleah.dll - NTLEA remote injection DLL ntleap.dll - NTLEA helper library neko.dll - NTLEA GUI runtime library Version & Update History : NTLEA Core 0.86 Beta 07.6.13 by LOVEHINA-AVC 增加对GetSystemDefaultUILanguage及GetUserDefaultUILanguage函数的挂钩 改善了Computer-based Training钩子的挂钩方式 修正了其他一些细小的BUG NTLEA Core 0.85 Beta 07.6.9 by LOVEHINA-AVC 增加让NTLEA加载的应用程序不受系统SDB补丁机制影响的功能 修正了其他一些细小的BUG NTLEA Core 0.83 Beta 07.6.8 by LOVEHINA-AVC 修正了之前的版本不能让含有特殊字符路径的应用程序正常工作的问题 修正了其他一些细小的BUG NTLEA GUI Launcher 1.0 Final 07.6.7 by 七夜真神 增加多语系界面支持与对应的区码(目前支持简体中文、繁体中文及英文) NTLEA Core 0.82 Beta 07.6.7 by LOVEHINA-AVC 修正了在一部分程序下执行会发生初始化失败的问题 完善了跨进程跟踪注入的功能 增加直接打开任意扩展名文件的功能(注:若系统中启用了Microsoft Applocale,msi安装程序将无法被NTLEA正确加载) 0.80 beta 07.6.4 中文名称更改为“NT全域通” 修正了对话框处理函数不能被正确挂钩的问题 修正了因错误地址传递导致应用程序启动失败的问题 修正了一部分程序不能使用IME标准输入法的问题 修正了0.72~0.75版不能在Windows 2000及Windows XP SP0 SP1下运行的问题 增加WM_CHAR及WM_IME_CHAR消息的处理模块,修正了输入框文字不能被正确显示及文字不能被正确输入的问题 消除了数个读零地址非法操作的诱发因素 改进了消息钩子的处理方式 增加应用程序参数指定的支持(详见命令行选项说明) 增加重新指定字体大小的功能(详见命令行选项说明) 修正了Core Launcher(NTLEAC)不能引导一部分程序的问题 修正了多个细小的BUG 0.75 beta 07.1.10 修正了0.73版不能支持某些Unicode/ANSI混合型应用程序的问题 ntleac命令行模式“F”选项实装(注:若要强制指定应用程序所使用的字体,则至少需追加“P4”选项) 增加LB_GETTEXTLEN消息的处理模块(感谢Yoxola提供兼容性问题报告) 0.73 beta 06.12.16 修正了一部分程序在通过系统模版创建窗口时无法被正确挂钩的问题 0.72 beta 06.12.4 修正了在Visual C++ MFC框架程序中会产生乱码的兼容性问题 修正了在调用对话框模版函数后程序运行不正常的问题 增加对kernel32!CreateProcessW函数的挂勾 0.70 beta 06.11.30 增加以下针对窗口及消息处理函数的挂钩: user32!SetWindowTextA user32!GetWindowTextA user32!SendMessageA user32!SendMessageTimeoutA user32!SendMessageCallbackA user32!SendNotifyMessageA user32!PostMessageA user32!GetWindowLongA user32!SetWindowLongA user32!DefDlgProcA user32!DefFrameProcA user32!DefMDIChildProcA user32!DialogBoxParamA user32!DialogBoxIndirectParamA user32!CreateDialogParamA user32!CreateDialogIndirectParamA 增加其它的一些函数的挂钩: user32!GetMenuStringA user32!GetMenuItemInfoA user32!SetMenuItemInfoA kernel32!CharPrevA kernel32!CharNextA kernel32!IsDBCSLeadByte gdi32!EnumFontFamiliesExA gdi32!CreateFontIndirectA 增加自定义右键启动菜单的功能 增加指定预设字体的功能 0.52 beta 06.10.14 增加对user32!CreateWindowExA函数的挂钩 增加对user32!DefWindowProcA函数的挂钩 修正了VerQueryValueA挂钩函数在Windows XP SP0及SP1下会导致无效内存访问异常的问题 0.50 beta 06.10.12 增加对kernel32!GetCommandLineA函数的挂钩 修正了ntdll!RtlUnicodeToMultibyteN挂钩函数中一个重大的BUG,解决了大部分程序的兼容性问题 0.20 beta 06.10.9 增加针对特定应用程序的支持选项 重部分函数,提高了挂勾程序的兼容性 修正数个小BUG 0.17 beta 06.9.30 再次(?)完善了kernel32!CreateProcessA挂钩函数的功能 0.16 beta 06.9.28 修正在目标程序调用version!VerQueryValueA时可能构成死循环的BUG 0.15 beta 06.9.27 增加对kernel32!GetTimeZoneInformation函数的挂钩,新增时区修正参数 增加对version!VerQueryValueA函数的挂勾 增加对Windows XP SP0操作系统的支持 新增一个兼容性选项 去除了不必要的语言ID参数 完善了kernel32!CreateProcessA挂钩函数的功能 0.11 beta 06.9.25 启动程序ntleac.exe与挂钩程序ntleah.dll由ANSI版本转变为Unicode版 注:如果在使用NTLEA外壳时发现程序无法启动,可尝试直接运行ntleac.exe 附:ntleac参数说明(第一个参数必须包含双引号): 1. "x:\xxxxx\xxx.exe" 说明:目标程序路径。该参数必须位于第一项。 2. "Px" 说明:指定兼容性选项。x为描述兼容性开关的数值,每一个位域指定一个选项(注)。例如,当x为1时,第1个兼容性选项将被开启;当x为8时,第4个兼容性选将被开启;当x为7时,前3个兼容性选项均被开启(1 | 2 | 4 = 7)。 注:这里所说的位域是指二进制数的数位,一个整数最多拥有32个位域,第x位域的值等于2的x次方。 3. "Cx" 说明:指定页码。x为页码ID。 4. "Lx" 说明:指定语言。x为语言区域ID。 5. "Tx" 说明:指定时区修正。x为UTC时区修正数值,单位是分钟。 6. "Fxxx" 说明:指定预设字体,xxx为字体名称。 7. "Axxx" 说明:指定将要传给目标应用程序的参数,xxx为参数内容。 8. "Sx" 说明:指定字体的收放比率,x为比值,单位是百分率。 示例: ntleac.exe "d:\test\game.exe" "A-G 123 -B 456" "P0" "C932" "L1041" "T-540" "FMS Gothic" "S200" 执行结果为启动“d:\test\game.exe -G 123 -B 456”,并设置页码为932(日文Shift-JIS),语言区域为日本,字体为“MS Gothic”,以两倍的大小显示,时区为东9区(GMT + 9:00或UTC - 9:00)。 (注:如果参数中包含双引号,则可用单引号来代替。如上例的"A-G 123 -B 456",追加双引号后可书为"A'-G 123' '-B 456'") 0.10 beta 06.9.25 正式更名为NT Locale Emulator Advance 增加具有图形界面的外壳程序 增加跨进程跟踪功能 0.05 beta 06.9.24 修正了0.04 beta无法在Windows 2000及XP SP1下运行的问题 0.04 beta 06.9.24 增加对kernel32!CompareStringA函数的挂钩 增加对ntdll!RtlUnicodeToMultibyteN函数的挂钩 0.03 beta 06.9.24 增加对kernel32!CreateFileA函数的本地化支持 修正了前一个版本在多处理器系统中可能出现的兼容性问题 0.02 beta 06.9.23 修正了无法在Windows XP SP1下运行的问题 0.01 beta 06.9.22 最初的版本 FAQs Q:这个工具能够做什么? A:区域模拟,以及内码转换。一些应用程序可能无法在其它的区域模拟软件下正常运行,因此我编了这个工具,以避免手工转换系统语言区域所带来的麻烦。 Q:它的兼容性如何? A:该程序能够在Windows 2000 SP4/XP及2003 SP1下正常工作,但它很可能不支持Windows 2000 SP3及更低的版本。(注意,当前的版本不支持Windows 20003 Gold、即SP0) 目前已测试可以支持的操作系统详细列表: Windows 2000 SP4 Windows XP Windows XP SP1 Windows XP SP2 Windows Server 2003 SP1 Windows XP x64 Edition Windows Vista Q:使用这个工具时需要安装额外的软件吗? A:不需要。同时这个程序也是绿色软件。 Q:我看到了两个可执行文件,应该怎样使用它们? A:直接运行ntleac.exe,或者为它建立一个快捷方式,并在命令行的末尾填上目标程序的全路径名。关于参数的详细说明请参考附录,在新的版本中您还可以使用名为NTLEAGUI的外壳程序。 Q:我可以与他人分享这个软件吗? A:是的,您可以自由转载这个程序,但请务必保持其完整,且不要修改任何内容。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值