历史上的今天
返回首页

历史上的今天

今天是:2025年03月07日(星期五)

正在发生

2019年03月07日 | STM32之CAN总线例程

2019-03-07 来源:eefocus

#include "stm32f10x.h"


/* RCC时钟配置 */

void RCC_config(void)

 ErrorStatus HSEStartUpStatus;


 /* RCC寄存器设置为默认配置 */

 RCC_DeInit();

 /* 打开外部高速时钟 */

 RCC_HSEConfig(RCC_HSE_ON);

 /* 等待外部高速时钟稳定 */

 HSEStartUpStatus = RCC_WaitForHSEStartUp();

 if(HSEStartUpStatus == SUCCESS) 

 { 

  /* 设置HCLK = SYSCLK */

  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  /* 设置PCLK2 = HCLK */

  RCC_PCLK2Config(RCC_HCLK_Div1);

  /* 设置PCLK1 = HCLK / 2 */

  RCC_PCLK1Config(RCC_HCLK_Div2);

//  /* 设置FLASH代码延时 */

//  FLASH_SetLatency(FLASH_Latency_2);

//  /* 使能预取址缓存 */

//  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  /* 设置PLL时钟源为HSE倍频9 72MHz */

  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  /* 使能PLL */

  RCC_PLLCmd(ENABLE);

  /* 等待PLL稳定 */

  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

  /* 设置PLL为系统时钟源 */

  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  /* 等待系统时钟源切换到PLL */

  while(RCC_GetSYSCLKSource() != 0x08);

 }

}


/* GPIO配置 */

void GPIO_config(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;


 /* 时钟配置 */

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);


 /* RX */

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


 /* TX */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

}


/* 中断嵌套控制器配置 */

void NVIC_config(void)

{

 NVIC_InitTypeDef NVIC_InitStructure;

 

 /* 选择中断分组2 */

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);


 /* 设置CAN接收中断 */

 NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 NVIC_Init(&NVIC_InitStructure);

}


/* CAN总线配置 */

void CAN_config(void)

{

 CAN_InitTypeDef CAN_InitStructure;

 CAN_FilterInitTypeDef CAN_FilterInitStructure;


 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

 

 /* CAN1默认参数 */

 CAN_DeInit(CAN1);

 

 /* 将结构体填入默认参数 */

 CAN_StructInit(&CAN_InitStructure);


 /* 关闭时间触发模式 */

 CAN_InitStructure.CAN_TTCM = DISABLE;

 /* 关闭自动离线管理 */

 CAN_InitStructure.CAN_ABOM = ENABLE;

 /* 关闭自动唤醒 */

 CAN_InitStructure.CAN_AWUM = ENABLE;

 /* 自动重传 */

 CAN_InitStructure.CAN_NART = DISABLE;

 /* 禁止FIFO溢出时覆盖原报文 */

 CAN_InitStructure.CAN_RFLM = DISABLE;

 /* 关闭优先级取决于ID */

 CAN_InitStructure.CAN_TXFP = DISABLE;

 /* 正常模式 */

 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;


 /* 设置波特率 */

 CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;

 CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;

 CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;

 CAN_InitStructure.CAN_Prescaler = 4;

 /* 初始化CAN总线 */

 CAN_Init(CAN1, &CAN_InitStructure);


 /* 过滤器配置 */

 CAN_FilterInitStructure.CAN_FilterNumber = 0;

 CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;

 CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

 CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0020;

 CAN_FilterInitStructure.CAN_FilterIdLow = 0x0007;

 CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0020;

 CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

 CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;

 CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

 CAN_FilterInit(&CAN_FilterInitStructure);


 /* 接收挂起中断 */

 CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

}



/* 毫秒延时函数 */

void delay_ms(uint16_t time)

{    

 uint16_t i = 0; 


 while(time--)

 {

  i = 12000;

  while(i--);    

 }

}


CanTxMsg TxMessage;


/* 主函数 */

int main(void)

