RT-Thread studio配置can hal库 驱动GM6020

最近由裸机系统转战rt-thread,在刚入手RT-Thread的过程中记录一些东西吧,可能是刚做的原因,软件还不是那么完整好用,希望以后可以越来越好。手头正好有一个大疆的GM6020电机,想用can做一个驱动来试一下。
提前说明一下,由于我按照官方的教程调用函数没有成功,而且响应的文件也没自动加载,不知道是我的原因还是软件不支持,现在我是直接用hal库的函数驱动,效果一样,也是在studio里面直接操作,希望有懂的大神可以指出正确的操作。

1、新建工程


这里我用的是stm32f103vet6芯片,板子是自己做的。

2、CubeMx配置

先新建一个工程

打开下载接口,否则芯片烧写一次后就会被锁死

外部时钟

时钟配置!!这里很重要!!!!我就是因为这里没配置好!不同的芯片根据自己的芯片手册配就行了,或者找野火的资料hal库开发指南里面有一些芯片的说明!

使能can 打开接收中断

接下来是配置can 我这里用的是1Mbps 设置BS1 BS2的时候可以先把数调大一个再调回来,这个报错不影响使用

project配置

这里选中可以将驱动代码单独生成一个.c .h文件

生成工程

3、RT-Thread studio代码移植

首先打开setting里的can模块

打开宏

时钟函数,注意只需要将大括号内的代码覆盖掉drv_clk.c中的函数代码,函数名不要改

如下

然后将生成的can.c can.h复制到studio工程下的drivers文件夹下

编译一下studio工程 左侧会自动显示添加的文件

由于cubemx生成的代码中没有can的过滤器配置,这里需要自己添加,在can.c中

HAL_StatusTypeDef CAN_Filter_Init(CAN_HandleTypeDef *h_can)
{CAN_FilterTypeDef sFilterConfig;sFilterConfig.FilterBank = 0;   //chenal 0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterIdHigh = ((((uint32_t)0x205<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF0000)>>16;sFilterConfig.FilterIdLow = (((uint32_t)0x205<<3)|CAN_ID_EXT|CAN_RTR_DATA)&0xFFFF;//MASK bit 0 means don't care,bit 1 means matchsFilterConfig.FilterMaskIdHigh = 0x0000;   //无需匹配sFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //FIFO0sFilterConfig.FilterActivation = CAN_FILTER_ENABLE;   //enable filtersFilterConfig.SlaveStartFilterBank = 0;if (HAL_CAN_ConfigFilter(h_can, &sFilterConfig) != HAL_OK){rt_kprintf("rt_can_filter_error!!\r\n");Error_Handler();return HAL_ERROR;}//regist RX_ITif (HAL_CAN_ActivateNotification(h_can, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)  //??CAN_IT_RX_FIFO0_MSG_PENDING ?????????{rt_kprintf("rt_an_error!!\r\n");Error_Handler();return HAL_ERROR;}return HAL_OK;
}

自己写一个发送函数,调用的库函数发送HAL_CAN_AddTxMessage() can.c中

uint8_t HAL_CAN_SendTxMessage(CAN_TxHeaderTypeDef *TxHeader,uint32_t std_id, uint8_t aData[],uint16_t lengh)
{uint32_t TxMailBox;uint8_t FreeTxMailBoxNum;TxHeader->StdId = std_id;TxHeader->DLC = lengh;TxHeader->IDE = CAN_ID_STD;TxHeader->RTR = CAN_RTR_DATA;TxHeader->TransmitGlobalTime = DISABLE;while(0 == FreeTxMailBoxNum){FreeTxMailBoxNum = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);}if (HAL_CAN_AddTxMessage(&hcan, TxHeader, aData, &TxMailBox) != HAL_OK){/* Transmission request Error */Error_Handler();return 0;}return 1;
}

can.c 里添加收发结构体

can.h将#include <main.h>改#include <board.h>
并且声明一下结构体


can.c 添加GM6020的数据包发送程序,并将函数添加到.h文件中声明

uint8_t txdata[8] ;
void can_6020()
{txdata[0] = 5000>>8;txdata[1] = 5000&0x00ff;MX_CAN_Init();CAN_Filter_Init(&hcan);HAL_CAN_Start(&hcan);HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);while(1){HAL_CAN_SendTxMessage(&TxHeader,0x1FF, txdata,8);rt_thread_mdelay(100);}
}

在drv_common.c里添加中断服务函数

void USB_LP_CAN1_RX0_IRQHandler(void)
{HAL_CAN_IRQHandler(&hcan);
}

