STM32 CAN簡單接收和傳送

2021-09-25 05:18:31 字數 3493 閱讀 7876

**:

前面對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的接收和傳送中斷:

/* 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的傳送中斷,傳送中斷是傳送郵箱中資料傳送完畢後產生的傳送完畢郵箱空中斷--這和usart傳送中斷不同。詳細點說can傳送中斷是指can的三個傳送郵箱中的其中乙個由滿到傳送資料完畢後空才產生的中斷,當原來傳送郵箱本來就是空的則不會產生傳送中斷。

4.can初始化配置:

void can_ini(void)

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,傳送中斷在can_transmit()後才能開啟,用來判斷傳送完畢傳送下乙個資料

}5.實現can的傳送中斷和接收中斷,這裡我們只用了乙個傳送郵箱進行傳送--簡單方便:

void usb_lp_can_rx0_irqhandler(void)  //接收中斷

targetid=(rxmessage.stdid>>6)&0x1f;

while(!qin(&qlinecanrx,targetid)){}

for(i=0;i            }}

}can_itconfig(can_it_fmp0, enable); //中斷退出

}void usb_hp_can_tx_irqhandler(void)

void cansendstr()

6.使用中先使用cansendstr()傳送一條資料,則傳送完畢後進入傳送空中斷,則之後會迴圈傳送資料

stm32 can通訊傳送解釋

uint8 t can transmit can typedef canx,cantxmsg txmessage else if canx tsr can tsr tme1 can tsr tme1 else if canx tsr can tsr tme2 can tsr tme2 else if...

STM32 CAN通訊問題

檢舉 2012 07 04 20 59 breath123 分類 工程技術科學 瀏覽974次 can通訊測試中 使能報文標示符過濾器按照標示符的內容進行比對過濾,擴充套件id不是如下的就拋棄掉,是的話,會存入fifo0。can filterinitstructure.can filteridhigh...

關於STM32 CAN 傳送失敗問題解釋

首先解釋一下can幾個配置的功能 1.can initstruct.can ttcm disable 這個只在某些can標準中使用,就設定為disable。2.can initstruct.can abom enable 這個位我們使能該功能,使用該功能可以在節點出錯離線後適時的自動恢復,不需要軟體...