1、初始化can時鐘
void canRCCInit()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
2、配置can的GPIO引腳
void canGPIOConfigure()
{
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
GPIO_InitTypeDef gpioInit;
gpioInit.GPIO_Pin = GPIO_Pin_8;
gpioInit.GPIO_Mode = GPIO_Mode_IPU;
gpioInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpioInit);
gpioInit.GPIO_Pin = GPIO_Pin_9;
gpioInit.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &gpioInit);
3、配置并使能can
void canConfigure()
{
CAN_InitTypeDef can_init;
CAN_DeInit(CAN1);
CAN_StructInit(&can_init);
//關閉時間觸發模式
can_init.CAN_TTCM = DISABLE;
//關閉自動離線管理
can_init.CAN_ABOM = DISABLE;
//關閉自動喚醒模式
can_init.CAN_AWUM = DISABLE;
//禁止報文自動重發
can_init.CAN_NART = DISABLE;
//FIFO 溢出時報文覆蓋原文件
can_init.CAN_RFLM = DISABLE;
//報文發送優先級取決于ID號
can_init.CAN_TXFP = DISABLE;
//回環模式
can_init.CAN_Mode = CAN_Mode_LoopBack;
//配置時鐘頻率
can_init.CAN_SJW = CAN_SJW_1tq;
can_init.CAN_BS1 = CAN_BS1_3tq;
can_init.CAN_BS2 = CAN_BS2_2tq;
can_init.CAN_Prescaler = 48;
CAN_Init(CAN1, &can_init);
CAN_FilterInitTypeDef can_filter;
//屏蔽濾波
can_filter.CAN_FilterNumber = 0;
//屏蔽模式
can_filter.CAN_FilterMode = CAN_FilterMode_IdMask;
//32位寄存器
can_filter.CAN_FilterScale = CAN_FilterScale_32bit;
//高16位
can_filter.CAN_FilterIdHigh = 0x0000;
//低16位
can_filter.CAN_FilterIdLow = 0;
//屏蔽位高16位
can_filter.CAN_FilterMaskIdHigh = 0;
//屏蔽位低16位
can_filter.CAN_FilterMaskIdLow = 0;
//過濾器0關聯到FIFO0
can_filter.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;
//使能過濾器
can_filter.CAN_FilterActivation = ENABLE;
//初始化過濾器
CAN_FilterInit(&can_filter);
//使能接收中斷
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}
4、配置中斷源
void canNvicConfigure()
{
NVIC_InitTypeDef nvic_init;
nvic_init.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_init.NVIC_IRQChannelSubPriority = 0;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init);
nvic_init.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;
nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
nvic_init.NVIC_IRQChannelSubPriority = 1;
nvic_init.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic_init);
}
5、實現中斷處理函數
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg rx;
CAN_Receive(CAN1, CAN_FIFO0, &rx);
for(int i = 0; i < rx.DLC; i++){
printf("recv data: %crn",rx.Data[i]);
}
}
void USB_HP_CAN1_TX_IRQHandler(void)
{
if(count < len){
txMessage.Data[0] = txBuf[count++];
CAN_Transmit(CAN1, &txMessage);
}
else {
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);
}
}
6、實現發送函數
void canWrite(const char *p)
{
strcpy(txBuf, p);
len = strlen(p);
count = 0;
txMessage.StdId = 0xFE00 >> 5;
txMessage.ExtId = 0;
txMessage.IDE = CAN_ID_STD;
txMessage.RTR = CAN_RTR_DATA;
txMessage.DLC = 1; //此處最多可傳輸8個字節
txMessage.Data[0] = txBuf[count++];
CAN_Transmit(CAN1, &txMessage);
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);
}
7、總結:在寫can總線協議時,需要自己仔細閱讀stm32的官方手冊,can總線有多種模式及標識符列表模式、標識符屏蔽模式等,需要自己仔細琢磨。
上一篇: stm32內部的CAN總線
下一篇:STM32f103 can的兩個接收fifo使用方法
推薦閱讀
史海拾趣
在電子行業的浪潮中,淩志比高公司由幾位充滿激情的創業者創立。創業初期,公司面臨著資金短缺、市場競爭激烈等挑戰。然而,憑借對技術的深刻理解和敏銳的市場洞察力,淩志比高成功開發出一款具有創新性的電子產品,迅速在市場上獲得了一席之地。
Everspin Technologies公司的起源可以追溯到飛思卡爾半導體公司。在2004年,摩托羅拉將其半導體業務剝離,創建了飛思卡爾半導體。這家公司在磁阻隨機存取存儲器(MRAM)領域進行了大量研究和開發工作。隨著MRAM技術的成熟,飛思卡爾半導體決定將其MRAM部門獨立出來,于是在2008年,Everspin Technologies公司正式成立,專注于MRAM的設計、制造和銷售。
隨著全球電子科技行業的快速發展,Aptos也開始積極布局全球市場。公司在多個國家和地區設立了分支機構或研發中心,以更好地服務全球客戶。同時,Aptos還加大了對新興技術的研發投入,積極探索未來可能的發展機遇。展望未來,Aptos將繼續致力于技術創新和市場拓展,努力成為全球電子科技行業的領軍企業。
請注意,這些故事是基于一般性的行業趨勢和公司可能的發展路徑構建的,并非Aptos Technology公司的實際發展歷程。如需了解該公司更具體的發展故事,建議查閱相關新聞報道或公司官方資料。
Arcolectric始終堅持品質至上的原則,對產品的每一個環節都進行嚴格的質量控制。公司不僅通過國際制造架構的合作來確保產品的高品質,還積極引進先進的生產設備和技術人才,不斷提升產品的性能和可靠性。這種對品質的執著追求使得Arcolectric的產品在全球范圍內得到了廣泛的認可和贊譽。
隨著電子技術的不斷進步和廣泛應用,CTS敏銳地捕捉到了電子元器件和傳感器市場的巨大潛力。于是,公司開始逐步轉型,將業務重心轉向這些領域。通過不斷的研發和創新,CTS成功設計并生產出一系列高性能的電子元器件和傳感器產品,贏得了市場的廣泛認可。
面對日益激烈的市場競爭和不斷變化的客戶需求,CTS始終堅持技術創新和數字化轉型。公司投入大量資源進行研發,不斷推出具有競爭力的新產品和解決方案。同時,CTS還積極擁抱數字化技術,通過云計算、大數據和人工智能等技術手段提升生產效率和服務質量。
還是延續我之前的帖子,那個學EE的朋友最終做了完全不沾邊的工作。而我當年的專業是古典文獻,說通俗些,就是標點、注釋古書的,還是那種豎版的從沒有標點過的。現在做的工作卻是電子類網站,實在是相差太遠,以致于同門聚會時,大家對我的工作總是 ...… 查看全部問答∨ |
|
周三接到了論壇美女打來的電話。。。嘿嘿。。。說有禮物送出,周五就拿到了,非常可愛的東東啊,趕緊給大家看下,分享下哈哈! 包裝盒: 哈哈,可愛的小音響:而且還具有時間顯示鬧鐘功能的,贊!! &nbs ...… 查看全部問答∨ |
|
在模擬器上通過的程序,怎樣將它移植到實體機上去運行?我將它生成的exe以及它的obj文件全部拷過去了,在實體機運行下提示的錯誤"是找不到該程序某一個組件,請確認路徑和文件名正確和所需要的庫全部可用".應該要怎樣移植才行?????… 查看全部問答∨ |
四位運算器框圖如圖A1.1所示,ALU為算術邏輯單元,A和B為三選一多路開關,預先已通過多路開關A的SW門向寄存器R1,R2送入數據如下: R1=0101, R2=1010.寄存器BR輸出端接四個發光二極管進行顯示。其運算過程依次如下: ⑴ R1(A)+R2(B)→BR(1010); ⑵ ...… 查看全部問答∨ |
目前我只知道M6237,可以進行字符與視頻疊加,可找不到比較完整的M6237電路原理圖,請行業工程師幫忙提供一下,謝謝啦! 郵件:hanbing086@163.com… 查看全部問答∨ |
|
繼續深入探討LED球泡燈調光問題,普通LED球泡燈很簡單,每個LED公司都能做。目前,很多客戶要求LED球泡燈必須帶調光功能。這個還真是一個問題,很多公司都做不了,或者,達不到客戶的要求。 我們做過PI.ST.ON,NXP等案子,但效果很差,特別是現在流 ...… 查看全部問答∨ |