Browse Source

update base project

master
zhaohe 2 years ago
parent
commit
19b6846662
  1. 3
      app/Core/Src/main.c
  2. 6
      src/board/hardware.cpp
  3. 24
      src/board/hardwarelib.cpp
  4. 13
      src/board/hardwarelib.hpp
  5. 43
      src/board/project_board.hpp
  6. 97
      src/umain.cpp
  7. 30
      src/umain.hpp

3
app/Core/Src/main.c

@ -58,7 +58,7 @@ void SystemClock_Config(void);
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
extern int umain(int argc, char const *argv[]) ;
/* USER CODE END 0 */
/**
@ -97,6 +97,7 @@ int main(void)
MX_USART1_UART_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
umain(0, NULL);
/* USER CODE END 2 */

6
src/board/hardware.cpp

@ -52,19 +52,25 @@ uint8_t Hardware::getDeviceId() { return DEVICE_ID; }
*******************************************************************************/
void Hardware::input_sensors_init() {
#if 0
SENSOR_INT0.initAsInput(STM32_GPIO::kInput_noIrq, false /*mirror*/);
SENSOR_INT1.initAsInput(STM32_GPIO::kInput_noIrq, false /*mirror*/);
#endif
}
uint32_t Hardware::input_sensors_get_table(int tableNum) {
uint32_t val = 0;
#if 0
val |= SENSOR_INT0.getStateUint32() << 0;
val |= SENSOR_INT1.getStateUint32() << 1;
#endif
return val;
}
void Hardware::input_sensors_table_dump(int tableNum) {
#if 0
ZLOGI(TAG, "[0]:%d [1]:%d", //
SENSOR_INT0.getStateUint32(), //
SENSOR_INT1.getStateUint32());
#endif
}
void Hardware::output_switch_init() {

24
src/board/hardwarelib.cpp

@ -2,27 +2,3 @@
#define TAG "hardware"
using namespace iflytop;
/*******************************************************************************
* TMC5130HImpl *
*******************************************************************************/
void TMC5130HImpl::initialize(const char *name, IflytopMicroOS *os, SPI_HandleTypeDef *spi, STM32_GPIO *spics, STM32_GPIO *enn) {
m_name = name;
m_os = os;
m_port.initialize(os, spi, spics, enn);
TMC5130::createDeafultTMC5130Config(&m_config, &m_port);
tmc5130.initialize(0, &m_config);
uint32_t idVersion0 = tmc5130.readChipVERSION();
ZLOGI(m_name, "idVersion :%x", idVersion0);
tmc5130.setMotorShaft(false);
tmc5130.setAcceleration(30000);
tmc5130.setDeceleration(30000);
tmc5130.setIHOLD_IRUN(0, 3, 0);
}
void TMC5130HImpl::periodicJob() { tmc5130.periodicJob(m_os->getTicket()); }
TMC5130 *TMC5130HImpl::getTMC5130() { return &tmc5130; }

13
src/board/hardwarelib.hpp

@ -13,18 +13,5 @@
#include "libiflytop_micro\stm32\component\tmcutils\tmc51x0_port_impl.hpp"
namespace iflytop {
class TMC5130HImpl {
public:
const char* m_name;
IflytopMicroOS* m_os;
TMC51X0PortImpl m_port;
TMC5130::TMC5130Config_t m_config;
TMC5130 tmc5130;
public:
void initialize(const char* name, IflytopMicroOS* os, SPI_HandleTypeDef* spi, STM32_GPIO* spics, STM32_GPIO* enn);
void periodicJob();
TMC5130* getTMC5130();
};
} // namespace iflytop

43
src/board/project_board.hpp

@ -4,51 +4,12 @@
#define DEVICE_ID 200
// 调试串口
#define DEBUG_UART huart1
#define DEBUG_UART huart2
// 调试指示灯
#define DEBUG_LIGHT_GPIO PB3
#define DEBUG_LIGHT_GPIO PA1
// 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置
// http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md
#define DELAY_US_TIMER htim4
#define CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE 1
#define CONFIG_ENABLE_TMC_MOTOR 1
/*******************************************************************************
* 5130 *
*******************************************************************************/
#if CONFIG_ENABLE_TMC_MOTOR
// 电机通道编号
#define MOTOR_SPI hspi1
#define TMC5130_MOTOR_NUM 1
#define MOTOR0_CSN PA4
#define MOTOR0_ENN PB9
// #define MOTOR1_SPI_MODE_SELECT
// 步进电机
#define MOTOR_R_SENSOR PB13
#define MOTOR_L_SENSOR PB12 // 作为零点限位
#endif
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
/*******************************************************************************
* CAN REG LIST *
*******************************************************************************/
#define DEVICE_BASIC_CTRL_ADD_BASE 0 // 模块控制基本功能 https://iflytop1.feishu.cn/wiki/wikcnBmIF0vqLzbzWBsB3VDMalb
#define REG_MOTOR1_CTRL_ADD_BASE 10000 // 步进电机控制基地址 https://iflytop1.feishu.cn/wiki/wikcnI9UaaRBfWQ7zY2PQfik5hb
#define REG_GPIO_INPUT0 1000 // GPIO输入寄存器0
#define REG_GPIO_OUTPUT0_WRITE 1100 // GPIO输出寄存器0 0-16,写时,高16位为掩码
#define REG_GPIO_OUTPUT0_STATE 1101 // GPIO输出寄存器0 0-16,写时,高16位为掩码
#endif
/*******************************************************************************
* GPIO INPUT *
*******************************************************************************/
#define SENSOR_INT1 PA0
#define SENSOR_INT0 PA1
/*******************************************************************************
* GPIO OUTPUT *
*******************************************************************************/

97
src/umain.cpp

@ -14,30 +14,6 @@ using namespace std;
#define TAG "umain"
int random(int max) { return SysTick->VAL % max; }
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
/*******************************************************************************
* IflytopCanProtocolStackProcesser *
*******************************************************************************/
icps::error_t Main::onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser *processer, icps::WriteEvent *writeEvent) {
if (m_deviceBaseControlService.isThisRegOwnToMe(writeEvent->reg)) {
return m_deviceBaseControlService.processIflytopCanRegisterWriteEvent(writeEvent);
} else if (writeEvent->reg->add == REG_GPIO_OUTPUT0_WRITE) {
uint32_t mask = (writeEvent->newvalue & 0xFFFF0000) >> 16;
uint32_t value = writeEvent->newvalue & 0xFFFF;
m_hardware.output_switch_set(0, (uint16_t)mask, value);
return icps::kSuccess;
}
return icps::kSuccess;
}
icps::error_t Main::onHostRegisterReadEvent(IflytopCanProtocolStackProcesser *processer, icps::ReadEvent *event) { return icps::kSuccess; }
void Main::onHostRegisterReportEvent(IflytopCanProtocolStackProcesser *processer, icps::ReportEvent *event) {}
icps::error_t Main::onSetEngineerMode(DeviceBaseControlService *service, int32_t engineer_mode) {
ZLOGI(TAG, "onSetEngineerMode %d", engineer_mode);
return icps::kSuccess;
}
#endif
/*******************************************************************************
* MAIN *
*******************************************************************************/
@ -57,67 +33,6 @@ void Main::main(int argc, char const *argv[]) {
m_hardware.input_sensors_init();
m_hardware.output_switch_init();
#if CONFIG_ENABLE_TMC_MOTOR
m_motor5130_1.initialize("motor1", &m_hardware, &MOTOR_SPI, &MOTOR0_CSN, &MOTOR0_ENN);
#endif
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
/*******************************************************************************
* m_protocolStack *
*******************************************************************************/
IflytopCanProtocolStackProcesser::createDefaultConfig(&m_iflytopCanStackConfig, m_hardware.getDeviceId(), m_regList, ZARRAY_SIZE(m_regList));
m_protocolStack.initialize(&m_hardware, &m_iflytopCanStackConfig);
m_protocolStack.setDumpPacketFlag(false);
m_protocolStack.registerListener(this);
m_protocolStack.activeReg(REG_GPIO_INPUT0, icps::kr, 0);
m_protocolStack.activeReg(REG_GPIO_OUTPUT0_WRITE, icps::kw, 0);
m_protocolStack.activeReg(REG_GPIO_OUTPUT0_STATE, icps::kr, 0);
/*******************************************************************************
* m_deviceBaseControlService *
*******************************************************************************/
m_deviceBaseControlService.initialize(&m_hardware, &m_protocolStack, m_hardware.getDeviceId());
m_deviceBaseControlService.setListener(this);
#if CONFIG_ENABLE_TMC_MOTOR
/*******************************************************************************
* *
*******************************************************************************/
{
TMC5130 *tmc_motor = m_motor5130_1.getTMC5130();
SingleAxisMotorControlerV2 *service = &m_motorService;
MOTOR_L_SENSOR.initAsInput(STM32_GPIO::kInput_risingAndFallingIrq, true /*mirror*/);
STM32_GPIO *homeGpio = &MOTOR_L_SENSOR;
tmc_motor->setMotorShaft(false);
tmc_motor->setIHOLD_IRUN(2, 3, 0);
service->initialize( //
"motorService", &m_protocolStack, REG_MOTOR1_CTRL_ADD_BASE,
homeGpio, // ZERO_GPIO
NULL, // LGPIO
NULL, // RGPIO
tmc_motor, // motor
&m_hardware // os
);
// service->disableMoveHomeCheck();
service->cfg_acc->setVal(30000); // 加速度
service->cfg_dec->setVal(30000); // 减速度
service->cfg_velocity->setVal(300000); // 位置模式时运行的速度
service->cfg_zero_shift->setVal(0); // 回零时的偏移量
service->cfg_runhome_velocity->setVal(50000); // 回零速度
service->cfg_runtohome_dec->setVal(100000); // 回零减速度
service->cfg_min_pos->setVal(INT32_MIN); // 最小位置
service->cfg_max_pos->setVal(INT32_MAX); // 最大位置
service->cfg_runtohome_max_distance->setVal(256 * 200 * 5); // 回零时移动的最大位移
service->cfg_runtohome_leave_zero_point_distance->setVal(256 * 200 * 5); // 回零时离开零点的距离
service->cfg_runtohome_keep_move_distance->setVal(256 * 25 * 1); // 回零时保持运动的距离
}
#endif
#endif
while (true) {
m_hardware.periodicJob();
m_hardware.debug_light_periodicJob();
@ -126,18 +41,6 @@ void Main::main(int argc, char const *argv[]) {
m_hardware.input_sensors_table_dump(0);
}
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
if (m_ticket % 20 == 0) {
m_protocolStack.writeRegValue(REG_GPIO_INPUT0, m_hardware.input_sensors_get_table(0), false);
m_protocolStack.writeRegValue(REG_GPIO_OUTPUT0_STATE, m_hardware.output_switch_get(0), false);
}
m_protocolStack.periodicJob();
#endif
#if CONFIG_ENABLE_TMC_MOTOR
m_motor5130_1.periodicJob();
#endif
HAL_IWDG_Refresh(&hiwdg);
}
}

