打印
[STM32F1]

stm32f103c8t6初始化失败

[复制链接]
942|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

使用stm32f103c8t6单片机做回环实验,在初始化can_init 的时候失败,程序一直卡在如下位置
while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT))
{
wait_ack++;
}
查看了stm32手册,是如下解释的:

_INRQ: 初始化请求 (Initialization request)
软件对该位清’0’可使CAN从初始化模式进入正常工作模式:当CAN在接收引脚检测到连续的11
个隐性位后,CAN就达到同步,并为接收和发送数据作好准备了。为此,硬件相应地对
CAN_MSR寄存器的INAK位清’0’。
软件对该位置1可使CAN从正常工作模式进入初始化模式:一旦当前的CAN活动(发送或接收)结
束,CAN就进入初始化模式。相应地,硬件对CAN_MSR寄存器的INAK位置’1’

现在是 硬件对CAN_MSR寄网上差了好多资料,有的说是波特率有的说是引脚复用。存器的INAK位怎么也不会 置’1’

电路连接如下:


网上差了好多资料,有的说是波特率有的说是引脚复用。



使用特权

评论回复
沙发
欢乐家园|  楼主 | 2024-2-28 10:04 | 只看该作者
代码如下:

#include "stm32f10x.h"                  // Device header
#include "stdbool.h"
#include "can.h"


void CAN_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    //ʹÄÜʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

    //CAN_TX   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           //¸´ÓÃÍÆÍìÊä³ö,TX
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
  //CAN_RX      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //ÉÏÀ­ÊäÈë RX
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯
   
    //#define GPIO_Remap_CAN    GPIO_Remap1_CAN1 ±¾ÊµÑéûÓÐÓõ½ÖØÓ³ÉäI/O
  //GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);
}

extern uint8_t can_init_status;

void CAN_Mode_Config(void)
{
    CAN_InitTypeDef CAN_InitStructure;
    //ÅäÖóÉ1M bps£¬²¨ÌØÂÊ=36M/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler)
    CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);
    CAN_InitStructure.CAN_TTCM = DISABLE;//ʱ¼ä´¥·¢Ä£Ê½
    CAN_InitStructure.CAN_ABOM = DISABLE;    //×Ô¶¯ÀëÏß¹ÜÀí
    CAN_InitStructure.CAN_AWUM = DISABLE;//×Ô¶¯»½ÐÑģʽ
    CAN_InitStructure.CAN_NART = DISABLE;//±¨ÎÄ×Ô¶¯ÖØ´« (0ΪÆôÓÃ)
    CAN_InitStructure.CAN_RFLM = DISABLE;//FIFOÒç³öʱ±¨Îĸ²¸ÇÔ­Îļþ
    CAN_InitStructure.CAN_TXFP = ENABLE;//±¨ÎÄ·¢ËÍÓÅÏȼ¶È¡¾öÓÚÓÊÏäÏȺó
   
    //¹¤×÷ģʽ£º
    CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
    //ÉèÖÃCAN²¨ÌØÂÊ  (1MHz)
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
    CAN_InitStructure.CAN_Prescaler = 6;
   
    //³õʼ»¯CAN
    can_init_status = CAN_Init(CAN1,&CAN_InitStructure);
    while(can_init_status != CAN_InitStatus_Success);
}

void CAN_Filter_Config(void)
{
    CAN_FilterInitTypeDef CAN_FilterInitStruct;
    CAN_FilterInitStruct.CAN_FilterActivation = ENABLE;
    CAN_FilterInitStruct.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
    CAN_FilterInitStruct.CAN_FilterNumber = 0;
    CAN_FilterInitStruct.CAN_FilterScale = CAN_FilterScale_32bit;
    CAN_FilterInitStruct.CAN_FilterMode = CAN_FilterMode_IdMask;

    CAN_FilterInitStruct.CAN_FilterIdHigh = ((PASS_ID<<3 | CAN_Id_Extended | CAN_RTR_Data)&0xFFFF0000)>>16;
    CAN_FilterInitStruct.CAN_FilterIdLow = (PASS_ID<<3 | CAN_Id_Extended | CAN_RTR_Data)&0xFFFF;
    CAN_FilterInitStruct.CAN_FilterMaskIdHigh = 0xFFFF;
    CAN_FilterInitStruct.CAN_FilterMaskIdLow = 0xFFFF;
    CAN_FilterInit(&CAN_FilterInitStruct);
    //½ÓÊܵ½Ò»Ìõ±¨Îļ´¿É²úÉúÖжÏ
    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
}

void CAN_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//ÇÀÕ¼ÓÅÏȼ¶0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //×ÓÓÅÏȼ¶0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQͨµÀʹÄÜ
    NVIC_Init(&NVIC_InitStructure);    //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯NVIC¼Ä´æÆ÷
}

void CAN_Config(void)
{
    CAN_GPIO_Config();   
    CAN_Filter_Config();
    CAN_Mode_Config();
    CAN_NVIC_Config();
}

extern uint8_t Flag;
extern CanRxMsg RX_Message;

void USB_LP_CAN1_RX0_IRQHandler()
{
    CAN_Receive(CAN1,CAN_FIFO0,&RX_Message);
    Flag = 1;
}

使用特权

评论回复
板凳
狄克爱老虎油| | 2024-2-29 19:10 | 只看该作者
硬件电路连接正常吗

使用特权

评论回复
地板
yangjiaxu| | 2024-2-29 22:00 | 只看该作者
我觉得不如使用cubemx来配置,这种就很少容易出现初始化失败的问题

使用特权

评论回复
5
两只袜子| | 2024-3-18 12:20 | 只看该作者
硬件连接问题?

使用特权

评论回复
6
jcky001| | 2024-3-18 13:01 | 只看该作者
可能是固件/软件问题

使用特权

评论回复
7
cr315| | 2024-3-18 14:12 | 只看该作者
调试接口是否有问题

使用特权

评论回复
8
laocuo1142| | 2024-3-18 15:03 | 只看该作者
检查Bootloader的配置是否正确,比如启动地址、校验和等。

使用特权

评论回复
9
小夏天的大西瓜| | 2024-3-18 17:46 | 只看该作者
标准库需要自己配置的比较多,一般情况下HA库L文件比较简单

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

918

帖子

1

粉丝