苏柚 发表于 2015-10-15 17:04:49

FAQ提问:STM32F042F4P6 CAN初始化

FAQ提问:
STM32F042F4P6 CAN初始化不成功


SYSCFG_CFGR1_PA11_PA12_RMP 在CAN的初始化时该如何设置?


FAQ地址:https://www.stmcu.org.cn/faq/index/detail/id-70617






任风吹吹 发表于 2016-6-6 12:11:20

本帖最后由 任风吹吹 于 2016-6-6 12:18 编辑

估计是重映射没有成功, SYSCFG的时钟没有打开.
在重映射PA11_PA12脚之前,必须先将SYS CFG的时钟打开,不然会重映射失败的,这个你可以在调试下查看系统配置寄存器的重映射标志状态确定是否重映射成功。

只有在重映射成功后再可以正确的初始化CAN。

如:
#define __HAL_REMAP_PIN_ENABLE(__PIN_REMAP__)          do {assert_param(IS_HAL_REMAP_PIN((__PIN_REMAP__)));               \
                                                         SYSCFG->CFGR1 |= (__PIN_REMAP__);                              \
                                                         }while(0)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
__HAL_REMAP_PIN_ENABLE(HAL_REMAP_PA11_PA12);

/* CAN configuration */
CAN_Config();




CAN_Config()如下所示:
static void CAN_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
CAN_InitTypeDef      CAN_InitStructure;
CAN_FilterInitTypeDefCAN_FilterInitStructure;
   
/* CAN GPIOs configuration **************************************************/

/* Enable GPIO clock */
RCC_AHBPeriphClockCmd(CAN_GPIO_CLK, ENABLE);

/* Connect CAN pins to AF7 */
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP;
GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

/* NVIC configuration *******************************************************/
NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

/* CAN register init */
CAN_DeInit(CANx);
CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
   
/* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(CANx, &CAN_InitStructure);

/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

/* Transmit Structure preparation */
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;

/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
}



拿走不谢!

阿平-5742 发表于 2016-3-20 23:53:21

我也碰到了, 请大神帮忙分析一下

xmshao 发表于 2016-6-5 21:56:38

http://mp.weixin.qq.com/s?__biz=MzA3OTIxMjQyNQ==&mid=402330198&idx=1&sn=8fda3c81dfed877fa421a83d7f54eb95&scene=21#wechat_redirect
页: [1]
查看完整版本: FAQ提问:STM32F042F4P6 CAN初始化