娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年04月23日(星期三)

正在發生

2018年04月23日 | stm32f407之CAN控制器(操作寄存器)

發布者:夢想學院 來源: eefocus關鍵字:stm32f407  CAN控制器  操作寄存器 手機看文章 掃描二維碼
隨時隨地手機看文章

首先簡單介紹一下CAN總線,關于CAN總線是誰發明的,CAN總線的歷史,CAN總線的發展,CAN總線的應用場合,這些,通通不說。這里只是以我個人理解,簡單說說CAN通信。CAN總線的端點沒有地址(除非自己在幀里定義地址),CAN總線通信不用地址,用標識符,不是單獨的誰發給誰,而是,你總是發送給整個網絡。然后每個節點都有過濾器,對網絡上的傳播的幀的標識符進行過濾,自己想要什么樣的幀,可以設置自己的過濾器,接收相關的幀信息。如果兩個節點同時發送怎么辦?這個不用我們擔心,CAN控制器會自己仲裁,讓高優先級的幀先發。

然后我們可以了解一下stm32的CAN控制器。


如上圖所示,stm32有兩個can控制器,can1(主),和can2(從),其中過濾器的設置是通過can1來設置,其他工作模式,波特率等,可以各自設置。每個控制器有三個發送郵箱,兩個fifo,每個fifo有三個接收郵箱。


發送:選擇一個空的發送郵箱,把幀信息寫到該發送郵箱的寄存器里,請求發送,控制器就會根據標識符的優先級把幀先后發送出去。


接收:如果接收到的幀的標識符能過過濾表的一系列過濾,該幀信息就會保存在fifo接收郵箱的寄存器里。

         

fifo1,每組都包括兩個32位存儲器,可以配置成一個32位有位屏蔽功能的標識符過濾器,或者兩個32位完全匹配的標識符過濾器,或者兩個16位有位屏蔽功能的標識符過濾器,或者四個16位完全匹配的標識符過濾器。如下圖所示:



我所說的完全匹配的意思是,接收到的幀的標識符每一位都要跟過濾器對應的位一樣,才能過得了這個過濾器。有位屏蔽功能的意思是一個寄存器放標識符,一個放屏蔽掩碼,屏蔽掩碼為1的位對應的接收到的幀的標識符的位與對應的放標識符的寄存器的位一致,就能通過。


傳輸一位的時間和波特率的計算:

 

CAN控制器的波特率是由APB時鐘線和CAN位時序寄存器CAN_BTR的TS2[3:0]、TS1[2:0]和BRP[9:0]確定的,其中,TS1[2:0]定義了時間段1占用多少個時間單元,TS2[3:0]定義了時間段2占用多少個時間單元,BRP[9:0]定義對APB1時鐘的分頻。

 

PS:設置波特率為1M


其中Tpclk為APB1的時鐘周期,假設為

Tpclk = 1/42M

0≦TS1≦7

0≦TS2≦15

0≦BRP≦1021

根據以上數據,有

(TS2+TS1+3)(BRP+1)=42

令BRP=2,有

TS2+TS1=11

令TS1=8,TS2=3


設置步驟:

1.     設置中斷優先級分組(如果之前沒有設置),這個最好一個程序里只在開頭設置一次。

2.     使能相關GPIO時鐘。

3.     選擇相關GPIO引腳的復用功能。

4.     設置相關GPIO引腳為復用模式。

5.     設置相關GPIO引腳的速度,方式。

6.     設置主控制寄存器MCR,進入初始化模式

7.     等待進入初始化模式

8.     設置波特率。

9.     其他設置。

10.  如果要用到中斷,在中斷使能寄存器IER中使能相關中斷響應。

11.  如果要用到中斷,設置相關中斷優先級(NVIC_IP)。

12.  如果要用到中斷,使能相關中斷(NVIC_ISER)。

13.  設置主控制寄存器MCR,進入正常工作模式。

14.  設置FMR,使過濾器組工作在初始化模式。

15.  設置FMR的CAN2SB,確定CAN2的過濾器組從哪一組開始。

16.  設置用到的過濾器組的工作方式。

