在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何設(shè)置CAN引腳功能?如何在中斷中獲取CAN數(shù)據(jù)?

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

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

圖片

MCU通過APB總線訪問CAN外設(shè),通過配置相關(guān)寄存器配置CAN的運(yùn)行環(huán)境,通過寫B(tài)UF及相關(guān)配置位發(fā)送CAN幀;通過輪詢某些狀態(tài)位或者中斷,讀取收到的BUF或者CAN外設(shè)目前處于的狀態(tài),并依據(jù)部分狀態(tài)作出相應(yīng)的動(dòng)作;CAN收發(fā)器將CAN外設(shè)的CAN_TX高低電平信號(hào)轉(zhuǎn)換為CANH、CANL總線信號(hào),并將接收到的CANH、CANL總線信號(hào)轉(zhuǎn)換為CAN外設(shè)的CAN_RX高低電平信號(hào),該信號(hào)輸送給CAN外設(shè),CAN外設(shè)根據(jù)CAN接收濾波器的設(shè)置判斷是否接收該數(shù)據(jù)幀等等。

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

圖片

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

2、進(jìn)行初始化操作

CAN_InitHardwr();

定義兩個(gè)結(jié)構(gòu)體變量,CAN_Config和CAN_BaudrateConfig

  1. 初始化硬件接口
    GPIO_SetFunc(CAN1_TX, GPIO_FUNC_1);//設(shè)置CAN1引腳復(fù)用功能
     GPIO_SetFunc(CAN1_RX, GPIO_FUNC_1);
     GPIO_SetDir(CAN1_STB, GPIO_OUTPUT);//設(shè)置CAN1收發(fā)器控制為IO控制
     //GPIO_FUNC_1 參考數(shù)據(jù)手冊(cè)中“信號(hào)多路復(fù)用和引腳分配”,使用function 1功能
    
  2. 使能CAN收發(fā)器
    CAN1_TRASCVER_NML;//使能CAN收發(fā)器
    //#define CAN1_TRASCVER_NML   do{GPIO_ResetPinBits(CAN1_STB);}while(0)
    
  3. 設(shè)置波特率和采樣點(diǎn)進(jìn)行配置
/*
   設(shè)置波特率為500K,采樣點(diǎn)為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)).
   在已經(jīng)知道波特率與采樣點(diǎn)的情況下,經(jīng)過計(jì)算后:tSeg1 = 13,tSeg2 = 3.
    */
   canBandrateConfig.S_PRESC  = 5;//分頻后時(shí)鐘為8M.
   canBandrateConfig.S_SEG_1  = 11;
   canBandrateConfig.S_SEG_2  = 2;
   canBandrateConfig.S_SJW  = 2;//滿足S_SJW <= tSeg2即可.
  1. 過濾器設(shè)置:選擇哪一個(gè)過濾器、指定過濾模式、過濾的ID類型
    16個(gè)過濾器中,可隨意選擇使用哪個(gè),并制定其過濾模式,制定其過濾ID的類型.
     如果一個(gè)過濾器只需要接收一個(gè)ID,直接可將其設(shè)置CODE模式,然后根據(jù)ID類型設(shè)置過濾類型.
     如果一個(gè)過濾器需要接收多個(gè)ID,將其設(shè)置為MASK模式,并根據(jù)這幾個(gè)ID的實(shí)際類型設(shè)置過濾ID類型,如果既有STD又有EXT,則應(yīng)選擇FILTER_IDE_STD_EXT_BOTH.
     此處加宏是為了更清楚的說明各種設(shè)置是否有效,在實(shí)際應(yīng)用中,可將各種組合放在一起使用.
     #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:過濾器使能狀態(tài),1使能,0禁能
  * @param[in] filterMode:CAN_FilterMode_TypeDef已定義.
  * @param[in] filterMask:參考CAN_FilterMask_TypeDef.
  * @param[in] ID
  * @return  void

參數(shù)說明:0:選用的過濾器編碼

1:1標(biāo)識(shí)使能,0為禁止

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

FILTER_IDE_STD_ONLY:分標(biāo)準(zhǔn)幀、擴(kuò)展幀、混合幀

