注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
星辰mn的个人空间 https://home.eeworld.com.cn/space-uid-404851.html [收藏] [复制] [分享] [RSS]
日志

问题求大侠帮助:STM32利用中断把USART串口接收的数据先存入数组,设置结束标志,并向

已有 5861 次阅读2012-4-3 14:02 |

主函数如下:

#include "stm32f10x_lib.h"
#include "stdio.h"

char  TxBuffer1[]; 
 char  RxBuffer1[];
volatile int TxCounter1;
volatile int RxCounter1;
 int rec_f,tx_flag;
 int Rec_Len;
 char  TxBuffer5[];
void RCC_Configuration()
{
       ErrorStatus HSEStartUpStatus;             //¶¨ÒåÍⲿ¸ßËÙ¾§ÕñÆô¶¯×´Ì¬Ã¶¾Ù±äÁ¿
       RCC_DeInit();                                                                                 //¸´Î»RCCÍⲿ¼Ä´æÆ÷µ½Ä¬ÈÏÖµ
       RCC_HSEConfig(RCC_HSE_ON);                 //´ò¿ªÍⲿ¸ßËÙ¾§Õñ
       HSEStartUpStatus=RCC_WaitForHSEStartUp();      //µÈ´ýÍⲿ¸ßËÙʱÖÓ×¼±¸ºÃ
 
       if(HSEStartUpStatus==SUCCESS){         //Íⲿ¸ßËÙʱÖÓÒѾ­×¼±¸ºÃ
 
              FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //¿ªÆôFLASHÔ¤¶Á»º³å¹¦ÄÜ£¬¼ÓËÙFLASHµÄ¶ÁÈ¡¡£ËùÓгÌÐòÖбØÐëµÄÓ÷¨£¬Î»ÖãºRCC³õʼ»¯×Óº¯ÊýÀïÃ棬ʱÖÓÆðÕñÖ®ºó
              FLASH_SetLatency(FLASH_Latency_2);        //FLASHʱÐòÑÓ³Ù¼¸¸öÖÜÆÚ£¬µÈ´ý×ÜÏßͬ²½²Ù×÷¡£ÍƼö°´ÕÕµ¥Æ¬»úϵͳÔËÐÐƵÂÊ£¬0¡ª24MHzʱ£¬È¡Latency=0£»24¡ª48MHzʱ£¬È¡Latency=1£»48~72MHzʱ£¬È¡Latency=2¡£
 
              RCC_HCLKConfig(RCC_SYSCLK_Div1);       //ÅäÖÃAHB(HCLK)==ϵͳʱÖÓ/1
              RCC_PCLK2Config(RCC_HCLK_Div1);      //ÅäÖÃAPB2(¸ßËÙ)(PCLK2)==ϵͳʱÖÓ/1 
              RCC_PCLK1Config(RCC_HCLK_Div2);     //ÅäÖÃAPB1(µÍËÙ)(PCLK1)==ϵͳʱÖÓ/2
              //×¢£ºAHBÖ÷Òª¸ºÔðÍⲿ´æ´¢Æ÷ʱÖÓ¡£APB2¸ºÔðAD£¬I/O£¬¸ß¼¶TIM£¬´®¿Ú1¡£APB1¸ºÔðDA£¬USB£¬SPI£¬I2C£¬CAN£¬´®¿Ú2345£¬ÆÕͨTIM¡£
 
 
              RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);   //ÅäÖÃPLLʱÖÓ==(Íⲿ¸ßËÙ¾§ÌåʱÖÓ/1£©* 9 ==72MHz
              RCC_PLLCmd(ENABLE);                                                                   //ʹÄÜPLLʱÖÓ
              while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);  //µÈ´ýPLLʱÖÓ¾ÍÐ÷
              RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  //ÅäÖÃϵͳʱÖÓ==PLLʱÖÓ
              while(RCC_GetSYSCLKSource()!=0x08); //µÈ´ýϵͳʱÖÓÔ´µÄÆô¶¯
       }
                                                                                                                                                                    
       //------------------------ÒÔÏÂΪ¿ªÆôÍâÉèʱÖӵIJÙ×÷-----------------------//
       //   RCC_AHBPeriphClockCmd (ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯AHBÉ豸
       //   RCC_APB2PeriphClockCmd(ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯ABP2É豸
       //   RCC_APB1PeriphClockCmd(ABP2É豸1 | ABP2É豸2 , ENABLE); //Æô¶¯ABP1É豸
 
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE);   //´ò¿ªAPB2ÍâÉè
}

