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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,4 u% z+ T1 G4 p; J% P8 H
" m# C7 |1 w1 J3 F( F' I
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码
' B4 |- y! c4 z6 a
结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。- ~7 W2 ~" k4 A1 F# M

3 C  y( h6 }7 T  V由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。
4 ?2 m7 t& ^+ |1 o; h( w& A) M, {. V+ a- e
  1. DEBUG [D] main:94 hello armwind. B9 t# Z  W4 N/ l2 v% K
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码

2 m( ^" w( H. ~5 M查看源码发现,断言表明,这个方法只能映射系统mem.- [; g$ I( R% m/ W& U1 s2 x

/ ~* r9 k; L. s4 H
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)- A1 h% {8 n+ X% X4 t- p! l
  2. {
    ' D' O2 P& i6 @" G" Z/ h- \6 h, R
  3.   uint32_t tmpctrl = 0;
    6 x# [7 M4 {( T7 j
  4. % b+ o) V8 r6 i, g
  5.   /* Check the parameter */5 f' d- P# X3 l! m, P, o5 J
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));
    1 t( K- {7 z4 U* \
  7. # s1 q  a: I; Z" I0 i+ }
  8.   /* Get CFGR1 register value */
    1 S9 c/ _( l/ K
  9.   tmpctrl = SYSCFG->CFGR1;; @3 h$ |) }" R4 x

  10. 9 W* J: l( b* A, z
  11.   /* Clear MEM_MODE bits */6 I4 c% l8 I% G
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);. R9 o) L; b9 _4 {+ U/ |

  13. & l8 b" D/ m9 S7 j
  14.   /* Set the new MEM_MODE bits value */' T8 a3 L5 L! k/ \- N
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;% y9 ?% g$ N% m* e% r" u% ~

  16. / G1 X5 e, f7 J1 R
  17.   /* Set CFGR1 register with the new memory remap configuration */
    0 t1 @: F6 `+ E, n' Z
  18.   SYSCFG->CFGR1 = tmpctrl;' r7 f; ~; q6 c( {
  19. }
    ; r) h2 {; w9 R9 T/ G

  20. % W6 t& y6 Z0 Q4 r
  21. //宏定义很明显, r/ V4 u/ K( Q7 W+ e4 S
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \7 U  n  I3 x+ l. L6 l
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \% W* H0 i1 A( a- ~% t' @8 w* q
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码

: Z8 C7 X0 K) v8 f4 Z# ^; b所以使用下面代码即可map成功' i7 c' h" f( k4 w8 w, b; O

5 L+ ]# M8 G1 P& a
  1. //不要覆盖掉系统原始的配置- k9 P6 y8 @7 q3 {+ C
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码
; }9 y- T! p2 J: y
完整的Can初始化代码
3 S& R4 X! j3 O
# d% `* q0 ?% t' C6 T/ R( {
  1. void can_init(void)7 e2 K6 \& u+ @: K
  2. {% b6 g4 E. z3 Y& K- U/ S
  3.   GPIO_InitTypeDef  GPIO_InitStructure;3 I. f  C- Z8 r* h9 z2 J2 `
  4.   NVIC_InitTypeDef  NVIC_InitStructure;
    - a, m# p$ c+ U/ o
  5.   CAN_InitTypeDef        CAN_InitStructure;4 _* x% Q$ c9 p; u4 a5 j$ z+ M( o! n
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    ' v- m3 M9 a8 R5 l0 s* W

  7. ) J- `" ?$ X) v; T* f" T- G4 {, n
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    $ V. ^! F% `& t! g& m0 j
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
    ) A. `/ ^" q- i

  10. ; B2 K; `) I9 B: z3 ^
  11.   //这里一定要先映射GPIO
    % `( t8 v9 E# y4 w
  12.   /* Enable GPIO clock */" `. F9 `* Q+ {
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    ' e" W! r6 |2 M) t+ \
  14.   /* Connect CAN pins to AF7 */
    9 R' g, q1 N" ^
  15.   /* CAN GPIOs configuration **************************************************/: C1 B9 P) P) L/ |
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    ' D% s: J! O% n- H. U
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
    5 ?6 Q* n& i4 Z' [/ A

  18. - Z- s5 |* R) R5 a) u1 O; @
  19.   /* Configure CAN RX and TX pins */) P/ K& N+ `7 N: X$ Y: `
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;7 y# P) h6 I0 c  q8 A( f
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;$ k0 w1 S- s4 E; B' x
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    8 I( x0 P; I. ~
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    4 A: I* i& I+ _9 o) }7 ~
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;/ {4 }" ?% s* D2 n, ], L) M
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);) e9 O/ s" f9 C; u7 `! N7 K1 b

  26. 7 D, S% m; U7 Z; \" ]& s
  27.   /* NVIC configuration *******************************************************/9 e% L8 i( j$ v0 s- m
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;$ F# G; r  M# W8 G, i3 |! B9 Q
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;7 x7 |1 p- \# O8 Y/ |+ h4 b- j
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    3 U0 k8 e  h* p, _
  31.   NVIC_Init(&NVIC_InitStructure);
    & p  Z& t. @% U; }2 g  g3 H
  32. 5 c/ u$ Y6 C. T
  33.   /* CAN configuration ********************************************************/& X% m7 M$ x2 P7 S4 |
  34.   /* Enable CAN clock */  F( e/ T4 s  j/ s: p
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);  E1 Z; n' W9 `7 c
  36. " D1 {" l' z5 l
  37.   /* CAN register init */
    - I0 q; N* [' Z6 H
  38.   CAN_DeInit(CAN);
    4 K4 }- t  p8 k. Z! g9 V
  39.   CAN_StructInit(&CAN_InitStructure);
    ' h3 x- ?# e" L

  40. % l8 A9 v! u& m
  41.   /* CAN cell init */
    7 A$ W$ `2 @% T* z8 X
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;
    6 m* @+ P5 ~) n8 t: @6 G$ X
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;
    + t5 j+ H* F3 s( v4 S0 U: z
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;9 y4 m. c2 ]6 N: ~4 q
  45.   CAN_InitStructure.CAN_NART = DISABLE;8 l2 W# d- \2 B. ?- O: h
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;
    & g4 e5 j% i' a
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;% o7 y+ n/ Q, R. q! Y  K8 L( S
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;. W  P3 {+ v) D( u9 W
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
    ! X: n# H+ s# P- [* ]9 O
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;! t4 B/ |) Z1 R
  51. - F, R7 D6 z* Q7 M
  52.   //200k的配置1 d- U9 W# [3 O' {
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k0 L1 f, y* P3 I3 v5 f
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */& C+ n7 y" b: Z
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;3 ?+ _, d: U" I2 n7 Z
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;2 @/ ~  k. M% [# u5 k0 e1 w6 A
  57.   CAN_InitStructure.CAN_Prescaler = 12;
    9 I& A$ s* E) b3 r3 w. ~
  58.   CAN_Init(CAN, &CAN_InitStructure);+ i5 `6 t6 c8 {
  59. & h) }# z# r; K( P: I8 v
  60.   /* CAN filter init */
    ' N0 h: o$ u0 c) m& s! \& \8 V
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;8 j7 G% r" M# ~
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
    7 g0 z8 [" I0 M1 G; o! f7 y
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;- S! Q: r2 x1 ~: b
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;, Y" @7 k6 q6 x+ O8 \( T5 P
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;5 t# y' x! z7 Q+ a
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    ) n  p1 d2 G6 |7 ^
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;7 `0 J2 _6 x) K* N: R4 w( X
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    4 I7 }7 s* s" }" m& ^4 i$ g* ^( Q
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;6 _5 A5 t7 a+ ]4 E5 B8 P* v  m' }
  70.   CAN_FilterInit(&CAN_FilterInitStructure);! ^2 P  j, N, }7 l: ]
  71.   /* Transmit Structure preparation */; u. K" g2 M3 c, a' L/ z7 ?, a# P
  72. 4 T! J# X5 k; _" U" K9 A' A' F) i
  73.   /* Enable FIFO 0 message pending Interrupt */9 Z+ `, w2 a1 p& ^
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
    4 Q, y1 k7 o9 P9 r+ d7 Z4 b
  75. }
    # D- }$ c. U5 h- C. I7 l0 j7 R+ ~
  76. % i0 s  ^+ _: X$ {

  77. # I. L! p0 n" ]' B+ P
复制代码

: U- G" F! o* _1 v0 X# T7 f/ A7 Z  n7 G$ z4 Z9 `" U  x! i
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 手机版