stm32在串口通讯中开启定时器的问题

2019-07-21 00:44发布

usart。初始化
#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"


///////////////////////////////////////
//3õê¼»ˉêy¾Y
uint8_t USART1_RX_BUF[USART1_REC_LEN];// ¶¨òå½óêÕ»o3å ×î′óUSART1_REC_LEN ¸ö×Ö½úÄ©×Ö½úÎa»»DD·û
uint8_t USART2_RX_BUF[USART2_REC_LEN];  //¶¨òåUSART2±äÆμ·¢ËíμÄêy¾Y»o3å
uint16_t USART1_RX_CNT=0; //¶¨òåUSART1½óêÕ×Ö·ûêy
uint16_t USART2_RX_CNT=0; //¶¨òåUSART2½óêÕ×Ö·ûêy
uint8_t USART1_RX_Flag=0;//1±íê¾½óêÕ½áêø 0±íê¾½óêÕÎ′íê3é
uint8_t USART2_RX_Flag=0;//1±íê¾½óêÕ½áêø 0±íê¾½óêÕÎ′íê3é
uint8_t CommErr=0;  //0±íê¾í¨Ñ¶Õy3£ 1±íê¾CRC′íÎó 2±íê¾ 1|ÄüÂë′íÎó 7±íê¾í¨Ñ¶3¬ê± 8±íê¾í¨Ñ¶Î′¿aê¼
uint8_t ErrPace=0;       // 1′ú±í′®¿úTIM6′y»úê±¼ä3¬3¤£¬·ÅÆúêy¾YÖ¡
                         // 2′ú±í′®¿úTIM7′y»úê±¼ä3¬3¤£¬·ÅÆúêy¾YÖ¡
                                                                                                 // 3′ú±í¼ì2aμ½Ôëòô¡¢Ö¡′íÎó»òÕßD£Ñé′íÎó
uint16_t USART1_Frame_Distance=9;
uint16_t USART2_Frame_Distance=5;

//′®¿ú1ÖD¶Ï·tÎñ3ìDò
//×¢òa,¶áè¡USARTx->SRÄü±üÃaÄaÃûÆäÃîμÄ′íÎó          
//uint8_t USART1_RX_BUF[USART1_REC_LEN];     //½óêÕ»o3å,×î′óUSART_REC_LEN¸ö×Ö½ú.
//½óêÕ×′ì¬
//bit15£¬        ½óêÕíê3é±êÖ¾
//bit14£¬        ½óêÕμ½0x0d
//bit13~0£¬        ½óêÕμ½μÄóDD§×Ö½úêyÄ¿
uint16_t USART1_RX_STA=0;       //USART1½óêÕ×′쬱ê¼Ç         
uint16_t USART2_RX_STA=0;       //USART2½óêÕ×′쬱ê־λ
uint16_t USART3_RX_STA=0;       //USART3½óêÕ×′쬱ê־λ
//////////////////////////////////////////////////////////////////////////////////          
//èç1ûê1óÃucos,Ôò°üà¨ÏÂÃæμÄí·Îļt¼′¿é.
#if SYSTEM_SUPPORT_OS
#include "includes.h"                                        //ucos ê1óà         
#endif
//////////////////////////////////////////////////////////////////////////////////         
//¼óèëòÔÏÂ′úÂë,Ö§3Öprintfoˉêy,¶ø2»DèòaÑ¡Ôñuse MicroLIB          
#if 1
#pragma import(__use_no_semihosting)            
//±ê×¼¿aDèòaμÄÖ§3Öoˉêy                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//¶¨òå_sys_exit()òÔ±üÃaê1óðëÖ÷»úģ꽠  
_sys_exit(int x)
{
        x = x;
}
//Öض¨òåfputcoˉêy
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//CRCD£Ñé ×Ô¼ooóÃæìí¼óμÄ

const u8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;


const u8 auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;


uint16_t CRC16(u8 *puchMsg, u16 usDataLen)
{
        uint8_t uchCRCHi = 0xFF ;
        uint8_t uchCRCLo = 0xFF ;
        uint32_t uIndex ;
        while (usDataLen--)
        {
                uIndex = uchCRCHi ^ *puchMsg++ ;
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                uchCRCLo = auchCRCLo[uIndex] ;
        }
        return ((uchCRCHi<< 8)  | (uchCRCLo)) ;
}//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




#if USART1_RX_EN   //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;


