搜索
bottom↓
回复: 0

STM32F429 串口3无法响应 帮忙看下

[复制链接]

出25入84汤圆

发表于 2017-12-13 17:15:11 | 显示全部楼层 |阅读模式
串口1和串口2都可以响应 串口3就是不行 哪位帮忙看下
  1. #include "usart.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////          
  4. //如果使用os,则包括下面的头文件即可.
  5. #if SYSTEM_SUPPORT_OS
  6. #include "includes.h"                                        //os 使用          
  7. #endif
  8. //////////////////////////////////////////////////////////////////////////////////         
  9. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  10. //ALIENTEK STM32F429开发板
  11. //串口1初始化                  
  12. //正点原子@ALIENTEK
  13. //技术论坛:www.openedv.com
  14. //修改日期:2015/9/7
  15. //版本:V1.5
  16. //版权所有,盗版必究。
  17. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  18. //All rights reserved
  19. //********************************************************************************
  20. //V1.0修改说明
  21. //////////////////////////////////////////////////////////////////////////////////           
  22. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  23. //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)       
  24. #if 1
  25. #pragma import(__use_no_semihosting)            
  26. //标准库需要的支持函数                 
  27. struct __FILE
  28. {
  29.         int handle;
  30. };

  31. FILE __stdout;      
  32. //定义_sys_exit()以避免使用半主机模式   
  33. void _sys_exit(int x)
  34. {
  35.         x = x;
  36. }
  37. //重定义fputc函数
  38. int fputc(int ch, FILE *f)
  39. {        
  40.         while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
  41.         USART3->DR = (u8) ch;      
  42.         return ch;
  43. }
  44. #endif

  45. #if EN_USART3_RX   //如果使能了接收
  46. //串口1中断服务程序
  47. //注意,读取USARTx->SR能避免莫名其妙的错误          
  48. u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  49. //接收状态
  50. //bit15,        接收完成标志
  51. //bit14,        接收到0x0d
  52. //bit13~0,        接收到的有效字节数目
  53. u16 USART_RX_STA=0;       //接收状态标记       

  54. u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
  55. UART_HandleTypeDef UART3_Handler; //UART句柄

  56. //初始化IO 串口1
  57. //bound:波特率
  58. void uart_init(u32 bound)
  59. {       
  60.         //UART 初始化设置
  61.         UART3_Handler.Instance=USART3;                                            //USART1
  62.         UART3_Handler.Init.BaudRate=bound;                                    //波特率
  63.         UART3_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
  64.         UART3_Handler.Init.StopBits=UART_STOPBITS_1;            //一个停止位
  65.         UART3_Handler.Init.Parity=UART_PARITY_NONE;                    //无奇偶校验位
  66.         UART3_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
  67.         UART3_Handler.Init.Mode=UART_MODE_TX_RX;                    //收发模式
  68.         HAL_UART_Init(&UART3_Handler);                                            //HAL_UART_Init()会使能UART1
  69.        
  70.         HAL_UART_Receive_IT(&UART3_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
  71.   
  72. }

  73. //UART底层初始化,时钟使能,引脚配置,中断配置
  74. //此函数会被HAL_UART_Init()调用
  75. //huart:串口句柄

  76. void HAL_UART_MspInit(UART_HandleTypeDef *huart)
  77. {
  78.     //GPIO端口设置
  79.         GPIO_InitTypeDef GPIO_Initure;
  80.        
  81.         if(huart->Instance==USART3)//如果是串口1,进行串口1 MSP初始化
  82.         {
  83.                 __HAL_RCC_GPIOB_CLK_ENABLE();                        //使能GPIOA时钟
  84.                 __HAL_RCC_USART3_CLK_ENABLE();                        //使能USART1时钟
  85.        
  86.                 GPIO_Initure.Pin=GPIO_PIN_10;                        //PA9
  87.                 GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
  88.                 GPIO_Initure.Pull=GPIO_PULLUP;                        //上拉
  89.                 GPIO_Initure.Speed=GPIO_SPEED_FAST;                //高速
  90.                 GPIO_Initure.Alternate=GPIO_AF7_USART3;        //复用为USART1
  91.                 HAL_GPIO_Init(GPIOB,&GPIO_Initure);                   //初始化PA9

  92.                 GPIO_Initure.Pin=GPIO_PIN_11;                        //PA10
  93.                 HAL_GPIO_Init(GPIOB,&GPIO_Initure);                   //初始化PA10
  94.                
  95. #if EN_USART3_RX
  96.                 HAL_NVIC_EnableIRQ(USART3_IRQn);                //使能USART1中断通道
  97.                 HAL_NVIC_SetPriority(USART3_IRQn,3,3);        //抢占优先级3,子优先级3
  98. #endif       
  99.         }

  100. }

  101. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  102. {
  103.         if(huart->Instance==USART3)//如果是串口1
  104.         {
  105.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  106.                 {
  107.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  108.                         {
  109.                                 if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  110.                                 else USART_RX_STA|=0x8000;        //接收完成了
  111.                         }
  112.                         else //还没收到0X0D
  113.                         {       
  114.                                 if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
  115.                                 else
  116.                                 {
  117.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
  118.                                         USART_RX_STA++;
  119.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  120.                                 }                 
  121.                         }
  122.                 }

  123.         }
  124. }

  125. //串口1中断服务程序
  126. void USART3_IRQHandler(void)                       
  127. {
  128.         u32 timeout=0;
  129.         u32 maxDelay=0x1FFFF;
  130. #if SYSTEM_SUPPORT_OS                 //使用OS
  131.         OSIntEnter();   
  132. #endif
  133.        
  134.         HAL_UART_IRQHandler(&UART3_Handler);        //调用HAL库中断处理公用函数
  135.        
  136.         timeout=0;
  137.     while (HAL_UART_GetState(&UART3_Handler) != HAL_UART_STATE_READY)//等待就绪
  138.         {
  139.          timeout++;////超时处理
  140.      if(timeout>maxDelay) break;               
  141.         }
  142.      
  143.         timeout=0;
  144.         while(HAL_UART_Receive_IT(&UART3_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
  145.         {
  146.          timeout++; //超时处理
  147.          if(timeout>maxDelay) break;       
  148.         }
  149. #if SYSTEM_SUPPORT_OS                 //使用OS
  150.         OSIntExit();                                                                                           
  151. #endif
  152. }
  153. #endif       


  154. /*下面代码我们直接把中断控制逻辑写在中断服务函数内部。
  155. 说明:采用HAL库处理逻辑,效率不高。*/
  156. /*


  157. //串口1中断服务程序
  158. void USART1_IRQHandler(void)                       
  159. {
  160.         u8 Res;
  161. #if SYSTEM_SUPPORT_OS                 //使用OS
  162.         OSIntEnter();   
  163. #endif
  164.         if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  165.         {
  166.         HAL_UART_Receive(&UART1_Handler,&Res,1,1000);
  167.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  168.                 {
  169.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  170.                         {
  171.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  172.                                 else USART_RX_STA|=0x8000;        //接收完成了
  173.                         }
  174.                         else //还没收到0X0D
  175.                         {       
  176.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  177.                                 else
  178.                                 {
  179.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  180.                                         USART_RX_STA++;
  181.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  182.                                 }                 
  183.                         }
  184.                 }                    
  185.         }
  186.         HAL_UART_IRQHandler(&UART1_Handler);       
  187. #if SYSTEM_SUPPORT_OS                 //使用OS
  188.         OSIntExit();                                                                                           
  189. #endif
  190. }
  191. #endif       
  192. */




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

本版积分规则

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

GMT+8, 2024-5-6 15:48

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

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