17.  設置用到的過濾器組的位寬。

18.  給fifo0和fifo2劃分(關聯)過濾組。

19.  禁用用到的過濾器組。

20.  設置過濾器組的標識符,幀類型等。

21.  使能相關過濾器組。

22.  設置FMR,使過濾器組工作在正常模式。

23.  如果要用中斷,編寫中斷服務函數(函數名是固定的)。

24.  中斷服務函數里檢查是哪個中斷。

25.  編寫相應服務程序。


程序:

/************************************  

    標題:操作CAN的練習  

    軟件平臺:IAR for ARM6.21  

    硬件平臺:stm32f4-discovery  

    主頻:168M  

      

    描述:通過硬件收發器連接CAN1,CAN2  

          組成一個兩個端點的網絡  

  

          CAN1循環發出數據幀  

  

          CAN2接收過濾數據幀  

  

          用uart把CAN2接收到  

          的數據幀發到超級終端  

  

    author:小船  

    data:2012-08-14  

*************************************/  

  

#include   

#include "MyDebugger.h"  

  

#define RECEIVE_BUFFER_SIZE 20  

  

u32 CAN2_receive_buffer[RECEIVE_BUFFER_SIZE][4];  

u8 UART_send_buffer[1800];  

u8 Consumer = 0;  

u8 Producer = 0;  

  

u32 Gb_TimingDelay;  

void Delay(uint32_t nTime);  

void TIM7_init();//定時1s  

u32 get_rece_data();  

void CAN_GPIO_config();  

  

void main ()  

