女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何設置CAN引腳功能?如何在中斷中獲取CAN數據?

冬至子 ? 來源:郝飛的俱俱 ? 作者:hf ? 2023-08-10 17:34 ? 次閱讀

MCU:MCU通過APB總線訪問CAN外設。② CAN外設:掛載在MCU的APB總線上,實現基本協議CAN2.0A、擴展協議CAN2.0B、接收濾波器、發送優先級及對CAN FD的支持等,并留出外設訪問接口給MCU,以便MCU控制。③ CAN收發器:看其收發器框圖,因僅包含CANH、CANL總線,所以TXD發出的CANH、CANL與RXD讀出的CANH、CANL是連接在一起的,因此CAN收發器TXD發送出來的總線信號會立即被轉換從RXD輸出給CAN接口(LBME環回模式使用此特性)

圖片

MCU通過APB總線訪問CAN外設,通過配置相關寄存器配置CAN的運行環境,通過寫BUF及相關配置位發送CAN幀;通過輪詢某些狀態位或者中斷,讀取收到的BUF或者CAN外設目前處于的狀態,并依據部分狀態作出相應的動作;CAN收發器將CAN外設的CAN_TX高低電平信號轉換為CANH、CANL總線信號,并將接收到的CANH、CANL總線信號轉換為CAN外設的CAN_RX高低電平信號,該信號輸送給CAN外設,CAN外設根據CAN接收濾波器的設置判斷是否接收該數據幀等等。

1、查看原理圖,看使用哪一個CAN接口。STB使用的引腳

圖片

#define CAN1_TX      (GPIO_PC15)  //pin 75
#define CAN1_RX      (GPIO_PC14)  //pin 74
#define CAN1_STB     (GPIO_PD5)   // pin9

2、進行初始化操作

CAN_InitHardwr();

定義兩個結構體變量,CAN_Config和CAN_BaudrateConfig

  1. 初始化硬件接口
    GPIO_SetFunc(CAN1_TX, GPIO_FUNC_1);//設置CAN1引腳復用功能
     GPIO_SetFunc(CAN1_RX, GPIO_FUNC_1);
     GPIO_SetDir(CAN1_STB, GPIO_OUTPUT);//設置CAN1收發器控制為IO控制
     //GPIO_FUNC_1 參考數據手冊中“信號多路復用和引腳分配”,使用function 1功能
    
  2. 使能CAN收發器
    CAN1_TRASCVER_NML;//使能CAN收發器
    //#define CAN1_TRASCVER_NML   do{GPIO_ResetPinBits(CAN1_STB);}while(0)
    
  3. 設置波特率和采樣點進行配置
/*
   設置波特率為500K,采樣點為81.25%.
   tSeg1 = (S_SEG_1 + 2); tSeg2 = (S_SEG_2 + 1).
   BandRate  = (48M / (S_PRESC + 1) / ((S_SEG_1 + 2) + (S_SEG_2 + 1)))
   SamplePoint = (tSeg1 / (tSeg1 + tSeg2)).
   在已經知道波特率與采樣點的情況下,經過計算后:tSeg1 = 13,tSeg2 = 3.
    */
   canBandrateConfig.S_PRESC  = 5;//分頻后時鐘為8M.
   canBandrateConfig.S_SEG_1  = 11;
   canBandrateConfig.S_SEG_2  = 2;
   canBandrateConfig.S_SJW  = 2;//滿足S_SJW <= tSeg2即可.
  1. 過濾器設置:選擇哪一個過濾器、指定過濾模式、過濾的ID類型
    16個過濾器中,可隨意選擇使用哪個,并制定其過濾模式,制定其過濾ID的類型.
     如果一個過濾器只需要接收一個ID,直接可將其設置CODE模式,然后根據ID類型設置過濾類型.
     如果一個過濾器需要接收多個ID,將其設置為MASK模式,并根據這幾個ID的實際類型設置過濾ID類型,如果既有STD又有EXT,則應選擇FILTER_IDE_STD_EXT_BOTH.
     此處加宏是為了更清楚的說明各種設置是否有效,在實際應用中,可將各種組合放在一起使用.
     #if (RECV_FRM_KIND_SEL == ONLY_RECV_STD_FRM)
     CAN_SetFilterParam( 0, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_STD_ONLY, CAN1_RECV_DATA_ID1);//使用CODE模式只接收STD幀
     CAN_SetFilterParam( 1, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_STD_ONLY, CAN1_RECV_DATA_ID2);//使用CODE模式只接收STD幀
     #endif
     #if (RECV_FRM_KIND_SEL == ONLY_RECV_EXT_FRM)
     CAN_SetFilterParam( 0, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_EXT_ONLY, CAN1_RECV_DATA_ID11);//使用CODE模式只接收EXT幀
     CAN_SetFilterParam( 1, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_EXT_ONLY, CAN1_RECV_DATA_ID12);//使用CODE模式只接收EXT幀
     #endif
     #if (RECV_FRM_KIND_SEL == RECV_STD_EXT_BOTH_FRM)
     CAN_SetFilterParam( 0, 1, CAN_FILTER_MASK_MODE, FILTER_IDE_STD_EXT_BOTH, (CAN1_RECV_DATA_ID1 & CAN1_RECV_DATA_ID11));//使用MASK模式接收兩種幀
     CAN_SetFilterParam( 1, 1, CAN_FILTER_MASK_MODE, FILTER_IDE_STD_EXT_BOTH, (CAN1_RECV_DATA_ID2 & CAN1_RECV_DATA_ID12));//使用MASK模式接收兩種幀
     #endif
    
  2. CAN_SetFilterParam( 0, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_STD_ONLY, CAN1_RECV_DATA_ID1);//使用CODE模式只接收STD幀