static void USART1_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3,ENABLE);
       
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_2; //PA9 | PA2 (USART1.TX | USART2.TX)&#184;′ó&#195;í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_9| GPIO_Pin_2);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_3;//PA10 | PA3 (USART1.RX | USART2.RX)&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_10| GPIO_Pin_3);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;    //PB11(USART3.TX)&#184;′ó&#195;í&#198;íìê&#189;ê&#228;3&#246;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_11);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //PB10(USART3.RX)&#184;&#161;&#191;&#213;ê&#228;è&#235;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_10);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;  //USART3&#191;&#216;&#214;&#198;&#189;&#197;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);       
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;  //USART2&#191;&#216;&#214;&#198;&#189;&#197;  0&#189;óê&#213; 1·¢&#203;í
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
        GPIO_ResetBits(GPIOD,GPIO_Pin_7);       
       
        NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        USART_DeInit(USART1);
        USART_InitStructure.USART_BaudRate=19200;
        USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
        USART_InitStructure.USART_WordLength=USART_WordLength_9b;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_Parity=USART_Parity_Even;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_Init(USART1,&USART_InitStructure);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);       
       
        NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn | USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        USART_DeInit(USART2);
        USART_DeInit(USART3);
        USART_InitStructure.USART_BaudRate=19200;
        USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
        USART_InitStructure.USART_WordLength=USART_WordLength_9b;
        USART_InitStructure.USART_StopBits=USART_StopBits_1;
        USART_InitStructure.USART_Parity=USART_Parity_Even;
        USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        USART_Init(USART2,&USART_InitStructure);
        USART_Init(USART3,&USART_InitStructure);
       

        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
//        USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
        USART2_TX_EN=1;
        USART_Cmd(USART1,ENABLE);       
        USART_Cmd(USART2,ENABLE);
//        USART_Cmd(USART3,ENABLE);       
//  Timer7_Init();
        Timer6_Init();

       
        }
  //&#182;¨ê±&#198;÷63&#245;ê&#188;&#187;ˉ£&#172;&#197;D&#182;&#207;&#214;÷&#187;úêy&#190;Yê&#199;·&#241;&#189;óê&#213;íê3é
void Timer6_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
        //TIM23&#245;ê&#188;&#187;ˉ
        TIM_DeInit(TIM6);
        TIM_TimeBaseStructure.TIM_Period=(USART1_Frame_Distance-1)*10;
        TIM_TimeBaseStructure.TIM_Prescaler=719;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);

        //TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_InternalClockConfig(TIM6);
        //TIM6&#214;D&#182;&#207;·&#214;×é&#197;&#228;&#214;&#195;TIM2_IRQn
        /*
        NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;  //TIM7&#214;D&#182;&#207;&#212;′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;2&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;  //&#207;ìó|ó&#197;&#207;è&#188;&#182;3&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //IRQ&#214;D&#182;&#207;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);  //3&#245;ê&#188;&#187;ˉNVIC_InitStructure       
        */
}
void Timer7_Init(void)    //&#182;¨ê±&#198;÷73&#245;ê&#188;&#187;ˉ£&#172;&#197;D&#182;&#207;′ó&#187;ú·μ&#187;&#216;êy&#190;Yê&#199;·&#241;&#189;óê&#213;íê3é
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);
        //TIM73&#245;ê&#188;&#187;ˉéè&#214;&#195;
        TIM_TimeBaseStructure.TIM_Period=USART2_Frame_Distance*10;//ms éè&#214;&#195;&#212;ú&#207;&#194;ò&#187;&#184;&#246;&#184;üD&#194;ê&#194;&#188;t×°è&#235;&#187;&#238;&#182;ˉμ&#196;×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#188;&#196;′&#230;&#198;÷&#214;ü&#198;úμ&#196;&#214;μ
        TIM_TimeBaseStructure.TIM_Prescaler=7199;  //ó&#195;à′éè&#214;&#195;×÷&#206;aTimxê±&#214;ó&#198;μ&#194;ê3yêyμ&#196;&#212;¤·&#214;&#198;μ&#214;μ£&#172;éè&#214;&#195;&#188;&#198;êy&#198;μ&#194;ê&#206;a10khz
        TIM_TimeBaseStructure.TIM_ClockDivision=0;  //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);  //&#184;ù&#190;YTIM_TimeBaseInitStructure&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;
        TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);  //&#212;êDíTIM7&#184;üD&#194;&#214;D&#182;&#207;
        //TIM7&#214;D&#182;&#207;·&#214;×é&#197;&#228;&#214;&#195;
        NVIC_InitStructure.NVIC_IRQChannel=TIM7_IRQn;  //TIM7&#214;D&#182;&#207;&#212;′
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;2&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;  //&#207;ìó|ó&#197;&#207;è&#188;&#182;3&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;  //IRQ&#214;D&#182;&#207;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);  //3&#245;ê&#188;&#187;ˉNVIC_InitStructure
}