{     

  

  u32 empty_box;  

  SysTick_Config(SystemCoreClock / 1000); //設置systemtick一毫秒中斷  

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中斷優先級分組 搶占:響應=3:1  

   

  MyDebugger_Init();  

  TIM7_init();  

  MyDebugger_Message( "\n\rtesting......\n\r" ,   

                     sizeof("\n\rtesting......\n\r")/sizeof(char) );  

    

  CAN_GPIO_config();  

    

  RCC->APB1ENR |= ((1<<25)|(1<<26));//使能CAN1、CAN2時鐘  

    

  CAN1->MCR = 0x00000000;  

  /*  

  請求進入初始化模式  

  禁止報文自動重傳  

  自動喚醒模式  

  */  

  CAN1->MCR |= ((1<<0)|(1<<4)|(1<<5));  

  CAN1->MCR &= ~(1<<16);//在調試時,CAN照常工作  

    

  while(!(CAN1->MSR & 0xfffffffe))  //等待進入初始化模式  

  {  

    MyDebugger_LEDs(orange, on);  

  }  

  MyDebugger_LEDs(orange, off);  

    

  /*  

  正常模式  

  重新同步跳躍寬度(1+1)tq  

  TS2[2:0]=3  

  TS1[3:0]=8  

  BRP[9:0]=2  

    

  ps:  

  tq = (BRP[9:0] + 1) x tPCLK,  

  tBS2 = tq x (TS2[2:0] + 1),  

  tBS1 = tq x (TS1[3:0] + 1),  

  NominalBitTime = 1 × tq+tBS1+tBS2,  

  BaudRate = 1 / NominalBitTime  

    

  波特率設為1M  

  */  

  CAN1->BTR = ((0<<30)|(0x01<<24)|(3<<20)|(8<<16)|(2<<0));  

    

  CAN1->MCR &= ~(0x00000001);//正常工作模式  

    

  CAN2->MCR = 0x00000000;  

  /*  

  請求進入初始化模式  

  禁止報文自動重傳  

  自動喚醒模式  

  */  

  CAN2->MCR |= ((1<<0)|(1<<4)|(1<<5));  

  CAN2->MCR &= ~(1<<16);//在調試時,CAN照常工作  

    

  while(!(CAN2->MSR & 0xfffffffe))  //等待進入初始化模式  

  {  

    MyDebugger_LEDs(orange, on);  

  }  

  MyDebugger_LEDs(orange, off);  

    

  /*  

  正常模式  

  重新同步跳躍寬度(1+1)tq  

  TS2[2:0]=3  

  TS1[3:0]=8  

  BRP[9:0]=2  

    

  ps:  

  tq = (BRP[9:0] + 1) x tPCLK,  

  tBS2 = tq x (TS2[2:0] + 1),  

  tBS1 = tq x (TS1[3:0] + 1),  

  NominalBitTime = 1 × tq+tBS1+tBS2,  

  BaudRate = 1 / NominalBitTime  

    

  波特率設為1M  

  */  

  CAN2->BTR = ((0<<30)|(0x01<<24)|(3<<20)|(8<<16)|(2<<0));  

    

  CAN2->IER &= 0x00000000;  

  /*  

  FIFO1消息掛號中斷使能  

  FIFO1滿中斷使能  

  FIFO1溢出中斷使能  

  */  

  CAN2->IER |= ((1<<4)|(1<<5)|(1<<6));  

    

    

  NVIC->IP[65] = 0xa0;   //搶占優先級101,響應優先級0   

  NVIC->ISER[2] |= (1<<1);  //使能中斷線65,也就是can2_rx1中斷  

    

  CAN2->MCR &= ~(0x00000001);//正常工作模式  

    

    

  //總共有28組過濾器  

  CAN1->FMR |= 1; //過濾器組工作在初始化模式  

    

  CAN1->FMR &= 0xffffc0ff;//CAN2的過濾器組從14開始  

  CAN1->FMR |= (14<<8);  

    

  CAN1->FM1R |= (1<<14);//過濾器組14的寄存器工作在標識符列表模式  

                         

                        //位寬為16位,2個32位分為四個16位寄存器,過濾四個標識符  

    

  //CAN1->FS1R |= (1<<15);//過濾器組15為單個32位寄存器,用于擴展標識符  

    

  CAN1->FFA1R = 0x0fffc000;//0~13號過濾器組關聯到fifo0,14~27號過濾器組關聯到fifo1  

    

  CAN1->FA1R &= ~(1<<14);//禁用過濾器組14  

    

   /*  

  過濾器組0寄存器分為4個十六位過濾器:  

  標識符列表:  

  過濾器編號        匹配標準標識符             RTR       IDE           EXID[17:15]  

     0              0x7cb(111 1100 1011b)    數據幀    標準標識符     000b  

     1              0x4ab(100 1010 1011b)    數據幀    標準標識符     000b  

     2              0x7ab(111 1010 1011b)    數據幀    標準標識符     000b    

     3              0x40b(100 0000 1011b)    數據幀    標準標識符     000b    

  */  

  CAN1->sFilterRegister[14].FR1 &= 0x00000000;  

  CAN1->sFilterRegister[14].FR2 &= 0x00000000;  

  CAN1->sFilterRegister[14].FR1 |= ((0x7cb<<5)|(0<<4)|(0<<3));  

  CAN1->sFilterRegister[14].FR1 |= ((0x4ab<<21)|(0<<20)|(0<<19));  

  CAN1->sFilterRegister[14].FR2 |= ((0x7ab<<5)|(0<<4)|(0<<3));  

  CAN1->sFilterRegister[14].FR2 |= ((0x40b<<21)|(0<<20)|(0<<19));  

    

  CAN1->FA1R |= (1<<14);//使能過濾器組14  

     

  CAN1->FMR &= ~1; //過濾器組正常工作  

    

  while(1)  

  {  

    /*  

    選擇空的發送郵箱:  

    標準標識符0x7ab(111 1010 1011b)  

    數據幀  

    不使用擴展標識符  

    */  

    if( CAN1->TSR & ((1<<26)|(1<<27)|(1<<28)) )  

    {  

      empty_box = ((CAN1->TSR>>24) & 0x00000003);   

      CAN1->sTxMailBox[empty_box].TIR = (0x7ab<<21);    

        

      CAN1->sTxMailBox[empty_box].TDTR &= 0xfffffff0;  

      CAN1->sTxMailBox[empty_box].TDTR |= 0x00000008;//發送數據長度為8  

        

      CAN1->sTxMailBox[empty_box].TDLR = 0x12345678;  

        

      CAN1->sTxMailBox[empty_box].TDHR = 0x9abcdef0;  

        

      CAN1->sTxMailBox[empty_box].TIR |= (1<<0);//請求發送  

    }  

    else  

    {  

      MyDebugger_LEDs(orange, on);  

    }  

    Delay(100);  

      

     /*  

    選擇空的發送郵箱:  

    標準標識符0x4ab(100 1010 1011b)  

    數據幀  

    不使用擴展標識符  

    */  

    if( CAN1->TSR & ((1<<26)|(1<<27)|(1<<28)) )  

    {  

      empty_box = ((CAN1->TSR>>24) & 0x00000003);   

      CAN1->sTxMailBox[empty_box].TIR = (0x4ab<<21);    

        

      CAN1->sTxMailBox[empty_box].TDTR &= 0xfffffff0;  

      CAN1->sTxMailBox[empty_box].TDTR |= 0x00000008;//發送數據長度為8  

        

      CAN1->sTxMailBox[empty_box].TDLR = 0x56781234;  

        

      CAN1->sTxMailBox[empty_box].TDHR = 0x9abcdef0;  

        

      CAN1->sTxMailBox[empty_box].TIR |= (1<<0);//請求發送  

    }  

    else  

    {  

      MyDebugger_LEDs(orange, on);  

    }  

    Delay(100);  

      

     /*  

    選擇空的發送郵箱:  

    標準標識符0x7cb(100 1010 1011b)  

    數據幀  

    不使用擴展標識符  

    */  

    if( CAN1->TSR & ((1<<26)|(1<<27)|(1<<28)) )  

    {  

      empty_box = ((CAN1->TSR>>24) & 0x00000003);   

      CAN1->sTxMailBox[empty_box].TIR = (0x7cb<<21);    

        

      CAN1->sTxMailBox[empty_box].TDTR &= 0xfffffff0;  

      CAN1->sTxMailBox[empty_box].TDTR |= 0x00000006;//發送數據長度為6  

        

      CAN1->sTxMailBox[empty_box].TDLR = 0x56781234;  

        

      CAN1->sTxMailBox[empty_box].TDHR = 0x00009abc;  

        

      CAN1->sTxMailBox[empty_box].TIR |= (1<<0);//請求發送  

    }  

    else  

    {  

      MyDebugger_LEDs(orange, on);  

    }  

    Delay(100);  

      

     /*  

    選擇空的發送郵箱:  

    標準標識符0x40b(100 0000 1011b)  

    數據幀  

    不使用擴展標識符  

    */  

    if( CAN1->TSR & ((1<<26)|(1<<27)|(1<<28)) )  

    {  

      empty_box = ((CAN1->TSR>>24) & 0x00000003);   

      CAN1->sTxMailBox[empty_box].TIR = (0x40b<<21);    

        

      CAN1->sTxMailBox[empty_box].TDTR &= 0xfffffff0;  

      CAN1->sTxMailBox[empty_box].TDTR |= 0x00000004;//發送數據長度為4  

        

      CAN1->sTxMailBox[empty_box].TDLR = 0x56781234;  

        

      CAN1->sTxMailBox[empty_box].TDHR = 0x00000000;  

        

      CAN1->sTxMailBox[empty_box].TIR |= (1<<0);//請求發送  

    }  

    else  

    {  

      MyDebugger_LEDs(orange, on);  

    }  

    Delay(100);  

      

   }  

}  

  

