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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,) ]: ~2 a3 m- G+ Z) D; [" p

+ V  q5 f5 D& t
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码
' M) G/ I2 Z  w9 m- Q9 n; r
结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。
' ?0 V+ N6 M% @0 ]
/ W; ~1 J$ s4 d  i0 N$ l由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。- ~1 c2 G# ~$ w" j

' d: h& }, c# G! s$ P3 w
  1. DEBUG [D] main:94 hello armwind. n$ Z: E. P1 C' @* @( F5 Q9 P
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码
! Z0 g0 w. A5 Z3 D- N8 G
查看源码发现,断言表明,这个方法只能映射系统mem.: l7 l, J) f8 V! t

" j; i* N$ e4 G1 e* b1 J
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)- U0 w0 j6 K; |# K* S; P
  2. {0 C+ h8 L9 O/ {2 p9 l' k$ j
  3.   uint32_t tmpctrl = 0;# G( O; c6 Y% a( L+ m3 }5 W$ Y
  4. " C( F/ c3 F& ~, f) B
  5.   /* Check the parameter */
    5 f  S+ ?2 g4 |: q& h0 L5 Q5 ?  T' K& I* E
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));
    / }8 _) G& e& j. N3 z) X0 I) o
  7. # T' v3 w+ o, t  I& q  P
  8.   /* Get CFGR1 register value */* u# ^. {2 j# y
  9.   tmpctrl = SYSCFG->CFGR1;" s# N" x+ V/ [9 d& u

  10. / ^" G( }4 w9 _9 J' r- N% n
  11.   /* Clear MEM_MODE bits */
      G2 `. v+ q# {3 D. ^  X& [: u
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);
      f0 m4 q; \' c( R' w* p. r7 y& R
  13. % b+ r6 V7 J# h. y$ ^! C2 d$ q! {& {
  14.   /* Set the new MEM_MODE bits value */
    ; `! U: n1 m6 W' T# g8 _- b6 Y
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;
    / O0 o. x! }# z- l, |9 Y9 o
  16. 9 o* I/ {  H5 w3 j
  17.   /* Set CFGR1 register with the new memory remap configuration */
    , t1 q+ p! l# A0 L- F# o
  18.   SYSCFG->CFGR1 = tmpctrl;6 P+ v- G4 E8 S9 m8 y
  19. }
    5 U1 y! {  s7 f* P6 _+ k

  20. : M' V2 ?2 H4 I/ }1 g% k( o4 X
  21. //宏定义很明显" H8 E/ V3 R2 k4 g" A# U
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \
    $ E" ]4 e# x' s/ w4 E1 V
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \/ Z- Z) u0 ~" l+ \9 l0 R& V0 E
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码

