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

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

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
这两天玩了一下stm32f042的can,但是折腾了2个晚上,还是没有进展。我知道stm32f042F6P6 ssop20封装的pin17,pin18默认是PA9,PA10的功能,如果想使用PA11和PA12,需要进行端口映射。这样的话,我直接就用了下面的代码,进行端口映射,! E" I# s3 I0 F6 s/ \0 X

( q% Z2 a, |9 x6 |
  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码
  K" h' h4 a% c
结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。0 W4 ]+ F% ]# h" x" G

! [2 l7 c, n2 z. D) X( N由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。' J; N& F+ c+ |) j$ `" A5 F8 `3 z

: i% o2 I( U* J/ z# `
  1. DEBUG [D] main:94 hello armwind% k. N  I! A6 T3 Y1 Q; Y$ q
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码

' E3 Y- w9 T5 o5 i5 x1 b查看源码发现,断言表明,这个方法只能映射系统mem.$ c1 N, s! ~5 h% m$ K# w6 ]

" o5 c- ]4 h5 @$ t
  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap): }& T, @& V8 \) I. }; Z
  2. {+ `+ L7 W2 c3 _
  3.   uint32_t tmpctrl = 0;: {5 s$ u) x# W3 ~
  4. * Y/ a9 y0 N, V  O
  5.   /* Check the parameter */
    + R# n. d4 a. B8 V
  6.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));! S/ m3 u4 o4 c; a  A& ]0 {4 t7 A5 ~4 D

  7. , m) P( x1 S* e7 A  L
  8.   /* Get CFGR1 register value */* j* w! d; }8 V- M$ A+ H
  9.   tmpctrl = SYSCFG->CFGR1;
    1 i& L! g, Q0 q6 v, x

  10. ; I9 T; _5 x0 f. f7 W! B$ \$ J
  11.   /* Clear MEM_MODE bits */0 h: a* J/ ?& Z
  12.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);+ a3 B$ C  c; V* m: T, u
  13. 9 s# t+ ^2 d* m
  14.   /* Set the new MEM_MODE bits value */4 C+ g+ l* _" R. v8 n
  15.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;
    7 _5 y% j) z* x2 V! L  E6 I6 ?

  16. , F" X" X/ A5 R. ^- l  W
  17.   /* Set CFGR1 register with the new memory remap configuration */
    8 r& d; ?% l4 Q4 \; y
  18.   SYSCFG->CFGR1 = tmpctrl;2 |' a2 w/ i: W
  19. }$ S5 T# ~- I2 ?& ~

  20. 4 U$ M5 R2 c; N
  21. //宏定义很明显. r: I( F. I$ \5 F
  22. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \8 L; c7 B0 D+ r9 K$ ?
  23.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \
    $ s0 N" {2 v' s, e& L# R4 C
  24.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码

  Z8 ~/ Z) C6 M* R/ J: V所以使用下面代码即可map成功
' M3 v- x: F* {, T1 z
, n$ L+ G3 L- f# a- W
  1. //不要覆盖掉系统原始的配置
    . v; ^( L% ~2 e8 N8 R$ y+ W
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码

) T6 X/ e6 ]6 A# ?完整的Can初始化代码; O; W6 |7 f5 O; b6 [
4 U, C- ]4 U& O4 U
  1. void can_init(void)5 Y0 N6 B8 U  k9 L
  2. {; [: b! a- E  F: B1 V
  3.   GPIO_InitTypeDef  GPIO_InitStructure;
    & A- c- Y7 l& \# g* F: l
  4.   NVIC_InitTypeDef  NVIC_InitStructure;
    " r3 ^' F, ~/ g& Y) Z- _
  5.   CAN_InitTypeDef        CAN_InitStructure;
    : M9 L8 W. }3 Y: I% i# l4 O" z
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;* c* s, i+ h- q

  7. ) [3 t% \$ I6 `2 j7 X
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    2 y% s) l. m% l/ `
  9.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;1 t3 M; ]& C4 F

  10. " Y$ m, [4 a2 @2 y1 r+ k# _
  11.   //这里一定要先映射GPIO, ~( v5 }8 r- l  Q) k* v
  12.   /* Enable GPIO clock */
    1 u+ U5 ^. M/ o* I( i2 M* D
  13.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);. ~+ B: N' |) Q! w9 Y7 F+ o' o5 G
  14.   /* Connect CAN pins to AF7 */+ T: g( O: e1 Y# @
  15.   /* CAN GPIOs configuration **************************************************/0 l* q- A# q5 N2 k& F
  16.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
    : W! M3 X  f2 s8 b# W; N1 j/ y4 R
  17.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);
    " C- V3 S; I# k# a1 z* p2 u

  18. 4 @& P  W+ d- E/ \
  19.   /* Configure CAN RX and TX pins */
    4 ]$ ^: v" A' u2 ]2 _+ w
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;) p0 D0 K. O, M5 Z
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    1 _3 V- ]% p8 ]$ @
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( M, O5 F. p" z+ ~* G2 D
  23.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    * m9 W) k( C; J$ R, U, U( j
  24.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    7 X8 S$ @3 |9 P/ y" m' x% K5 y
  25.   GPIO_Init(GPIOA, &GPIO_InitStructure);. h+ o# D. \0 i" F. Z) Y
  26. ' f2 x' ]3 J  D0 M  N. u, T8 A
  27.   /* NVIC configuration *******************************************************/1 o8 d" e0 N3 J7 e
  28.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;4 a# f, J& k) w- H. ^% M
  29.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;- ^  Z5 s4 e( i5 a* [
  30.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/ S% x9 Z" ]# n/ X( `
  31.   NVIC_Init(&NVIC_InitStructure);" m7 q8 X6 I; y7 \9 f0 e" _( M8 J

  32. 5 G. l( D: }. V8 {% G
  33.   /* CAN configuration ********************************************************/8 V$ C: I  S- g/ v/ R$ k
  34.   /* Enable CAN clock */* _; {  q# r/ b2 y
  35.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);6 y- S$ w9 U/ R3 O1 g; M
  36. 6 @3 W! ?; l9 h5 M' V
  37.   /* CAN register init */, {4 L' ]! x* ]4 S8 v
  38.   CAN_DeInit(CAN);. g! l7 b6 F' F% d9 V
  39.   CAN_StructInit(&CAN_InitStructure);1 h% O/ R, D' m. A4 _
  40. " R5 F9 H5 i+ Q# X8 \6 i% A" M' T
  41.   /* CAN cell init */3 G' U; A( C0 e) l1 V* y
  42.   CAN_InitStructure.CAN_TTCM = DISABLE;
    4 w  C3 U  L% P* U) W; J
  43.   CAN_InitStructure.CAN_ABOM = DISABLE;- G$ H6 `$ b& T: T$ i/ i" O& \
  44.   CAN_InitStructure.CAN_AWUM = DISABLE;
    8 n, \) {* a( Q, A8 o) u
  45.   CAN_InitStructure.CAN_NART = DISABLE;
    ( {: ~( [" X9 P! b
  46.   CAN_InitStructure.CAN_RFLM = DISABLE;& L. W" R  P2 @" {5 f+ F
  47.   CAN_InitStructure.CAN_TXFP = DISABLE;7 A3 g+ b1 |  r6 `! j# p. h8 ~
  48.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
    + N) I4 I$ T9 P5 Y' q; c7 d
  49.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;6 D, U: K' v6 _+ Q" r! h6 y) V$ x6 {
  50.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;& m8 l( J1 [3 b
  51. ' j2 o+ n0 C# P6 H2 f. `. _4 b
  52.   //200k的配置/ l5 Q2 w3 g8 v: |% [; {7 C0 @
  53.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k
    " E+ _/ i' k6 b2 z2 p
  54.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */; A3 m. [; w& d3 J7 m* [" W- W
  55.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;" b4 u6 O& b; H5 W4 Z; e
  56.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;/ B. j4 ~/ F* e. O5 H  h9 X9 w
  57.   CAN_InitStructure.CAN_Prescaler = 12;
    5 I: C& J. P- O' {+ q' @
  58.   CAN_Init(CAN, &CAN_InitStructure);
    * j$ F. e5 T) c# @2 ?" ^

  59. 0 Y4 G( \8 I7 ^) v1 K
  60.   /* CAN filter init */
    % V2 R6 j( I  [8 d
  61.   CAN_FilterInitStructure.CAN_FilterNumber = 1;. x# f) `0 r: D2 q/ A/ D+ h
  62.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;+ M4 I$ j( z, ^; r& O- U0 `( r* I
  63.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
      V( [) P& ~8 i1 w4 l
  64.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
    9 p! m- H4 x1 ]# M: m
  65.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
    6 `7 ]8 R; u3 A+ g3 @6 M$ F4 L
  66.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;3 ^8 g! z* t( ^3 m
  67.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;2 _: O7 h) c9 @& Y
  68.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
    3 W$ c8 ~' a; ~4 t8 l% H
  69.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
    , y% {+ Z, r  s- _6 D/ H
  70.   CAN_FilterInit(&CAN_FilterInitStructure);7 [1 h, r6 o& j# Q* F
  71.   /* Transmit Structure preparation */3 n8 R' W/ n5 i) Z

  72. , a5 }! ?* A/ c+ T# t/ M
  73.   /* Enable FIFO 0 message pending Interrupt */
    & t- V" P  i+ S2 _- D3 k
  74.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);+ Z$ p2 p* c+ P
  75. }+ E) \# ?- e: @% Q

  76.   f. Q- X1 ]$ u0 G0 S% [

  77. ; Q5 B  i6 T0 F  s9 K
复制代码
6 m# U+ l& C' \3 M! Z0 I
1 y5 P9 t  r% B5 F9 \
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 手机版