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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,
6 ^; C+ B( N; A* d# j/ I9 ^% s& r1 ^4 x; E
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码

% K: a6 w7 [4 |: L9 R- g结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。$ S, I; \) |& U( ~

. [) {# I; o# j0 Y1 G9 }4 N+ s由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。  A! w0 b3 @* z7 g

3 _- \' a8 Z0 V- k$ {1 R- K
  1. DEBUG [D] main:94 hello armwind
    % g( A! o# \  j( b( Z0 J4 }) T
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码
2 Q3 G( a% D' }9 b9 j; H( D
查看源码发现,断言表明,这个方法只能映射系统mem.
, d9 n0 Y* r9 {& H2 f7 h! J+ o, h' s* o% ?; g
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)
    0 Q" X: X8 e8 G* \6 F
  2. {
    & ^3 h* I4 f8 |$ {; C' l
  3.   uint32_t tmpctrl = 0;/ @* _, a  o( Q7 N6 t

  4. . ?9 s6 Q) {5 h( H$ E5 o0 A
  5.   /* Check the parameter */
    2 W: G, Z" h5 G% l9 J, q! b
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));
    ( I' R( v" Y0 Q3 d) V* z$ n

  7. . x  X0 u8 l) @+ S
  8.   /* Get CFGR1 register value */8 G$ v6 |' L. H8 c- I( J" z
  9.   tmpctrl = SYSCFG->CFGR1;
    8 M( O; w4 @/ `" [
  10. 9 r8 ^+ c. x2 @, V7 g* ?# a
  11.   /* Clear MEM_MODE bits */
    8 w( q* }; {3 D, y
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);1 R8 B8 ^1 A1 n) f' b
  13. # v  |, M' h1 ]2 s
  14.   /* Set the new MEM_MODE bits value */
    ; f! a# |3 Q3 f( G! n: _
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;
    1 C1 E3 ^9 t; {
  16. ; n! o% }- Y+ D! e$ d
  17.   /* Set CFGR1 register with the new memory remap configuration */4 {0 Q6 \  C$ \. x$ Y
  18.   SYSCFG->CFGR1 = tmpctrl;
    - T9 J% v; r- r
  19. }* A9 N1 H* b, a9 K) Q% ~' q
  20. ) D6 E! `8 D( O/ G
  21. //宏定义很明显9 i8 a7 K$ g9 S4 O8 W
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \
    9 z+ T; R! g, u7 s: d& P# A6 V; T
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \" j% z" f; e$ X) P
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码

0 T" s5 L2 n6 D# V0 h所以使用下面代码即可map成功
4 u4 u% H8 R. i, l( T, B$ j$ }+ L5 z" @' s- a; ~
  1. //不要覆盖掉系统原始的配置
    # r$ Z) }6 a/ ?, m& M8 ^
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码
! ^4 o$ ^0 d( a3 Z1 H" W$ ?
完整的Can初始化代码. g4 n/ J! n6 q1 `! Q3 M% x; K
- S0 U/ q' z; J; J/ z
  1. void can_init(void)' D" j$ K3 `" r) ]$ d2 Q
  2. {
    2 A, I$ }7 c/ Z/ u: i5 a2 w
  3.   GPIO_InitTypeDef  GPIO_InitStructure;
    ; L' P: M4 S: x5 \& I4 F; O$ m9 C
  4.   NVIC_InitTypeDef  NVIC_InitStructure;- _( M$ N! t7 i5 Z$ X) Z- `$ h
  5.   CAN_InitTypeDef        CAN_InitStructure;' D; ~, o, ], D+ S% [* X, v2 Z0 l- C
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    / ?1 z! q' B7 s; z7 D
  7. 5 F, k; C) U. b3 Q; Z2 H
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);) l( H7 q" H/ N7 I
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;9 s1 j5 W" k- x: |' L4 z; h

  10. ! a- m! D: m6 B( W/ M
  11.   //这里一定要先映射GPIO
    ) x- N9 K( x8 ~7 d( ]0 p
  12.   /* Enable GPIO clock */$ B$ ~# b. X7 ^5 e8 H1 u
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    & w7 k( ^4 M5 l% `1 m
  14.   /* Connect CAN pins to AF7 */
    , q' M# P7 D! n8 |
  15.   /* CAN GPIOs configuration **************************************************/8 j5 H- @( W/ ~5 r* y7 u
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    7 }. P6 {( H1 ~5 @
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
    6 d0 F4 ]5 l: a# c3 f+ t; |2 p

  18. % {( s0 l: |9 e0 i, ~. R, q8 H
  19.   /* Configure CAN RX and TX pins */% I, E$ o! I9 x; s
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;
    " V& m  p9 Q3 f
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    - X& \  b! a( I9 F( y  F% Z) ?
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;+ |& k6 O) H8 `! s9 b) e
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( {9 F4 {+ t! @6 G2 P1 `, m9 @9 C& @$ f0 p
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;1 Y$ B. F% m3 |9 {; S/ ^
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);' r$ W! X9 U- p4 u5 y1 [8 ?% \
  26. / O" `; a. s" X) J
  27.   /* NVIC configuration *******************************************************/
    4 E7 N3 x. L: Z9 L
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
    0 v$ w' u# S( t9 Z! l1 V6 j
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
    ( L& p/ s: _+ X; w( V# t
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    4 F' Z" q# I* x$ l$ t
  31.   NVIC_Init(&NVIC_InitStructure);' C1 x% m6 _" u- u% @' n: A: Q% f

  32. ! u/ ~8 p( \1 M5 ~8 q
  33.   /* CAN configuration ********************************************************/7 ~& s) u  P9 m* H. B4 g7 e* C) e" a* L
  34.   /* Enable CAN clock */
    3 A7 u! x: x6 \' Y9 J0 ]
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);' k& y! e. r% i& }3 A) R( R- G

  36. & s" G) c- F: a
  37.   /* CAN register init */1 x) |& q' ]8 }% Q0 K# V
  38.   CAN_DeInit(CAN);
    # R9 x; B4 T: Y) ?# Z7 v2 I
  39.   CAN_StructInit(&CAN_InitStructure);
    0 [1 |$ K- B5 q

  40. # n3 {8 f+ C9 c
  41.   /* CAN cell init */
    2 c$ h. k+ I: \/ a! h& K
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;
    ; l6 g# B" }0 Z/ h7 x
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;1 S% g& G( [0 a( @$ z0 u- A3 U
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;+ h/ ^1 g- t' L9 r7 c
  45.   CAN_InitStructure.CAN_NART = DISABLE;* _9 O$ Y# @2 V- W
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;
    0 r: y, t- x" B1 }8 P5 ~5 j
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;, q- Z0 M' L' n' B8 H5 }1 p
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    9 [3 M7 t5 b1 w  v; ?& F7 \
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;: D" L& ~) ?; _( U
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    ' v4 |: R3 J& {; L8 h" x* N* c% b

  51. 8 Q: k( b! C- d: d+ z8 k( l
  52.   //200k的配置
    ( P3 E. H! Y* W+ K% e$ `* a( ?6 J6 T
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k
    # c3 P6 F* p" u, T5 a0 j0 X
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */( T% a. g/ s0 X
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;+ v) G) G. A& }! @
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;- i6 C, u3 B6 R* M1 q
  57.   CAN_InitStructure.CAN_Prescaler = 12;
    4 A, v3 J+ X/ T4 P3 z0 n
  58.   CAN_Init(CAN, &CAN_InitStructure);; \5 _% V2 `% b$ m  R

  59. ) u% h% Y) Z$ g: V
  60.   /* CAN filter init */
    ' ^$ j" e) ~( o
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;; L% G0 k1 I4 F
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;) ~; ?' I/ O; ]  d0 W7 q
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
    * A& q; b, i- x8 K* N
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;" E8 \; J4 I  _. I' M
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    3 P. }% U0 E3 g' ?; X, u2 M
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;: i" e" ^2 Q: T* [1 l( B
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
    ) I& g. C. E" s( E  l# f* I0 g
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    ( Q* B: }5 R! h0 i4 u# ?
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
      a8 u" s) }# x+ e% i! }
  70.   CAN_FilterInit(&CAN_FilterInitStructure);& Q* r4 L: m- ^& ?& ~
  71.   /* Transmit Structure preparation */
    + N& b7 c$ C% E5 W$ _

  72. : c6 w6 h! V2 @
  73.   /* Enable FIFO 0 message pending Interrupt */5 n' v4 P- m) D% t; _
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
    . [8 @1 e# Q3 [( r
  75. }
    * Q* y, k- {0 D3 T4 b; z

  76. 1 s7 k1 z3 r& |) @
  77. ; U2 u) q: u  F
复制代码
: {7 z; k) r! E
! O: i1 y- Y- Z8 t
D%XB1GC`78[95[~{DGB}193.png
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版