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

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。
, d) o/ ~$ f; {4 o: u波特率配置代码如下:
; ^3 P; M4 I) }" s, r7 R$ E! a1 ~. q" l
  y. Y/ _# f6 f" Z' i+ ?; I% \" O
7 i0 Z  ^0 ~: F+ R4 [' T0 B1 y) Q
//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
# @# p! \9 `( a7 `                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
' N4 y( L* w/ c; a' r                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps
4 y6 N" Z- o* L% ^& y. Y                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k! d6 J( G3 j4 g) d5 M
                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k
8 y6 B( ]* r8 Q7 T0 [0 {+ u0 M几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。
% U/ _9 p) k9 M5 j9 n  y7 X" K
# n& S0 V/ y! `/ F
' j) G. j4 e7 e( b" X( O7 c初始化函数:( D# E0 u% K9 ?1 A8 z7 _% ]
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode); u, z, j3 h1 X( n( q8 l! ^
{
6 s7 j) k: r' b- }1 k
% O# @1 |0 Q: ~$ H5 t        GPIO_InitTypeDef GPIO_InitStructure; 1 p; H% G+ O. p  P4 c2 o# n
        CAN_InitTypeDef        CAN_InitStructure;
; r4 U! x) V8 h        CAN_FilterInitTypeDef  CAN_FilterInitStructure;
! Q0 u# o8 |3 ]- j4 T! x#if CAN1_RX0_INT_ENABLE ( W# D  V/ M0 a% h, x
           NVIC_InitTypeDef  NVIC_InitStructure;3 V; V6 ?9 w1 A0 q! j* I' g
#endif7 Q3 F8 N; }8 ~& |
        //使能相关时钟5 D0 I( c& F9 b" a6 F
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    
, h: t! E1 ]/ n5 ~" k/ T+ F# H2 ]9 A( L
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟        9 O/ p4 @: m6 r/ ^

+ }8 C( r- r" S4 O0 t8 v; R        //初始化GPIO
/ O' r  R9 `9 d/ g. s        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;4 @( a; N% s7 r6 J1 C/ Z1 p
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
/ g/ E. Q1 Q$ S        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
: |% c1 u* @$ s5 N- V5 d        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8
+ {5 p; ~: ^# \1 m- G0 F
, J5 B9 d+ p  Y8 [9 b! s% u2 O5 N        /* Configure CAN pin: TX */0 |& r: W/ o/ P% P/ K; [
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;) u0 e  _2 o3 l& d; u$ @
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
* }& f9 p  Q7 \$ x; s( W( _; n          GPIO_Init(GPIOB, &GPIO_InitStructure);6 w! \# D6 z/ D* M! z* a. b2 n3 G
( U9 Q' A* F$ x* x
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9        ) F! s) {. g2 W2 q3 D

1 M3 c  c6 c8 E( F8 Q1 T        //CAN单元设置6 g) y. F, [$ j8 D
        CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   9 V  |" |9 f8 o+ v! e  H/ Z
        CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
5 e! ~- s; R6 Z. l! h        CAN_InitStructure.CAN_AWUM=DISABLE;        /眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)3 L, c+ y: J  D; k/ S
        CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送 ) `- `# v7 t  q* S2 i
        CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  & {" \4 Q6 y. g5 P- G4 u5 ]
        CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定 ' v5 |, ~' Y: S& J
        CAN_InitStructure.CAN_Mode= mode;         //模式设置 2 W+ c. A4 n4 x% {. Q7 f' \( V
        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq# j" a* T1 ]  O
        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq. [. P0 X7 i4 V$ j; i% _5 Z" q& [
        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq7 B, |2 N0 e1 C6 A5 o* P" t1 O
        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1       
+ P, f" E, O/ _2 g  a- t5 R        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
6 F1 L! |6 i1 x( |- |2 m8 {& l) q: T" z3 p  l, I2 y7 U
        //配置过滤器. B; H3 e8 l0 l2 f4 `
        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                          //过滤器02 }8 g: |0 ]1 I( J! f  z/ _
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  [5 t- G# o' U: U        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;                 //32位 / ~. g; W3 q* O+ f4 j/ S
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                        ////32位ID9 g8 S: J* W6 ~2 L0 |" D
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;" E  y4 L1 K9 y0 \* _; W; O
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                                //32位MASK, Y" g' m, w) x. Z0 O; Z& T% c: w* |
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;, d) E$ m- s* F1 }
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;        //过滤器0关联到FIFO0
5 |- d6 ~- X+ G) _' I! s! R* e        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器0
: `0 Y3 l  \6 j# w2 ]7 ^        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化1 W. N" U: v) r9 m; o$ \
                ) T! `/ k2 }6 r* \6 J# x: }
#if CAN1_RX0_INT_ENABLE
, Z2 j; _- t  @0 X; R: `       
7 Z3 D' N3 p6 V4 o# Q' v+ j" S        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    ( Y$ B4 q- X! S: @- i4 Z

1 f: S0 B8 r5 t0 O- k& `        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  V4 Z  Y5 ]6 J  s) n3 J7 t' |- a          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1, y/ D; P+ w' D" {+ ]( k* k  U
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为0
9 r: J7 N4 w7 P- w1 y$ o# I1 H          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;1 q. ^6 Y' v! |
          NVIC_Init(&NVIC_InitStructure);
/ I! r1 X6 u: F" G#endif
  X* p- D' l% z7 E& s# `        return 0;
6 O' {3 m$ v& e( O6 m( {$ l+ T' {} # W9 {4 d; G# ]; b& Z, i* I# N
& b2 y- ]. ^  ~1 d
收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于
8 Z; m- b9 B7 g- F( o$ z& oSTM32F103时APB CLK = 36M
8 W/ O8 @' ^% I- T对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V
, ^- d# t% q+ i7 c7 y7 @另一个107的板子电压差是1.0V,怎么会事?
bit 回答时间:2015-3-26 14:11:15
1V是不对的
雪落祁连 回答时间:2015-3-30 12:09:11
问题解决了,应该是时钟设计的问题,应用D:\Keil\ARM\Boards\Keil\MCBSTM32C\RL\CAN8 I6 q6 ~8 k0 z8 m* \2 }
keil自带的例程中系统时钟配置文件应该OK了,! W% K$ D# `! y9 s
注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。
1 v" Q. V. |' ^  ~/ O1 @: V5 UAPB CLK = 42M
) e* H8 j; p) U' P/ X& z
7 F- R# G& u0 M5 P5 j7 ACAN1_Mode_Init(CAN_SJW_4tq, CAN_BS2_5tq, CAN_BS1_12tq, 4, mode);
yangquandan 回答时间:2020-6-20 17:19:17
楼主你好,我想问你103和107VCT6的时钟是不是不一样
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版