STM32F103XX CAN通訊筆記(一)

2021-09-05 10:10:11 字數 3178 閱讀 6301

一、什麼是can?

can是controller area network的縮寫。是一種序列通訊協議,在車載行業中有廣泛的應用,主要連線不同的控制單元和感測器。

二、can的通訊協議

三、can的應用

本次對can的研究,主要基於專案需求,研究裝置間通過can通訊進行資料傳輸做一些筆記。

平台:stm32f103c8/ stm32f103rc/ stm32f103ze

裝置:一台主機多台從機,從機接收到資料時進行相應,不做主動傳送。主機可以對從機資料進行查詢,對從機裝置進行一些引數的設定

擴充套件:can網路中的裝置維護

需注意:

1、can標準的資料幀一次只能傳輸8位元組,資料較多的時候,需要進行分包處理,資料要進行有效性判斷,設定快取清空條件

2、can沒有所謂的主機和從機概念,可以分配id進行自定義主機和從機。id分配合理,資料過濾會更加方便

3、can一些基礎知識的了解

四、can引數

波特率的計算:

1、確定時鐘,閱讀st32f103xx的datasheet,外設can使用pclk1(apb1),內部時鐘一般是8mhz經過倍頻(9倍頻)可以達到72mhz,pclk1經過72mhz的2分頻達到36mhz。

rcc_pclk1config(rcc_hclk_div2);/* 設定apb1預分頻:2  */

rcc_pllconfig(rcc_pllsource_hse_div1, rcc_pllmul_9);/* 輸入源:hse,倍頻係數:9 */

rcc_apb1periphclockcmd(rcc_apb1periph_can1, enable); /* 開啟外設時鐘 */

2、can波特率一些引數的設定

ss:同步段,固定1tq

sjw:再次同步段,1~4tq

bs1,bs2:相位緩衝段,bs1(1~8tq),bs2(2~8tq)

prescaler:取樣點

波特率 = can時鐘/((sjw+bs1+bs2)*prescaler)

備註:這裡說的bs1,指代官方文件說的bs1+1tq

can_inittypedef        can_initstructure;

can_deinit(can1);/* reset all configuration */

/* 72mhz時鐘經過2分頻得到36mhz 外設時鐘,波特率=36m/((1+3+2)*30)=200k*/

can_initstructure.can_sjw = can_sjw_1tq;

can_initstructure.can_bs1 = can_bs1_3tq;

can_initstructure.can_bs2 = can_bs2_2tq;

can_initstructure.can_prescaler = 30;

濾波器的使用:

本人對於濾波器的使用並未深入,這裡只做簡單的使用介紹。

濾波器應用於接收的濾波,關閉濾波器的時候,對所有資料都進行接收,開啟時,只接收特定id的資料。

1.標準模式下的id

範圍為:0~0x7ff,在濾波器中can_fxr1[31:21],以32位濾波器舉例,如下圖

2.可變位寬

16位濾波器或32位濾波器

3.識別符號列表模式和遮蔽位模式

識別符號列表模式:符合固定id的資料才進行接收,可以理解為每一位都要檢驗。

遮蔽位模式:對id中的某些位進行檢查,符合預期資料才進行接收。

can_filterinittypedef  can_filterinitstructure;

can_filterinitstructure.can_filternumber=0;

can_filterinitstructure.can_filtermode=can_filtermode_idmask;

can_filterinitstructure.can_filterscale=can_filterscale_32bit;

can_filterinitstructure.can_filteridhigh=id<<5;

can_filterinitstructure.can_filteridlow=0;

/* ***1 1111 0000 00xx  ,置1表示進行檢驗的值,置0表示不進行檢驗。0x1f00表示 對 id&0x1f00進行檢驗,後面6位不關心,例如id=0x40,則0x40~0x7f都可以接收到 */

can_filterinitstructure.can_filtermaskidhigh=0x1f00;//0x1ffc

can_filterinitstructure.can_filtermaskidlow=0x0000;

can_filterinitstructure.can_filterfifoassignment=0;

can_filterinitstructure.can_filteractivation=enable;//enable;

can_filterinit(&can_filterinitstructure);                             /*  載入設定                    */      

中斷:1.初始化中斷及優先順序

nvic_inittypedef  nvic_initstructure;

nvic_prioritygroupconfig(nvic_prioritygroup_0);

nvic_initstructure.nvic_irqchannel = usb_lp_can1_rx0_irqn;

nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x0;

nvic_initstructure.nvic_irqchannelsubpriority = 0x0;

nvic_initstructure.nvic_irqchannelcmd = enable;

nvic_init(&nvic_initstructure);

接收快取:can_itconfig(can1, can_it_fmp0, enable);

中斷處理

if(can_getitstatus(can1,can_it_fmp0)!= reset)

此外還有can的io配置,管腳對映等,這裡不在進行贅述!

stm32f103外部中斷

void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...

STM32F103啟動檔案

目錄 一 概述 二 彙編指令 2.1 equ 2.2 area 2.3 space 2.4 preserve8 2.5 thumb 2.6 export 2.7 dcd 2.8 proc 2.9 ldr 2.10 blx 2.11 bx 2.12 temport 2.13 b 2.14 if,els...

筆記 STM32F103 SPI flash概述

spi介面 spi 是英語 serial peripheral inte ce 的縮寫,就是序列外圍裝置介面。是一種高速的,全雙工,同步的通訊匯流排,並且在晶元的管腳上只占用四根線,節約了晶元的管腳 內部結構 spi 介面一般使用4條線通訊 miso主裝置資料輸入,從裝置資料輸出。mosi主裝置資料...