历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2019年09月30日 | stm32 can中断通信

2019-09-30 来源:eefocus

1、初始化can时钟


void canRCCInit()

{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);


2、配置can的GPIO引脚


void canGPIOConfigure()

{

    GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);


    GPIO_InitTypeDef gpioInit;

    gpioInit.GPIO_Pin = GPIO_Pin_8;

    gpioInit.GPIO_Mode = GPIO_Mode_IPU;

    gpioInit.GPIO_Speed = GPIO_Speed_50MHz;


    GPIO_Init(GPIOB, &gpioInit);


    gpioInit.GPIO_Pin = GPIO_Pin_9;

    gpioInit.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOB, &gpioInit);


3、配置并使能can


void canConfigure()

{

    CAN_InitTypeDef can_init;

    CAN_DeInit(CAN1);

    CAN_StructInit(&can_init);


    //关闭时间触发模式

    can_init.CAN_TTCM = DISABLE;    

    //关闭自动离线管理

    can_init.CAN_ABOM = DISABLE;

    //关闭自动唤醒模式

    can_init.CAN_AWUM = DISABLE;

    //禁止报文自动重发

    can_init.CAN_NART = DISABLE;

    //FIFO 溢出时报文覆盖原文件

    can_init.CAN_RFLM = DISABLE;

    //报文发送优先级取决于ID号

    can_init.CAN_TXFP = DISABLE;

    //回环模式

    can_init.CAN_Mode = CAN_Mode_LoopBack;


    //配置时钟频率

    can_init.CAN_SJW = CAN_SJW_1tq;

    can_init.CAN_BS1 = CAN_BS1_3tq;

    can_init.CAN_BS2 = CAN_BS2_2tq;

    can_init.CAN_Prescaler = 48;


    CAN_Init(CAN1, &can_init);


    CAN_FilterInitTypeDef can_filter;


    //屏蔽滤波

    can_filter.CAN_FilterNumber = 0;

    //屏蔽模式

    can_filter.CAN_FilterMode = CAN_FilterMode_IdMask;

    //32位寄存器

    can_filter.CAN_FilterScale = CAN_FilterScale_32bit;

    //高16位

    can_filter.CAN_FilterIdHigh = 0x0000;

    //低16位

    can_filter.CAN_FilterIdLow = 0;

    //屏蔽位高16位

    can_filter.CAN_FilterMaskIdHigh = 0;

    //屏蔽位低16位

    can_filter.CAN_FilterMaskIdLow = 0;

    //过滤器0关联到FIFO0

    can_filter.CAN_FilterFIFOAssignment = CAN_FilterFIFO0;

    //使能过滤器

    can_filter.CAN_FilterActivation = ENABLE;

    //初始化过滤器

    CAN_FilterInit(&can_filter);


    //使能接收中断

    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

}

4、配置中断源


void canNvicConfigure()

{

    NVIC_InitTypeDef nvic_init;

    nvic_init.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

    nvic_init.NVIC_IRQChannelPreemptionPriority = 0;

    nvic_init.NVIC_IRQChannelSubPriority = 0;

    nvic_init.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&nvic_init);


    nvic_init.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;

    nvic_init.NVIC_IRQChannelPreemptionPriority = 0;

    nvic_init.NVIC_IRQChannelSubPriority = 1;

    nvic_init.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&nvic_init);

}


5、实现中断处理函数


void USB_LP_CAN1_RX0_IRQHandler(void)

{

    CanRxMsg rx;

    CAN_Receive(CAN1, CAN_FIFO0, &rx);

    for(int i = 0; i < rx.DLC; i++){

        printf("recv data: %crn",rx.Data[i]);

    }

}


void USB_HP_CAN1_TX_IRQHandler(void)

{

    if(count < len){

        txMessage.Data[0] = txBuf[count++];

        CAN_Transmit(CAN1, &txMessage);

    }

    else {

        CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);

    }

}


6、实现发送函数


void canWrite(const char *p)

{

    strcpy(txBuf, p);

    len = strlen(p);

    count = 0;

    txMessage.StdId = 0xFE00 >> 5;

    txMessage.ExtId = 0;

    txMessage.IDE = CAN_ID_STD;

    txMessage.RTR = CAN_RTR_DATA;

    txMessage.DLC = 1;  //此处最多可传输8个字节

    txMessage.Data[0] = txBuf[count++];

    CAN_Transmit(CAN1, &txMessage);


    CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);

}


7、总结:在写can总线协议时,需要自己仔细阅读stm32的官方手册,can总线有多种模式及标识符列表模式、标识符屏蔽模式等,需要自己仔细琢磨。

推荐阅读

史海拾趣

Bel Fuse公司的发展小趣事

作为一个有社会责任感的企业,Bel Fuse始终关注环境保护和可持续发展。公司致力于减少生产过程中的能源消耗和环境污染,积极采用环保材料和工艺。同时,Bel Fuse还参与了多项公益活动,为社会做出贡献。这种对社会责任的承担不仅提升了公司的形象,也增强了员工的凝聚力和归属感。