* @prototype CAN_SetFilterParam(uint8_t filterNum, uint8_t filterEn, CAN_FilterMode_TypeDef filterMode, CAN_FilterMask_TypeDef filterMask, uint32_t ID)
  *
  * @param[in] filterNum:過濾器編碼,015可用.
  * @param[in] filterEn:過濾器使能狀態,1使能,0禁能
  * @param[in] filterMode:CAN_FilterMode_TypeDef已定義.
  * @param[in] filterMask:參考CAN_FilterMask_TypeDef.
  * @param[in] ID
  * @return  void

參數說明:0:選用的過濾器編碼

1:1標識使能,0為禁止

CAN_FILTER_CODE_MODE:分code模式和mask模式,code只能接收一個ID,mask可以接收多個ID

FILTER_IDE_STD_ONLY:分標準幀、擴展幀、混合幀

ID:需要過濾的ID,表示這個ID可以通過,單片機可以接收到數據。

  1. 設置can配置
    canConfig.interruptEnable = TRUE;//使能中斷
     canConfig.TSSS = TRUE;//使用次發送緩沖區發送
     canConfig.canMode = CAN_MODE_NORMAL;
     canConfig.autoReset = TRUE;//CAN BUSOFF后,自動恢復
     canConfig.filterList = g_canFilterTab;//賦值過濾器設置list
    
  2. 設置回調函數CAN_SetEventCallBack(CAN1, CAN1_IRQnCallBack);
  3. /**
    * @prototype CAN1_IRQnCallBack(uint32_t event, uint32_t wparam, uint32_t lparam)
    *
    * @param[in] ...
    * @return  ...
    *
    * @brief    CAN1 module interrupt handler.
    *    CAN1中斷處理函數.
    */
    int32_t CAN1_IRQnCallBack(uint32_t event, uint32_t wparam, uint32_t lparam)
    {
     if (event & CAN_EVENT_RECVMSG)
     {
      if (CAN_IsMsgInReceiveBuf((CAN_Type*)lparam))
            {
                CAN_MessageRead((CAN_Type*)lparam, &g_recvCANMsgInfo);
    
       g_recvedCANDataRdy = TRUE;
            }
     }
    
     return 1;
    }
    
  4. 調用庫函數CAN_Initialize()。

CAN_Initialize(CAN1, &canConfig, &canBandrateConfig);//程序引用

CAN_Initialize(CAN_Type *CANx, CAN_Config *config, const CAN_BaudrateConfig *baudrate)//函數原型

參數說明:

  • @param[in] CANx: CAN type pointer
  • @param[in] config: CAN config
  • @param[in] baudrate: CAN baud rate
  • @return 0: no error, 1: Initialize error