{

 uint8_t TransmitMailbox = 0;

 

 /* RCC时钟配置 */

 RCC_config();

 

 /* GPIO配置 */

 GPIO_config(); 


 /* CAN总线配置 */

 CAN_config();

 

 /* 中断嵌套控制器配置 */

 NVIC_config();

 

 while(1)

 {

        TxMessage.StdId = 1;

        TxMessage.ExtId = 0;

        TxMessage.IDE = CAN_ID_STD;

        TxMessage.RTR = CAN_RTR_DATA;

        TxMessage.DLC = 8;

        TxMessage.Data[0] = 0x11;

        TxMessage.Data[1] = 0x22;

        TxMessage.Data[2] = 0x33;

        TxMessage.Data[3] = 0x44;

        TxMessage.Data[4] = 0x55;

        TxMessage.Data[5] = 0x66;

        TxMessage.Data[6] = 0x77;

        TxMessage.Data[7] = 0x88;


  TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);

  while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK));

  

  delay_ms(1000);

 }

}




void USB_LP_CAN1_RX0_IRQHandler(void)

{

 CanRxMsg RxMessage;

    volatile CanRxMsg Message;


    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);


    Message.StdId = RxMessage.StdId;

    Message.ExtId = RxMessage.ExtId;

    Message.IDE = RxMessage.IDE;

    Message.RTR = RxMessage.RTR;

    Message.DLC = RxMessage.DLC;


    Message.Data[0] = RxMessage.Data[0];

    Message.Data[1] = RxMessage.Data[1];

    Message.Data[2] = RxMessage.Data[2];

    Message.Data[3] = RxMessage.Data[3];

    Message.Data[4] = RxMessage.Data[4];

    Message.Data[5] = RxMessage.Data[5];

    Message.Data[6] = RxMessage.Data[6];

    Message.Data[7] = RxMessage.Data[7];

}

推荐阅读

史海拾趣

DC Components公司的发展小趣事

在电子行业中,产品质量是企业立足之本。DC Components公司深知这一点,因此始终把质量控制放在首位。公司通过实施严格的质量控制系统,确保每一个产品都符合高质量标准,并符合所有合同要求。这种对质量的坚守,使DC Components公司在市场上赢得了良好的口碑,吸引了众多客户的青睐。

Andersen Laboratories Inc公司的发展小趣事

为了更好地服务全球客户,AnalogicTech积极实施全球化运营策略。公司在亚洲和大中华地区建立了广泛的晶圆制造和后端合作伙伴网络,包括香港地区、上海和台湾地区的台北。此外,AnalogicTech还迁入香港科技园,将深圳地区纳入业务版图,提高在中国大陆的销售情况,特别是珠江三角洲地区。

AKM [Asahi Kasei Microsystems]公司的发展小趣事

自1997年成立以来,AnalogicTech便致力于技术创新,不断推动电子行业的发展。公司总部位于硅谷,设计中心则分布在圣塔克拉拉和上海,汇聚了全球顶尖的研发人才。凭借深厚的技术底蕴和创新能力,AnalogicTech成功研发出一系列具有颠覆性的产品,为当今最具创造性的消费品提供了强大的技术支持。

E-tec Interconnect Ltd公司的发展小趣事

随着技术的不断成熟和产品质量的不断提升,E-tec开始积极拓展市场。他们与多家国际知名的电子设备制造商建立了合作关系,产品逐渐进入全球供应链。为了进一步提升产品质量和竞争力,E-tec通过了ISO 9001质量管理体系认证,以及多项行业内的品质认证,如UL、CE等。这些认证不仅提升了公司的品牌形象,也增强了客户对公司的信任。

Bliley Technologies Inc公司的发展小趣事

随着全球化趋势的加速,Bliley也开始积极实施全球化战略。公司不仅在美国本土建立了先进的制造工厂和研发中心,还积极拓展海外市场,与全球客户建立紧密的合作关系。通过全球化战略的实施,Bliley不仅扩大了其市场份额,也提升了其品牌影响力和国际竞争力。如今,Bliley的产品已经广泛应用于各个领域,包括航空航天、军事国防、移动通信、5G蜂窝和电信等。