/****************************************  

  函數名:CAN_GPIO_config  

  參數:無  

  返回值:無  

  功能:設置CAN1,2控制器用到IO口  

  CAN1_TX---------PD1  

  CAN1_RX---------PB8  

  CAN2_TX---------PB13  

  CAN2_RX---------PB5  

****************************************/  

void CAN_GPIO_config()  

{  

  RCC->AHB1ENR |= ((1<<1) | (1<<3));//使能GPIOB、D時鐘  

  GPIOB->AFR[0] |= 0x00900000;      //AF9  

  GPIOB->AFR[1] |= 0x00900009;  

  GPIOD->AFR[0] |= 0x00000090;  

      

  GPIOB->MODER &= 0xF3FCF3FF; //第二功能  

  GPIOB->MODER |= 0x08020800;  

  GPIOD->MODER &= 0xFFFFFFF3;   

  GPIOD->MODER |= 0x00000008;  

    

  GPIOB->OSPEEDR &= 0xF3FCF3FF; //50M  

  GPIOB->OSPEEDR |= 0x08020800;  

  GPIOD->OSPEEDR &= 0xFFFFFFF3;   

  GPIOD->OSPEEDR |= 0x00000008;  

    

  GPIOB->PUPDR &= 0xF3FCF3FF;   //上拉  

  GPIOB->PUPDR |= 0x04010400;  

  GPIOD->PUPDR &= 0xFFFFFFF3;   

  GPIOD->PUPDR |= 0x00000004;   

}  

  

