OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8973|回复: 9

STM32 关于通过寄存器配置串口2

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
发表于 2013-9-14 14:10:34 | 显示全部楼层 |阅读模式

向大家请教一下,这个寄存器怎么配置串口2 啊,最好有串口2 配置的源代码发出来一下。我搞了半天还是不能实现串口2 的通信。 对了,补充一点儿,我用的是战舰的板子,那位哥又做过吗?我网上查了一下,说什么改一下寄存器名字就可以了,但是我还是没明白怎么回事儿。这里我发一下我初始化的串口2 。

//初始化IO 串口2
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init1(u32 pclk2,u32 bound)
{

 float temp;
 u16 mantissa;
 u16 fraction; 
 bound = bound;
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;

 
 //RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB1ENR|=1<<17; //使能串口2时钟
 GPIOA->CRL=0X44444B44;//IO状态设置

 GPIOA->CRL&=0XFFFF00FF;//IO状态设置
 GPIOA->CRL|=0X00008B00;//IO状态设置

 RCC->APB1RSTR|=1<<17;  //复位串口2
 RCC->APB1RSTR&=~(1<<17);//停止复位
 
 //波特率设置
 USART2->BRR=mantissa; // 波特率设置 
    USART2->CR1|=0X200C; //1位停止,无校验位.
 
 #if EN_USART2_RX    //如果使能了接收
 //使能接收中断
 USART2->CR1|=1<<8;    //PE中断使能
 USART2->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
 #endif

}                                    
            

void USART2_IRQHandler(void)
{
 u8 res; 
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 OSIntEnter();   
#endif
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;
  if((USART_RX_STA1&0x8000)==0)//接收未完成
  {
   if(USART_RX_STA1&0x4000)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA1=0;//接收错误,重新开始
    else USART_RX_STA1|=0x8000; //接收完成了
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA1|=0x4000;
    else
    {
     USART_RX_BUF1[USART_RX_STA1&0X3FFF]=res;
     USART_RX_STA1++;
     if(USART_RX_STA1>(USART_REC_LEN-1))USART_RX_STA1=0;//接收数据错误,重新开始接收 
    }  
   }
  }                  
 }
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 OSIntExit();             
#endif
}
#endif 
不知道哪里有问题。

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-14 14:29:35 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
 楼主| 发表于 2013-9-14 16:23:53 | 显示全部楼层

     你好,原子,我看了一下代码,发现串口2通信的代码主要是放在ustart2.c 和ustart2.h这两个文件里的,我在main函数所在的文件里面包含了这个头文件,然后调用u2_printf函数怎么串口2 没有反应啊?我main函数如下。
#include "sys.h"
#include "usart.h" 
#include "usart2.h"  
#include "delay.h" 
#include "led.h"
#include "beep.h"   
#include "key.h"   
//ALIENTEK战舰STM32开发板实验4
//串口实验 
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{   
 u16 t;
 u16 len; 
 u16 times=0;       
 Stm32_Clock_Init(9); //系统时钟设置
 uart_init(72,9600);   //串口初始化为9600
 USART2_Init(36,115200); //初始化串口2
 delay_init(72);       //延时初始化
 LED_Init();      //初始化与LED连接的硬件接口
 BEEP_Init();          //初始化蜂鸣器端口
 KEY_Init();          //初始化与按键连接的硬件接口
  while(1)
 {

  
  if(USART_RX_STA&0x8000)
  {       
   len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
   printf("\r\n您发送的消息为:\r\n\r\n");
   for(t=0;t<len;t++)
   {
    USART1->DR=USART_RX_BUF[t];
    while((USART1->SR&0X40)==0);//等待发送结束
   }
   printf("\r\n\r\n");//插入换行
   USART_RX_STA=0;
  }else
  {
   times++;
   if(times%5000==0)
   {
    printf("\r\n战舰STM32开发板 串口实验\r\n");
    printf("正点原子@ALIENTEK\r\n\r\n");
   }
   if(times%200==0)
   {
    printf("请输入数据,以回车键结束\r\n");
    u2_printf("output!\n");
    
   }
   if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
   delay_ms(10);  
  }

   if(times%300==0)
   {
    u2_printf("output!\n");
   }
 } 
}


 

 

