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

STM32F107 CAN

[复制链接]
雪落祁连 发布时间:2015-3-26 10:46
调试STM32F103 与 STM32F407两个板子互相通信都通过了,500k波特率都没什么问题,可以在STM32F107Vc上面就是不能正确设置波特率。7 F' p6 i* Y5 d; k. R: K+ L  `
波特率配置代码如下:
8 {/ D* u2 j6 `0 u2 h, W  x: R( q; I' t/ [! K) D8 J

6 |" y! z3 P# V+ `+ A. O
8 @  J7 v8 l% j% n- q6 ]) q//CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_7tq, 1, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps+ D. e7 ]7 Y1 [: H
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_3tq, 6, mode);        // CAN普通模式初始化,普通模式,波特率500Kbps
# k$ b$ o, Q9 J4 Z                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_8tq, CAN_BS1_9tq, 8, mode);        // 普通模式初始化,普通模式,波特率500Kbps' I; A, y2 B, j0 Q1 E
                        //CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_3tq, CAN_BS1_2tq, 12, mode);//500k0 R; [  L# \. J5 i  h0 q; s1 S
                        CAN1_Mode_Init(CAN_SJW_1tq, CAN_BS2_1tq, CAN_BS1_4tq, 24, mode);                //36m 1000k
# U1 d* O4 j5 N1 X# U- Y几个都试了,就是不行示波器测量有波形,但与407,103发同样数据,数据周期都不一样。4 Z. i; W1 j$ g( [& ]: l& C

2 J4 ^; U/ H" p' G6 ]: H5 O2 N; e. _# G1 j6 \1 i7 e; D
初始化函数:5 Q8 s% M5 \, b8 ?8 V& o8 L' [! p
u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)9 Y6 F% D# R' M1 W8 i* U
{
4 e# ]2 U; K+ z3 a$ {) A! L2 p$ H6 y  b0 G% J7 c
        GPIO_InitTypeDef GPIO_InitStructure; 4 b0 o' H" N* k# K6 t3 m' O& `
        CAN_InitTypeDef        CAN_InitStructure;& |$ g1 r- W$ `4 a3 _" v
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;! p# |% ^( t3 N3 Q5 D
#if CAN1_RX0_INT_ENABLE
$ M6 X) f+ F, p3 i9 ]           NVIC_InitTypeDef  NVIC_InitStructure;
$ e+ e. T- J. M2 J& a0 I#endif
! W& J2 N- {5 ]& c        //使能相关时钟
. h( @& {( T' ~        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PORTA时钟                                                                                                                    
0 K/ Y$ l) a6 d' W9 h5 F+ J/ ^
6 X7 d+ f) c* P  X        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟       
  [; q6 d) ^; I2 a7 w; @
( J9 S3 h; e5 Z* K        //初始化GPIO
0 }1 `2 b6 ^# q        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
: |8 V. ^# v* i' `5 a3 x' H        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
! H' \! D% b' w% U8 Q5 z+ H        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
3 A( o  _3 j: g# s* k+ X        GPIO_Init(GPIOB, &GPIO_InitStructure);                //初始化PB8
& {( a, p+ ~- L6 ]: L/ u0 x0 X7 g3 G& T: o
        /* Configure CAN pin: TX */! c# s* f5 t; p% i3 H2 t3 h: l
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
6 k+ f) X6 l4 O* Q1 F          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;' w& s! ~6 t  Q+ {- p
          GPIO_Init(GPIOB, &GPIO_InitStructure);& t2 I9 W* h6 s% A1 h% Q
; E8 p! r8 P* q7 Y0 R9 f+ }
        GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE );//重影射CAN IO脚到 PB8,PB9       
. i4 h+ K2 ?( b4 S- [) p. ^9 N1 m! s: F1 ]+ H& L  b5 e
        //CAN单元设置9 a" A$ T2 Q. Q5 K8 Y7 y
        CAN_InitStructure.CAN_TTCM=DISABLE;        //非时间触发通信模式   
5 D2 l  H) T1 i5 q) v5 i; Y6 Z        CAN_InitStructure.CAN_ABOM=DISABLE;        //软件自动离线管理          
5 C/ ]# k/ c& v: R        CAN_InitStructure.CAN_AWUM=DISABLE;        /眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)( o( v/ e1 T6 c6 u
        CAN_InitStructure.CAN_NART=ENABLE;        //禁止报文自动传送