这五个故事共同展现了Bliley Technologies Inc.在电子行业中的发展历程。从一家小型压电公司起步,通过不断创新和拓展,Bliley逐渐成长为晶振行业的领军企业,并在全球化市场中取得了显著成就。这些故事不仅反映了Bliley的辉煌历史,也预示着其未来更加广阔的发展前景。

Auctor Corp公司的发展小趣事

随着电子行业的快速发展,Auctor Corp公司意识到只有不断创新才能在竞争中脱颖而出。因此,公司加大了对研发的投入,不断引进先进技术和人才。经过数年的努力,公司成功开发出一系列具有行业领先水平的新产品,不仅性能卓越,而且具有极高的性价比。这些新产品的推出,使得Auctor Corp在市场上获得了广泛的认可。

问答坊 | AI 解惑

走出防电脑辐射的种种误区

很长一段时间以来,由射线防护品生产厂商们炒作的电磁辐射危害人类生存的浪潮愈演愈烈,引诱了很多日用品的生产者跟风,向消费者不断推销号称“世界领先科技”的防护用品,如:防电脑辐射的眼镜、手套、面罩、上衣、裤子、甚至孕妇专用的套装等等千 ...…

查看全部问答>

什么是汽车电子?

汽车电子简而言之就是半导体和汽车的结合,主要分为两类:一类是汽车电子控制装置,要和机械系统配合使用,例如电子燃油喷射系统、制动防抱死控制、防滑控制、悬架控制、动力转向等。另一类是车载汽车电子装置,是在汽车环境下能够独立使用的电子装 ...…

查看全部问答>

【藏书阁】电子线路与电子技术 /电器修理技术丛书

目录: 第1章 基础知识 第1节 基本概念 第2节 电子元器件主要特性和典型应用电路故障分析 第2章 音频放大器电路 第1节 晶体管单级放大器电路和电路故障分析 第2节 多级放大器电路及电路故障分析 第3节 放大器性能参数 第4节 音频功率放大 ...…

查看全部问答>

【藏书阁】微型计算机原理与汇编语言程序设计

第01章 微型计算机概述 38页.ppt 第02章 计算机中的数据表示 26页.ppt 第03章 80X86微处理器及其体系结构 33页.ppt 第04章 指令系统 134页.ppt 第05章 汇编语言的基本表达及其运行 28页.ppt 第06章 汇编语言程序设计 78页.ppt 第07章 中断调 ...…

查看全部问答>

求硬件开发的人才

高薪求人才! 职位描述及要求: 1. 生物医学工程、精密仪器、检测电子、电子信息工程等相关专业毕业 2、医疗工程系毕业的硕士优先考虑 2. 精通FPGA,单片机等硬件编程芯片的程序设计者优先考虑 3. 熟悉模拟电路、数字电路等sch设计及pcb设计 ...…

查看全部问答>

请教关于HALT模式

本人使用的不是低功耗的ST8芯片,在进入HALT后,用470uF的电容只能够记忆10S左右,但是我看说明书说进入HALT的电流是6ua,我把定时器,看门狗,内外部时钟都关掉,IO口置为输入,请问我是否有其他用电器需要关掉,谢谢.…

查看全部问答>

关于FLASH读写

                                 我现在FLASH能读,但是写不进去,也擦不了。对寄存器也是正确操作。…

查看全部问答>

关于P2IN

给P2.5输入0,程序如下 P2SEL &=~BIT5; P2IN    &=~BIT5; 结果编译出错,改成P2OUT &=~BIT5,没问题,但我一直理解的是P2OUT为输出的值,P2IN为输入的值,不知道这样理解对不对…

查看全部问答>

独立按键接法

小弟是刚开始学习的,按键触发不是有高低电平吗,我想知道独立按键的高电平触发电路接法和低电平触发电路接法.…

查看全部问答>