*该函数会自动调用void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef hcan)
因此我们在can.c里添加这个函数

简单写一下测试用,实际可根据自己的需要加筛选器,以及具体的中断接收函数,这里只给出介绍

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{uint8_t aRxData[8];if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, aRxData) == HAL_OK){//rt_kprintf("can 6020 receive message !!!\r\n");}
}

到这基本配置完成,接下来就是添加一个线程来验证一下程序。

4、添加线程

main.c

#include <rtthread.h>#define DBG_TAG "main"
#include "can.h"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>static rt_thread_t can6020_thread = RT_NULL;int main(void)
{can6020_thread =rt_thread_create("can6020_thread",can_6020,RT_NULL,512,5,20);if(can6020_thread!=RT_NULL){rt_thread_startup(can6020_thread);}else{return -1;}
}

编译–>烧录,电机轻松起转!中断成功进入!

注意:添加的函数需要声明,相关的头文件需要引用,跟keil用法一样。


更新一下,刚看到有人用正规做法驱动的can

RT-Thread studio开发环境下使用can

RT-Thread studio配置can hal库 驱动GM6020相关推荐

  1. RT Thread Studio 配置IIC并读取AS5600角度

    RT Thread Studio 配置IIC并读取AS5600角度 一.RT Thread Studio 配置IIC 1.在RT Thread Seting 中开启IIC功能 并保存 一定要保存才能更 ...

  2. RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程

    (1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...

  3. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  4. STM32f429独立看门狗配置--基于HAL库

    STM32f429独立看门狗配置–基于HAL库 独立看门狗IWDG由专用的低速时钟LSI驱动,即使主时钟发生故障他仍然有效,但由于时钟LSI并不精确所以他适用于对时间精度要求低的场合,在喂狗的时候尽量 ...

  5. STM32 HAL库 驱动 MT6701 磁编码器

    写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...

  6. VL53L0x TOF激光测距的 stm32 HAL库驱动代码

    VL53L0x 是ST公司生成的 TOF激光测距传感器,得益于非常小巧的尺寸,很容易放入手机.无人机中,提供更加精准.稳定的测距方式. 本文代码,使用 STM32F4xx的 HAL库. VL53L0x ...

  7. STM32F030F4P6 IIC HAL库驱动CH455G

    STM32F0系列单片机IO口没有位带操作,仿位带比较浪费资源,不太想用模拟IIC. HAL库的IIC操作做还是很方便的,是24C02之类的EEPROM很好用,本文主要介绍使用HAL库的IIC驱动沁恒 ...

  8. STM32使用HAL库驱动SDRAM

    1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...

  9. 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    1.首先,我们先了解一下大疆开发板A型的资料,官方有提供 官网:RoboMaster 机甲大师赛 芯片型号STM32F427IIH6 2.了解M3508直流无刷电机的资料,官网有提供  3.于是我找到 ...

最新文章

  1. kafka使用_kafka使用Interceptors实现消息端到端跟踪
  2. get_children 方法里面参数 iv_as_copy 有什么用?
  3. SpringSecurity使用SpringBoot简单使用
  4. Gitter - 高颜值GitHub小程序客户端诞生记 1
  5. u-boot之mkconfig分析
  6. 引领Boost(二)(Boost::Any)
  7. 解决deepin+win7双系统打不上KB4474419补丁问题
  8. ESD与EOS的区别
  9. Unity学习笔记------用Unity2D制作打地鼠游戏
  10. 手机邮箱无法显示加密邮件_电子邮件可能无法加密
  11. 学术文献也有身份证?
  12. MarkdownPad 2 安装配置及常见问题
  13. C++判断系统位数(64位或32位)
  14. fedora下关掉那讨厌的beep beep beep
  15. 使用 Redis 实现语音社交聊天室源码中的排行榜功能
  16. 三星升级android9,没买的不必看!三星手机各机升级Android 9.0 时间表
  17. appzapper注册码
  18. 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码
  19. 直播礼物特效-漫播直播礼物分析
  20. 个人读书思维导图笔记之mysql-innodb之操作函数相关

热门文章

  1. 西红柿炒鸡蛋的神奇功效
  2. MyBatis配置数据库
  3. Java项目:SpringBoot图书管理系统
  4. 今天的打拼,是为了与众不同的明天!
  5. 计算机基础知识大眼睛,眼睛知识
  6. “b数”(B树)是个怎么回事
  7. 10-124 A3-4查询产品表中最大库存量
  8. ConcurrentHashMap源码解读
  9. 如何把语音文件转成文字格式
  10. Outlook 2007无法连接Exchange 2007