/****************************************  

  函數名:CAN2_RX1_IRQHandler  

  參數:無  

  返回值:無  

  功能:CAN2fifo1接收中斷處理  

        把信息存進循環隊列  

****************************************/  

void CAN2_RX1_IRQHandler()  

{  

  if(CAN2->RF1R & (0x00000003))//接收到新的消息,fifo1非空  

  {  

    Producer++;  

    if(Producer == RECEIVE_BUFFER_SIZE)Producer = 0;  

    if(Producer != Consumer)  

    {  

      CAN2_receive_buffer[Producer][0] = CAN2->sFIFOMailBox[1].RIR;  

      CAN2_receive_buffer[Producer][1] = CAN2->sFIFOMailBox[1].RDTR;  

      CAN2_receive_buffer[Producer][2] = CAN2->sFIFOMailBox[1].RDLR;  

      CAN2_receive_buffer[Producer][3] = CAN2->sFIFOMailBox[1].RDHR;  

    }  

    else  

    {  

      if(Producer == 0)Producer = RECEIVE_BUFFER_SIZE;  

      Producer--;  

      MyDebugger_LEDs(blue, on);  

    }     

    CAN2->RF1R |= (1<<5);//釋放郵箱  

  }  

    

  if(CAN2->RF1R & (1<<3))//fifo0滿  

  {  

    MyDebugger_LEDs(red, on);  

    CAN2->RF1R &= ~(1<<3);  

  }  

    

  if(CAN2->RF1R & (1<<4))//fifo0溢出  

  {  

    MyDebugger_LEDs(red, on);  

    CAN2->RF1R &= ~(1<<4);  

  }  

}  

  

/****************************************  

  函數名:TIM7_init  

  參數:無  

  返回值:無  

  功能:初始化定時器7  

        作1s定時用  

****************************************/  

void TIM7_init()  

{  

  RCC->APB1ENR |= (1<<5); //打開TIM7時鐘  

  TIM7->PSC = 8399; //對時鐘84M進行8400分頻,使得計數頻率為10k  

  TIM7->ARR = 10000;  //定時一秒  

  TIM7->CNT = 0;  //清空計數器  

  TIM7->CR1 |= (1<<7); //自動重裝載預裝載使能  

  TIM7->DIER |= 1; //使能中斷  

    

  NVIC->IP[55] = 0xe0;  

  NVIC->ISER[1] |= (1<<(55-32));  

    

  TIM7->CR1 |= 1; //開始計時  

}  

  

/****************************************  

  函數名:TIM7_IRQHandler  

  參數:無  

  返回值:無  

  功能:定時器7中斷處理  

        1s定時到  

        把can2收到的信息轉換格式  

        用usrt發送到超級終端顯示  

****************************************/  

void TIM7_IRQHandler(void)  

{  

  u32 length;  

  if(TIM7->SR)  

  {  

    length = get_rece_data();  

    MyDebugger_Message( UART_send_buffer, length );  

    TIM7->SR &= ~(0x0001);   

  }  

}  

  

/****************************************  

  函數名:get_rece_data  

  參數:無  

  返回值:length 整理后要發送數據的長度  

  功能:把循環隊列的信息取出  

        進行格式轉換  

        把信息存到uart發送緩沖區  

****************************************/  

