历史上的今天
返回首页

历史上的今天

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

正在发生

2019年09月30日 | cubemx实现CAN通讯

2019-09-30 来源:eefocus

首先要安装cubemx跟Keil5两个编程软件


然后打开cubemx软件,新建一个工程项目:

输入CPU型号:

在右下角双击CPU具体型号

稍等片刻会打开如下对话框:

首先要配置系统的调试方式:我们选择SW方式

然后配置晶振源,这里选择的是外部晶振,8M

使能看门狗

使能CAN

使能TIM2时钟源,采用内部时钟

配置完成后可以看到单片机管脚已经做了配置

切换到Clock Configuration选项卡,配置时钟周期,这里配置为8M

切换到Configuration选项卡,进入CAN配置选项配置波特率如下为500Kbps

配置接收中断

配置定时器如下为1ms定时器

配置定时器中断

配置完成后点击保存,然后点击如下按钮,生成代码

填写工程名称,路径,编程软件等等

选择生成代码的方式

等待

点击打开项目。代码生成部分完成。

添加一些特殊配置和逻辑代码


添加CAN的配置信息函数


void Can_Config(void)

{

  hcan.pTxMsg = &TxMessage;

  hcan.pRxMsg = &RxMessage;

 

  /*##-1- Configure CAN1 Transmission Massage #####################################*/

  hcan.pTxMsg->StdId = 0x123;

  hcan.pTxMsg->RTR = CAN_RTR_DATA;

  hcan.pTxMsg->IDE = CAN_ID_STD;

  hcan.pTxMsg->DLC = 8;

 

  /*##-2- Configure the CAN1 Filter ###########################################*/

  sFilterConfig.FilterNumber = 0;

  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

  sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT;

  sFilterConfig.FilterIdHigh = 0;

  sFilterConfig.FilterIdLow = 0;

  sFilterConfig.FilterMaskIdHigh = 0;

  sFilterConfig.FilterMaskIdLow = 0;

  sFilterConfig.FilterFIFOAssignment = CAN_FIFO0;

  sFilterConfig.FilterActivation = ENABLE;

  sFilterConfig.BankNumber = 14;

  HAL_CAN_ConfigFilter(&hcan, &sFilterConfig);

}

 在Main函数中while(1)之前调用一下即可


添加定时器启动函数: HAL_TIM_Base_Start_IT(&htim2);


CAN接收中断启动函数:HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);


/* USER CODE BEGIN 2 */

 

Can_Config();                        //Can配置信息

HAL_TIM_Base_Start_IT(&htim2);       //定时器启动

HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//使能Can接收中断

 

  /* USER CODE END 2 */

 打开stm32f1xx_it.c文件,找到如下函数,


添加接收中断启动函数:HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);


注意:接收中断启动函数使能一次只进一次中断,所以中断退出前要再次使能。


void USB_LP_CAN1_RX0_IRQHandler(void)

{

  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */

 

  /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */

  HAL_CAN_IRQHandler(&hcan);

  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */

  HAL_CAN_Receive_IT(&hcan, CAN_FIFO0);//ʹÄÜCAN½ÓÊÕ

  /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */

}

添加CAN接收服务函数:HAL_CAN_RxCpltCallback


说明:该函数在stm32f1xx_hal_can.c文件中已经有定义,它的定义方式如下:


__weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan)


函数前面的__weak关键字意思是如果有同样的定义,先执行没有__weak关键字的函数,所以当我们定义了HAL_CAN_RxCpltCallback函数后,编译器会先编译我们定义的函数,而忽略系统定义的该函数。当我们没有定义该函数时,系统会编译带有__weak关键字的函数。


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)

{

    unsigned short int speed;

    switch(hcan->pRxMsg->StdId)

    {//根据ID处理数据

        case 0x123://

        /*在此添加数据处理逻辑*/

        break;

        default:

        break;

     }

}

 添加CAN发送函数:


/* USER CODE BEGIN WHILE */

  while (1)

  {

        HAL_IWDG_Refresh(&hiwdg); //喂狗函数

 

        if(Can_Trans_Timer == 0)

        {//每100ms发送一次数据

            Can_Trans_Timer = 100;

            hcan.pTxMsg->StdId = 0x123;

 

            hcan.pTxMsg->Data[0] = 'C';

            hcan.pTxMsg->Data[1] = 'A';

            hcan.pTxMsg->Data[2] = 'N';

            hcan.pTxMsg->Data[3] = ' ';

            hcan.pTxMsg->Data[4] = 'T';

            hcan.pTxMsg->Data[5] = 'E';

            hcan.pTxMsg->Data[6] = 'S';

            hcan.pTxMsg->Data[7] = 'T';

            HAL_CAN_Transmit(&hcan, 200);//发送一帧数据

        }

    }

  /* USER CODE END WHILE */