$ h/ J8 `( f1 E; E        CAN_InitStructure.CAN_RFLM=DISABLE;        //报文不锁定,新的覆盖旧的  + ~. D% [0 `) D( T% G3 ?
        CAN_InitStructure.CAN_TXFP=DISABLE;        //优先级由报文标识符决定 $ Q( [0 {/ l: B+ l7 j8 B. ^9 T
        CAN_InitStructure.CAN_Mode= mode;         //模式设置 7 Y' Y  q8 Y/ S) d9 R
        CAN_InitStructure.CAN_SJW=tsjw;                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
& H+ i5 ?4 r7 j  P9 j2 z        CAN_InitStructure.CAN_BS1=tbs1;         //Tbs1范围CAN_BS1_1tq ~CAN_BS1_16tq& B+ k2 z$ t0 R* D1 N% S
        CAN_InitStructure.CAN_BS2=tbs2;                //Tbs2范围CAN_BS2_1tq ~        CAN_BS2_8tq% P9 x5 Y8 k/ n1 f, n0 [
        CAN_InitStructure.CAN_Prescaler=brp;  //分频系数(Fdiv)为brp+1        5 R3 d( U+ N; @/ b# F2 k
        CAN_Init(CAN1, &CAN_InitStructure);   // 初始化CAN1
! n2 n7 D1 V8 w* f# {3 x0 v3 I/ ^* D3 O# u; V% U
        //配置过滤器
6 `2 b7 [0 U( ]+ Z: @5 P        CAN_FilterInitStructure.CAN_FilterNumber=0;                                                          //过滤器0
8 J/ w( D- n" l4 T6 \) h7 B5 v6 E        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;   e/ y, Q9 X$ Z! L6 ~7 }% w, c, M
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;                 //32位
; E; }; C" F! u! F5 u        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;                                        ////32位ID$ c: ?( O. U5 ^% Q0 ]( K" G
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
# C1 K/ `$ t1 H8 W1 W0 [! L        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;                                //32位MASK
  x+ a; v7 B/ X4 S        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;, x# R/ G& G6 r/ n  X5 _) |( _5 U
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;        //过滤器0关联到FIFO0
) z$ X' c8 Y- K& j" U        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;                                 //激活过滤器0
& {* b: `6 d7 B0 r9 Z! {        CAN_FilterInit(&CAN_FilterInitStructure);                                                        //滤波器初始化" F% V3 y7 U5 j/ M& _2 |
                ) X, r; w+ z4 n8 f( Z9 x' q! a
#if CAN1_RX0_INT_ENABLE
6 `! x- A1 K$ X; m. l       
( \. m( e' v% u/ Z        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
9 F/ c6 o0 ?! T/ k2 b7 V# j4 u- P5 R4 V' `# j' ?' g
        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;+ @+ `/ B4 U; l- d
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为1; o$ x8 b, s) x- l) ]! |
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为04 ]  \* G) P' J' x$ d( ^  f5 ^
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  x9 M9 S# j5 |  H: O          NVIC_Init(&NVIC_InitStructure);
& u9 I8 i: ]( T2 |#endif! `8 k, z1 q- Y
        return 0;7 A& r# P) `* b. y
} " k$ i  _) v8 I( i
$ m* S5 H/ r' S9 C0 J/ ?( k
赞 收藏 评论5 发布时间:2015-3-26 10:46

举报

5个回答
雪落祁连 回答时间:2015-3-26 10:50:42
补充问一下波特率计算公式:APB CLK /(CAN_SJW + CAN_BS1 + CAN_BS2)/CAN_Prescaler这个公式对于, k6 k( _% D+ ]2 Q  r+ f% m
STM32F103时APB CLK = 36M
% y9 l( K0 H) o对于STM32F107是多少
雪落祁连 回答时间:2015-3-26 10:52:20
两个板子103的板子CANL与CANH电压差有数据时是2.0V
; S6 x0 @, Q0 d8 ?0 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
5 o0 b5 |; ?4 p/ [keil自带的例程中系统时钟配置文件应该OK了,& A  t0 R- o3 Q5 `
注明STM32F103时APB CLK = 42M,怎么配置的没看明白,待有时间的了仔细再看看。
! A# s; v! r" E1 vAPB CLK = 42M1 c5 _0 t6 ~" }& V

0 ~; C6 ~0 e) U# vCAN1_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 手机版