void NVIC_Configuration( )
{
      NVIC_InitTypeDef NVIC_InitStructure;    //¶¨ÒåÒ»¸öÖжϽṹÌå
 
//     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  //ÉèÖÃÖжÏÏòÁ¿±íµÄÆðʼµØַΪ0x08000000
//     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //ÉèÖÃNVICÓÅÏȼ¶·Ö×飬·½Ê½¡£
       //×¢£ºÒ»¹²16¸öÓÅÏȼ¶£¬·ÖΪÇÀռʽºÍÏìӦʽ¡£Á½ÖÖÓÅÏȼ¶ËùÕ¼µÄÊýÁ¿ÓÉ´Ë´úÂëÈ·¶¨£¬NVIC_PriorityGroup_x¿ÉÒÔÊÇ0¡¢1¡¢2¡¢3¡¢4£¬
       //·Ö±ð´ú±íÇÀÕ¼ÓÅÏȼ¶ÓÐ1¡¢2¡¢4¡¢8¡¢16¸öºÍÏìÓ¦ÓÅÏȼ¶ÓÐ16¡¢8¡¢4¡¢2¡¢1¸ö¡£¹æ¶¨Á½ÖÖÓÅÏȼ¶µÄÊýÁ¿ºó£¬ËùÓеÄÖжϼ¶±ð±ØÐëÔÚÆäÖÐÑ¡Ôñ£¬
       //ÇÀÕ¼¼¶±ð¸ßµÄ»á´ò¶ÏÆäËûÖжÏÓÅÏÈÖ´ÐУ¬¶øÏìÓ¦¼¶±ð¸ßµÄ»áÔÚÆäËûÖжÏÖ´ÐÐÍêÓÅÏÈÖ´ÐС£
 
       NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel; //ͨµÀÉèÖÃΪ´®¿Ú1ÖжÏ
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //ÖжÏÏìÓ¦ÓÅÏȼ¶0
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //´ò¿ªÖжÏ
       NVIC_Init(&NVIC_InitStructure);   //³õʼ»¯
}

/****************************************
* º¯ÊýÃû³Æ    £ºGPIO_Configuration()
* ¹¦ÄÜÃèÊö    £º GPIOÅäÖÃ
* ²ÎÊý        £º  ÎÞ
* ·µ»ØÖµ      £º  ÎÞ
* È«¾Ö±äÁ¿    £º  ÎÞ
* È«¾Ö¾²Ì¬±äÁ¿£º  ÎÞ
* ¾Ö²¿¾²Ì¬±äÁ¿£º  ÎÞ
****************************************/
void GPIO_Configuration()
{
       GPIO_InitTypeDef GPIO_InitStructure;    //¶¨ÒåGPIO³õʼ»¯½á¹¹Ìå

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8;    //LED,ָʾµÆ
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
       //--------½«USART1 µÄTX ÅäÖÃΪ¸´ÓÃÍÆÍìÊä³ö AF_PP---------------------//
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;     //¹Ü½ÅλÖö¨Ò壬±êºÅ¿ÉÒÔÊÇNONE¡¢ALL¡¢0ÖÁ15¡£
       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //Êä³öËÙ¶È2MHz
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //ÍÆÍìÊä³öģʽ Out_PP
       GPIO_Init(GPIOA,&GPIO_InitStructure);     //E×éGPIO³õʼ»¯
 
       //--------½«USART1 µÄRX ÅäÖÃΪ¸´Óø¡¿ÕÊäÈë IN_FLOATING---------------------//
       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;   //¹Ü½ÅλÖö¨Òå
       //ÊäÈëģʽÏÂÅäÖÃÊä³öËÙ¶ÈÎÞÒâÒå
       //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //Êä³öËÙ¶È2MHz
       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //¸¡¿ÕÊäÈë IN_FLOATING                    
       GPIO_Init(GPIOA,&GPIO_InitStructure); //C×éGPIO³õʼ»¯
 
      
}
/****************************************************
* º¯ÊýÃû³Æ    £ºUSART1_Configuration( )
* ¹¦ÄÜÃèÊö    £º ÅäÖÃUSART1Êý¾Ý¸ñʽ¡¢²¨ÌØÂʵȲÎÊý
* ²ÎÊý        £º  ÎÞ
* ·µ»ØÖµ      £º  ÎÞ
* È«¾Ö±äÁ¿    £º  ÎÞ
* È«¾Ö¾²Ì¬±äÁ¿£º  ÎÞ
* ¾Ö²¿¾²Ì¬±äÁ¿£º  ÎÞ
*******************************************************/
void USART1_Configuration( )
{
       USART_InitTypeDef USART_InitStructure; //´®¿ÚÉèÖûָ´Ä¬ÈϲÎÊý
 
       USART_InitStructure.USART_BaudRate = 115200; //²¨ÌØÂÊ115200
       USART_InitStructure.USART_WordLength = USART_WordLength_8b; //×Ö³¤8λ
       USART_InitStructure.USART_StopBits = USART_StopBits_1; //1λֹͣ×Ö½Ú
       USART_InitStructure.USART_Parity = USART_Parity_No; //ÎÞÆæżУÑé
       USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;     //ÎÞÁ÷¿ØÖÆ
       USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;      //´ò¿ªRx½ÓÊÕºÍTx·¢Ë͹¦ÄÜ
       USART_Init(USART1, &USART_InitStructure);  //³õʼ»¯
       USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // Èô½ÓÊÕÊý¾Ý¼Ä´æÆ÷Âú£¬Ôò²úÉúÖжÏ
       USART_Cmd(USART1, ENABLE);                                                             //Æô¶¯´®¿Ú                  
                                                  
       //-----ÈçÏÂÓï¾ä½â¾öµÚ1¸ö×Ö½ÚÎÞ·¨ÕýÈ··¢ËͳöÈ¥µÄÎÊÌâ-----//
       USART_ClearFlag(USART1, USART_FLAG_TC);     // Çå±êÖ¾
}

