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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,. D( y+ a) b8 ^4 c: C
9 h8 X' V) l6 N* a& z" n3 Q
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码
' c# H. m0 C4 G4 o$ y
结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。' S& _% p$ x- m& `
# [0 u6 A" M- K3 D& ?8 b3 E
由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。, Z' D: v. w  K+ _5 k  M% M: m
: k! \1 L/ e! Q
  1. DEBUG [D] main:94 hello armwind
    : o2 n) O+ G! _  S) C  v8 }
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码

7 a0 z$ X  v5 R* {9 O/ G, E6 ~查看源码发现,断言表明,这个方法只能映射系统mem.
1 ?! X9 @( C4 a9 P( _" W2 d) N  h+ q* r( Y
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap); {" B+ h- G' _, l4 Q& \9 S1 \7 M
  2. {, c- q% M: p! |0 d
  3.   uint32_t tmpctrl = 0;, `7 V' a; u6 f- u/ f8 @" X
  4. + o0 ~% t, W9 L
  5.   /* Check the parameter */" a: l1 j) d9 O" G$ u4 H$ x7 S0 f
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));
    " p, j& J' q* T7 ^0 g
  7. $ h: ]/ j/ [: Z+ Y2 P3 x2 {
  8.   /* Get CFGR1 register value *// a4 l0 E+ |+ y' Q% J& [
  9.   tmpctrl = SYSCFG->CFGR1;3 S, W- @, Z0 e. @7 k+ f/ C

  10. 4 r/ e% Y# v4 r) |+ S, g
  11.   /* Clear MEM_MODE bits */
    * q9 I2 V' H, }4 E8 M' c' Y) s
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);% y. r5 H: E% @! c9 x

  13. % E/ L$ r9 q/ q9 `5 I; ^
  14.   /* Set the new MEM_MODE bits value */% m; b+ U' K8 q$ `
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;# R5 k- L0 u* ?) w8 |

  16. / ^: o7 o" l2 o9 R9 ]0 R
  17.   /* Set CFGR1 register with the new memory remap configuration */+ U4 t' X8 D- Q1 E% t! \1 H( d
  18.   SYSCFG->CFGR1 = tmpctrl;
    % e& s# n7 u/ {: S* d$ E
  19. }
    & P0 X& t  V' b, U

  20. + t1 ^7 V3 `/ J, m& M9 z
  21. //宏定义很明显/ P9 X: T# K* u# L- @1 F9 v. s
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \  Y7 Y7 i6 p( V4 n
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \, e( x$ B; l7 y( }) R2 O* v  y
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码
# d8 o+ e6 ^( G' ^) G$ Y
所以使用下面代码即可map成功, G- c! W1 M( C5 \" _
. G4 f3 G& J) T
  1. //不要覆盖掉系统原始的配置
    6 y! ~: u3 x8 S9 w5 j2 l4 V
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码
( @% w1 N* }) _. z8 O
完整的Can初始化代码
" l% E  D! v; l
  K2 a* o/ i' W3 Z7 t
  1. void can_init(void)
      {, y+ C2 P9 {
  2. {
    % Q1 b0 \  q! ]# T
  3.   GPIO_InitTypeDef  GPIO_InitStructure;1 A2 W# F. X' g/ @
  4.   NVIC_InitTypeDef  NVIC_InitStructure;( O3 i) ~4 _2 F/ J4 ~
  5.   CAN_InitTypeDef        CAN_InitStructure;, E. F* G4 f1 ^
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    ( D- x$ z( N7 Q$ S0 f7 M

  7. 2 L7 r0 _4 C- @! ~4 ?/ x
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    ) ^" x2 D) k& N
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;5 N! |9 w3 ?+ w3 [

  10. . j6 L: z  n: m6 {
  11.   //这里一定要先映射GPIO7 I  l* {2 Q5 `5 f% R5 m
  12.   /* Enable GPIO clock */
      Q" n$ H8 \8 l7 a
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);; \8 Z( f; y  g! a1 i
  14.   /* Connect CAN pins to AF7 */
    + p& a5 I. y/ h; l! W
  15.   /* CAN GPIOs configuration **************************************************/
      y; A0 y" r% p. U
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    5 @6 Y' X- T0 \  b# d  r" Y7 N
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);$ t. y# S8 G: S/ F! i$ m

  18. % B. T. H  a- B: S
  19.   /* Configure CAN RX and TX pins */
    $ V+ Y, ?7 G, f& e+ V# S
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;
    0 L# c# q: J7 M7 h
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;; [9 Z. n4 l0 w- q. U
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    6 Q& N9 h0 ^- Y: g! N
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;' `' s) J# l8 O1 `
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;3 @  E/ w+ J: e3 o/ R
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);
    ; g; \4 z; N) G  c! Z3 K

  26. 5 `9 I) P# T$ f  E& w* m
  27.   /* NVIC configuration *******************************************************/8 X5 \, A5 i+ \# f3 q: U& v
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;1 a6 g: _- K7 k/ b: Y
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;+ d! ~- i. `$ |/ |& N
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    3 j! Q* I8 i  C! U
  31.   NVIC_Init(&NVIC_InitStructure);  t1 m" ~; C3 B
  32. : W8 _3 C0 e+ F9 C" N( I- d
  33.   /* CAN configuration ********************************************************// A2 t5 T5 }0 P
  34.   /* Enable CAN clock */
    1 }. l4 |7 P0 a! f1 ^
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);/ f- o6 k* ~" k! P

  36. # i( k7 [" |5 o1 o4 j1 g
  37.   /* CAN register init */) ]& ]* _, F# o: Z
  38.   CAN_DeInit(CAN);
    % p' [  O7 L1 Z9 o3 H
  39.   CAN_StructInit(&CAN_InitStructure);
    9 p5 L4 F* x( d$ b
  40. 9 n$ r8 J7 k7 o) w$ F# M
  41.   /* CAN cell init */! R. s$ W4 t% u6 @
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;
    ! f7 N8 I1 u( M- U, p0 M( {
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;# W: p/ O9 G2 I3 h" z2 E( B
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;5 w* R& b( D* X; g( I+ s
  45.   CAN_InitStructure.CAN_NART = DISABLE;, |# ]7 u7 B9 X
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;
    0 a2 U( ]4 K& @% L# l7 m( c
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;
    # x) W4 B& j% M4 D: S! S, @
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    + c2 Q6 ]0 N4 D# W* d0 m
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
    % M/ }: T( Q7 o6 q% \7 ~4 _
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    5 {2 q9 ^$ c: a% @, J
  51. . n% ]6 `3 a3 C! m
  52.   //200k的配置0 ^( J+ j6 M; t; T1 P
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k: f0 O, z% w& t2 o' i4 _2 w4 Y# ^$ B
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
    & e( b% q4 i0 x4 R+ H+ A; Y
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;# L4 z: U- T0 i! s
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
    5 F: ^1 W5 p4 C4 W* I$ I4 v
  57.   CAN_InitStructure.CAN_Prescaler = 12;
    ! E; N( H( }# Y: O
  58.   CAN_Init(CAN, &CAN_InitStructure);
    ' |" H# V3 z) z2 @. w( j- E, z
  59. 5 K9 P+ l+ }; S
  60.   /* CAN filter init */* C; b6 d5 _& V, O( `, i3 h
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;& b! s# \; L  v4 V. ^
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;* q0 [9 C6 A6 X' t1 B' O
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;. x1 I2 Z# h4 L, s0 u: g
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;. t  Q4 c6 H; x% O9 N7 d
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    ' X$ h/ r. W- r9 C
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    7 |2 y9 ~9 e# t0 d' p
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;2 j2 h& n* b) f  x# Q+ l
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;/ Q$ n' {" o( P
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;/ r4 `4 S/ `" E# m: @3 p
  70.   CAN_FilterInit(&CAN_FilterInitStructure);
    2 s9 T0 K& i: ]* G0 O6 w
  71.   /* Transmit Structure preparation */2 f  n" `1 B; l8 O/ c/ L

  72. ( Z' ]4 Y* U$ P, X3 u& r
  73.   /* Enable FIFO 0 message pending Interrupt */
    4 ], D* z2 G. e  W/ s/ l. Y
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
    + _6 y8 V' h$ w% h
  75. }
    $ w  |; H- g2 R( x7 _2 P# G. }; i1 c! b4 X

  76. * k+ v# o( C1 V& X1 x* ~
  77. 3 T( n( C0 p- I; Q
复制代码

/ y6 ^7 x" w! [4 Y+ S( P6 q2 L, N. }2 \1 O- n
D%XB1GC`78[95[~{DGB}193.png
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版