在定时器函数中添加定时器代码:


void TIM2_IRQHandler(void)

{

  /* USER CODE BEGIN TIM2_IRQn 0 */

  if(Can_Trans_Timer > 0)          Can_Trans_Timer--;

  /* USER CODE END TIM2_IRQn 0 */

  HAL_TIM_IRQHandler(&htim2);

  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */

}

说明:在往工程中添加代码时要注意,不要任意往里面添加代码,要在注释着USER CODE BEGIN的地方添加代码,这样在重新生成代码时才不至于将已经写好的代码覆盖掉,如下


/* USER CODE BEGIN Includes */


添加用户代码


/* USER CODE END Includes */


/* USER CODE BEGIN PFP */


添加用户代码


/* USER CODE END PFP */


/* USER CODE BEGIN 0 */


添加用户代码


/* USER CODE END 0 */

推荐阅读

史海拾趣

AnDAPT__Inc.公司的发展小趣事

AnDAPT Inc.是一家专注于可编程电源管理解决方案的创新型公司。以下是关于该公司发展的相关故事:

  1. 公司成立与初期阶段:AnDAPT Inc.成立于2014年,总部位于美国加利福尼亚州圣何塞。公司的创始人之一是Raghunandan "Raghu" Anandan,他在可编程电源管理领域拥有丰富的经验和专业知识。公司成立之初,致力于开发一种新型的可编程电源管理解决方案,以满足日益复杂和多样化的电子设备对电源管理的需求。

  2. 技术创新与产品开发:AnDAPT Inc.在其成立初期即开始着手开发基于可编程电源管理技术的解决方案。公司团队结合了数字信号处理(DSP)和模拟电路设计等领域的专业知识,不断推动技术创新和产品开发。他们的主要产品是基于可编程电源管理器件的芯片,能够根据应用需求动态调整电源管理参数,提供高效、灵活和智能的电源解决方案。

  3. 市场拓展与合作伙伴关系:随着公司技术的不断成熟和产品的不断推出,AnDAPT Inc.开始加大对市场的拓展力度。公司与电子设备制造商、系统集成商以及电源管理解决方案提供商建立了紧密的合作关系,共同推动可编程电源管理技术的应用和推广。通过与行业领先的合作伙伴进行合作,AnDAPT Inc.不断拓展产品的应用领域和市场份额。

  4. 技术认证与市场认可:AnDAPT Inc.的产品经过严格的技术认证和市场测试,在业界获得了良好的口碑和市场认可。公司的可编程电源管理解决方案被广泛应用于各种电子设备,包括消费类电子产品、工业自动化设备、汽车电子系统等。其技术创新和产品性能得到了行业专家和客户的一致好评。

  5. 持续发展与未来展望:作为一家专注于可编程电源管理技术的创新型公司,AnDAPT Inc.将继续致力于技术创新和产品开发。公司将不断推出新的产品和解决方案,满足客户不断变化的需求,并积极参与行业标准的制定和技术进步的推动。在未来,AnDAPT Inc.将继续保持敏锐的市场洞察力和技术领先地位,助力客户实现产品创新和市场竞争优势。

辰颐电子公司的发展小趣事

随着公司业务的不断发展,辰颐电子开始积极拓展市场。他们通过参加各种行业展会、举办产品发布会等方式,加强与客户的沟通和交流,提升品牌知名度和影响力。同时,公司还注重线上线下的渠道建设,通过电商平台、实体店等多种方式,将产品推向更广阔的市场。这些努力使辰颐电子在市场中树立了良好的品牌形象和口碑。

EPCOS (TDK)公司的发展小趣事

2009年10月1日,EPCOS与TDK元件事业部合并,成立了TDK-EPC公司。这次合并进一步增强了EPCOS在电子元器件领域的实力,使其在全球市场中的地位更加稳固。合并后,TDK-EPC公司继续秉承EPCOS的技术创新和产品拓展战略,不断推出具有竞争力的新产品和解决方案,以满足客户日益增长的需求。

