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

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。
! S- y( i1 B4 t波特率配置代码如下:
1 g& P3 s6 n9 B0 [8 R# r4 O  X, }) J9 X( a" ?6 {* z* i

5 m: \( N0 x* Y/ j
. z6 l4 L5 W- E( q. H1 i//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
7 C5 b1 s) w6 T. M% V) W                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps' ^8 [4 L+ v2 ~
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps8 K7 P' S, A& ^: K2 d2 \* F
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k
. k$ i5 p( ~4 c5 u0 d6 {                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k
# p& V; ^' b2 s几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。5 F1 i  _6 _+ W9 ^: @6 }
) c2 a  S& \0 g. P! R* g0 c' L

0 R# m( {. U) _( s4 X. V8 d4 D7 s* l初始化函数:& t, ^) |( H" H. o# x* k8 H" |
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
7 v9 a: @8 \4 j! Z{4 R- g. j+ N2 m9 n

  r! B: V, N4 E" U  q- k3 r        GPIO_InitTypeDef GPIO_InitStructure;
$ f( l6 J" }" O0 C8 A( |        CAN_InitTypeDef        CAN_InitStructure;3 ], M6 W& ]: F4 ^! I6 {0 E
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
/ Q" O/ v0 W5 _( f; {( D- f7 s$ U" f! _! o#if CAN1_RX0_INT_ENABLE
& f( s9 Z$ ]0 O$ f           NVIC_InitTypeDef  NVIC_InitStructure;
( f9 x4 y8 @- G- |# w#endif* `" {6 R! ~: Y8 Z3 t! R
        //使能相关时钟/ N4 D: S' x7 Q5 P! H5 d2 j
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    . \! Y/ h# Y( c3 C( R( }. g( g

+ ]9 ]+ N* R% g$ k  b5 f        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟        9 |; O7 u  l: F8 Y- ~) d
& k) _1 X# N# Q. M
        //初始化GPIO
' X' U- q8 ?0 P$ f8 t! x" d' j        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;! @0 s; M5 Y. L  r2 r# G
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
, L' W! m$ V4 l; A        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        3 g4 b. X- [+ F1 B
        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8
5 c/ B+ L3 z: ?
+ \& z* m. ?1 S2 R        /* Configure CAN pin: TX */
. {! `. M, }& x% z9 C% ~          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
$ n" a, ]# Y& `# o! J: @) m          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
1 Z3 p7 K# u0 O4 M          GPIO_Init(GPIOB, &GPIO_InitStructure);
3 u* Y2 C* S4 b5 f$ f* J# s' H( V, g
) b( H1 {, _' {, G- U* V) S7 E  ?        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9        9 }  R, w( w, Q4 t/ z% I
' U0 i, r) b  T/ W4 }
        //CAN单元设置6 T- H1 G$ J  {4 k  h
        CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   
5 w6 s) `; B& n" f+ H        CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          ! V9 h, V  Q) J4 Y( a8 J- n
        CAN_InitStructure.CAN_AWUM=DISABLE;        /眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)* U; b) Q- o& P! z9 T/ ~5 R, x
        CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送 % L( [" t( z7 R5 o1 ^, ?5 E1 G+ k0 r
        CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  0 n$ z. G5 d0 U: [# Z
        CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定 . H" c; J+ c6 ^0 w+ k
        CAN_InitStructure.CAN_Mode= mode;         //模式设置 : ~4 t" P& s4 b) j! |3 P
        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
7 f, Q7 B; `9 `2 Y/ C# b        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq9 U/ }/ r7 V% g5 S: P; `5 J
        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq
; `. J% K- T) l! V        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
- r! F" \0 J  y. `        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
0 w8 }8 G0 I1 A0 }& K; m
4 y6 z! e* J, w5 r, Q% H/ h        //配置过滤器8 A& x( F& U' ^! C+ U
        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                          //过滤器05 Z+ j& _4 A, S# k) H& v1 N; P
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
0 N# a( w# g2 H: Z0 G. R        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;                 //32位 , [& @# M4 Z. ?2 j. l! `& o3 C
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                        ////32位ID
/ e& l' u0 v  _, K        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
' X( E/ A$ e8 O# M        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                                //32位MASK
/ R! e% ^3 S5 O; y9 F' ?        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;0 q6 ]5 k, [4 W' `! s! H$ f) T
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;        //过滤器0关联到FIFO0
% r0 n6 O' D" s/ o3 Z, \        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器09 `' s) @7 g; V5 F9 V& M
        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化
8 ]/ G; M' x  b. K               
2 }( S- X9 v  u4 r. h#if CAN1_RX0_INT_ENABLE( j/ a' p# w6 |0 z" M9 S. e( x1 ]/ N( [
        7 M9 W4 u+ {0 ~
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
* t, `5 Q. B) V. p
, \2 `$ w, E1 g& `- U: l' ]        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;8 {% h$ [! B- n$ I7 V4 p+ Y
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1& l3 G8 f; L# ^6 l  _+ S$ C
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0% s0 n& b. q; S& B0 B. q6 N( C
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& b, t6 Z- X/ ~$ b6 g% a3 B          NVIC_Init(&NVIC_InitStructure);$ H  \* \! L" J% ]& F, {0 d
#endif! [2 c8 n: g" b* |% }4 J9 W
        return 0;" R1 g1 P' M& }5 x0 p) N# ~" }
}
: n9 k% p- e9 [; T; M
8 _' v0 E5 A2 z9 M. l
收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于% t+ S- l4 f& K) i4 }
STM32F103时APB CLK = 36M
: T8 r# |" k6 @& X+ _  R( a4 D& H对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V
7 N) E$ [+ l2 G4 U& r另一个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
+ r; @6 r+ _5 |6 N7 qkeil自带的例程中系统时钟配置文件应该OK了,
  a  t. g2 c3 {8 z注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。$ @: z" c! N# Q! k# U& ^: k2 U: x
APB CLK = 42M
# B* }! V  e" A, C) R2 z/ p7 H- t$ x! l4 t' [* H6 o
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版