void CAN_InitHardwr(void)
{
 CAN_Config canConfig = {0};
 CAN_BaudrateConfig canBandrateConfig = {0};
 
 GPIO_SetFunc(CAN1_TX, GPIO_FUNC_1);//設置CAN1引腳復用功能
 GPIO_SetFunc(CAN1_RX, GPIO_FUNC_1);
 GPIO_SetDir(CAN1_STB, GPIO_OUTPUT);//設置CAN1收發器控制為IO控制
 CAN1_TRASCVER_NML;//使能CAN收發器
 
 /*
 設置波特率為500K,采樣點為81.25%.
 tSeg1 = (S_SEG_1 + 2); tSeg2 = (S_SEG_2 + 1).
 BandRate  = (48M / (S_PRESC + 1) / ((S_SEG_1 + 2) + (S_SEG_2 + 1)))
 SamplePoint = (tSeg1 / (tSeg1 + tSeg2)).
 在已經知道波特率與采樣點的情況下,經過計算后:tSeg1 = 13,tSeg2 = 3.
  */
 canBandrateConfig.S_PRESC  = 5;//分頻后時鐘為8M.
 canBandrateConfig.S_SEG_1  = 11;
 canBandrateConfig.S_SEG_2  = 2;
 canBandrateConfig.S_SJW  = 2;//滿足S_SJW <= tSeg2即可.
 
 /* 
 16個過濾器中,可隨意選擇使用哪個,并制定其過濾模式,制定其過濾ID的類型.
 如果一個過濾器只需要接收一個ID,直接可將其設置CODE模式,然后根據ID類型設置過濾類型.
 如果一個過濾器需要接收多個ID,將其設置為MASK模式,并根據這幾個ID的實際類型設置過濾ID類型,如果既有STD又有EXT,則應選擇FILTER_IDE_STD_EXT_BOTH.
 
 此處加宏是為了更清楚的說明各種設置是否有效,在實際應用中,可將各種組合放在一起使用.
  */
 #if (RECV_FRM_KIND_SEL == ONLY_RECV_STD_FRM)
 CAN_SetFilterParam( 0, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_STD_ONLY, CAN1_RECV_DATA_ID1);//使用CODE模式只接收STD幀
 CAN_SetFilterParam( 1, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_STD_ONLY, CAN1_RECV_DATA_ID2);//使用CODE模式只接收STD幀
 #endif
 #if (RECV_FRM_KIND_SEL == ONLY_RECV_EXT_FRM)
 CAN_SetFilterParam( 0, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_EXT_ONLY, CAN1_RECV_DATA_ID11);//使用CODE模式只接收EXT幀
 CAN_SetFilterParam( 1, 1, CAN_FILTER_CODE_MODE, FILTER_IDE_EXT_ONLY, CAN1_RECV_DATA_ID12);//使用CODE模式只接收EXT幀
 #endif
 #if (RECV_FRM_KIND_SEL == RECV_STD_EXT_BOTH_FRM)
 CAN_SetFilterParam( 0, 1, CAN_FILTER_MASK_MODE, FILTER_IDE_STD_EXT_BOTH, (CAN1_RECV_DATA_ID1 & CAN1_RECV_DATA_ID11));//使用MASK模式接收兩種幀
 CAN_SetFilterParam( 1, 1, CAN_FILTER_MASK_MODE, FILTER_IDE_STD_EXT_BOTH, (CAN1_RECV_DATA_ID2 & CAN1_RECV_DATA_ID12));//使用MASK模式接收兩種幀
 #endif
 
 canConfig.interruptEnable = TRUE;//使能中斷
 canConfig.TSSS = TRUE;//使用次發送緩沖區發送
 canConfig.canMode = CAN_MODE_NORMAL;
 canConfig.autoReset = TRUE;//CAN BUSOFF后,自動恢復
 canConfig.filterList = g_canFilterTab;//賦值過濾器設置list
 
 CAN_SetEventCallBack(CAN1, CAN1_IRQnCallBack);
 CAN_Initialize(CAN1, &canConfig, &canBandrateConfig);
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 濾波器
    +關注

    關注

    162

    文章

    8066

    瀏覽量

    181005
  • AMBA
    +關注

    關注

    0

    文章

    70

    瀏覽量

    15327
  • CAN收發器
    +關注

    關注

    3

    文章

    173

    瀏覽量

    26155
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14238
  • MCU控制器
    +關注

    關注

    0

    文章

    27

    瀏覽量

    7065
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    CAN外設的接收過濾器設置

    一、背景 ????在實際應用CAN總線上的數據,對于某些CAN節點來說,可能需要的數據并不多,希望收到的
    的頭像 發表于 08-24 09:03 ?2620次閱讀
    <b class='flag-5'>CAN</b>外設的接收過濾器<b class='flag-5'>設置</b>

    CAN loopback模式測試

    報文:在中斷回調函數,通過 HAL_CAN_GetRxMessage 函數獲取接收到的報文,并進行處理。例如,void HAL_CAN
    發表于 01-18 16:29

    stm32 can 中斷

    FIFO0接收數據信息存入消息結構體 if ((RxMessage.IDE == CAN_ID_STD)) //如果消息標識符的類型為標準幀模式 {for(i=0;iRF0R|=
    發表于 11-01 15:11

    請問CAN接收中斷DSP底層會怎么樣?

    請教:正常流程:CAN設置中斷接收方式,通過CAN調試助手,發送一幀數據,產生一個CAN接收
    發表于 10-17 14:37

    基于STM32F103實現CAN數據收發的功能

    。基于rt-thread,已經有CAN的驅動框架,可以快速實現CAN數據的收發。這里基于STM32F103 實現CAN數據收發的
    發表于 08-19 07:20

    使用CAN1中斷接收數據,無法接收到CAN數據是為什么?

    我是用CAN1中斷進行接收信息,在ch32v30x_it.c添加了中斷聲明void CAN1_RX1_IRQHandler(void) _
    發表于 06-24 11:21

    實現功能安全性冗余CAN參考設計

    描述該參考設計展示了如何在物理層實施冗余(并行)CAN 以實現功能安全性。其中包括兩個 SN65HVD257 CAN 收發器以及可確保兩個收發器收到相同
    發表于 09-23 07:09

    何在外設設置CAN實例啟用靈活數據速率復選框?

    我一直在使用S32SDK_S321XX_RTM_4.0.1 can_pal_s32k144示例。 在該示例CAN 0 實例已在外設設置
    發表于 03-21 08:00

    CAN通信波特率設置

    CAN通信波特率設置 LM3S2000、LM3S5000、LM3S8000系列CPU內部有1~3路CAN控制器,通過對CAN位定時寄存器CANBIT及
    發表于 04-06 18:00 ?24次下載

    stm32 can 無法進入中斷

    這個要改成和你的芯片對應的值,不然就進不了can中斷。這個錯誤不會影響單片機其他功能,非常隱蔽。USE_STDPERIPH_DRIVER, STM32F10X_HD
    發表于 12-02 17:21 ?32次下載
    stm32 <b class='flag-5'>can</b> 無法進入<b class='flag-5'>中斷</b>

    STM32CubeMX生成CAN相關程序一(發送中斷與接收中斷

    目錄一、CubeMX配置1、時鐘設置2、CAN1設置1)引腳修改2)中斷使能3)波特率計算3、SYS設置
    發表于 12-04 18:21 ?25次下載
    STM32CubeMX生成<b class='flag-5'>CAN</b>相關程序一(發送<b class='flag-5'>中斷</b>與接收<b class='flag-5'>中斷</b>)

    STM32的CAN收發數據死在硬件錯誤中斷

    STM32的CAN收發數據死在硬件錯誤中斷使用uCosIII的消息隊列,當CAN接收到數據,使用消息隊列給
    發表于 12-09 09:36 ?22次下載
    STM32的<b class='flag-5'>CAN</b>收發<b class='flag-5'>數據</b>死在硬件錯誤<b class='flag-5'>中斷</b>

    APM32F103RCT6_CAN_CAN無法進入中斷

    APM32F103RCT6_CAN_CAN無法進入中斷
    發表于 11-09 21:03 ?6次下載
    APM32F103RCT6_<b class='flag-5'>CAN_CAN</b>無法進入<b class='flag-5'>中斷</b>

    CAN總線學習筆記|CAN盒測試STM32的CAN中斷接收

    CAN基礎知識介紹文中介紹了CAN協議相關的基礎知識,以及STM32F4芯片的CAN控制器相關知識,下面將通過實例,利用STM32CubeMX圖形化配置工具,并配合CAN盒,來實現
    的頭像 發表于 01-16 17:17 ?5590次閱讀

    can總線中斷狀態什么意思呢?

    過程中斷處理機制。以下是關于CAN總線中斷狀態的詳細介紹。 CAN總線概述 1.1 CAN
    的頭像 發表于 06-16 10:21 ?2583次閱讀