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

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

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

  1. SYSCFG_MemoryRemapConfig(SYSCFG_CFGR1_PA11_PA12_RMP);
复制代码

结果Can总线一直没有波形出来。使用回环模式调试,总线上一直没有波形。

由于CAN的PA11和PA12和串口1的PA9和PA10是复用的,没有第一时间使用串口进行调试。今天晚上下班将usart2飞线飞出来了。使能断言后,发现下面的断言错误。

  1. DEBUG [D] main:94 hello armwind
  2. DEBUG [D] assert_failed:94<div> …/Lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c,line:119</div>
复制代码

查看源码发现,断言表明,这个方法只能映射系统mem.

  1. void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)
  2. {
  3.   uint32_t tmpctrl = 0;

  4.   /* Check the parameter */
  5.   assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));

  6.   /* Get CFGR1 register value */
  7.   tmpctrl = SYSCFG->CFGR1;

  8.   /* Clear MEM_MODE bits */
  9.   tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);

  10.   /* Set the new MEM_MODE bits value */
  11.   tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;

  12.   /* Set CFGR1 register with the new memory remap configuration */
  13.   SYSCFG->CFGR1 = tmpctrl;
  14. }

  15. //宏定义很明显
  16. #define IS_SYSCFG_MEMORY_REMAP(REMAP) (((REMAP) == SYSCFG_MemoryRemap_Flash) || \
  17.                                        ((REMAP) == SYSCFG_MemoryRemap_SystemMemory) || \
  18.                                        ((REMAP) == SYSCFG_MemoryRemap_SRAM))
复制代码

所以使用下面代码即可map成功

  1. //不要覆盖掉系统原始的配置
  2. SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;
复制代码

完整的Can初始化代码

  1. void can_init(void)
  2. {
  3.   GPIO_InitTypeDef  GPIO_InitStructure;
  4.   NVIC_InitTypeDef  NVIC_InitStructure;
  5.   CAN_InitTypeDef        CAN_InitStructure;
  6.   CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  8.   SYSCFG->CFGR1 = SYSCFG->CFGR1 | SYSCFG_CFGR1_PA11_PA12_RMP;

  9.   //这里一定要先映射GPIO
  10.   /* Enable GPIO clock */
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  12.   /* Connect CAN pins to AF7 */
  13.   /* CAN GPIOs configuration **************************************************/
  14.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_4);
  15.   GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_4);

  16.   /* Configure CAN RX and TX pins */
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11 | GPIO_PinSource12;
  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  19.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  21.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  22.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  23.   /* NVIC configuration *******************************************************/
  24.   NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
  25.   NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
  26.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  27.   NVIC_Init(&NVIC_InitStructure);

  28.   /* CAN configuration ********************************************************/
  29.   /* Enable CAN clock */
  30.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);

  31.   /* CAN register init */
  32.   CAN_DeInit(CAN);
  33.   CAN_StructInit(&CAN_InitStructure);

  34.   /* CAN cell init */
  35.   CAN_InitStructure.CAN_TTCM = DISABLE;
  36.   CAN_InitStructure.CAN_ABOM = DISABLE;
  37.   CAN_InitStructure.CAN_AWUM = DISABLE;
  38.   CAN_InitStructure.CAN_NART = DISABLE;
  39.   CAN_InitStructure.CAN_RFLM = DISABLE;
  40.   CAN_InitStructure.CAN_TXFP = DISABLE;
  41.   CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  42.   //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
  43.   CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

  44.   //200k的配置
  45.   //48M/12/(CAN_SJW_1tq + CAN_BS1_4tq+CAN_BS2_5tq) == 200k
  46.   /* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
  47.   CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
  48.   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  49.   CAN_InitStructure.CAN_Prescaler = 12;
  50.   CAN_Init(CAN, &CAN_InitStructure);

  51.   /* CAN filter init */
  52.   CAN_FilterInitStructure.CAN_FilterNumber = 1;
  53.   CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  54.   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  55.   CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
  56.   CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  57.   CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
  58.   CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
  59.   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  60.   CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  61.   CAN_FilterInit(&CAN_FilterInitStructure);
  62.   /* Transmit Structure preparation */

  63.   /* Enable FIFO 0 message pending Interrupt */
  64.   CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
  65. }


复制代码


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 手机版