+ \+ B; c. ~4 o所以使用下面代码即可map成功
* A4 ]# l. y9 I0 O. F1 T7 K; c2 E0 A6 D6 i! }% r/ F
  1. //不要覆盖掉系统原始的配置
    9 K' x' B  ~9 {& i3 ^
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码
7 ?" h. M; q. S& H
完整的Can初始化代码3 q4 ?: B+ T# T+ r6 k

/ n: u1 B+ X1 k8 a0 n" I  y+ Y
  1. void can_init(void)
    0 v% }  p; r5 ]+ h3 Q$ U
  2. {' i: C% Z1 n" x" Z/ L2 E
  3.   GPIO_InitTypeDef  GPIO_InitStructure;' A) r$ F; ^; b! U4 o+ Z; S% O
  4.   NVIC_InitTypeDef  NVIC_InitStructure;
    , j) [' H$ I* z
  5.   CAN_InitTypeDef        CAN_InitStructure;
    " Z4 z! V( m  B
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    ' f; A& H5 R1 |# J

  7. $ t# O7 f. [4 \' }  l# r
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);+ |. [, y; F6 I/ i) g6 K
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;' I& X  b) F/ N+ T; M0 K
  10. / _/ \: j  O2 s6 U
  11.   //这里一定要先映射GPIO5 Z; s  m. l2 Q: b
  12.   /* Enable GPIO clock */" I* n( a4 J0 F( f' ?0 m9 B5 u
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    ( f" g7 M0 J& h# V4 w( D" O
  14.   /* Connect CAN pins to AF7 */0 A* |  J  W2 T: t9 |
  15.   /* CAN GPIOs configuration **************************************************/
    7 y/ J" [/ @2 o# E5 s; d2 J
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    & d' z8 n5 Q; E8 S9 M, v
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
    4 y9 g# i' {+ S
  18. $ F$ Z# B; o" L7 Y
  19.   /* Configure CAN RX and TX pins */
    # J( }: \5 ?/ A+ ^
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;. a7 ?# `! b! i) Y& S! b' V
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;6 [$ V! Y) c! h- K( I+ p
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    4 E, L% S, J' j6 q) }
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;8 x6 Z: w- H( n/ T, x1 i& p
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;3 C3 R$ ~$ B& ?0 A
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);7 I8 y" z. P  [/ j6 _4 q" G
  26. 4 l, e1 \+ r! y! h0 e
  27.   /* NVIC configuration *******************************************************/$ p2 p3 |  `+ F5 ^0 D6 p$ ?- t
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;1 B/ h1 ?0 t* U3 O9 x, F: p2 H) ?4 |
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;6 A" i, [' q& l4 _
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;3 |( K- Z  c) K" f5 a
  31.   NVIC_Init(&NVIC_InitStructure);
    . G) @* p, B/ M5 I/ u+ @4 ^

  32. 2 P2 l- w' B& y, @: G5 j% |
  33.   /* CAN configuration ********************************************************/3 n# v* p* [, Y9 p
  34.   /* Enable CAN clock */$ B. q7 r- \0 S" f% ]5 j
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
    / J/ t$ M+ b1 Y- c, N1 u

  36. % D8 [) K: t- _) ]. E! E& W% `9 a: r
  37.   /* CAN register init */6 G4 ]( ]/ J7 F, m  [
  38.   CAN_DeInit(CAN);7 M6 j) r: C$ y' d9 J
  39.   CAN_StructInit(&CAN_InitStructure);
    9 E' a6 _) k7 b; T5 o

  40. - m$ z' |0 d# v8 s9 v2 _, V
  41.   /* CAN cell init */
    " m* f% x- I6 \! u* S3 J4 {
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;& v2 C0 c7 w/ ^0 c/ e, I
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;
    . r+ t+ s9 K( v( ]' h
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;
    0 Q5 j7 K/ S& o  S6 K3 V8 p
  45.   CAN_InitStructure.CAN_NART = DISABLE;+ i4 }6 r% }, {, u
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;
    0 }! B% C+ p- H; ~& r
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;
    1 S! M- E# \& g9 R3 p" D
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    2 V' o2 R! y: v" o2 B- q( J: h% I
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;$ p  @) i- M5 ]+ L8 v  X+ x
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;- C5 U/ k/ H9 [, `$ Z4 g: ]
  51. 5 f9 \. z7 m8 w6 m9 _0 M
  52.   //200k的配置! I! [) n) H  r: a/ r
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k6 a$ U+ L; T+ l9 h
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */) z2 n6 b2 N3 q# @+ n, Q
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
    : C/ }5 D- r0 n" V
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
    & ~  ~. _/ F' ^! L$ H$ f  M
  57.   CAN_InitStructure.CAN_Prescaler = 12;# P7 A+ l: f( |5 A8 |+ ]) G
  58.   CAN_Init(CAN, &CAN_InitStructure);
    1 h/ I/ c' c4 k; Q9 C5 q5 H+ u9 G7 Y
  59. * P- i3 R) e: c
  60.   /* CAN filter init *// J$ R$ }. _; w5 n7 f
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;
    9 O$ N- J1 V5 U& s' }; K3 d: ?. y( N
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;$ ^. V9 f' ]6 J8 m$ H- B# }
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    . n) a: j' h# V  m
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;( p7 x# u, j) H0 H, G* y/ w
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    1 {* a# {( w$ M5 A. `
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
    $ [4 n3 c* }, {+ W+ B. R
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;1 P1 h9 {4 r+ T
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;/ t2 F. x7 A9 q) j+ A
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;/ h& b7 s$ {2 S" y
  70.   CAN_FilterInit(&CAN_FilterInitStructure);
    % Q- U: B7 Y0 m9 q( N& R
  71.   /* Transmit Structure preparation */( f$ [3 \# Y6 w! V/ Q9 t

  72. 2 W( \6 ]- ^+ d0 a3 R
  73.   /* Enable FIFO 0 message pending Interrupt */
    * a& J' D" w' M# z
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);* l/ E# Y* i" i5 x+ w0 G& F  S  F
  75. }
    ( `' S8 j; P) ?& y8 d

  76. 7 |# p/ p# a  w+ A6 X

  77.   p2 q3 \! r# A- _) g
复制代码

/ `0 j. _% a' d9 X: D& n% N0 X7 ]) ]4 M+ m# Y
D%XB1GC`78[95[~{DGB}193.png
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

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