你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。: x9 W/ |. F- m9 x
波特率配置代码如下:7 o- U, M* J% I5 T
) V1 _0 W3 ?4 z6 n5 w7 z8 r

% a+ V+ |# \, \% T& U! F9 a! h! a4 e5 p; y0 K3 Z6 [1 t
//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps. i: N% i) u9 a( `& w/ d/ |
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
9 ?- _0 R% E5 C+ D) ^                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps
; J! Z$ D4 w) u5 [/ I                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k( P5 s, |1 k( T+ D5 a9 m
                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k; V; M! y3 Y8 A9 U% n  i
几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。; M/ o$ W2 e" I6 D7 F% H9 d
# N" L1 r5 F- [
1 c+ K1 P/ @2 O( a
初始化函数:
9 f# o) \6 _9 S! q  R. O* f; Lu8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
# f2 X$ ^4 r: H# F{, ^4 X5 T# p2 _  x: H+ j; A! n

2 Z: v3 A- d# M% x! r; e! @        GPIO_InitTypeDef GPIO_InitStructure; 7 Y7 I# M! `. J- u! n9 w8 u5 k
        CAN_InitTypeDef        CAN_InitStructure;/ n/ R4 t; H  u
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;1 U9 F) F' A5 k3 z- {1 ?
#if CAN1_RX0_INT_ENABLE 8 r# y% |6 y( v3 j- Z- C
           NVIC_InitTypeDef  NVIC_InitStructure;
( V- k4 |' D$ |0 [, D#endif
- M% m1 I% y( X! |! r' j4 k% R        //使能相关时钟/ Z/ T% K" W& w+ D
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    
: x7 K) R& H2 y& H% \& p, u: A3 Q3 w+ O8 i
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
- k' r' C; f$ D# H# a" o. D) l1 Y9 l" S9 L
2 ]" J/ |+ B1 N6 }$ o        //初始化GPIO2 ]  h  B; J6 h) J/ X0 @$ z  ]" e
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
0 Z/ a5 j& y8 T! ~4 e        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;0 N9 x* E3 o. H6 n( N3 g
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        4 n2 d% q" `( M+ ^7 I: W
        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8
  A% M9 b% f6 b( i% D; k
5 o2 A' q, S  A% W2 Q* U2 k        /* Configure CAN pin: TX */
! i+ N$ V( U' l/ }5 \. n7 _: A1 A          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;- i, M* B# @6 J" M- m8 Y: X# T
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ C; \4 l! a( c7 n
          GPIO_Init(GPIOB, &GPIO_InitStructure);5 Y0 }. ]3 u, p, s" I: Y, V

; T. J! W9 a$ N2 g$ s+ T8 B        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9       
+ M% s+ r% f+ X; T( `9 v) B
; {+ D6 o3 d) C* K4 u# N3 N* I4 M        //CAN单元设置% G; Z9 z7 l& a
        CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   9 p% T6 }; k. x4 N4 V7 D3 f" A
        CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
# W7 e- D8 Q/ X7 w9 ^* [3 H        CAN_InitStructure.CAN_AWUM=DISABLE;        /眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)6 N6 l, R" z( L- N
        CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送 7 o% T( Y1 n5 ~$ y
        CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  
6 o+ ?8 I, M& p. V        CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定 / d, c: n. g5 o) j( D- g5 I/ M+ a
        CAN_InitStructure.CAN_Mode= mode;         //模式设置
4 c7 I# o( Z6 Z# _9 b* N1 r        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
6 J; F+ }" o! Q& {8 j        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
6 J3 W. v+ o3 A5 Z# i6 C1 z        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq* v$ l# e1 D% t7 P3 X6 [) A
        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1        / L9 B$ F; _- S# P$ }$ j. ]
        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
/ d) S% ~/ B4 Q. k
) U% V, Q' w8 j) x$ Y! b, I        //配置过滤器
& M! i3 c/ k4 s+ t6 N        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                          //过滤器0
  s6 U# T. f% e9 j  R        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; * i5 |9 F; H8 t
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;                 //32位
$ d# B. O8 j% r/ y) z  H6 q  G        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                        ////32位ID% ]6 \7 P) p* O6 M8 W( e: e
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;1 @! b4 [4 Q! D. d. K" {
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                                //32位MASK
0 e5 t- \; k- R# w) J1 f        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;% i) i, {6 q) _$ i2 H: f
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;        //过滤器0关联到FIFO0
) s. o" f. w  b" ~        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器0
5 z6 k' F4 A( k4 C) k; X        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化
# F; _5 t8 C+ C                & l9 H. k* T0 ?& Q6 b  C$ z
#if CAN1_RX0_INT_ENABLE
' s5 j# D* C7 B0 x        , K" b4 l2 c. _) |; [
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
1 W$ C& f9 q8 N$ I/ K( b3 ?/ ^- R4 k+ o5 y* B" X! u, t1 _3 b
        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
5 N& Z0 t2 A- k3 o/ t6 ]  y          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1
3 |$ w# H8 F/ Z9 F' e          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
8 i9 |7 g4 w2 ?4 g6 a' @# W7 C          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;2 x- u9 G7 N2 P/ w7 Q
          NVIC_Init(&NVIC_InitStructure);
& O% |: G; h" |4 u$ x#endif
, X8 n. C* ]. J$ w) b7 A3 I        return 0;- F6 E) E) q' V% P- s1 u: P
}
7 n% X  u2 _: _, \& Y1 E$ _
# q  B; `  F% ?  g! I& F
收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于
9 h# Z- D; J7 _( BSTM32F103时APB CLK = 36M  Q, A3 s2 @1 S, }0 P$ _( F/ i4 u; F* C
对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V) ]4 _7 ?& ]' |' d7 c
另一个107的板子电压差是1.0V,怎么会事?
bit 回答时间:2015-3-26 14:11:15
1V是不对的
雪落祁连 回答时间:2015-3-30 12:09:11
问题解决了,应该是时钟设计的问题,应用D:\Keil\ARM\Boards\Keil\MCBSTM32C\RL\CAN
# B/ B0 k  F* Ikeil自带的例程中系统时钟配置文件应该OK了,
8 ]4 F2 `5 C. e8 |' ]注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。  z8 A" w& U$ k
APB CLK = 42M( e* s+ W; k4 h1 a  i/ n9 f8 p6 B

1 l! G" M- s8 I+ q2 E0 L3 dCAN1_Mode_Init(CAN_SJW_4tq, CAN_BS2_5tq, CAN_BS1_12tq, 4, mode);
yangquandan 回答时间:2020-6-20 17:19:17
楼主你好,我想问你103和107VCT6的时钟是不是不一样

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版