Clever Little Box公司的发展小趣事

Clever Little Box深知,优质的客户服务是企业长期发展的关键。因此,公司始终注重提升服务质量,为客户提供专业的技术支持和售后服务。同时,公司还注重与客户建立良好的关系,通过定期沟通、反馈收集等方式,了解客户的需求和意见,以便更好地满足客户的期望。

Cornell Dubilier公司的发展小趣事

在经历了环境污染问题后,Cornell Dubilier公司开始重视可持续发展和环境责任。公司采取了一系列措施来减少生产过程中的环境污染,包括改进生产工艺、使用环保材料、加强废物处理等。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这些努力不仅提升了公司的社会形象,也为电子行业的可持续发展做出了贡献。

这五个故事涵盖了Cornell Dubilier公司在电子行业发展的不同方面,包括创立与早期发展、运营与污染问题、技术革新与产品应用、智能化生产与合作以及可持续发展与环境责任。这些故事展示了公司在电子行业中的成长和变革,也反映了公司在面对挑战时所采取的积极措施和取得的成果。

深圳杜因特(DOINGTER)公司的发展小趣事

为了进一步提升自身实力和市场竞争力,杜因特积极寻求与国内外一流芯片代工厂、封装测试代工厂的合作。通过紧密的合作关系,杜因特不仅获得了先进的技术支持,还实现了产品质量的稳步提升。同时,公司还积极与国内外知名电子企业建立战略合作关系,共同开拓市场,实现共赢发展。

问答坊 | AI 解惑

实用电子电路设计制作例解

实用电子电路设计制作例解…

查看全部问答>

AVR ATMega16 步进电机驱动程序,已经调试通过【转】

这两天做步进电机的驱动成功,现将程序共享,愿起到抛砖引玉的作用。 此程序可驱动五引线步进电机,通过按键可控制步进电机的转速、方向、三种驱动方式,三种驱动方式分别为:单四拍驱动、双四拍驱动、单双八拍驱动,其中以单双八拍驱动转速最慢。 ...…

查看全部问答>

笔记本电池专用料

FDS6690A  FAIRCHILD  09+   100K AO4468        AOS        09+   300K APM4435A   ANPEC      09+&nb ...…

查看全部问答>

电路板书架-原来电路也可以如此简约

电路板书架,简单,美观。 原来错综复杂的电路图也可以如此简约好看。 即体现了职业,又显示了品位。你是不是也想有一套? 安装图纸 …

查看全部问答>

基于FPGA的高阶数字锁相环的设计

上述代码经过在Quartus II上编译仿真后其波形如图2所示。     设计中适当选取K值特别的重要。如果K值偏大,这样计数器对少量噪声干扰不可能计满,就不会有进位或者借位脉冲,有利于抑制随机噪声;但就会使捕捉带减小,导致环路进入锁定 ...…

查看全部问答>

请教DNW不能用问题~

用三星的dnw下载eboot和nk,不小心把机器整蓝屏了,于是我就直接关掉插座的电源(不是关的pc的power键)。然后重新上电开机。开机后dnw就不能打开了,弹出“ dnw.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉”这个需要进入调试和发送错误报 ...…

查看全部问答>

出售团队

本团队共四人,一硬件(硬件部门总工),三软件(一软件部门总工、两底层、蓝牙和PC应用开发工程师、平均年龄28)。一直从事蓝牙、单片机和PC软件的开发。手里有几十个现成的项目。从事了3年的蓝牙耳机、DONGLE以及各种适配器的开发,该团队一起工 ...…

查看全部问答>

那里有DumpRom.exe工具软件下载啊?怎么提取BIN/NB0文件里面的某个文件?

那里有DumpRom.exe工具软件下载啊?怎么提取BIN/NB0文件里面的某个文件?…

查看全部问答>

还是钩子,按键一次响应两次的问题

找了不少资料,造成这样的原因应该是按键按下和弹起都会触发消息。 但是,怎么避免呢 在vc下,有的做法是在hook过程函数处理之前加个判断,那些我没试过行不行。 但是在wince下用如下方法判断却都不行。郁闷! if (LLKHF_UP==(keyb->flags) ) ...…

查看全部问答>

pt1000的用法

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 哪位高手帮我讲解下这个电路图 每升高一度对应多少电压值的变化 如果有别的关于pt1000使用的电路图 更好  不胜感激  …

查看全部问答>