void USART1_IRQHandler(void)
{
        uint8_t Res;
#if SYSTEM_SUPPORT_OS                 //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
        {
                Res=USART_ReceiveData(USART1);
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);               
                if((USART1_RX_STA&0x8000)==0)  //&#189;óê&#213;&#206;′íê3é
                {
                        if(USART1_RX_STA&0x4000)  //&#189;óê&#213;μ&#189;á&#203;0x0D
                        {
                               
                                if(Res!=0x0a) USART1_RX_STA=0;  //&#189;óê&#213;′í&#206;ó£&#172;&#214;&#216;D&#194;&#191;aê&#188;
                                else USART1_RX_STA|=0x8000;   //&#189;óê&#213;íê3é
                        }
                        else //&#206;′&#189;óê&#213;μ&#189;0x0D
                        {
                                if(Res==0x0D) USART1_RX_STA|=0x4000;
                                else
                                {
                                        USART1_RX_BUF[USART1_RX_STA&0x3fff]=Res;
                                        USART1_RX_STA++;
                        TIM_ClearFlag(TIM6,TIM_FLAG_Update);
                        TIM_SetCounter(TIM6,0);  //&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;×&#214;&#189;ú&#189;&#171;&#182;¨ê±&#198;÷&#199;&#229;0
                        TIM_Cmd(TIM6,ENABLE); //&#191;aê&#188;&#188;&#198;ê±                                                       
                                        if(USART1_RX_STA>(USART1_REC_LEN-1)) USART1_RX_STA=0;
                                }
                        }
                }               
        }
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
       
}

#endif
/*
static void RS485_Init(void)
{
       
}
*/

void USART2_IRQHandler(void)
{
        uint8_t Res;
        if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
        {
                if(USART_GetFlagStatus(USART2,USART_FLAG_NE|USART_FLAG_FE|USART_FLAG_PE))
                        ErrPace=2; //&#188;ì2aμ&#189;&#212;&#235;ò&#244;′í&#206;ó&#161;¢&#214;&#161;′í&#206;óoíD£&#209;é′í&#206;ó
                else
                        ErrPace=0;
                Res=USART_ReceiveData(USART2);
                USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                if(((USART2_RX_STA&0X3FFF)<256)&&(ErrPace==0))
                {
                        USART2_RX_BUF[USART2_RX_STA&0x3fff]=Res;
                        //USART2_RX_CNT++;
                        USART2_RX_STA++;
//                        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);  //&#199;&#229;3y&#182;¨ê±&#198;÷TIM7μ&#196;&#214;D&#182;&#207;
                        TIM_ClearFlag(TIM6,TIM_FLAG_Update);
                        TIM_SetCounter(TIM6,0);  //&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;×&#214;&#189;ú&#189;&#171;&#182;¨ê±&#198;÷&#199;&#229;0
                        TIM_Cmd(TIM6,ENABLE); //&#191;aê&#188;&#188;&#198;ê±               
                       
//                        TIM_ClearITPendingBit(TIM7,TIM_IT_Update);  //&#199;&#229;3y&#182;¨ê±&#198;÷TIM7μ&#196;&#214;D&#182;&#207;
//                        TIM_SetCounter(TIM7,0);  //&#189;óê&#213;μ&#189;ò&#187;&#184;&#246;×&#214;&#189;ú&#189;&#171;&#182;¨ê±&#198;÷&#199;&#229;0
//                        TIM_Cmd(TIM7,ENABLE); //&#191;aê&#188;&#188;&#198;ê±
                }
                else
                        printf("BBBBBBBBBBBBB");
        }
       
}
void TIM6_IRQHandler(void)
{
//        uint8_t i;
//  uint16_t CalCRC;


}

void TIM7_IRQHandler(void)
{
        uint8_t i=0;
        if(TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET)
        {
                TIM_ClearITPendingBit(TIM7,TIM_IT_Update);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;
                TIM_Cmd(TIM7,DISABLE); //1&#216;&#182;¨ê±&#198;÷
                //USART2_TX_EN=1;//í£&#214;1&#189;óê&#213;£&#172;&#199;D&#187;&#187;&#206;a·¢&#203;í×′ì&#172;
                printf(" à′×&#212;±&#228;&#198;μ&#198;÷μ&#196;·′à&#161;&#207;&#251;&#207;¢&#206;a£o ");
                USART2_RX_Flag=1;  //USART2&#189;áê&#248;±ê&#188;&#199;&#206;&#187;
                ErrPace=1;
                USART2_RX_BUF[USART2_RX_CNT]=0x0D;
                USART2_RX_BUF[++USART2_RX_CNT]=0x0A;
                for(i=0;i<USART2_RX_CNT;i++)
                {
                        USART_SendData(USART1,USART2_RX_BUF[i]);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                }
                printf(" ");
        }
}

void COMM_Init(void)
{
        USART1_Init();
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。