u32 get_rece_data()  

{  

  u8 filter_No;  

  u8 Data_length;   

  char i;  

  u32 length = 0;  

  const char ascii[16] = {'0', '1', '2', '3', '4', '5', '6', '7',  

                          '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};  

  while(1)  

  {  

    if(Producer != Consumer)  

      {  

        Consumer++;  

        if(Consumer == RECEIVE_BUFFER_SIZE)Consumer=0;  

          

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';  

        //Filter No.xx  

        UART_send_buffer[length++] = 'F';  

        UART_send_buffer[length++] = 'i';   

        UART_send_buffer[length++] = 'l';  

        UART_send_buffer[length++] = 't';  

        UART_send_buffer[length++] = 'e';  

        UART_send_buffer[length++] = 'r';   

        UART_send_buffer[length++] = ' ';  

        UART_send_buffer[length++] = 'N';   

        UART_send_buffer[length++] = 'o';  

        UART_send_buffer[length++] = '.';  

     

        filter_No = (CAN2_receive_buffer[Consumer][1]>>8) & 0x000000ff;  

        UART_send_buffer[length++] = filter_No%100/10 + '0';  

        UART_send_buffer[length++] = filter_No%10 + '0';  

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';  

          

        //DataLength:x  

        UART_send_buffer[length++] = 'D';   

        UART_send_buffer[length++] = 'a';  

        UART_send_buffer[length++] = 't';   

        UART_send_buffer[length++] = 'a';  

        UART_send_buffer[length++] = 'L';  

        UART_send_buffer[length++] = 'e';   

        UART_send_buffer[length++] = 'n';  

        UART_send_buffer[length++] = 'g';   

        UART_send_buffer[length++] = 't';  

        UART_send_buffer[length++] = 'h';  

        UART_send_buffer[length++] = ':';  

        Data_length = CAN2_receive_buffer[Consumer][1] & 0x0000000f;  

        UART_send_buffer[length++] = Data_length % 10 + '0';  

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';  

          

          

        if(CAN2_receive_buffer[Consumer][0] & (1<<1))  

        {  

          UART_send_buffer[length++] = 'R';   

          UART_send_buffer[length++] = 'e';  

          UART_send_buffer[length++] = 'm';   

          UART_send_buffer[length++] = 'o';  

          UART_send_buffer[length++] = 't';  

          UART_send_buffer[length++] = 'e';   

          UART_send_buffer[length++] = 'F';  

          UART_send_buffer[length++] = 'r';   

          UART_send_buffer[length++] = 'a';  

          UART_send_buffer[length++] = 'm';  

          UART_send_buffer[length++] = 'e';  

        }  

        else  

        {  

          UART_send_buffer[length++] = 'D';   

          UART_send_buffer[length++] = 'a';  

          UART_send_buffer[length++] = 't';   

          UART_send_buffer[length++] = 'a';   

          UART_send_buffer[length++] = 'F';  

          UART_send_buffer[length++] = 'r';   

          UART_send_buffer[length++] = 'a';  

          UART_send_buffer[length++] = 'm';  

          UART_send_buffer[length++] = 'e';  

        }  

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';          

          

          

        if(CAN2_receive_buffer[Consumer][0] & (1<<2))  

        {  

          UART_send_buffer[length++] = 'e';   

          UART_send_buffer[length++] = 'x';  

          UART_send_buffer[length++] = 't';   

          UART_send_buffer[length++] = ' ';  

          UART_send_buffer[length++] = 'I';  

          UART_send_buffer[length++] = 'D';  

          UART_send_buffer[length++] = ':';  

            

          UART_send_buffer[length++] =   

            ascii[CAN2_receive_buffer[Consumer][0] >> 31];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 27)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 23)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 19)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 15)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 11)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 7)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 3)& 0x0000000f];  

        }  

        else  

        {  

          UART_send_buffer[length++] = 's';   

          UART_send_buffer[length++] = 't';  

          UART_send_buffer[length++] = 'd';   

          UART_send_buffer[length++] = ' ';  

          UART_send_buffer[length++] = 'I';  

          UART_send_buffer[length++] = 'D';  

          UART_send_buffer[length++] = ':';  

            

          UART_send_buffer[length++] =   

            ascii[CAN2_receive_buffer[Consumer][0] >> 29];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 25)& 0x0000000f];  

          UART_send_buffer[length++] =   

            ascii[(CAN2_receive_buffer[Consumer][0] >> 21)& 0x0000000f];          

        }  

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';  

          

        UART_send_buffer[length++] = 'D';   

        UART_send_buffer[length++] = 'a';  

        UART_send_buffer[length++] = 't';  

        UART_send_buffer[length++] = 'a';  

        UART_send_buffer[length++] = ':';  

        if(Data_length > 4)  

        {  

          for(i = 2*Data_length - 8; i > 0; i--)  

            UART_send_buffer[length++] =   

              ascii[(CAN2_receive_buffer[Consumer][3] >> ((i-1)*4))& 0x0000000f];  

            

          for(i = 8; i > 0; i--)  

            UART_send_buffer[length++] =   

              ascii[(CAN2_receive_buffer[Consumer][2] >> ((i-1)*4))& 0x0000000f];  

        }  

        else  

        {  

          for(i = 2*Data_length; i > 0; i--)  

            UART_send_buffer[length++] =   

              ascii[(CAN2_receive_buffer[Consumer][2] >> ((i-1)*4))& 0x0000000f];           

        }  

        UART_send_buffer[length++] = '\n';  

        UART_send_buffer[length++] = '\r';  

      }  

    else  

      break;  

  }  

  return length;  

}  

  

  

