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

【经验分享】stm32f042调试Can心得

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,/ u5 ~7 l: i0 x/ W% X
3 f: J! O  S4 ?
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码
2 b: a/ x! J! X8 [: k/ L
结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。
, F% o/ ?5 e, d  l' [
/ M! n: Q2 o9 @' B# `+ s/ V+ {由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。
4 A! j+ [8 g! X5 n: Q' ^& i2 ^2 v
! v8 o9 z( G+ H
  1. DEBUG [D] main:94 hello armwind0 c9 n7 `; W- k5 L) z! |: @
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码

9 i" w) D  L" \5 C" g查看源码发现,断言表明,这个方法只能映射系统mem.3 O, Q+ P- ]) K" C

9 d  ?: c+ H* K7 R
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)2 C+ p% K* _  X8 g5 u
  2. {
    , L: W1 B5 p9 `- C/ X! e+ N  ?* w5 t
  3.   uint32_t tmpctrl = 0;
    3 ?7 `$ K1 R1 w# P$ h
  4. ' ^, k( w5 t3 R
  5.   /* Check the parameter */
    3 j8 N* [1 x* F
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));. y4 z, v5 m- \. L

  7. 5 b2 d4 m- }3 d: f
  8.   /* Get CFGR1 register value */
    , d" W0 L% w8 l3 z; ~  n9 n
  9.   tmpctrl = SYSCFG->CFGR1;6 {8 j; K2 E3 k& B  {5 b

  10. 8 H  w) m7 r' q5 Q; B" y
  11.   /* Clear MEM_MODE bits */' S# D% v# L4 V& H
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);. w' B% g7 P2 A
  13. 6 f2 z7 V5 n! |% R& k
  14.   /* Set the new MEM_MODE bits value */0 O& J# N' u- ]2 m0 @! |
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;
    4 ]' G7 a$ D5 N

  16. 5 K0 z& y  P  b% d' O; L: P
  17.   /* Set CFGR1 register with the new memory remap configuration */! h, ?8 s  D4 N4 L4 ~1 y9 s
  18.   SYSCFG->CFGR1 = tmpctrl;
    + M( F- ^0 u! V' u6 g9 w
  19. }$ T# f1 p5 }/ r. L5 F$ Y

  20. # T+ i0 ~2 R' P3 I1 }- e
  21. //宏定义很明显
    0 q1 x$ p8 x/ H" x5 h* k, f" ?- E2 ^
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \4 r2 m( \$ W% s0 b
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \
    ; ?4 y5 _5 M! q: k  Q5 k
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码
- W0 u7 |/ u  v
所以使用下面代码即可map成功
' B9 X% S7 L! V) G
/ z" k6 y1 R, m: @. T
  1. //不要覆盖掉系统原始的配置
    4 V1 j& Y" b8 i& X& o* q6 ~
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码

* N5 A) l3 X. K) l; h1 n) g* P完整的Can初始化代码
% T! _  _0 z5 Q9 |8 [: S! ]2 w9 K) O8 }/ H& |) o
  1. void can_init(void)& g" {% G$ [& u2 `
  2. {
    ! m( |4 d2 x% H4 p
  3.   GPIO_InitTypeDef  GPIO_InitStructure;$ d8 f1 Z& k8 |( f  o9 z- Q
  4.   NVIC_InitTypeDef  NVIC_InitStructure;+ [* H+ B( ^7 R: T$ j( @8 W1 f2 l
  5.   CAN_InitTypeDef        CAN_InitStructure;
    ' V' }, {9 A# Y+ A1 I  m
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;+ ^/ l, b$ j4 u# V0 ^
  7. 1 K  i) t+ b' y) f) d/ u& \
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);5 I$ f' N9 L  A- p3 {( g. ^/ u8 W9 B6 P+ i
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;! i% y) J" }: o" q+ c+ X

  10. ' M# ?3 d+ `$ ~8 ]' G7 L, |$ S
  11.   //这里一定要先映射GPIO# q4 [# H/ @. x9 u: j
  12.   /* Enable GPIO clock */
    0 w5 Z9 t4 {: O! H! a( Z+ J! u
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    " x% U. t3 k/ v8 Z( q3 `+ Y3 q2 g4 r6 R
  14.   /* Connect CAN pins to AF7 */' O0 J3 o9 U0 F8 y5 F7 @
  15.   /* CAN GPIOs configuration **************************************************/( j0 P% d$ {; N  A
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    , d% |2 Z  ~& u& t/ C5 |
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
    ! n+ r! S) N- f; m

  18. 8 `1 r) y% w5 r, k
  19.   /* Configure CAN RX and TX pins */& @# [3 ?" g" e* y- M' S6 i* ^/ }0 T
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;+ }3 K% O- c4 d$ o9 ~+ S7 C; d  A, l
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;, S' q5 G- ?. t+ E
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    2 K% V+ g- s" y
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;& s; e; U" w2 v9 h
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    % X* A8 G) s2 b! j
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);
    + S  m0 ~( R+ X7 H  Z
  26. # [9 t3 m, ~- p( A
  27.   /* NVIC configuration *******************************************************/' i9 Y$ U2 o2 K! ?( Q" S
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;3 b' a# q( e' [- G+ {
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
    ! t2 L# u  D  h- Y; q2 q/ v
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    ; @* y1 V6 B# p7 A, ?2 a/ h0 X
  31.   NVIC_Init(&NVIC_InitStructure);1 P) V+ N2 `$ b
  32. : P3 h$ e' Q5 [; F; D8 a
  33.   /* CAN configuration ********************************************************/
    * T! d4 q! F: R# V, p% w# q; K$ Q
  34.   /* Enable CAN clock */. K, f2 {6 B6 m4 I: B" |
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
    * Z, }" M/ J4 O; e( ?4 u( u+ P

  36. ! K: x9 Y7 ^$ }" T1 M7 X% `+ v
  37.   /* CAN register init */6 w* J0 |9 x# x
  38.   CAN_DeInit(CAN);% q" Z- L; }" o
  39.   CAN_StructInit(&CAN_InitStructure);
    # }( T" i& {* j( S
  40. 2 K5 n" k& N( H1 [2 |9 N- T* X# \! }
  41.   /* CAN cell init */
    $ c" B: z8 A# ]; i) j1 }
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;8 U. x' x/ W  I& A5 t- `
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;8 V$ i6 w$ Z4 F) L8 y
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;/ }( F5 q& E1 b0 C
  45.   CAN_InitStructure.CAN_NART = DISABLE;: v" m4 u1 d7 |# I
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;
    ; {5 w. X  Z1 f* ]! _2 g+ A  W
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;
    & f. d) A9 g  O
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;! y1 K2 }' G) Y( b
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;7 x6 I8 x+ I% T( Z3 ?* b, k. Q! l
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;" P& Q1 f) ^1 C0 A
  51.   d2 R: R0 d: D3 [
  52.   //200k的配置9 Z0 u+ m& N. m' u7 k2 O! h1 o
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k9 p& u9 n2 e8 o
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */: M. E# }' Q" P% J
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
    - z5 _1 D- i3 t: \6 _  ^
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
    + i  j- k5 ~7 [& q5 i: M. s
  57.   CAN_InitStructure.CAN_Prescaler = 12;
    ; H1 t7 m9 J; |  I% Y
  58.   CAN_Init(CAN, &CAN_InitStructure);
    - l8 p, k0 B* X2 d
  59. 8 J! U8 m) M$ f# \# H6 v: P6 d
  60.   /* CAN filter init */' L/ h- M. f0 i( ?$ j
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;
    ( `, X8 i- r+ H1 Z
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    , y6 e: U( [/ x1 w" K; n$ o
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;& {9 P' l8 Z3 @
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;& Q7 K' b- V1 V( w
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    % `; M3 h+ w! |3 V6 s# L. N  [
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    6 u! V* ]7 S! i( Z# d
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;. t+ x. O  m7 x" K- e2 G( B3 @
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;( P4 L0 c$ M- F' I& X' t
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    * Q. d; N/ |/ R. x. J' h
  70.   CAN_FilterInit(&CAN_FilterInitStructure);; @) g- a& |( q0 P; p- B
  71.   /* Transmit Structure preparation */
    / b( k8 T  `( q* j# A4 G
  72. , G& }0 |+ c6 k% ?6 d! f: n8 B  s
  73.   /* Enable FIFO 0 message pending Interrupt */
    / M* ^" S* M) `5 F% H9 u" K2 p
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
    ( Y6 f0 T! d6 X; ]7 l  p
  75. }
    9 Z* B6 F! m, c/ o
  76. 0 e9 U+ Q7 f, J8 b5 e* G  ^3 B
  77. ( G: X  C9 x  }2 B7 J1 ]
复制代码
% ^1 ?( H, ~9 a- v5 e: L1 n! K( M
* Y8 {/ m! F. c" n5 H
D%XB1GC`78[95[~{DGB}193.png
赞 收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

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