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

歷史上的今天

今天是:2024年09月02日(星期一)

正在發(fā)生

2018年09月02日 | STM32--CAN簡單接收和發(fā)送

發(fā)布者:平和的心情 來源: eefocus關鍵字:STM32  CAN  接收和發(fā)送 手機看文章 掃描二維碼
隨時隨地手機看文章

前面對CAN原理進行了講解,這里我用一個簡單的例子來說明CAN的使用。我使用的STM32芯片是STM32F103ZE,幾個基本的配置是:

1.配置CAN時鐘

 /* CAN Periph clock enable */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

2.CAN管腳配置,這里使用的PB11,PB12管腳:

/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
  
 /* Configure CAN pin: TX */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);  

3.中斷配置,這里打開CAN的接收和發(fā)送中斷:

/* CAN RX interrupt */
NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN_RX0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);     
    
 /* CAN TX interrupt */
 NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN_TX_IRQChannel; 
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 5;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);   

這里需要注意的是CAN的發(fā)送中斷,發(fā)送中斷是發(fā)送郵箱中數據發(fā)送完畢后產生的發(fā)送完畢郵箱空中斷--這和USART發(fā)送中斷不同。詳細點說CAN發(fā)送中斷是指CAN的三個發(fā)送郵箱中的其中一個由滿到發(fā)送數據完畢后空才產生的中斷,當原來發(fā)送郵箱本來就是空的則不會產生發(fā)送中斷。

4.CAN初始化配置:

void CAN_Ini(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  /* CAN register init */
  CAN_DeInit();
  CAN_StructInit(&CAN_InitStructure);

  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;  //禁止時間觸發(fā)通信模式
  CAN_InitStructure.CAN_ABOM=DISABLE;  //軟件對CAN_MCR寄存器的INRQ位進行置1隨后清0后,一旦硬件檢測
                                       //到128次11位連續(xù)的隱性位,就退出離線狀態(tài)。
  CAN_InitStructure.CAN_AWUM=DISABLE;  //睡眠模式通過清除CAN_MCR寄存器的SLEEP位,由軟件喚醒
  CAN_InitStructure.CAN_NART=DISABLE;   //CAN報文只被發(fā)送1次,不管發(fā)送的結果如何(成功、出錯或仲裁丟失)
  CAN_InitStructure.CAN_RFLM=DISABLE;  //在接收溢出時FIFO未被鎖定,當接收FIFO的報文未被讀出,下一個收到的報文會覆蓋原有的報文
  CAN_InitStructure.CAN_TXFP=ENABLE;  //用來使能或者失能發(fā)送FIFO優(yōu)先級,由發(fā)送的請求順序決定
 CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN硬件工作在正常模式

 switch(CAN_BPP)
 {
    //總體配置保持,tBS1>=tBS2,tBS2>=1個CAN時鐘周期,tBS2>=2tSJW
  case 100000:
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;   //重新同步跳躍寬度
  CAN_InitStructure.CAN_BS1=CAN_BS1_10tq;  //設定時間段1的時間單位數目
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;   //設定時間段2的時間單位數目
  CAN_InitStructure.CAN_Prescaler=20;         //一個時間單位的長度//(pclk1/((4+8+8)*9)) = 36Mhz/18/20 = 100Kbits
  break;
  case 50000:
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_10tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=40;    //(pclk1/((4+8+8)*9)) = 36Mhz/18/40 = 50Kbits
  break;

  case 20000:
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_10tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=100;    //(pclk1/((4+8+8)*9)) = 36Mhz/18/100 = 20Kbits
  break;
  case 250000:
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=9;    //(pclk1/((1+8+7)*9)) = 36Mhz/16/9 = 250Kbits
  break;

  case 500000:
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;    //重新同步跳躍寬度1個時間單位
  CAN_InitStructure.CAN_BS1=CAN_BS1_6tq;    //時間段1為6個時間單位
  CAN_InitStructure.CAN_BS2=CAN_BS2_5tq;    //時間段2為5個時間單位
  CAN_InitStructure.CAN_Prescaler=6;        //(pclk1/((1+6+5)*6)) = 36Mhz/12/6 = 500Kbits設定了一個時間單位的長度9
  break;
  default:
  break;

 }

  CAN_Init(&CAN_InitStructure);

  /* CAN filter init */
  CAN_FilterInitStructure.CAN_FilterNumber=0;     //指定了待初始化的過濾器0
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;      //指定了過濾器將被初始化到的模式為標識符屏蔽位模式
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;  //給出了過濾器位寬1個32位過濾器
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                  //用來設定過濾器標識符(32位位寬時為其高段位,16位位寬時為第一個)
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;                  //用來設定過濾器標識符(32位位寬時為其低段位,16位位寬時為第二個
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;              //用來設定過濾器屏蔽標識符或者過濾器標識符(32位位寬時為其高段位,16位位寬時為第一個
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;              //用來設定過濾器屏蔽標識符或者過濾器標識符(32位位寬時為其低段位,16位位寬時為第二個
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_IT_FMP0;  //設定了指向過濾器的FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;              //使能過濾器
  CAN_FilterInit(&CAN_FilterInitStructure);

  /* CAN FIFO0 message pending interrupt enable */ 
  CAN_ClearITPendingBit(CAN_IT_FF0);
  CAN_ClearITPendingBit(CAN_IT_FOV0);
  CAN_ClearITPendingBit(CAN_IT_FF1);
  CAN_ClearITPendingBit(CAN_IT_FOV1);
  CAN_ClearITPendingBit(CAN_IT_RQCP0);
  CAN_ClearITPendingBit(CAN_IT_RQCP1);
  CAN_ClearITPendingBit(CAN_IT_RQCP2);
  CAN_ITConfig(CAN_IT_FMP0, ENABLE);  //使能接收中斷
    //CAN_ITConfig(CAN_IT_TME, ENABLE); //TransmitMailbox empty,發(fā)送中斷在CAN_Transmit()后才能打開,用來判斷發(fā)送完畢發(fā)送下一個數據

}