回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
 楼主| 发表于 2013-9-14 16:25:49 | 显示全部楼层
我就包含了一个ustart2.h的头文件,然后调用了一下里面的初始化函数和打印函数,结果发现如果调用了串口2 的初始化函数,串口1和串口2都用不鸟了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-14 18:58:08 | 显示全部楼层
能不能仿真?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
 楼主| 发表于 2013-9-14 21:07:34 | 显示全部楼层

            貌似不能仿真,仿真的时候出错。


 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-14 21:54:14 | 显示全部楼层
仿真主要看你的串口寄存器是不是OK,我看你的这个截图,串口设置貌似无问题。
再看IO口设置有没有问题,TXD要设置为复用输出,RXD设置为带上下拉的输入即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
 楼主| 发表于 2013-9-14 22:23:23 | 显示全部楼层

串口2  的端口配置我就是山寨的串1的配置,现在我遇到了一个不解的情况,我串口2 下已经能往上位机发送数据了,但是上位机忘串口2发送数据,串口2 进入不鸟中断函数,这个中断函数是不是在USART2_IRQHandler这里写个函数体就可以了啊?还是需要在某个地方单独注册一下什么的啊?我把我完整的代码发出来。问题是如果是正常的,串口2收到数据后,串口1应该会打印出rrrrr这个字符串才对啊。

test.c:

#include "sys.h"
#include "usart.h" 
#include "usart2.h"  
#include "delay.h" 
#include "led.h"
#include "beep.h"   
#include "key.h"   

 


void send1_str(unsigned char *p,unsigned char s)    //发送字符程序
{
       u8 m=0;
    for(m=0;m<s;m++)
    {
     USART1->DR=(*p);
  while((USART1->SR&0X40)==0);//等待发送结束
  p++;
    }
}

void send2_str(unsigned char *p,unsigned char s)    //发送字符程序
{
       u8 m=0;
    for(m=0;m<s;m++)
    {
  USART2->DR=(*p);
  while((USART2->SR&0X40)==0);//等待发送结束
  p++;
    }
}


//ALIENTEK战舰STM32开发板实验4
//串口实验 
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{   
 u16 t;
 u8 len; 
 u16 times=0;   
 u8 tchar1[256] = "1111";
 u8 tchar2[256] = {0};
// u8 uclen = 0;    
 Stm32_Clock_Init(9); //系统时钟设置
 uart_init(72,9600);   //串口初始化为9600
// USART2_Init(36,115200); //初始化串口2
 uart2_Init(36,9600);

 delay_init(72);       //延时初始化
 LED_Init();      //初始化与LED连接的硬件接口
 BEEP_Init();          //初始化蜂鸣器端口
 KEY_Init();          //初始化与按键连接的硬件接口
  while(1)
 {

  u2_printf("output!\n");
  if(USART_RX_STA&0x8000)
  {       
   len=USART_RX_STA&0x3FFF;//得到此次接收到的数据长度
   printf("\r\n您发送的消息为:\r\n\r\n");
   for(t=0;t<len;t++)
   {
    USART1->DR=USART_RX_BUF[t];
    while((USART1->SR&0X40)==0);//等待发送结束
   }
   printf("\r\n\r\n");//插入换行
   USART_RX_STA=0;
  }else
  {
   times++;
   if(times%5000==0)
   {
    printf("\r\n战舰STM32开发板 串口实验\r\n");
    printf("正点原子@ALIENTEK\r\n\r\n");
   }
   if(times%200==0)
   {
    printf("请输入数据,以回车键结束\r\n");
    send1_str(tchar1,3);
   }
   if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
   delay_ms(10);  
  }
   if(times%500==0)
   {
     send2_str(tchar1,3);
   }

   if(len!=0)
   {
      send2_str(tchar2,len);
   }

 } 
}


ustart.c:

#include "sys.h"
#include "usart.h"  
//////////////////////////////////////////////////////////////////////////////////  
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"     //ucos 使用  
#endif
////////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
//////////////////////////////////////////////////////////////////////////////////   
 

