位寬和模式都相同的過濾器,優先級由過濾器號決定,過濾器號小的優先級高
?
上面的例子說明了bxCAN的過濾器規則:在接收一個報文時,其標識符首先與配置在標識符列表模式下的過濾器相比較;如果匹配上,報文就被存放到相關聯的FIFO中,并且所匹配的過濾器的序號被存入過濾器匹配序號中。如同例子中所顯示,報文標識符跟#4標識符匹配,因此報文內容和FMI4被存入FIFO。
如果沒有匹配,報文標識符接著與配置在屏蔽位模式下的過濾器進行比較。
如果報文標識符沒有跟過濾器中的任何標識符相匹配,那么硬件就丟棄該報文,且不會對軟件有任何打擾。
?
接收郵箱(FIFO)
在接收到一個報文后,軟件就可以訪問接收FIFO的輸出郵箱來讀取它。一旦軟件處理了報文(如把它讀出來),軟件就應該對CAN_RFxR寄存器的RFOM位進行置1,來釋放該報文,以便為后面收到的報文留出存儲空間。
?
中斷
bxCAN占用4個專用的中斷向量。通過設置CAN中斷允許寄存器(CAN_IER),每個中斷源都可以單獨允許和禁用。
?
發送中斷可由下列事件產生:
─ 發送郵箱0變為空,CAN_TSR寄存器的RQCP0位被置1。
─ 發送郵箱1變為空,CAN_TSR寄存器的RQCP1位被置1。
─ 發送郵箱2變為空,CAN_TSR寄存器的RQCP2位被置1。
FIFO0中斷可由下列事件產生:
─ FIFO0接收到一個新報文,CAN_RF0R寄存器的FMP0位不再是‘00’。
─ FIFO0變為滿的情況,CAN_RF0R寄存器的FULL0位被置1。
─ FIFO0發生溢出的情況,CAN_RF0R寄存器的FOVR0位被置1。
FIFO1中斷可由下列事件產生:
─ FIFO1接收到一個新報文,CAN_RF1R寄存器的FMP1位不再是‘00’。
─ FIFO1變為滿的情況,CAN_RF1R寄存器的FULL1位被置1。
─ FIFO1發生溢出的情況,CAN_RF1R寄存器的FOVR1位被置1。
錯誤和狀態變化中斷可由下列事件產生:
─ 出錯情況,關于出錯情況的詳細信息請參考CAN錯誤狀態寄存器(CAN_ESR)。
─ 喚醒情況,在CAN接收引腳上監視到幀起始位(SOF)。
─ CAN進入睡眠模式。
?
工作流程大概就是這個樣子,接著就是一大堆煩人的can寄存器,看了一遍總算有了大概的了解,況且這么多的寄存器要一下子把他們都記住是不可能的。根據以往的經驗,只要用多幾次,對寄存器的功能就能記住。
好了,到讀具體實驗程序的時候了,這時候就要打開“STM32庫函數”的資料。因為它里面有STM32打包好的庫函數的解釋,對讀程序很有幫助。
下面是主程序:
int main(void)
{
// ?int press_count = 0;
char data = '0';
int sent = FALSE;
?
#ifdef DEBUG
debug();
#endif
?
/* System Clocks Configuration */
RCC_Configuration();
?
/* NVIC Configuration */
NVIC_Configuration();
?
/* GPIO ports pins Configuration */
GPIO_Configuration();
?
USART_Configuration();
?
CAN_Configuration();
?
Serial_PutString("\r\n偉研科技 \r\n");
Serial_PutString("CAN test\r\n");
?
while(1){
if(GPIO_Keypress(GPIO_KEY, BUT_RIGHT)){
GPIO_SetBits(GPIO_LED, GPIO_LD1);//檢測到按鍵按下
?
if(sent == TRUE)
continue;
sent = TRUE;
data++;
if(data > 'z')
data = '0';
CAN_TxData(data);
}
else{//按鍵放開
GPIO_ResetBits(GPIO_LED, GPIO_LD1); ?
sent = FALSE;
}
}
}
?
前面的RCC、NVIC、GPIO、USART配置和之前的實驗大同小異,關鍵是分析CAN_Configuration()函數如下:
void CAN_Configuration(void)//CAN配置函數
{
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;//禁止時間觸發通信模式
CAN_InitStructure.CAN_ABOM=DISABLE;//,軟件對CAN_MCR寄存器的INRQ位進行置1隨后清0后,一旦硬件檢測
評論