30
src/umain.hpp

@ -23,43 +23,15 @@
namespace iflytop {
class __class {};
class Main :
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
public IflytopCanProtocolStackProcesserListener,
public DeviceBaseControlServiceListener,
#endif
public __class {
class Main : public __class {
public:
Hardware m_hardware;
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
IflytopCanProtocolStackProcesser::iflytop_can_slave_config_t m_iflytopCanStackConfig;
icps::Reg_t m_regList[128];
IflytopCanProtocolStackProcesser m_protocolStack;
DeviceBaseControlService m_deviceBaseControlService; // 设备基础服务
SingleAxisMotorControlerV2 m_motorService; // 平移电机
#endif
#if CONFIG_ENABLE_TMC_MOTOR
TMC5130HImpl m_motor5130_1;
#endif
int32_t m_ticket; // 保证一个数一个数的递增,但不保证时间准确
Main() {}
void main(int argc, char const *argv[]);
#if CONFIG_ENABLE_IFLYTOP_CAN_SLAVE_MODULE
/*******************************************************************************
* IflytopCanProtocolStackProcesser *
*******************************************************************************/
virtual icps::error_t onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser *processer, icps::WriteEvent *writeEvent);
virtual icps::error_t onHostRegisterReadEvent(IflytopCanProtocolStackProcesser *processer, icps::ReadEvent *writeEvent);
virtual void onHostRegisterReportEvent(IflytopCanProtocolStackProcesser *processer, icps::ReportEvent *writeEvent);
virtual icps::error_t onSetEngineerMode(DeviceBaseControlService *service, int32_t engineer_mode);
#endif
private:
void generateScheduleTicket();
};

Loading…
Cancel
Save