ID:需要過濾的ID,表示這個(gè)ID可以通過,單片機(jī)可以接收到數(shù)據(jù)。

  1. 設(shè)置can配置
    canConfig.interruptEnable = TRUE;//使能中斷
     canConfig.TSSS = TRUE;//使用次發(fā)送緩沖區(qū)發(fā)送
     canConfig.canMode = CAN_MODE_NORMAL;
     canConfig.autoReset = TRUE;//CAN BUSOFF后,自動(dòng)恢復(fù)
     canConfig.filterList = g_canFilterTab;//賦值過濾器設(shè)置list
    
  2. 設(shè)置回調(diào)函數(shù)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中斷處理函數(shù).
    */
    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. 調(diào)用庫(kù)函數(shù)CAN_Initialize()。

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

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

參數(shù)說明:

  • @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);//設(shè)置CAN1引腳復(fù)用功能
 GPIO_SetFunc(CAN1_RX, GPIO_FUNC_1);
 GPIO_SetDir(CAN1_STB, GPIO_OUTPUT);//設(shè)置CAN1收發(fā)器控制為IO控制
 CAN1_TRASCVER_NML;//使能CAN收發(fā)器
 
 /*
 設(shè)置波特率為500K,采樣點(diǎn)為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)).
 在已經(jīng)知道波特率與采樣點(diǎn)的情況下,經(jīng)過計(jì)算后:tSeg1 = 13,tSeg2 = 3.
  */
 canBandrateConfig.S_PRESC  = 5;//分頻后時(shí)鐘為8M.
 canBandrateConfig.S_SEG_1  = 11;
 canBandrateConfig.S_SEG_2  = 2;
 canBandrateConfig.S_SJW  = 2;//滿足S_SJW <= tSeg2即可.
 
 /* 
 16個(gè)過濾器中,可隨意選擇使用哪個(gè),并制定其過濾模式,制定其過濾ID的類型.
 如果一個(gè)過濾器只需要接收一個(gè)ID,直接可將其設(shè)置CODE模式,然后根據(jù)ID類型設(shè)置過濾類型.
 如果一個(gè)過濾器需要接收多個(gè)ID,將其設(shè)置為MASK模式,并根據(jù)這幾個(gè)ID的實(shí)際類型設(shè)置過濾ID類型,如果既有STD又有EXT,則應(yīng)選擇FILTER_IDE_STD_EXT_BOTH.
 
 此處加宏是為了更清楚的說明各種設(shè)置是否有效,在實(shí)際應(yīng)用中,可將各種組合放在一起使用.
  */
 #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;//使用次發(fā)送緩沖區(qū)發(fā)送
 canConfig.canMode = CAN_MODE_NORMAL;
 canConfig.autoReset = TRUE;//CAN BUSOFF后,自動(dòng)恢復(fù)
 canConfig.filterList = g_canFilterTab;//賦值過濾器設(shè)置list
 
 CAN_SetEventCallBack(CAN1, CAN1_IRQnCallBack);
 CAN_Initialize(CAN1, &canConfig, &canBandrateConfig);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 濾波器
    +關(guān)注

    關(guān)注

    162

    文章

    8007

    瀏覽量

    180437
  • AMBA
    +關(guān)注

    關(guān)注

    0

    文章

    70

    瀏覽量

    15260
  • CAN收發(fā)器
    +關(guān)注

    關(guān)注

    3

    文章

    171

    瀏覽量

    26059
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    14184
  • MCU控制器
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    7040
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CAN外設(shè)的接收過濾器設(shè)置

    一、背景 ????在實(shí)際應(yīng)用,CAN總線上的數(shù)據(jù),對(duì)于某些CAN節(jié)點(diǎn)來說,可能需要的數(shù)據(jù)并不多,希望收到的
    的頭像 發(fā)表于 08-24 09:03 ?2472次閱讀
    <b class='flag-5'>CAN</b>外設(shè)的接收過濾器<b class='flag-5'>設(shè)置</b>

    CAN loopback模式測(cè)試

    報(bào)文:在中斷回調(diào)函數(shù),通過 HAL_CAN_GetRxMessage 函數(shù)獲取接收到的報(bào)文,并進(jìn)行處理。例如,void HAL_CAN
    發(fā)表于 01-18 16:29

    stm32 can 中斷

    FIFO0接收數(shù)據(jù)信息存入消息結(jié)構(gòu)體 if ((RxMessage.IDE == CAN_ID_STD)) //如果消息標(biāo)識(shí)符的類型為標(biāo)準(zhǔn)幀模式 {for(i=0;iRF0R|=
    發(fā)表于 11-01 15:11

    請(qǐng)問CAN接收中斷DSP底層會(huì)怎么樣?

    請(qǐng)教:正常流程:CAN設(shè)置中斷接收方式,通過CAN調(diào)試助手,發(fā)送一幀數(shù)據(jù),產(chǎn)生一個(gè)CAN接收
    發(fā)表于 10-17 14:37

    基于STM32F103實(shí)現(xiàn)CAN數(shù)據(jù)收發(fā)的功能

    。基于rt-thread,已經(jīng)有CAN的驅(qū)動(dòng)框架,可以快速實(shí)現(xiàn)CAN數(shù)據(jù)的收發(fā)。這里基于STM32F103 實(shí)現(xiàn)CAN數(shù)據(jù)收發(fā)的
    發(fā)表于 08-19 07:20

    使用CAN1中斷接收數(shù)據(jù),無法接收到CAN數(shù)據(jù)是為什么?

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

    實(shí)現(xiàn)功能安全性冗余CAN參考設(shè)計(jì)

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

    何在外設(shè)設(shè)置CAN實(shí)例啟用靈活數(shù)據(jù)速率復(fù)選框?

    我一直在使用S32SDK_S321XX_RTM_4.0.1 can_pal_s32k144示例。 在該示例,CAN 0 實(shí)例已在外設(shè)設(shè)置
    發(fā)表于 03-21 08:00

    CAN通信波特率設(shè)置

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

    stm32 can 無法進(jìn)入中斷

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

    STM32CubeMX生成CAN相關(guān)程序一(發(fā)送中斷與接收中斷

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

    STM32的CAN收發(fā)數(shù)據(jù)死在硬件錯(cuò)誤中斷

    STM32的CAN收發(fā)數(shù)據(jù)死在硬件錯(cuò)誤中斷使用uCosIII的消息隊(duì)列,當(dāng)CAN接收到數(shù)據(jù),使用消息隊(duì)列給
    發(fā)表于 12-09 09:36 ?22次下載
    STM32的<b class='flag-5'>CAN</b>收發(fā)<b class='flag-5'>數(shù)據(jù)</b>死在硬件錯(cuò)誤<b class='flag-5'>中斷</b>

    APM32F103RCT6_CAN_CAN無法進(jìn)入中斷

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

    CAN總線學(xué)習(xí)筆記|CAN盒測(cè)試STM32的CAN中斷接收

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

    can總線中斷狀態(tài)什么意思呢?

    過程中斷處理機(jī)制。以下是關(guān)于CAN總線中斷狀態(tài)的詳細(xì)介紹。 CAN總線概述 1.1 CAN
    的頭像 發(fā)表于 06-16 10:21 ?2439次閱讀
    主站蜘蛛池模板: 窝窝午夜看片免费视频 | 韩国特黄特色a大片免费 | 久草资源网站 | 91成人免费福利网站在线 | 男人和女人做免费做爽爽视频 | 天天草天天射 | 免费精品美女久久久久久久久久 | 亚洲日韩色图 | 毛片大全免费 | 人人草97 | 四虎最新永久免费网址 | 怡红院亚洲怡红院首页 | 狠狠躁夜夜躁人人爽天天3 狠狠躁夜夜躁人人爽天天段 | 成人午夜免费视频 | 看大片全色黄大色黄 | 美女扒开尿口给男人看大全 | 国产特级毛片 | 日本三级强在线观看 | 免费v片网站 | 一女被两男吃奶玩乳尖口述 | 四虎东方va私人影库在线观看 | 天天看片中文字幕 | 欧美天天视频 | 色综合天天综合网国产成人 | 久久精彩免费视频 | 四虎永久在线观看视频精品 | 午夜噜噜噜私人影院在线播放 | 日韩一级欧美一级一级国产 | 亚洲综合色在线观看 | 韩国三级视频在线 | 四虎影院免费在线播放 | 免费深夜视频 | 男啪女色黄无遮挡免费视频 | 丁香六月欧美 | 成人网在线视频 | 99亚洲精品卡2卡三卡4卡2卡 | 亚洲羞羞裸色私人影院 | 色婷婷成人网 | 亚洲国产婷婷综合在线精品 | 久久久久久夜精品精品免费啦 | 亚洲成年 |