void Delay(uint32_t nTime)  

{   

  Gb_TimingDelay = nTime;  

  

  while(Gb_TimingDelay != 0);  

}  

  

void SysTick_Handler(void)  

{  

  if (Gb_TimingDelay != 0x00)  

  {   

    Gb_TimingDelay--;  

  }  

}  

運行結果:



關鍵字:stm32f407  CAN控制器  操作寄存器 引用地址:stm32f407之CAN控制器(操作寄存器)

上一篇:stm32f4使用Systick實現延時
下一篇:stm32F4 時基定時器(2)

推薦閱讀

  近日,由中美貿易戰引發的“中興事件”引起了電子行業熱議。從中,不僅折射出中國企業管控合規風險的能力滯后,成為進入到全球價值鏈競爭后的重大隱患,更反映出中國科技的發展依然被“缺芯少魂”的現狀所困擾。下面就隨網絡通信小編一起來了解一下相關內容吧。  盡管此事目前仍未定論,但從事發至今業界反應,以及媒體的發聲來看,用“頗為慌張”形...
隨著人工智能的發展,語音交互技術正在各個領域扎根,汽車也不例外。早在 2002年,英菲尼迪就推出了世界首款可用語音控制的汽車,而今天語音識別控制功能已經成為很多新車型的一大賣點。語音識別之外,外置麥克風的環境聲探測在ADAS中也發揮關鍵作用,猶如汽車的耳朵,犬吠聲、喇叭聲、警報聲......聲音信號有助于讓ADAS系統更加有效地掌握周邊環境。 此外...
前不久國內長江存儲宣布128層QLC 3D NAND研發成功,且已經在群聯和聯蕓兩家控制器廠的SSD上通過驗證,可應用于消費級SSD,并逐步進入企業級服務器、數據中心等領域,以滿足未來5G、AI時代多元化數據存儲需求。3D NAND存儲器在近些年來迅速發展,由于其具有較高的寫入速度和擦除速度,從而適合于存儲數據。3D NAND結構中包括多個層疊設置的氧化層和氮化...
美國汽車大廠福特汽車表示,受到芯片短缺的問題影響,在北美的5座工廠將進一步停產,該公司旗下最受歡迎的一款SUV和最賺錢的F-150皮卡生產也因而中斷。福特汽車表示,其位于芝加哥、底特律郊區和堪薩斯的工廠將再停產兩周,停產時間將延長至5月14日;位于加拿大安大略省的一家SUV工廠也將在停產一周。福特汽車制造和勞工事務副總裁John Savona表示,福特...