这些故事虽然基于虚构,但它们是根据Bel Fuse公司可能经历的发展历程和挑战来构建的。真实的故事可能会因时间、市场环境等因素而有所不同。要了解Bel Fuse公司的真实发展历程,建议查阅相关文献资料或访问公司官方网站。

Aydin Corp公司的发展小趣事

随着电子技术的快速发展,Aydin Corp意识到只有不断创新才能在市场中立于不败之地。公司投入大量资源用于研发,不断推出具有创新性和竞争力的产品。这些产品不仅性能卓越,而且设计独特,迅速赢得了消费者的青睐。同时,Aydin Corp还注重产品升级和迭代,以满足市场不断变化的需求。

Hengstler GmbH公司的发展小趣事

在国内市场取得一定成绩后,Aydin Corp开始积极拓展国际市场。通过与全球知名企业的合作,公司成功将产品打入多个国家和地区的市场。同时,Aydin Corp还积极参加国际电子展会和交流活动,与业界同行建立了广泛的合作关系。这些举措不仅提升了公司的国际知名度,也为公司的持续发展注入了新的动力。

Aptiv公司的发展小趣事

Aptiv公司在电子行业中以其领先的技术实力著称。早在1995年,公司便成立了自动驾驶研究实验室,开始探索自动驾驶技术的可能性。经过多年的研发与试验,Aptiv在自动驾驶领域取得了显著的突破。2004年,公司首次在内华达州成功测试了自动驾驶汽车,获得了州政府的批准,这标志着Aptiv在自动驾驶技术上迈出了坚实的步伐。此后,Aptiv不断推动自动驾驶技术的商业化进程,为全球汽车行业带来了新的发展机遇。

台湾美丽微(FMS)公司的发展小趣事

FTDI的历史可以追溯到1992年3月13日,由弗雷德·达特(Fred Dart)创立。公司初期专注于个人电脑市场,推出了针对主板芯片组的解决方案。其中,早期的主要客户之一是IBM,这些芯片被应用于AMBRA和PS/2系列的个人电脑中,为当时的计算机技术发展做出了重要贡献。这一时期的成功不仅奠定了FTDI的技术基础,也为其后续的市场拓展奠定了坚实的客户基础。

兵字(BingZi)公司的发展小趣事

兵字公司的创始人李元兵,在经历了多年的研究所工作后,怀揣着对电子元器件领域的深厚情感与独到见解,决定投身创业。他深知,在电子行业这个日新月异的领域,唯有掌握核心技术,才能在激烈的市场竞争中立足。于是,兵字公司从成立之初,就致力于电源变压器和触发变压器的研发与生产,凭借过硬的技术实力和优质的产品质量,迅速在市场中站稳了脚跟。

问答坊 | AI 解惑

新能源新趋势

新能源几乎成了“绿色”动力的代言。去年底发布的《新能源汽车生产准入管理规则》对新能源汽车有准确的定义,指采用非常规的车用燃料作为动力来源(或使用常规的车用燃料、采用新型车载动力装置),综合车辆的动力控制和驱动方面的先进技术,形成的 ...…

查看全部问答>

关于监控用的摄像头用的LED是什么样的?

遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...…

查看全部问答>

wince5.0怎么设置才能实现通过路由上网

最近我刚买一块2440的开发板,跑wince5.0,按照PC机设置wince,连上网线后不能上网!不知道是什么原因。PC机可以通过网线与ARM板通信。ftp和fttp都正常。那我应该怎么样设置或还需要哪些工作才能实现我这块开发板与网络的连接呢。…

查看全部问答>

wince安全性问题

在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...…

查看全部问答>

各位好心人帮忙解决一个usb驱动问题

小弟现在正在做一个Linux下usb鼠标驱动的程序,但编写程序时总是提示找不到linux/usb.h,望大家帮忙指点,岂求ING………

查看全部问答>

【招聘】汇编语言入门图书兼职作者

【招聘】汇编语言入门图书兼职作者 本公司是业内知名IT图书策划出版公司,正在运作一本汇编语言入门相关图书。想征求关于汇编语言的设计高手参与编写。有意者请将个人介绍和联系方式(QQ或MSN)发到本人邮箱macuilhy@sina.cn。…

查看全部问答>

讲了那么多技术,有没有导购的?

                                 要1K STM32f103c8T6,找谁?…

查看全部问答>

u8 sd_raw_get_info(struct sd_raw_info* info)中struct怎么理解

u8 sd_raw_get_info(struct sd_raw_info* info) { …… } 这个子程序怎么用啊,像u8 mmcWrite(u32 sector, u8* buffer)这种,我在主程序中只要定义unsigned char SD_Write1[]={\"0123456789\"}; 就可以用了mmcWrite(SD_Write1); 但是这个定义 ...…

查看全部问答>

TI 电源设计小贴士 9

欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到一 ...…

查看全部问答>