Ⅰ 問下STM32 高手 CAN中 問提 求解
這是過濾器的配置啊。
如果是屏蔽模式的話,CAN_FilterMaskIdHigh=0xffff ,CAN_FilterMaskIdLow=0xffff;表示接收的幀ID (報文)要跟回 .CAN_FilterIdHigh 和.CAN_FilterIdLow 的一一對應才答能接收。
如果CAN_FilterMaskIdHigh=0x0,CAN_FilterMaskIdLow=0x0,表示接收全部(ID)幀的報文。
Ⅱ stm32 can 報文過濾器編號的用法
濾波器就是過濾地址和報文的,比如你可以對郵箱0設置濾波器讓它只接受數據幀和指定地址為xxx的。如果讓某個郵箱具有多個地址,比如需要設置地址和廣播地址,那就需要設置2個濾波器。
Ⅲ 在STM32CubeMX中,STM32F207如何對CAN進行配置
***配置3.5寸工業級LCD觸摸屏,支持4線觸摸。
***1路USB2.0 OTG Full-Speed,1路USB2.0 OTG High-Speed。
***G-Sensor三軸加速度感測器。
***IEEE 1588v2的10/100 Mbps乙太網介面。
***支持UCOS II_v2.86 & UCGUI_v3.90a,並提供BSP源碼。
***支持FatFs_vR0.08a 文件系統(用於U盤,SD卡的文件系統)。
***支持LwIP_v1.3.2協議棧。
***工業級的器件選型。從實際應用的角度考慮,所選型器件的貨源以
及供貨周期都有足夠的市場保障。 處理器
STM32F207IGT6,ARM 32-bit Cortex-M3,最高運行頻率為120MHz
內部集成1 MBFlash memory,128+4KB SRAM
支持片外Flash, SRAM, PSRAM, NOR及NAND Flash
LCD 並行介面,8080/6800 模式
USB 2.0 Full-speed/High-speed Device/Host/OTG
10/100 Ethernet MAC.,支持硬體IEEE 1588v2(MII/RMII)
2路CAN2.0B,4路UART,2路全雙工I2S,3路I2C,3路SPI最高30Mbit
8到14 bit 並行攝像頭介面,最高達48Mbyte/s
1/4/8bit SD/MMC/SDIO主機介面,最高容量可支持32GB
高達140個I/O口,最高頻率60MHz
17個定時器(其中2個為32位),最高計數頻率為120MHz
3路12-bit 高達2M的 A/D、2路12-bit D/A
模擬隨機數生成器
Ⅳ 請教 兩個STM32 CAN通信過濾器設置問題
CAN匯流排傳送到數據是基於消息而不是地址的,每個消息用不同的編號表達(2.0A用11位、2.0B用29位)。在CAN上進行簡單傳送而自定義傳送協議時,要把所有需要傳送的命令列出,然後根據傳送的緊急程度(優先順序)從高到低進行排序,然後把最高優先順序的設定一個最低的編號、以此類推...最低優先順序的設定最高的編號。因為CAN物理上是不分主從,所以當有幾個站點同時發送而發生碰撞時,編號最低的將優先傳送。
從匯流排上接收消息:每個站點可能只對所有協議中的幾個消息感興趣,CAN初始化時,在過濾器中設置本站點需要接收的消息編號,這樣一旦匯流排上有需要的消息將會自動接收,並產生中斷,通知CPU收到新消息,CPU在中斷程序中接收、處理。
發送消息到匯流排上:CAN初始化時設置本站點將來需要發送的消息編號,當運行過程中需要發送消息時,填入相關數據,設置相關消息對象發送。
CAN控制器內部一般設有32個消息對象,分成2組,分別各用一組寄存器來操作。一般一組用來接收過濾,另一組用來發送。
希望能解決您的問題。
Ⅳ STM32裡面的CAN,過濾器的設置有什麼用
CAN的過濾器是硬體設置接受指定地址數據用的。
假如說1號機設置FilterID為0x01010101,FilterMask設置為0xFFFFFFFF,那麼他只能接內受CAN通訊容數據ID為0x01010101的數據,其他的硬體就會被屏蔽掉。如果FilterMask設置為0,那麼就是所有ID的數據都可以接受。
FilterID為過濾的地址,FilterMask與FilterID對應每一位表示是否需要匹配當前位。還是上面的例子,mask設置為全1,表示所有為必須匹配,也就是只接受和FilterID一樣的數據;mask設置為全0,就是任何一位都不需要匹配;mask設置為1,就是最低位匹配即可。就是這么個道理
語言比較混亂,不知能否看明白
Ⅵ 如何操作STM32F105的從CAN
#include "can.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供學習使用,未經作者許可,不得用於其它任何用途
//ALIENTEK戰艦STM32開發板
//CAN驅動 代碼
//正點原子@ALIENTEK
//技術論壇:www.openedv.com
//修改日期:2012/9/11
//版本:V1.0
//版權所有,盜版必究。
//Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//CAN初始化
//tsjw:重新同步跳躍時間單元.范圍:1~3; CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
//tbs2:時間段2的時間單元.范圍:1~8;
//tbs1:時間段1的時間單元.范圍:1~16; CAN_BS1_1tq ~CAN_BS1_16tq
//brp :波特率分頻器.范圍:1~1024;(實際要加1,也就是1~1024) tq=(brp)*tpclk1
//注意以上參數任何一個都不能設為0,否則會亂.
//波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);
//mode:0,普通模式;1,回環模式;
//Fpclk1的時鍾在初始化的時候設置為36M,如果設置CAN_Normal_Init(1,8,7,5,1);
//則波特率為:36M/((1+8+7)*5)=450Kbps
//返回值:0,初始化OK;
// 其他,初始化失敗;
///////////////////////////////////////////////////CAN1////////////////////////////////////////////////////
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能PORTD時鍾,使能功能復用時鍾
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1時鍾
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO
//GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);
//CAN單元設置
CAN_InitStructure.CAN_TTCM=DISABLE; //非時間觸發通信模式 //
CAN_InitStructure.CAN_ABOM=DISABLE; //軟體自動離線管理 //
CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通過軟體喚醒(清除CAN->MCR的SLEEP位)//
CAN_InitStructure.CAN_NART=ENABLE; //禁止報文自動傳送 //
CAN_InitStructure.CAN_RFLM=DISABLE; //報文不鎖定,新的覆蓋舊的 //
CAN_InitStructure.CAN_TXFP=DISABLE; //優先順序由報文標識符決定 //
CAN_InitStructure.CAN_Mode= mode; //模式設置: mode:0,普通模式;1,回環模式; //
//設置波特率
CAN_InitStructure.CAN_SJW=tsjw; //重新同步跳躍寬度(Tsjw)為tsjw+1個時間單位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1個時間單位CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1個時間單位CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=brp; //分頻系數(Fdiv)為brp+1 //
CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1
CAN_FilterInitStructure.CAN_FilterNumber=0; //過濾器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//過濾器0關聯到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0
CAN_FilterInit(&CAN_FilterInitStructure);//濾波器初始化
#if CAN_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息掛號中斷允許.
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主優先順序為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次優先順序為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
#if CAN_RX0_INT_ENABLE //使能RX0中斷
//中斷服務函數
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN1, 0, &RxMessage);
Can_Send_Msg(RxMessage.Data,8);
}
#endif
//can發送一組數據(固定格式:ID為0X12,標准幀,數據幀)
//len:數據長度(最大為8)
//msg:數據指針,最大為8個位元組.
//返回值:0,成功;
// 其他,失敗;
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // 標准標識符為0
TxMessage.ExtId=0x12; // 設置擴展標示符(29位)
TxMessage.IDE=0; // 使用擴展標識符
TxMessage.RTR=0; // 消息類型為數據幀,一幀8位
TxMessage.DLC=len; // 發送兩幀信息
for(i=0;i<8;i++)
TxMessage.Data[i]=msg[i]; // 第一幀信息
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待發送結束
if(i>=0XFFF)return 1;
return 0;
}
//can口接收數據查詢
//buf:數據緩存區;
//返回值:0,無數據被收到;
// 其他,接收的數據長度;
u8 Can_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //沒有接收到數據,直接退出
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//讀取數據
for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}
///////////////////////////////////////////////////CAN2////////////////////////////////////////////////////
u8 CAN2_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX2_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);//使能PORTB時鍾
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);//使能CAN2時鍾
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化IO
//GPIO_PinRemapConfig(GPIO_Remap_CAN2,ENABLE);
//CAN單元設置
CAN_InitStructure.CAN_TTCM=DISABLE; //非時間觸發通信模式 //
CAN_InitStructure.CAN_ABOM=DISABLE; //軟體自動離線管理 //
CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通過軟體喚醒(清除CAN->MCR的SLEEP位)//
CAN_InitStructure.CAN_NART=ENABLE; //禁止報文自動傳送 //
CAN_InitStructure.CAN_RFLM=DISABLE; //報文不鎖定,新的覆蓋舊的 //
CAN_InitStructure.CAN_TXFP=DISABLE; //優先順序由報文標識符決定 //
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal; //模式設置: mode:0,普通模式;1,回環模式; //
//設置波特率
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳躍寬度(Tsjw)為tsjw+1個時間單位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1=tbs1+1個時間單位CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//Tbs2=tbs2+1個時間單位CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=9; //分頻系數(Fdiv)為brp+1 //
CAN_Init(CAN2, &CAN_InitStructure); // 初始化CAN2
CAN_FilterInitStructure.CAN_FilterNumber=14; //過濾器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//過濾器0關聯到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活過濾器0
CAN_FilterInit(&CAN_FilterInitStructure);//濾波器初始化
#if CAN_RX2_INT_ENABLE
CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);//FIFO0消息掛號中斷允許.
NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主優先順序為1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次優先順序為0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return 0;
}
#if CAN_RX2_INT_ENABLE //使能RX2中斷
//中斷服務函數
void CAN2_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN2, 0, &RxMessage);
Can2_Send_Msg(RxMessage.Data,8);
}
#endif
//can發送一組數據(固定格式:ID為0X12,標准幀,數據幀)
//len:數據長度(最大為8)
//msg:數據指針,最大為8個位元組.
//返回值:0,成功;
// 其他,失敗;
u8 Can2_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // 標准標識符為0
TxMessage.ExtId=0x12; // 設置擴展標示符(29位)
TxMessage.IDE=0; // 使用擴展標識符
TxMessage.RTR=0; // 消息類型為數據幀,一幀8位
TxMessage.DLC=len; // 發送兩幀信息
for(i=0;i<8;i++)
TxMessage.Data[i]=msg[i]; // 第一幀信息
mbox= CAN_Transmit(CAN2, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN2, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待發送結束
if(i>=0XFFF)return 1;
return 0;
}
//can口接收數據查詢
//buf:數據緩存區;
//返回值:0,無數據被收到;
// 其他,接收的數據長度;
u8 Can2_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN2,CAN_FIFO0)==0)return 0; //沒有接收到數據,直接退出
CAN_Receive(CAN2, CAN_FIFO0, &RxMessage);//讀取數據
for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}
Ⅶ STM32裡面的CAN,過濾器的設置有什麼用(答案好,有追加)
CAN匯流排傳復送到數據是基於消息制而不是地址的,每個消息用不同的編號表達(2.0A用11位、2.0B用29位)。在CAN上進行簡單傳送而自定義傳送協議時,要把所有需要傳送的命令列出,然後根據傳送的緊急程度(優先順序)從高到低進行排序,然後把最高優先順序的設定一個最低的編號、以此類推...最低優先順序的設定最高的編號。因為CAN物理上是不分主從,所以當有幾個站點同時發送而發生碰撞時,編號最低的將優先傳送。
從匯流排上接收消息:每個站點可能只對所有協議中的幾個消息感興趣,CAN初始化時,在過濾器中設置本站點需要接收的消息編號,這樣一旦匯流排上有需要的消息將會自動接收,並產生中斷,通知CPU收到新消息,CPU在中斷程序中接收、處理。
發送消息到匯流排上:CAN初始化時設置本站點將來需要發送的消息編號,當運行過程中需要發送消息時,填入相關數據,設置相關消息對象發送。
CAN控制器內部一般設有32個消息對象,分成2組,分別各用一組寄存器來操作。一般一組用來接收過濾,另一組用來發送。
Ⅷ STM32 CAN 通信 濾波設置問題
首先這個配置使用的是 32位的標識符屏蔽位模式
CAN_FilterIdHigh和CAN_FilterIdLow組合成一個32位寄存器,用來存儲將要過濾的ID
CAN_FilterMaskIdHigh和CAN_FilterMaskIdLow組合成一個32位寄存器,用來表示這個ID的哪些位
必須符合(置1),哪些位不care(置0).
使用標示符屏蔽模式可以實現接收包含特定位的幀,即一系列的幀。
CAN的接收郵箱標示符寄存器中,31~3位存儲29位的擴展標示符。
所以通過濾波器要接收ID為0x0A的幀,
CAN_FilterIdLow = 0x000A << 3; CAN_FilterIdHigh = 0;
CAN_FilterMaskIdLow = 0x00FF << 3; CAN_FilterMaskIdHigh = 0;
純手打,若正確請給辛苦費
Ⅸ stm32f103 can采樣點設置為多少合適
我一般情況按2/3-80%算,最重要是在同一網路中要按相同的采樣點設置,如果是自己組網定采樣點的話,正常流程是要等網路確定後再測試哪個點合適,粗定義的話,和波特率有關;
Ⅹ STM32 CAN 過濾器設置
看手冊里有關該模式過濾寄存器的每位含義,最低三位是IDE RTR和 0,前面高位是標識符