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

Nucleo 072 板子的 usart2 一直没有调通!

[复制链接]
faba 提问时间:2014-12-21 21:47 /
Nucleo 072 板子的 usart2 一直没有调通,请问有sample code可以参考吗? usart1 是正常的。库函数版本1.4.0
收藏 评论4 发布时间:2014-12-21 21:47

举报

4个回答
netlhx 回答时间:2014-12-22 09:24:11
可以参考一下这个,我用着没问题
https://www.stmcu.org.cn/module/forum/thread-598177-1-1.html
废鱼 回答时间:2014-12-22 09:27:40
配置代码发一下。
小贾-370388 回答时间:2014-12-22 10:42:52
赶紧上传代码吧,没代码大家怎么帮你分析
晓枫VS枯叶 回答时间:2014-12-22 11:50:12
  1. #include "sys.h"
  2. #include "usart.h"          
  3. //////////////////////////////////////////////////////////////////////////////////          
  4. //如果使用ucos,则包括下面的头文件即可.
  5. #if SYSTEM_SUPPORT_UCOS
  6. #include "includes.h"                                        //ucos 使用          
  7. #endif
  8. //////////////////////////////////////////////////////////////////////////////////         
  9. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  10. //ALIENTEK STM32开发板
  11. //串口1初始化                  
  12. //正点原子@ALIENTEK
  13. //技术论坛:www.openedv.com
  14. //修改日期:2012/8/18
  15. //版本:V1.5
  16. //版权所有,盗版必究。
  17. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  18. //All rights reserved
  19. //********************************************************************************
  20. //V1.3修改说明
  21. //支持适应不同频率下的串口波特率设置.
  22. //加入了对printf的支持
  23. //增加了串口接收命令功能.
  24. //修正了printf第一个字符丢失的bug
  25. //V1.4修改说明
  26. //1,修改串口初始化IO的bug
  27. //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
  28. //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
  29. //4,修改了EN_USART2_RX的使能方式
  30. //V1.5修改说明
  31. //1,增加了对UCOSII的支持
  32. //////////////////////////////////////////////////////////////////////////////////           


  33. //////////////////////////////////////////////////////////////////
  34. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  35. #if 1
  36. #if defined ( __CC_ARM )
  37. #pragma import(__use_no_semihosting)                              
  38. struct __FILE
  39. {
  40.         int handle;
  41. };
  42. FILE __stdout;         
  43. int _sys_exit(int x)
  44. {
  45.         x = x;
  46. }
  47. #endif
  48. //重定义fputc函数
  49. int fputc(int ch, FILE *f)
  50. {      
  51.         while((USART2->ISR&0X40)==0);//循环发送,直到发送完毕   
  52.     USART2->TDR = (uint8_t) ch;      
  53.         return ch;
  54. }
  55. #endif

  56. /*使用microLib的方法*/
  57. /*
  58. int fputc(int ch, FILE *f)
  59. {
  60.         USART_SendData(USART2, (uint8_t) ch);

  61.         while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}       
  62.    
  63.     return ch;
  64. }
  65. int GetKey (void)  {

  66.     while (!(USART2->SR & USART_FLAG_RXNE));

  67.     return ((int)(USART2->DR & 0x1FF));
  68. }
  69. */


  70. //串口1中断服务程序
  71. //注意,读取USARTx->SR能避免莫名其妙的错误          
  72. uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  73. //接收状态
  74. //bit15,        接收完成标志
  75. //bit14,        接收到0x0d
  76. //bit13~0,        接收到的有效字节数目
  77. uint16_t USART_RX_STA=0;       //接收状态标记          

  78. //初始化IO 串口1
  79. //bound:波特率
  80. void uart_init(uint32_t bound){
  81.     //GPIO端口设置
  82.         GPIO_InitTypeDef GPIO_InitStructure;
  83.           USART_InitTypeDef USART_InitStructure;
  84.           NVIC_InitTypeDef NVIC_InitStructure;
  85.        
  86.           RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //开时钟
  87.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  88.           GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); //开管脚复用功能
  89.           GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  90.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;//管脚配置
  91.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  92.           GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  93.           GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  94.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  95.           GPIO_Init(GPIOA, &GPIO_InitStructure);  

  96.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  97.         NVIC_InitStructure.NVIC_IRQChannelPriority=2;
  98.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  99.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器  
  100.        
  101.        
  102.           USART_InitStructure.USART_BaudRate = bound;//波特率设置  参数配置
  103.           USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  104.           USART_InitStructure.USART_StopBits = USART_StopBits_1;
  105.           USART_InitStructure.USART_Parity = USART_Parity_No;
  106.           USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  107.           USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  108.           USART_Init(USART2, &USART_InitStructure);//初始化
  109.                 USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
  110.           USART_Cmd(USART2, ENABLE);               //使能

  111. }
  112. #if EN_USART2_RX   //如果使能了接收
  113. void USART2_IRQHandler(void)                        //串口1中断服务程序
  114.         {
  115.         uint8_t Res;
  116. #ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII了.
  117.         OSIntEnter();   
  118. #endif
  119.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  120.                 {
  121.                 Res =USART_ReceiveData(USART2);//(USART2->DR);        //读取接收到的数据
  122.                
  123.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  124.                         {
  125.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  126.                                 {
  127.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  128.                                 else USART_RX_STA|=0x8000;        //接收完成了
  129.                                 }
  130.                         else //还没收到0X0D
  131.                                 {       
  132.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  133.                                 else
  134.                                         {
  135.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  136.                                         USART_RX_STA++;
  137.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  138.                                         }                 
  139.                                 }
  140.                         }                    
  141.      }
  142. #ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII了.
  143.         OSIntExit();                                                                                           
  144. #endif
  145. }
  146. #endif       
复制代码
上面的代码是移植的原子的F103的,使用的是你所说的1.4.0的库,已经可以用了,可以看看!

所属标签

相似问题

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