为什么can引脚改成pa11和pa12就没有波形了,pd0和pd1就可以,复用功能已经注释了,其它程序都不变,为什么会这样?

2019-08-08 13:31发布

为什么can引脚改成pa11和pa12就没有波形了,pd0和pd1就可以,复用功能已经注释了,其它程序都不变,为什么会这样?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
yobuwen
1楼-- · 2019-08-08 16:10
#include "stm32f10x.h"
#include <stdio.h>

#define CAN1_RX0_INT_ENABLE 1

void RCC_Configuration(void)
{
        RCC_DeInit();//???RCC?????????
        RCC_HSEConfig(RCC_HSE_ON);//????????(HSE)

        if( RCC_WaitForHSEStartUp() != RESET)
        {
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//???????????--???????
                FLASH_SetLatency(FLASH_Latency_2);
               
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//??PLL????????
                RCC_PLLCmd(ENABLE);//??????PLL
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//?????RCC???????
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//??????(SYSCLK)
                while(RCC_GetSYSCLKSource() == RESET);//????????????
                RCC_HCLKConfig(RCC_SYSCLK_Div1);//??AHB??(HCLK)
                RCC_PCLK1Config(RCC_HCLK_Div1);//????AHB??(PCLK1)
                RCC_PCLK2Config(RCC_HCLK_Div1);//????AHB??(PCLK2)
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC,ENABLE);
        }
}
void USART_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        USART_InitStructure.USART_BaudRate = 115200;        //?????9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_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;

        USART_Init(USART1, &USART_InitStructure);
        //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//??????
        USART_Cmd(USART1, ENABLE);
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);          /*?????????,????????,?????????????*/
       
}

void CAN1_Init(u8 Tsjw,u8 Tbs2,u8 Tbs1,u16 Brp,u8 Mode)
{
          GPIO_InitTypeDef                 GPIO_InitStructure;
        CAN_InitTypeDef                CAN_InitStructure;
          CAN_FilterInitTypeDef          CAN_FilterInitStructure;
       
#if CAN1_RX0_INT_ENABLE
           NVIC_InitTypeDef  NVIC_InitStructure;
#endif
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE);
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);

//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//        GPIO_Init(GPIOD, &GPIO_InitStructure);
//       
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;     //
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure CAN pin: TX */   // PA12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//        GPIO_Init(GPIOB, &GPIO_InitStructure);
//       
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//        GPIO_Init(GPIOB, &GPIO_InitStructure);

//        GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
//        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
  
//-------------------CANμ¥&#212;aéè&#214;&#195;-------------------------------------//
           CAN_InitStructure.CAN_TTCM=DISABLE;        //·&#199;ê±&#188;&#228;′¥·¢í¨D&#197;&#196;£ê&#189;   
          CAN_InitStructure.CAN_ABOM=DISABLE;        //èí&#188;t×&#212;&#182;ˉà&#235;&#207;&#223;1üàí          
          CAN_InitStructure.CAN_AWUM=DISABLE;//&#203;ˉ&#195;&#223;&#196;£ê&#189;í¨1yèí&#188;t&#187;&#189;D&#209;(&#199;&#229;3yCAN->MCRμ&#196;SLEEP&#206;&#187;)
          CAN_InitStructure.CAN_NART=ENABLE;        //&#189;&#251;&#214;1±¨&#206;&#196;×&#212;&#182;ˉ′&#171;&#203;í
          CAN_InitStructure.CAN_RFLM=DISABLE;        //±¨&#206;&#196;2&#187;&#203;&#248;&#182;¨,D&#194;μ&#196;&#184;2&#184;&#199;&#190;éμ&#196;  
          CAN_InitStructure.CAN_TXFP=DISABLE;        //ó&#197;&#207;è&#188;&#182;ó鱨&#206;&#196;±êê&#182;·&#251;&#190;&#246;&#182;¨
               
          CAN_InitStructure.CAN_Mode= Mode;         //&#196;£ê&#189;éè&#214;&#195;
          CAN_InitStructure.CAN_SJW=Tsjw;        //&#214;&#216;D&#194;í&#172;2&#189;ì&#248;&#212;&#190;&#191;í&#182;è(Tsjw)&#206;atsjw+1&#184;&#246;ê±&#188;&#228;μ¥&#206;&#187; CAN_SJW_1tq~CAN_SJW_4tq
          CAN_InitStructure.CAN_BS1=Tbs1; //Tbs1·&#182;&#206;§CAN_BS1_1tq ~CAN_BS1_16tq
          CAN_InitStructure.CAN_BS2=Tbs2;//Tbs2·&#182;&#206;§CAN_BS2_1tq ~        CAN_BS2_8tq
          CAN_InitStructure.CAN_Prescaler=Brp;  //·&#214;&#198;μ&#207;μêy(Fdiv)&#206;abrp+1       
          CAN_Init(CAN1, &CAN_InitStructure);   // 3&#245;ê&#188;&#187;ˉCAN1 BS1>=tBS2 tBS2>=1&#184;&#246;CAN&#214;ü&#198;ú tBS2>=2tSJW
   
