RT-Thread studio配置can hal库 驱动GM6020
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相关推荐
- RT Thread Studio 配置IIC并读取AS5600角度
RT Thread Studio 配置IIC并读取AS5600角度 一.RT Thread Studio 配置IIC 1.在RT Thread Seting 中开启IIC功能 并保存 一定要保存才能更 ...
- RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程
(1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- STM32f429独立看门狗配置--基于HAL库
STM32f429独立看门狗配置–基于HAL库 独立看门狗IWDG由专用的低速时钟LSI驱动,即使主时钟发生故障他仍然有效,但由于时钟LSI并不精确所以他适用于对时间精度要求低的场合,在喂狗的时候尽量 ...
- STM32 HAL库 驱动 MT6701 磁编码器
写在前面: MT6701 是 MagnTek 推出的新一代基于差分霍尔感应原理的磁性角度编码器芯片.值得一提的是 MT6701不仅提供 0~360° 的角度信号,而且还提供了一个"按压&qu ...
- VL53L0x TOF激光测距的 stm32 HAL库驱动代码
VL53L0x 是ST公司生成的 TOF激光测距传感器,得益于非常小巧的尺寸,很容易放入手机.无人机中,提供更加精准.稳定的测距方式. 本文代码,使用 STM32F4xx的 HAL库. VL53L0x ...
- STM32F030F4P6 IIC HAL库驱动CH455G
STM32F0系列单片机IO口没有位带操作,仿位带比较浪费资源,不太想用模拟IIC. HAL库的IIC操作做还是很方便的,是24C02之类的EEPROM很好用,本文主要介绍使用HAL库的IIC驱动沁恒 ...
- STM32使用HAL库驱动SDRAM
1.驱动平台 开发板使用的是野火的STM32H750,需要驱动核心板上的SDRAM(2片装),SDRAM使用的是W9825G6KH-6,32MB@,组合一起成为64M.驱动方式使用STM32H750X ...
- 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制
1.首先,我们先了解一下大疆开发板A型的资料,官方有提供 官网:RoboMaster 机甲大师赛 芯片型号STM32F427IIH6 2.了解M3508直流无刷电机的资料,官网有提供 3.于是我找到 ...
最新文章
- kafka使用_kafka使用Interceptors实现消息端到端跟踪
- get_children 方法里面参数 iv_as_copy 有什么用?
- SpringSecurity使用SpringBoot简单使用
- Gitter - 高颜值GitHub小程序客户端诞生记 1
- u-boot之mkconfig分析
- 引领Boost(二)(Boost::Any)
- 解决deepin+win7双系统打不上KB4474419补丁问题
- ESD与EOS的区别
- Unity学习笔记------用Unity2D制作打地鼠游戏
- 手机邮箱无法显示加密邮件_电子邮件可能无法加密
- 学术文献也有身份证?
- MarkdownPad 2 安装配置及常见问题
- C++判断系统位数(64位或32位)
- fedora下关掉那讨厌的beep beep beep
- 使用 Redis 实现语音社交聊天室源码中的排行榜功能
- 三星升级android9,没买的不必看!三星手机各机升级Android 9.0 时间表
- appzapper注册码
- 51单片机开发系列一-51单片机开发环境搭建以及入门汇编代码
- 直播礼物特效-漫播直播礼物分析
- 个人读书思维导图笔记之mysql-innodb之操作函数相关