您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

65 行
2.0 KiB

  1. #ifndef PLSR_HAL_F407_H
  2. #define PLSR_HAL_F407_H
  3. #include "plsr_types.h"
  4. #include <stdint.h>
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. #define PLSR_HW_AXIS_COUNT (PLSR_AXIS_COUNT)
  9. #define PLSR_HW_DIR_POINT_NONE (0xFFU)
  10. typedef enum
  11. {
  12. PLSR_HW_STATE_IDLE = 0,
  13. PLSR_HW_STATE_DIR_SETTLING, /* DIR 已置位,等待方向建立延时 */
  14. PLSR_HW_STATE_PWM_PENDING, /* 延时已到,等待首个非零频率启动 PWM */
  15. PLSR_HW_STATE_RUNNING, /* PWM 输出中,更新中断计数 */
  16. PLSR_HW_STATE_DONE
  17. } PLSR_HW_STATE;
  18. typedef struct
  19. {
  20. uint32_t frequencyHz; /* 初始频率(起始速度,可为 0) */
  21. int64_t targetPulses; /* 本段目标脉冲数 */
  22. uint8_t directionPoint; /* DIR 输出点(Y 点号,0xFF=无) */
  23. uint8_t directionPositive;
  24. uint16_t directionDelayMs;
  25. } PLSR_HW_START_PARAMS;
  26. PLSR_RESULT PlsrHwInit(void);
  27. PLSR_RESULT PlsrHwStartPulse(uint8_t axis, const PLSR_HW_START_PARAMS *params);
  28. PLSR_RESULT PlsrHwSetFrequency(uint8_t axis, uint32_t frequencyHz);
  29. PLSR_RESULT PlsrHwStopPulse(uint8_t axis);
  30. uint8_t PlsrHwIsPulseActive(uint8_t axis);
  31. PLSR_HW_STATE PlsrHwGetState(uint8_t axis);
  32. uint32_t PlsrHwGetTimerClockHz(uint8_t axis);
  33. /* 每 1ms tick 推进 HAL 状态机(DIR 延时等)。 */
  34. void PlsrHwTick(uint8_t axis);
  35. /* 输出定时器更新中断入口(生产由 IRQHandler 调用,host 由测试调用)。 */
  36. void PlsrHwOnTimerUpdate(uint8_t axis);
  37. /* 输出点(Y0~Y20)引脚映射表:DIR 点解析用。 */
  38. uint8_t PlsrHwResolveDirectionPoint(uint8_t pointNumber);
  39. #ifdef PLSR_HOST_TEST
  40. /* 模拟寄存器访问与中断触发(测试用)。 */
  41. uint32_t PlsrHwTestGetArr(uint8_t axis);
  42. uint32_t PlsrHwTestGetCcr(uint8_t axis);
  43. uint32_t PlsrHwTestGetPsc(uint8_t axis);
  44. uint8_t PlsrHwTestGetPwmEnabled(uint8_t axis);
  45. uint8_t PlsrHwTestGetDirLevel(uint8_t axis);
  46. void PlsrHwTestTriggerUpdate(uint8_t axis);
  47. #endif
  48. #ifdef __cplusplus
  49. }
  50. #endif
  51. #endif /* PLSR_HAL_F407_H */