//-------------------&#197;&#228;&#214;&#195;1y&#194;&#203;&#198;÷-------------------------------------//
          CAN_FilterInitStructure.CAN_FilterNumber=0;          //1y&#194;&#203;&#198;÷0
          CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
          CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32&#206;&#187;
          CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32&#206;&#187;ID
          CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
          CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32&#206;&#187;MASK
          CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
           CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1y&#194;&#203;&#198;÷01&#216;áaμ&#189;FIFO0
          CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //&#188;¤&#187;&#238;1y&#194;&#203;&#198;÷0
          CAN_FilterInit(&CAN_FilterInitStructure);//&#194;&#203;2¨&#198;÷3&#245;ê&#188;&#187;ˉ
               
#if CAN1_RX0_INT_ENABLE       
          CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0&#207;&#251;&#207;¢1òo&#197;&#214;D&#182;&#207;&#212;êDí.                     
          NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     // &#214;÷ó&#197;&#207;è&#188;&#182;&#206;a1
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // ′&#206;ó&#197;&#207;è&#188;&#182;&#206;a0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
#endif
}   


/*********************************&#214;D&#182;&#207;·t&#206;&#241;oˉêy***************************************/
#if CAN1_RX0_INT_ENABLE
void USB_LP_CAN1_RX0_IRQHandler(void)
{
        int i=0;
        CanRxMsg RxMessage;
        CAN_Receive(CAN1, 0, &RxMessage);

        for(i=0;i<8;i++)
        {
        printf("rxbuf[%d]:%d ",i,RxMessage.Data[i]);
        }
}
#endif

/************************CAN Send Function***********************************
*@param  len:data length(<=8); msg:data pointer(8bytes)
*@retval 0:success; others:failt
*******************************************************************************/

u8 CAN1_Send_Msg(u8* msg,u8 len)
{       
  u8 mbox;
  u16 i=0;
  CanTxMsg TxMessage;
  TxMessage.StdId=0x12;         // ±ê×&#188;±êê&#182;·&#251;&#206;a0
  TxMessage.ExtId=0x12;         // éè&#214;&#195;à&#169;&#213;1±êê&#190;·&#251;£¨29&#206;&#187;£&#169;
  TxMessage.IDE=0;                  // ê1ó&#195;à&#169;&#213;1±êê&#182;·&#251;
  TxMessage.RTR=0;                  // &#207;&#251;&#207;¢ààDí&#206;aêy&#190;Y&#214;&#161;£&#172;ò&#187;&#214;&#161;8&#206;&#187;
  TxMessage.DLC=len;                                                         // ·¢&#203;íá&#189;&#214;&#161;D&#197;&#207;¢
  for(i=0;i<len;i++)
  TxMessage.Data[i]=msg[i];                                 // μúò&#187;&#214;&#161;D&#197;&#207;¢         
  mbox= CAN_Transmit(CAN1, &TxMessage);   
  i=0;
  while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;        //μè′y·¢&#203;í&#189;áê&#248;
  if(i>=0XFFF)return 1;
  return 0;               
}
/************************CAN Receive Function***********************************
*@param  buf:data buffer cache
*@retval 0:none datas; others:data length
*******************************************************************************/
u8 CAN1_Receive_Msg(u8 *buf)
{                                     
        u32 i;
        CanRxMsg RxMessage;
  if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;                //&#195;&#187;óD&#189;óê&#213;μ&#189;êy&#190;Y,&#214;±&#189;óí&#203;3&#246;
   
        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//&#182;áè&#161;êy&#190;Y       
  for(i=0;i<RxMessage.DLC;i++)
        {
  buf[i]=RxMessage.Data[i];  
        }
        return RxMessage.DLC;       
}


void delay(int num)
{
        while(num--);
}

int fputc(int ch , FILE *f)
{
        //USART_ClearFlag(USART1,USART_FLAG_TC);
        USART_SendData(USART1, (u8)ch);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        return (ch);
}
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void delay_ms(u16 nms)
{
         u32 temp;
         SysTick->LOAD = 9000*nms;
         SysTick->VAL=0X00;//?????
         SysTick->CTRL=0X01;//??,???????,???????
         do
         {
          temp=SysTick->CTRL;//????????
         }while((temp&0x01)&&(!(temp&(1<<16))));//??????
         SysTick->CTRL=0x00; //?????
         SysTick->VAL =0X00; //?????
}


int main()
{
        u8 re;
        u8 sendmsg[8] = {1,2,3,4,5,6,7,8};

        RCC_Configuration();
        USART_Configuration();
        GPIO_Configuration();

        CAN1_Init(CAN_SJW_1tq,CAN_BS2_3tq,CAN_BS1_12tq,9,CAN_Mode_Normal);//CAN_Mode_Normal  CAN_Mode_LoopBack
       
        while(1)
        {
//                GPIO_SetBits(GPIOC,GPIO_Pin_6);
//                delay_ms(500);
//                GPIO_ResetBits(GPIOC,GPIO_Pin_6);
//                delay_ms(500);

                printf ("ok");
                re = CAN1_Send_Msg(sendmsg,8);
                printf("re = %d ",re);
        }


}
目瞪狗呆
2楼-- · 2019-08-08 18:56
小白,帮顶一下

一周热门 更多>