//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB  
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                
struct __FILE
{
 int handle;
 /* Whatever you require here. If the only file you are using is */
 /* standard output using printf() for debugging, no file handling */
 /* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
 x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{     
 while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
 USART1->DR = (u8) ch;     
 return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////

#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误    
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记  
 
void USART1_IRQHandler(void)
{
 u8 res; 
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 OSIntEnter();   
#endif
 if(USART1->SR&(1<<5))//接收到数据
 { 
  res=USART1->DR;
  if((USART_RX_STA&0x8000)==0)//接收未完成
  {
   if(USART_RX_STA&0x4000)//接收到了0x0d
   {
    if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x8000; //接收完成了
   }else //还没收到0X0D
   { 
    if(res==0x0d)USART_RX_STA|=0x4000;
    else
    {
     USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
     USART_RX_STA++;
     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
   }
  }                  
 }
#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 OSIntExit();             
#endif
}
#endif          
//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
//CHECK OK
//091209
void uart_init(u32 pclk2,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 GPIOA->CRH&=0XFFFFF00F;//IO状态设置
 GPIOA->CRH|=0X000008B0;//IO状态设置
   
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位       
 //波特率设置
  USART1->BRR=mantissa; // 波特率设置 
 USART1->CR1|=0X200C;  //1位停止,无校验位.
#if EN_USART1_RX    //如果使能了接收
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}


 //初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率  
void uart2_Init(u32 pclk2,u32 bound)
{
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 
 RCC->APB1ENR|=1<<17;  //使能串口2时钟 
 
 GPIOA->CRL&=0XFFFF00FF;
 GPIOA->CRL|=0X00008B00;//串口2  IO状态设置  PA2 PA3
 
 RCC->APB1RSTR|=1<<17;   //复位串口2
 RCC->APB1RSTR&=~(1<<17);//停止复位 
 
 USART2->BRR=mantissa; // 波特率设置 
 USART2->CR1|=0X200C;  //1位停止,无校验位.
}    

 

usart2.c

#include "delay.h"
#include "usart2.h"
#include "stdarg.h"   
#include "stdio.h"   
#include "string.h"   
////////////////////////////////////////////////////////////////////////////////// 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//串口2驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2013/2/22
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved          
//////////////////////////////////////////////////////////////////////////////////    

//串口发送缓存区  
__align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];  //发送缓冲,最大USART2_MAX_SEND_LEN字节
#ifdef USART2_RX_EN           //如果使能了接收     
//串口接收缓存区  
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];     //接收缓冲,最大USART2_MAX_RECV_LEN个字节.


//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
u16 USART2_RX_STA=0;    
void USART2_IRQHandler(void)
{
 u8 res;    
 if(USART2->SR&(1<<5))//接收到数据
 { 
  res=USART2->DR;    
  if(USART2_RX_STA<USART2_MAX_RECV_LEN)  //还可以接收数据
  {
   TIM4->CNT=0;              //计数器清空
   if(USART2_RX_STA==0)TIM4_Set(1);   //使能定时器4的中断
   USART2_RX_BUF[USART2_RX_STA++]=res;  //记录接收到的值 
  }else
  {
   USART2_RX_STA|=1<<15;     //强制标记接收完成
  }
 }   
 printf("rrrrr");          
}  
//初始化IO 串口2
//pclk1CLK1时钟频率(Mhz)
//bound:波特率  
void USART2_Init(u32 pclk1,u32 bound)
{      
 RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
 GPIOA->CRL&=0XFFFF00FF; //IO状态设置
 GPIOA->CRL|=0X00008B00; //IO状态设置 
 RCC->APB1ENR|=1<<17;   //使能串口时钟  
 RCC->APB1RSTR|=1<<17;   //复位串口2
 RCC->APB1RSTR&=~(1<<17);//停止复位       
 //波特率设置
  USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置 
 USART2->CR1|=0X200C;   //1位停止,无校验位.
 USART2->CR3=1<<7;    //使能串口2的DMA发送
 UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF
//#ifdef USART2_RX_EN     //如果使能了接收
 //使能接收中断
 USART2->CR1|=1<<8;     //PE中断使能
 USART2->CR1|=1<<5;     //接收缓冲区非空中断使能      
 MY_NVIC_Init(2,3,USART2_IRQChannel,2);//组2,优先级2,3
 TIM4_Init(999,7199); //100ms中断
 USART2_RX_STA=0;  //清零
 TIM4_Set(1);   //关闭定时器4
//#endif             
}
//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...) 

 va_list ap;
 va_start(ap,fmt);
 vsprintf((char*)USART2_TX_BUF,fmt,ap);
 va_end(ap);
 while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成  
 UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF));  //通过dma发送出去
}
//定时器4中断服务程序     
void TIM4_IRQHandler(void)
{  
 if(TIM4->SR&0X01)//是更新中断
 {       
  USART2_RX_STA|=1<<15; //标记接收完成
  TIM4->SR&=~(1<<0);  //清除中断标志位    
  TIM4_Set(0);   //关闭TIM4 
 }    
}
//设置TIM4的开关
//sta:0,关闭;1,开启;
void TIM4_Set(u8 sta)
{
 if(sta)
 {
  TIM4->CR1|=1<<0;     //使能定时器4
     TIM4->CNT=0;         //计数器清空
 }else TIM4->CR1&=~(1<<0);//关闭定时器4   
}
//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数  
void TIM4_Init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<2; //TIM4时钟使能   
  TIM4->ARR=arr;   //设定计数器自动重装值  
 TIM4->SC=psc;   //预分频器
  TIM4->DIER|=1<<0;   //允许更新中断    
  TIM4->CR1|=0x01;   //使能定时器4      
    MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占2,子优先级3,组2 在2中优先级最低        
}
#endif  
///////////////////////////////////////USART2 DMA发送配置部分//////////////////////////////////         
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHxMA通道CHx
//cpar:外设地址
//cmar:存储器地址   
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
  RCC->AHBENR|=1<<0;   //开启DMA1时钟
 delay_us(5);
 DMA_CHx->CPAR=cpar;   //DMA1 外设地址
 DMA_CHx->CMAR=cmar;   //DMA1,存储器地址 
 DMA_CHx->CCR=0X00000000; //复位
 DMA_CHx->CCR|=1<<4;    //从存储器读
 DMA_CHx->CCR|=0<<5;    //普通模式
 DMA_CHx->CCR|=0<<6;    //外设地址非增量模式
 DMA_CHx->CCR|=1<<7;    //存储器增量模式
 DMA_CHx->CCR|=0<<8;    //外设数据宽度为8位
 DMA_CHx->CCR|=0<<10;   //存储器数据宽度8位
 DMA_CHx->CCR|=1<<12;   //中等优先级
 DMA_CHx->CCR|=0<<14;   //非存储器到存储器模式     
}
//开启一次DMA传输
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u16 len)
{
 DMA_CHx->CCR&=~(1<<0);       //关闭DMA传输
 DMA_CHx->CNDTR=len;          //DMA1,传输数据量
 DMA_CHx->CCR|=1<<0;          //开启DMA传输
}   
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////          

#if 0
 //USART2发送len个字节.
 //buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void USART2_Send_Data(u8 *buf, u8 len)
 {
  u8 t;
    for(t = 0; t < len; t++)  //循环发送数据
 {
   while((USART2->SR & 0X40) == 0);//等待发送结束   
   USART2->DR = buf[t];
  } 
  while((USART2->SR & 0X40) == 0);//等待发送结束
  USART2_RX_STA = 0;  
 }
 //USART2查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void USART2_Receive_Data(u8 *buf, u8 *len)
 {
  u8 rxlen = USART2_RX_STA;
  u8 i = 0;
  *len = 0;    //默认为0
  delay_ms(10);  //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
 if(rxlen == USART2_RX_STA && rxlen)//接收到了数据,且接收完成了
 {
   for(i = 0; i < rxlen; i++)
   {
    buf = USART2_RX_BUF;
   } 
   *len = USART2_RX_STA; //记录本次数据长度
  USART2_RX_STA = 0;  //清零
 }
 }
#endif

 

 

 

 

 

 

 

 


 

 

 

回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-9-14
在线时间
0 小时
 楼主| 发表于 2013-9-14 23:19:31 | 显示全部楼层
             哎~终于搞掂了,原来是没有配置串口2 的中断。谢谢原子啦。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-14 23:40:25 | 显示全部楼层
你在串口2 里面设置个断点  看看能不能跑进去。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-13 04:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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