史海拾趣

問答坊 | AI 解惑

求USB設備轉存接口設計

1、設計無需計算機而能實現資料轉存的設備2、 內容及特點:用51單片機設計一個USB設備間轉存接口,實現資料從一個可移動設備中讀出并寫入另一個可移動設備的功能,解決人們外出旅游等需攜帶筆記本電腦的煩惱。3、設計方法:a) 單片機讀寫USB接口硬 ...…

查看全部問答∨

可取代石英振蕩器的單芯片全硅振蕩器(Si500)

Silicon Labs的全硅振蕩器單芯片Si500,支持從0.9 MHz至200 MHz的任何頻率,其基于CMOS的架構可大幅提高可靠度及性能,由于采用了大量IC制造流程可縮短交貨時間,適用于消費電子、存儲產品、計算機外設、視頻顯示以及工業應用等。請點擊下載本演講 ...…

查看全部問答∨

基于freescale QE128的低功耗設計

是中文版的,飛思卡爾出的appnote。不知道是哪位大蝦翻譯的,可以看看…

查看全部問答∨

示波器探頭

摘要:本篇文章的主要核心是示波器探頭,主要介紹其結構、分類、主要技術指標以及實際測試中對測量結果的影響,另外介紹了如何選用合適的示波器探頭,以及使用示波器探頭的注意事項。…

查看全部問答∨

計時器,通過4個獨立按鍵來控制

/*數碼管前三位顯示一個跑表,從000到999之間以1%秒速度運行    */ #include #define UINT unsigned int #define UCHAR unsigned char sbit s2 = P3 ^ 4; sbit s3 = P3 ^ 5; sbit s4 = P3 ^ 6; sbit s5 = P3 ^ 7; sbit dula = P2 ^ 6; ...…

查看全部問答∨

C51有關題目求教!!!

可以用C51做電流-電壓轉換電路嗎 有電路圖嗎…

查看全部問答∨

我要實現一個功能,請問怎么實現,有什么好的方案

功能很簡單,有40臺設備,我要在計算機里面采集這些設備幾點運行,幾點關閉,請問有什么好的方案?我是搞計算機編程的不懂電路,請問如何實現?我想的是,拆一個鍵盤,當設備通電時,一直按著某建,比如說,的一臺設備通電運行時我按著a建,第二臺設備運行時我按 ...…

查看全部問答∨

以太網的緩沖區不夠用怎么辦?請教各位幫忙!

IP數據報的最大長度是65535字節,然后它會分片,分成長度為1500字節的片(40多片)傳給MAC層,發送 (1)小弟最近很困惑,假如來了一個接收中斷,那如果接收端的以太網的buffer只有buffer[8][1500]這么大怎么辦? (2)9200手冊上說這個緩沖區 ...…

查看全部問答∨

看 《tcp/ip詳解卷2》 對 mbuf 中的宏 dtom 不理解

《tcp/ip詳解卷2》中 mbuf 中的宏 dtom 不理解 該宏這樣定義 /* dtom(x) -        convert data pointer within mbuf to mbuf pointer (XXX) */ #define        dtom(x)        & ...…

查看全部問答∨

VCD光盤格式

哪位老大知道VCD光盤中的INFO.VCD、ENTRIES.VCD、LOT.VCD、PSD.VCD等文件格式的?發我郵箱也可以:zxr415@163.com ,或者如果知道哪里的網站上有講的話,給個連接也可以,非常感謝…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 神木县| 文登市| 安泽县| 九龙县| 宣汉县| 依兰县| 娄烦县| 普兰店市| 丰宁| 拜城县| 赤壁市| 泊头市| 湘潭市| 泾川县| 怀宁县| 新化县| 金寨县| 武宣县| 图木舒克市| 万荣县| 开封市| 云龙县| SHOW| 汤阴县| 水富县| 遵化市| 文成县| 泌阳县| 师宗县| 尉犁县| 启东市| 临安市| 南召县| 永州市| 乐至县| 浪卡子县| 礼泉县| 云林县| 峨边| 博野县| 赤峰市|