5.實現CAN的發(fā)送中斷和接收中斷,這里我們只用了一個發(fā)送郵箱進行發(fā)送--簡單方便:

void USB_LP_CAN_RX0_IRQHandler(void)  //接收中斷
{
  CanRxMsg RxMessage;
  U8 i=0;
  U8 targetid=0;

  //如果是標準幀
    CAN_Receive(CAN_FIFO0, &RxMessage);
    if(RxMessage.IDE==CAN_ID_STD)//只收標準幀數據
    {
        if((RxMessage.StdId&0x1F)==PCL_ID+bmqnum)   //接收到ID是取后5位是自己的ID
        {
            //每個完整的數據,以|開頭,下面是ID
            while(!QIn(&Qlinecanrx,'|')){}
            targetid=(RxMessage.StdId>>6)&0x1F;
            while(!QIn(&Qlinecanrx,targetid)){}
            for(i=0;i            {
                while(!QIn(&Qlinecanrx,RxMessage.Data[i])){}
            }
        }

    }
  CAN_ITConfig(CAN_IT_FMP0, ENABLE); //中斷退出
}
void USB_HP_CAN_TX_IRQHandler(void)
{
    CAN_ClearITPendingBit(CAN_IT_RQCP0);
    CAN_ClearITPendingBit(CAN_IT_RQCP1);
    CAN_ClearITPendingBit(CAN_IT_RQCP2);
    CAN_ITConfig(CAN_IT_TME, DISABLE);
    CANSendStr();   //時刻查詢是否可以給上位發(fā)送數據
}

void CANSendStr()
{
    CanTxMsg TxMessage;
    TxMessage.StdId=PCL_ID+bmqnum;  //用來設定標準標識符,0x08+2=0x0A
    TxMessage.ExtId=0;              //用來設定擴展標識符
  TxMessage.RTR=CAN_RTR_DATA;     //用來設定待傳輸消息的幀類型,它可以設置為數據幀或者遠程幀,使用數據幀
  TxMessage.IDE=CAN_ID_STD;       //用來設定消息標識符的類型,使用標準標識符
  TxMessage.DLC = 8;              //用來設定待傳輸消息的幀長度,它的取值范圍是0到0x8
    //20160822----zhang
    TxMessage.RTR=CAN_RTR_DATA;    //數據幀
    //20160822----zhang
    TxMessage.Data[0]='~';
    TxMessage.Data[1]='0';
    TxMessage.Data[2]='1';
    TxMessage.Data[3]='2';
    TxMessage.Data[4]='3';
    TxMessage.Data[5]='4';
    TxMessage.Data[6]='5';
    TxMessage.Data[7]='6';             
    CAN_Transmit(&TxMessage);
    CAN_ITConfig(CAN_IT_TME, ENABLE); //TransmitMailbox empty,發(fā)送中斷在CAN_Transmit()后才能打開,用來判斷發(fā)送完畢發(fā)送下一個數據 
}

6.使用中先使用CANSendStr()發(fā)送一條數據,則發(fā)送完畢后進入發(fā)送空中斷,則之后會循環(huán)發(fā)送數據

參考文章:

http://www.openedv.com/thread-38867-1-1.html

http://www.stmcu.org/module/forum/thread-565605-1-1.html

http://www.cnblogs.com/chris-cp/p/3961508.html

http://www.openedv.com/thread-51889-1-1.html


關鍵字:STM32  CAN  接收和發(fā)送 引用地址:STM32--CAN簡單接收和發(fā)送

上一篇:STM32的CAN總線學習總結
下一篇:STM32之CAN通信

推薦閱讀

據經濟參考報報道,中國發(fā)展研究基金會和紅杉資本中國基金聯合舉辦的“投資人力資本,擁抱人工智能:中國未來就業(yè)的挑戰(zhàn)與應對”報告發(fā)布暨課題研討會日前舉行。專家表示,人工智能的發(fā)展將極大地推動知識經濟的形成,這為進一步解放生產力提供了重大機遇,應搶抓人工智能發(fā)展機遇。人力資源和社會保障部副部長張義珍表示,人工智能的發(fā)展催生了一批新生產...
新能源車的興起,從歐中程度上要感謝特斯拉和美國加州政府,正是由于特斯拉的產品和加州不斷嚴厲的排放規(guī)定,從某種程度將純電車輛帶入了人們的視線,而資本的追逐又給“純電”新能源風潮“錦上添花”,從中國到美國到歐洲,全球都掀起了新能源車的開發(fā)熱潮。無數的國內外新老勢力在新能源領域投入大量的資金。氫氣,天然氣,太陽能等等能源都被融合到了汽...
1、您需要多少帶寬  我們已經處于數字示波器時代,與僅考慮模擬放大器的帶寬相比,應更多的考慮示波器的帶寬,為了保證示波器為應用提供足夠的帶寬,您必需考慮示波器將要考察的信號帶寬。  帶寬是示波器最重要的特點,因為它決定這顯示的信號范圍,它在很大程度上還決定著用戶需要支付的價格。在制定帶寬決策時,您必需把當前有限的預算與實驗室中示...
SysTick是STM32中的系統定時器,利用SysTick可以實現精確的延時。SysTick—系統定時器屬于 CM3 內核中的一個外設,內嵌在 NVIC 中。系統定時器是一個 24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/SYSCLK,一般我們設置系統時鐘 SYSCLK 等于 72M。當重裝載數值寄存器的值遞減到 0 的時候,系統定時器就產生一次中斷,以此循環(huán)往復。...

史海拾趣

問答坊 | AI 解惑

移動收購鐵通不外乎是為了一紙固網業(yè)務的“入場劵”

據說,這幾天有網友在玩網絡游戲時因鐵通網絡不穩(wěn)最終丟失虛擬裝備,于是有意起訴鐵通。原貼見此鏈接http://bbs2.wm090.com/dispbbs.asp?boardID=40&ID=918438&page=1。有部分網友對此表示疑惑,鐵通已被移動收購半年多,以移動的實力,鐵通的 ...…

查看全部問答∨

超聲波發(fā)射接收器

超聲波發(fā)射接收器換能器    有正負之分么????…

查看全部問答∨

運算放大器使用指南(翻譯整理稿)

美國國家半導體公司的OP使用指南,由中國電子網社區(qū)翻譯。整部指南的完全翻譯版,保留英文,算是中英文對照版。…

查看全部問答∨

按鍵專題活動總結---準備做一個按鍵學習的開發(fā)板

在3月份我們在論壇搞了一個按鍵專題活動的討論(http://bbs.eeworld.com.cn/viewthread.php?tid=97931 ),這個活動獲得了大家的廣泛支持,討論的很是熱烈根據討論內容,從大家的討論中,我們學習和了解到了更多的按鍵方面的知識。 俗話說的好:好 ...…

查看全部問答∨

LPC2131 IIC 下讀寫24c02老是不進中斷?

不知道有沒有人弄過周工的IIC程序包?我在使用LPC2131讀寫AT24C02時,有時候可以進入中斷,有時候有不能進入中斷?希望高手指導一下!!!!!!!!…

查看全部問答∨

sdram,nor flash,nand flash

各位大俠,小弟剛接觸嵌入式。有些基本的問題還沒有搞清楚,請教一下 在一塊板子上,有sdram,nor flash,nand flash 哪個是用來存儲系統的, 這3個又有什么區(qū)別呢?…

查看全部問答∨

2011年全國競賽基本儀器和主要元器件清單

本帖最后由 paulhyde 于 2014-9-15 09:47 編輯 …

查看全部問答∨

這是什么錯誤,很奇怪

keil編譯時,提示入下錯誤:(我估計不應該是程序的錯誤,不知道哪里沒有設置正確)   Build target \'Target 1\'assembling STARTUP.A51...compiling Lcd.c...C51 FATAL-ERROR -  ACTION:     GOBAL OPTIMIZATION ...…

查看全部問答∨

初學者的迷惑

我今年準備開始學習430,之前只有一點單片機的知識,感覺學習起來沒有壓力,對C語言算是了解了,不算透徹但是感覺應付單片機夠了。 現在就有一個疑問,學習430需要哪些儲備知識才能很好的上手(盡量詳細一點)!這個問題一直很疑惑,主要實驗室現 ...…

查看全部問答∨

beaglebone心得一:windows下驅動安裝

我收到的就一個SD卡,但帶了個SD大卡卡槽。并不是傳說中的,兩個SD卡。 我破不急等地插到USB口上,當然迷你SD卡也插上,發(fā)現硬件。我等著自動裝硬件。但顯示了一個虛擬的U盤。我又傻等一會兒,還是要驅動。 應是U轉串的驅動。 我查型號是FT2232H ...…

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

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

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

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 政和县| 乌什县| 东明县| 商河县| 墨玉县| 临漳县| 陵川县| 连江县| 南岸区| 定结县| 冀州市| 安徽省| 南雄市| 双柏县| 道真| 河北区| 依兰县| 塔河县| 安溪县| 宁津县| 中牟县| 林芝县| 榕江县| 柘荣县| 永川市| 望奎县| 彭山县| 公主岭市| 庄浪县| 大城县| 含山县| 三门县| 怀集县| 东丽区| 常宁市| 绩溪县| 定边县| 梓潼县| 新郑市| 乌什县| 石台县|