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

【经验分享】STM32F042 CAN使用例子

[复制链接]
STMCU小助手 发布时间:2021-11-22 21:03
代码如下:$ q5 v0 q. {  I8 ]. C* ^! ]" l

6 s" }% V! h1 g; l: t% G% C
  1. #include "mycan.h"2 O1 T# }+ z' o+ K* J7 ?
  2. / I: B) N8 G+ y  C: j. j
  3. //CAN初始化
    7 z1 p! I9 v; t& l( r) E8 [/ x4 v
  4. //tsjw:重新同步跳跃时间单元.范围:1~3; CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
    3 a% w8 K. H! I- q2 D% W
  5. //tbs2:时间段2的时间单元.范围:1~8;
    % V" j6 x: ]; W3 O3 E; Z: Y
  6. //tbs1:时间段1的时间单元.范围:1~16;          CAN_BS1_1tq ~CAN_BS1_16tq# c) ~& ~, _2 m! }; a: h) m9 n5 s8 V8 W
  7. //brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
    & [3 ~' ?; f% k
  8. //注意以上参数任何一个都不能设为0,否则会乱.1 s  Y0 T* e  @0 t8 b/ Y
  9. //波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp);: k; L1 @( }5 R- V0 f) x
  10. //mode:0,普通模式;1,回环模式;
    - I( ?4 ]. l6 M% T. H
  11. //Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);& K; u3 ~5 }- o
  12. //则波特率为:48M/((1+8+7)*5)=450Kbps
    $ x& @6 f7 G( k$ J: ^1 W5 ?% g7 E/ ^

  13. $ i! m0 S' }# Y, g% w" e6 J
  14. void CAN_Mode_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,uint16_t brp,uint8_t mode)+ q! p; E. a: {/ ]% ^: k
  15. {0 J' V) M( R0 e

  16. 3 {* ?: e+ G3 V7 G8 b$ i: k( ]
  17.         GPIO_InitTypeDef GPIO_InitStructure;
    : [" e+ T* j* n& ~
  18.         CAN_InitTypeDef        CAN_InitStructure;9 q/ K$ M# o1 o; d( A1 K* O6 k: ]
  19.          CAN_FilterInitTypeDef  CAN_FilterInitStructure;% m, w3 ~7 ^5 k9 V" e
  20. #if CAN_RX0_INT_ENABLE 7 ~  \9 {9 Z) h: N5 |! l
  21.            NVIC_InitTypeDef  NVIC_InitStructure;
    5 x9 V  S9 ]+ g" A+ r1 h
  22. #endif
    5 _" `* r6 t7 y+ ?3 W2 C4 D
  23.                 $ _. @% |0 l4 g( C+ O1 F7 j1 S
  24.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);9 ?+ x. r. Y2 ^0 [
  25.                 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能PORTA时钟                                                                                                                    
    * ]1 \0 P) I" `& g
  26.           SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;                  //RMAP        8 ]/ l0 C$ u  y) b# E# h7 y
  27.           GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_4);
    7 ]! S- q* x4 g3 v- y0 C* i
  28.                 GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);: q8 ?) g6 V' o4 G
  29.           RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);//使能CAN时钟        
    7 V; f$ [; D4 v: c' H
  30. ' m5 a8 D/ m: N) e
  31.     GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11|GPIO_Pin_12;2 G8 n# Z. i* [0 J+ {" k  v' `
  32.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
    . C  o' g  `  H. _! f
  33.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;; ?, `3 O$ K; r5 }
  34.     GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;! |2 D/ E9 V! ~5 H, m" j; c3 j
  35.     GPIO_Init(GPIOA, &GPIO_InitStructure);, n0 l4 K' Y, N4 R, j, w1 b
  36.                 7 B+ x) D/ U. H8 B
  37.           CAN_DeInit(CAN);, m- N; j' \, Z6 a5 F
  38.          //CAN单元设置
    $ Q" s* U- N4 V$ g
  39.                 CAN_InitStructure.CAN_TTCM=DISABLE;                                                 //非时间触发通信模式  //2 v6 w& ]& w) g3 K
  40.                 CAN_InitStructure.CAN_ABOM=ENABLE;                                                 //软件自动离线管理         //7 R( Q# u' @# \
  41.                 CAN_InitStructure.CAN_AWUM=DISABLE;                                                 //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//, ~" x: n2 p5 \  l7 i8 _7 U+ z
  42.                 CAN_InitStructure.CAN_NART=ENABLE;                                                         //禁止报文自动传送 //
    8 e, d( E8 ?% w# I) Z. ^6 n
  43.                 CAN_InitStructure.CAN_RFLM=DISABLE;                                                 //报文不锁定,新的覆盖旧的 //
      f! C4 {! U; r. s8 L0 A, E; X
  44.                 CAN_InitStructure.CAN_TXFP=DISABLE;                                                 //优先级由报文标识符决定 /// d' i: V  U: ?! d
  45.                 CAN_InitStructure.CAN_Mode= mode;                 //模式设置: mode:0,普通模式;1,回环模式; //7 E: k7 _- k$ s( ~- ^! L& C
  46.           //设置波特率; w/ {( c( r2 i2 b# t2 z5 `$ g
  47.           CAN_InitStructure.CAN_SJW=tsjw;                                //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq3 d8 c3 o2 q' z0 e7 }+ g( ]% f, |2 c
  48.           CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq! N8 D, ?( A4 q5 P( Y5 O
  49.           CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~        CAN_BS2_8tq& X( J) O0 ~, p( B* P0 j" u
  50.           CAN_InitStructure.CAN_Prescaler=brp;            //分频系数(Fdiv)为brp+1        //
    ' M& H* S; U; |" l
  51.           CAN_Init(CAN, &CAN_InitStructure);            // 初始化CAN1
    # p" q: x8 |7 w9 e* |1 Q, {

  52. 1 H7 i2 Y- ~; h7 k& G
  53.                 CAN_FilterInitStructure.CAN_FilterNumber=0;          //过滤器0
    & P5 X. q, a' A- _3 W  q# V$ u
  54.                 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; ; ~8 j% V- P8 F
  55.                 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
    $ [  h5 _- c  g. ?, l
  56.                 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;32位ID
      {3 R# R% J0 J# i
  57.                 CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;8 G& v* a* S: ^; w) s% Z3 t; l
  58.                 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
    $ E( J! n5 w; H6 \* R4 ]. w
  59.                 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;2 G( P9 c3 \, B) d4 p
  60.                 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
    / Y$ ?% f9 R, a3 u3 M% d% r! n
  61.                 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0. R. v: z3 Q; [. u9 z0 g
  62. 1 u! u- {( _. B
  63.                 CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化2 w( b' `  h% ^  G0 G. d* z
  64. #if CAN_RX0_INT_ENABLE$ ~2 |' n5 ~( h. ?* b7 r/ a  M
  65.         
    / R9 t! |" V. X
  66.                 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.                    
    + s* _& D' i) h4 T0 h9 u

  67. 9 T0 `+ x" ~) w3 n3 g  r6 z6 g5 W
  68.                 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;/ k1 @9 e* t( }2 {, p
  69.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     // 主优先级为11 A) s3 C  z. {8 X$ g8 w
  70.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            // 次优先级为01 P' X6 c' p  b6 i, \& B5 R
  71.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    1 q; ?5 ]$ z: ^  {  l9 ?: j: Z
  72.                 NVIC_Init(&NVIC_InitStructure);, ^; m2 c) O% n6 c7 U4 G8 ~: G4 q! M
  73. #endif2 V  x1 ?7 I1 x$ p, C2 D9 O
  74. }
    . m, l5 @/ U6 _" M
  75. #if CAN_RX0_INT_ENABLE        //使能RX0中断1 x, F* U1 A7 g6 ~' Z% N' |' {
  76. //中断服务函数                           
    6 y% \' l  f# Z
  77. void CEC_CAN_IRQHandler(void)
    # y, Y, r$ @; C% k8 B' W; \) b4 Y
  78. {
    2 `% ?. p2 k2 p( F' U: Y, p
  79.                 CanRxMsg RxMessage;, w/ d9 `: D0 n: B
  80.                 int i=0;
    * [* s; e; c4 ^1 c% K8 o* U4 R
  81.                 CAN_Receive(CAN, 0, &RxMessage);- ~% C& a9 M1 R8 k) x( g
  82.                 //for(i=0;i<8;i++)& ~2 M4 j/ ]2 g6 z
  83.                 //printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data<i>);</i>
    & b  @6 u8 l  F9 n" r& H  R% `
  84. }
      ^/ h# j% ^* m) I: S4 v+ y+ ~
  85. #endif  W. q* z4 X( G; a3 O  q9 E9 H) \+ |0 v1 n
  86. 4 S# Q2 s  R4 F- C
  87. //can发送一组数据(固定格式:ID为0X12,标准帧,数据帧)        2 n' n* J6 q, p9 k9 Y2 j
  88. //len:数据长度(最大为8)                                    
    $ y% m- x6 ^, a, ?9 O1 M' `
  89. //msg:数据指针,最大为8个字节.
    ' |6 g+ ~$ E) R! b. E% T. g
  90. //返回值:0,成功;+ s2 A5 R- \& G7 x* v& V
  91. //                 其他,失败;
    ! v: k4 i) T+ t, ?) M) h  E
  92. uint8_t Can_Send_Msg(uint8_t* msg,uint8_t len)) R6 S- M7 S5 H/ I( m# G
  93. {        
    : _+ m) h$ d  s; K/ P! F& z3 A- |
  94.   uint8_t mbox;' e5 V% W0 q1 I; z1 w
  95.   uint16_t i=0;& ?8 ^+ ?" `$ \8 Z% S6 |
  96.   CanTxMsg TxMessage;) z* D! P% M# R( a9 [
  97.   TxMessage.StdId=0x12;                                         // 标准标识符为0$ B- ^& G+ a% P, Q
  98.   TxMessage.ExtId=0x12;                                 // 设置扩展标示符(29位)) q, N/ ?& V/ I, L8 `4 {
  99.   TxMessage.IDE=0;                         // 使用扩展标识符, t6 ]* }. d8 U5 G' M0 [
  100.   TxMessage.RTR=0;                 // 消息类型为数据帧,一帧8位
    % u5 _- j# L" M; i! R' i/ |* i( C
  101.   TxMessage.DLC=len;                                                         // 发送两帧信息0 q6 m/ Z6 h7 d' K& @( b
  102.   for(i=0;i<len;i++)" A) Q. L( b" \; ~, b2 q5 A: u9 r
  103.   TxMessage.Data=msg;                                 // 第一帧信息         
    8 u7 [* ~3 v+ S- d7 A! Z
  104.   mbox= CAN_Transmit(CAN, &TxMessage);   
    ! P! _7 K( K# h' I2 w9 n
  105.   i=0;
    9 ]4 X5 _0 S# t+ M! U' Q4 i6 w9 Y
  106.   while((CAN_TransmitStatus(CAN, mbox)==CAN_TxStatus_Failed)&&(i < 0XFFF))i++;        //等待发送结束
    * b- z: o: e2 ^5 e& r
  107.   if(i >= 0XFFF)return 1;6 X4 y9 K2 Q4 X
  108.   return 0;                5 u- Q6 v$ i/ f5 U4 V8 x
  109. }2 y: b9 `5 O1 a! |$ P
  110. //can口接收数据查询
    : D! ^' ~8 [( o8 k: ~) [/ _9 H
  111. //buf:数据缓存区;         , h. T. s6 l( o% E, X3 h) m
  112. //返回值:0,无数据被收到;9 V+ `/ B/ j7 v( }9 b
  113. //                 其他,接收的数据长度;9 j4 D' E) Q7 L: t- r8 V
  114. uint8_t Can_Receive_Msg(uint8_t *buf)7 I4 Q4 l+ l- [) `( Y, v% R
  115. {                                      
    & K3 Y, m8 w2 i
  116.          uint32_t i;
    % n: @& r) }! `: Y
  117.         CanRxMsg RxMessage;
    + v) W7 K2 a: B3 \
  118.     if( CAN_MessagePending(CAN,CAN_FIFO0)==0)return 0;                //没有接收到数据,直接退出 ( r6 Y7 b1 r! L( X% h7 K
  119.     CAN_Receive(CAN, CAN_FIFO0, &RxMessage);//读取数据        . w4 |' a- p3 u
  120.     for(i=0;i<8;i++)7 u6 k+ Y: ~( a3 ]# a4 A8 \& T
  121.     buf=RxMessage.Data;  
    8 D" f! Y2 E1 i+ S# k
  122.         return RxMessage.DLC;        6 m) K" Q  H9 k
  123. }
复制代码
) A. G- L/ T! X3 J: J
注意:一定要根据自己的封装来设置
+ I0 c/ g/ v; P% h% B) p7 CSYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;
3 d. Q7 f7 C" h, |如果不设置 CAN_Init(CAN, &CAN_InitStructure);会初始化失败
1 G; q- q2 \3 `) r) }1 ^: E' c4 ~) u, V* s6 u
' }4 c7 y9 j: {- ?! h
收藏 评论0 发布时间:2021-11-22 21:03

举报

0个回答

所属标签

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