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

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。
5 P4 [' C* p4 k# o! l波特率配置代码如下:2 G9 R7 m0 Z7 ~" Y# M' q! E; W

! l; v+ L9 E& p: X0 ^  w7 b6 W: Z) a+ O5 x

+ c4 K9 k+ ~1 W2 ?# g: w//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
, R  P3 c; [* m* ^) b* j                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps+ \  w2 ^/ W3 M
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps  M& B( R* f9 @) ]: q) W
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k
) \6 U1 j' w: k/ F# ?% ~) N                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k$ B$ t4 j1 S3 J! T% }
几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。
9 [0 {! J& y) B  F) o. J" M- g
. w( _( m+ ^! q. |, E) ]* x3 E2 y. P
1 O) X6 F& e' m% `初始化函数:5 B" X6 O0 Q$ O& U; q' k
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
: `6 V7 w, N/ m4 ^% B  _) D( q{( X  A) _& N5 p- e' m% Q3 C& w
% d9 A5 }2 X+ W: S0 g; @7 P9 X1 G. E
        GPIO_InitTypeDef GPIO_InitStructure; 3 C5 x4 G) Q+ z; ~: o
        CAN_InitTypeDef        CAN_InitStructure;
1 r- h8 ^3 E7 Q9 I. F5 F        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
9 L( t* x0 f2 ?#if CAN1_RX0_INT_ENABLE & h; z1 G5 c; {9 r, J* K! o0 D
           NVIC_InitTypeDef  NVIC_InitStructure;/ Q( p' O1 h- N# x1 d4 p+ C
#endif
. N9 E! D( ^4 b2 I1 |        //使能相关时钟
) X/ x! j& I7 V  h6 t- F" ~( i8 H        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    
) y  c4 [% Q' V
4 ^" g% u, I5 _9 t  m        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟        * j0 M0 W7 t2 ]4 _! W) e% x9 o) b
' m1 e1 w- P7 r- L
        //初始化GPIO8 {  l, F1 b) H( K8 m$ r
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;. F, ~$ j. l# ?. n- f3 ]" K
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
6 h4 C3 R: m: E. F6 J6 h        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        : b/ N+ @( _- s
        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8
" T9 Q9 {+ x$ f, y8 ?# x$ p: ^1 w" q  O8 _
        /* Configure CAN pin: TX */
3 ^* H% j* X1 P8 P* b, G6 M$ s- b: ]          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
6 {0 F. _% b. `3 c6 g          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
! t) I9 v- u5 [# \# N6 v8 {          GPIO_Init(GPIOB, &GPIO_InitStructure);9 R' |3 F& U* p1 m
' N! G: ]% b  b' U
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9       
+ Y& Q- _3 V) J2 Q1 B4 P' \, B5 |! e" l, d% Q! D3 ]2 W' ]  h
        //CAN单元设置9 {, o7 M6 C& H' T, U6 W) h
        CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   
6 g) E7 u! r6 T( }% R        CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          # B+ Q. ~- n5 X# ?8 f3 K8 s
        CAN_InitStructure.CAN_AWUM=DISABLE;        /眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)7 t' M0 L! c' e5 @" U& E
        CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送
+ D+ s. @6 Z" [: |        CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  ; S7 q/ d' B4 W; N$ h* x
        CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定
, L7 t$ }4 f# f$ ]        CAN_InitStructure.CAN_Mode= mode;         //模式设置
( }8 `3 C1 w+ u' U4 H* c$ n0 J1 P        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
8 s8 I0 E! f3 N( S        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq
' A# F% C: d( i/ g7 o& \  R. }        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
3 C! A0 @% _7 x5 Y0 }! b        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
- E, F& Z' Y. f- h4 I3 Z' M        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
/ E4 j9 y+ _$ e" S8 r, o% Z: _7 E; {; Q  m1 f
        //配置过滤器
/ ]- |8 h2 e1 s/ T, a6 N        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                          //过滤器0' t) }' z2 C- x1 ?0 ]2 S2 d4 n
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  x0 ?' x) g, }# @) p/ _        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;                 //32位
4 @  I! I' n$ _        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                        ////32位ID
  X  \4 o. d9 `1 m        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
- o1 C& r. x# l- b/ K        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                                //32位MASK
1 Z- H6 R( f0 D. n3 q        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;+ P  U6 l/ V1 q: T% h
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;        //过滤器0关联到FIFO0
: O. v* k+ K& B6 K        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器0. v3 b( i3 }) g9 Z8 t4 D" j, B  _
        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化! c3 W, Y1 {0 d* t
                % N6 K4 ~& Z/ H) n/ n6 I
#if CAN1_RX0_INT_ENABLE
. S) L! _/ J9 ^! i+ b        " r4 ^$ h$ C" \2 H. T0 e) S
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    ( \1 ]9 m4 q0 A% f& T
2 W3 v7 ]  @0 }8 i: S( N% i& r
        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;. _) y. \* f9 a  A( [) J
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为15 _, B0 E+ }2 Q+ I5 U
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0" c. t3 T$ j3 B. L5 K$ M2 ~3 S7 {
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;& @) g. s5 b( x) g2 t& t
          NVIC_Init(&NVIC_InitStructure);
9 ~% |' W9 r; S* o#endif
& d2 {! k; x7 `: D" a; D        return 0;
3 l; \$ H- \$ @. l8 R: c& l" {} $ b, H) h/ `" j  g, l# x! @7 @) m
0 g& d7 O9 b$ A" h( \* H' I
赞 收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于3 f, O  W+ X4 h; I; j
STM32F103时APB CLK = 36M
: k- X( Q* G* ~  p8 F) w2 _9 L对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V
$ L  u7 @  x3 `3 p( k另一个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
8 ^) t4 z6 h6 S: S. H4 j% vkeil自带的例程中系统时钟配置文件应该OK了,
. E2 Y2 R$ i/ a( b. E; x0 k注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。! f$ y5 D4 f  G9 w9 m
APB CLK = 42M
9 K1 ^" y& c7 G& B2 c; Q5 r' E' T' v; z/ Y1 e
CAN1_Mode_Init(CAN_SJW_4tq, CAN_BS2_5tq, CAN_BS1_12tq, 4, mode);
yangquandan 回答时间:2020-6-20 17:19:17
楼主你好,我想问你103和107VCT6的时钟是不是不一样

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版