void USART_OUT(USART_TypeDef* USARTx,  char *Data, int Len){
 int i;
 for(i=0; i<Len; i++){
  USART_SendData(USARTx, Data[i]);         
     while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);      //ÅжÏÊÇ·ñ·¢ËÍÍê³É¡£
 }
}

int main(void)
{
 char a = 0;int j;
 RCC_Configuration();
 GPIO_Configuration();
 NVIC_Configuration( );
 USART1_Configuration();
  printf("\r\n¸ÐлÄúʹÓÃSTM32·Ü¶·°å£¡^_^ \r\n");
 printf("\r\n Please Input Character From Keyboard \r\n");
 while(1)
    {
  if(rec_f==1){              //ÅжÏÊÇ·ñÊÕµ½Ò»Ö¡ÓÐЧÊý¾Ý
  rec_f=0;
  USART_OUT(USART1,TxBuffer1,Rec_Len);
  }
  if(a==0) {GPIO_SetBits(GPIOC, GPIO_Pin_6); a=1;}          //LED1  V6 Ã÷°µÉÁ˸               
  else {GPIO_ResetBits(GPIOC, GPIO_Pin_6);a=0;  }
 }     
}
int fputc(int ch, FILE *f)      
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (u8) ch);

  /* Loop until the end of transmission */
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {
  }

  return ch;
}

中断函数如下:

#include "stm32f10x_it.h"
#include "stm32f10x_usart.h"
#include "stdio.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/ 
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
extern char  TxBuffer1[]; 
extern char  TxBuffer5[],RxBuffer1[];
extern int TxCounter1;
extern int RxCounter1;
extern int rec_f,tx_flag;
extern int Rec_Len;

void USART1_IRQHandler(void)
{
 char i,j;
 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    //Èô½ÓÊÕÊý¾Ý¼Ä´æÆ÷Âú
    {
  USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);
  printf("%d  ",RxCounter1);
  if(RxCounter1 == 10)     //ÅжϽáÊø±êÖ¾ÊÇ·ñÊÇ0x0d 0x0a
  {
   for(i=0; i< RxCounter1; i++){        //½«½ÓÊÕ»º³åÆ÷µÄÊý¾Ýתµ½·¢ËÍ»º³åÇø£¬×¼±¸×ª·¢
    TxBuffer1[i] = RxBuffer1[i];
    }
   rec_f=1;                                                 //½ÓÊճɹ¦±êÖ¾
   Rec_Len=RxCounter1;
   RxCounter1=0;
    } 
 }
}
问题描述:原本想是让接收到的最后一个数据时W时,就向PC机发送数组里存储的数据,可是怎么也实现不了,后来就改为接收10个数据就发送,可是也实现不了。只有当小于8才可以正确发送,而且我把RxCounter1的值打印出来:打印结果如下:1  2  3  4  5  6  7  113  114  115  116  117  118  119  120  121……

从7后RxCounter1的值就不正常了!

就是哪儿的问题我找了好久,搞的头都打了,我是个学STM32的新手,请高手指点指点啊!

发表评论 评论 (1 个评论)
回复 lukyoo 2012-5-30 11:47
问题解决了吗,结贴啊,怎么解决的,急急急

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章