重写驱动

This commit is contained in:
许晟昊 2024-12-24 09:10:11 +08:00
parent 5dd03a2628
commit 76736247f5
17 changed files with 1835 additions and 1461 deletions

View File

@ -89,6 +89,10 @@ void Error_Handler(void);
#define TMC2240_MISO_GPIO_Port GPIOA #define TMC2240_MISO_GPIO_Port GPIOA
#define TMC2240_MOSI_Pin LL_GPIO_PIN_7 #define TMC2240_MOSI_Pin LL_GPIO_PIN_7
#define TMC2240_MOSI_GPIO_Port GPIOA #define TMC2240_MOSI_GPIO_Port GPIOA
#define TMC2240_STEP_Pin LL_GPIO_PIN_0
#define TMC2240_STEP_GPIO_Port GPIOB
#define TMC2240_DIR_Pin LL_GPIO_PIN_1
#define TMC2240_DIR_GPIO_Port GPIOB
#define OLED_SDA_Pin LL_GPIO_PIN_12 #define OLED_SDA_Pin LL_GPIO_PIN_12
#define OLED_SDA_GPIO_Port GPIOB #define OLED_SDA_GPIO_Port GPIOB
#define OLDE_SCK_Pin LL_GPIO_PIN_13 #define OLDE_SCK_Pin LL_GPIO_PIN_13

View File

@ -37,7 +37,6 @@ extern "C" {
/* USER CODE END Private defines */ /* USER CODE END Private defines */
void MX_TIM1_Init(void); void MX_TIM1_Init(void);
void MX_TIM2_Init(void);
void MX_TIM3_Init(void); void MX_TIM3_Init(void);
/* USER CODE BEGIN Prototypes */ /* USER CODE BEGIN Prototypes */

View File

@ -59,7 +59,7 @@ void MX_GPIO_Init(void)
LL_GPIO_ResetOutputPin(GPIOA, TMC2240_EN_Pin|TMC2240_CS_Pin); LL_GPIO_ResetOutputPin(GPIOA, TMC2240_EN_Pin|TMC2240_CS_Pin);
/**/ /**/
LL_GPIO_ResetOutputPin(GPIOB, OLED_SDA_Pin|OLDE_SCK_Pin); LL_GPIO_ResetOutputPin(GPIOB, TMC2240_DIR_Pin|OLED_SDA_Pin|OLDE_SCK_Pin);
/**/ /**/
GPIO_InitStruct.Pin = LED_BLUE_Pin; GPIO_InitStruct.Pin = LED_BLUE_Pin;
@ -74,8 +74,8 @@ void MX_GPIO_Init(void)
LL_GPIO_Init(GPIOC, &GPIO_InitStruct); LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/**/ /**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_2|LL_GPIO_PIN_8|LL_GPIO_PIN_11 GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_8
|LL_GPIO_PIN_12|LL_GPIO_PIN_15; |LL_GPIO_PIN_11|LL_GPIO_PIN_12|LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct); LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
@ -87,10 +87,16 @@ void MX_GPIO_Init(void)
LL_GPIO_Init(GPIOA, &GPIO_InitStruct); LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/**/ /**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10 GPIO_InitStruct.Pin = TMC2240_DIR_Pin;
|LL_GPIO_PIN_11|LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_3 GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
|LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7 GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
|LL_GPIO_PIN_8|LL_GPIO_PIN_9; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(TMC2240_DIR_GPIO_Port, &GPIO_InitStruct);
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_2|LL_GPIO_PIN_10|LL_GPIO_PIN_11|LL_GPIO_PIN_14
|LL_GPIO_PIN_15|LL_GPIO_PIN_3|LL_GPIO_PIN_4|LL_GPIO_PIN_5
|LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8|LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct); LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

View File

@ -99,7 +99,6 @@ int main(void)
/* Initialize all configured peripherals */ /* Initialize all configured peripherals */
MX_GPIO_Init(); MX_GPIO_Init();
MX_DMA_Init(); MX_DMA_Init();
MX_TIM2_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
MX_TIM1_Init(); MX_TIM1_Init();
MX_TIM3_Init(); MX_TIM3_Init();

View File

@ -257,10 +257,6 @@ void TIM3_IRQHandler(void)
/* USER CODE END TIM3_IRQn 0 */ /* USER CODE END TIM3_IRQn 0 */
/* USER CODE BEGIN TIM3_IRQn 1 */ /* USER CODE BEGIN TIM3_IRQn 1 */
if (IS_TIM_IT_FLAG(WORK_TIM))
{
TIM_IRQ_HANDLER(WORK_TIM);
}
/* USER CODE END TIM3_IRQn 1 */ /* USER CODE END TIM3_IRQn 1 */
} }

View File

@ -58,55 +58,6 @@ void MX_TIM1_Init(void)
/* USER CODE END TIM1_Init 2 */ /* USER CODE END TIM1_Init 2 */
}
/* TIM2 init function */
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
TIM_InitStruct.Prescaler = 0;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 7199;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM2, &TIM_InitStruct);
LL_TIM_EnableARRPreload(TIM2);
LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL);
LL_TIM_OC_EnablePreload(TIM2, LL_TIM_CHANNEL_CH2);
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM2;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 0;
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
LL_TIM_OC_Init(TIM2, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);
LL_TIM_OC_EnableFast(TIM2, LL_TIM_CHANNEL_CH2);
LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM2);
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
/**TIM2 GPIO Configuration
PA1 ------> TIM2_CH2
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
} }
/* TIM3 init function */ /* TIM3 init function */
void MX_TIM3_Init(void) void MX_TIM3_Init(void)
@ -117,7 +68,9 @@ void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 0 */ /* USER CODE END TIM3_Init 0 */
LL_TIM_InitTypeDef TIM_InitStruct = {0}; LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */ /* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
@ -128,18 +81,35 @@ void MX_TIM3_Init(void)
/* USER CODE BEGIN TIM3_Init 1 */ /* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */ /* USER CODE END TIM3_Init 1 */
TIM_InitStruct.Prescaler = 7199; TIM_InitStruct.Prescaler = 71;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP; TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 99; TIM_InitStruct.Autoreload = 1000;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM3, &TIM_InitStruct); LL_TIM_Init(TIM3, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIM3); LL_TIM_EnableARRPreload(TIM3);
LL_TIM_SetClockSource(TIM3, LL_TIM_CLOCKSOURCE_INTERNAL); LL_TIM_SetClockSource(TIM3, LL_TIM_CLOCKSOURCE_INTERNAL);
LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH3);
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 0;
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH3, &TIM_OC_InitStruct);
LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH3);
LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET); LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM3); LL_TIM_DisableMasterSlaveMode(TIM3);
/* USER CODE BEGIN TIM3_Init 2 */ /* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */ /* USER CODE END TIM3_Init 2 */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
/**TIM3 GPIO Configuration
PB0 ------> TIM3_CH3
*/
GPIO_InitStruct.Pin = TMC2240_STEP_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(TMC2240_STEP_GPIO_Port, &GPIO_InitStruct);
} }

View File

@ -153,32 +153,37 @@
<Ww> <Ww>
<count>0</count> <count>0</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>_tmc2240,0x10</ItemText> <ItemText>_tmc2240,0x0A</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>1</count> <count>1</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>rdata</ItemText> <ItemText>tmc</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>2</count> <count>2</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>data</ItemText> <ItemText>wdata</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>3</count> <count>3</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>wdata</ItemText> <ItemText>rdata</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>4</count> <count>4</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>rdata</ItemText> <ItemText>TMC2240_B_CURRENT</ItemText>
</Ww> </Ww>
<Ww> <Ww>
<count>5</count> <count>5</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>tx_data</ItemText> <ItemText>rdata</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>vel,0x0A</ItemText>
</Ww> </Ww>
</WatchWindow1> </WatchWindow1>
<MemoryWindow1> <MemoryWindow1>

File diff suppressed because it is too large Load Diff

BIN
Public/ADI-TMC2240-CN.pdf Normal file

Binary file not shown.

BIN
Public/ADI-TMC2240.pdf Normal file

Binary file not shown.

View File

@ -13,8 +13,6 @@ static uint8_t business_inspection(struct flow *fl)
FL_HEAD(fl); FL_HEAD(fl);
for (;;) for (;;)
{ {
tmc2240_config(TMC2240_1);
tmc2240_position_read(TMC2240_1);
FL_LOCK_DELAY(fl, FL_CLOCK_SEC); FL_LOCK_DELAY(fl, FL_CLOCK_SEC);
} }
FL_TAIL(fl); FL_TAIL(fl);
@ -35,10 +33,11 @@ static uint8_t idle_inspection(struct flow *fl)
for (;;) for (;;)
{ {
GPIO_TOGGLE(LED_BLUE_GPIO_Port, LED_BLUE_Pin); GPIO_TOGGLE(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
tmc2240_test(TMC2240_1);
ssd1306_f6x8_string(0, 2, " tick:"); ssd1306_f6x8_string(0, 2, " tick:");
ssd1306_f6x8_number(40, 2, tick++, 0); ssd1306_f6x8_number(40, 2, tick++, 0);
ssd1306_f6x8_string(0, 4, " cfg:"); ssd1306_f6x8_string(0, 4, " cfg:");
ssd1306_f6x8_number(40, 4, tmc2240_get(TMC2240_1)->data.gconf, 0); ssd1306_f6x8_number(40, 4, tmc2240_get(TMC2240_1)->config.gconf.data, 0);
ssd1306_update_screen(); ssd1306_update_screen();
FL_LOCK_DELAY(fl, FL_CLOCK_SEC); FL_LOCK_DELAY(fl, FL_CLOCK_SEC);
} }
@ -78,7 +77,6 @@ void app_init(void)
FL_INIT(&idle_fw); // 空闲任务 FL_INIT(&idle_fw); // 空闲任务
ENABLE_TIM(TASK_TIM); ENABLE_TIM(TASK_TIM);
ENABLE_TIM(WORK_TIM);
ssd1306_clear(); ssd1306_clear();
} }

View File

@ -43,7 +43,6 @@ void board_init(void)
{ {
GPIO_RESET(TMC2240_EN_GPIO_Port, TMC2240_EN_Pin); GPIO_RESET(TMC2240_EN_GPIO_Port, TMC2240_EN_Pin);
delay_ms(100);
spi_gpio_group_t gpios; spi_gpio_group_t gpios;
gpios.cs = gpio_create(TMC2240_CS_GPIO_Port, TMC2240_CS_Pin); gpios.cs = gpio_create(TMC2240_CS_GPIO_Port, TMC2240_CS_Pin);
gpios.mosi = gpio_create(TMC2240_MOSI_GPIO_Port, TMC2240_MOSI_Pin); gpios.mosi = gpio_create(TMC2240_MOSI_GPIO_Port, TMC2240_MOSI_Pin);

View File

@ -7,9 +7,6 @@
#define UART_TXSIZE (240u) // 发送240个字节 #define UART_TXSIZE (240u) // 发送240个字节
#define TASK_TIM TIM1 #define TASK_TIM TIM1
#define PWM_TIM TIM2
#define PWM_CHANNEL LL_TIM_CHANNEL_CH2
#define WORK_TIM TIM3
typedef struct typedef struct
{ {

View File

@ -6,6 +6,9 @@ static void tmc2240_write(tmc2240_index_e index, uint8_t *data)
{ {
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index]; tmc2240_t *tmc = &_tmc2240[index];
DBG_ASSERT(tmc != NULL __DBG_LINE);
DBG_ASSERT(tmc->spi != NULL __DBG_LINE);
tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs); tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs);
for (uint16_t i = 0; i < 5; i++) for (uint16_t i = 0; i < 5; i++)
{ {
@ -18,6 +21,8 @@ static void tmc2240_read(tmc2240_index_e index, uint8_t *wdata, uint8_t *rdata)
{ {
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index]; tmc2240_t *tmc = &_tmc2240[index];
DBG_ASSERT(tmc != NULL __DBG_LINE);
DBG_ASSERT(tmc->spi != NULL __DBG_LINE);
tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs); tmc->spi->gpios.cs->reset(*tmc->spi->gpios.cs);
for (uint16_t i = 0; i < 5; i++) for (uint16_t i = 0; i < 5; i++)
@ -38,6 +43,65 @@ static void tmc2240_read(tmc2240_index_e index, uint8_t *wdata, uint8_t *rdata)
tmc->spi->gpios.cs->set(*tmc->spi->gpios.cs); tmc->spi->gpios.cs->set(*tmc->spi->gpios.cs);
} }
static void tmc2240_reg_write(tmc2240_index_e index, uint8_t reg, uint32_t data)
{
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index];
DBG_ASSERT(tmc != NULL __DBG_LINE);
DBG_ASSERT(tmc->spi != NULL __DBG_LINE);
uint8_t wdata[5] = {0};
wdata[0] = TMC2240_HIGHT_BIT | reg;
wdata[1] = (data >> 24) & 0xFF;
wdata[2] = (data >> 16) & 0xFF;
wdata[3] = (data >> 8) & 0xFF;
wdata[4] = data & 0xFF;
tmc2240_write(index, wdata);
}
static uint32_t tmc2240_reg_read(tmc2240_index_e index, uint8_t reg)
{
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index];
DBG_ASSERT(tmc != NULL __DBG_LINE);
DBG_ASSERT(tmc->spi != NULL __DBG_LINE);
uint8_t wdata[5] = {0};
uint8_t rdata[5] = {0};
wdata[0] = reg;
tmc2240_read(index, wdata, rdata);
return (rdata[1] << 24) | (rdata[2] << 16) | (rdata[3] << 8) | rdata[4];
}
/**
* @brief TMC2240步进电机驱动器
*
* TMC2240步进电机驱动器的各种参数线
*
* @param index TMC2240步进电机驱动器的索引
*/
static void tmc2240_config(tmc2240_index_e index)
{
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index];
DBG_ASSERT(tmc != NULL __DBG_LINE);
tmc->config.gconf.data = 0x00000000;
tmc->config.chopconf.data = 0x00410153;
tmc->config.drvconf.data = 0x00000021;
tmc->config.global_scaler.data = 0x00000000;
tmc->config.ihold_irun.data = 0x00071f1f;
tmc->config.pwmconf.data = 0xC44C261E;
tmc->config.gstat.data = 0x00000007;
tmc2240_reg_write(index, TMC2240_GCONF, tmc->config.gconf.data);
tmc2240_reg_write(index, TMC2240_CHOPCONF, tmc->config.chopconf.data);
tmc2240_reg_write(index, TMC2240_DRV_CONF, tmc->config.drvconf.data);
tmc2240_reg_write(index, TMC2240_GLOBAL_SCALER, tmc->config.global_scaler.data);
tmc2240_reg_write(index, TMC2240_IHOLD_IRUN, tmc->config.ihold_irun.data);
tmc2240_reg_write(index, TMC2240_PWMCONF, tmc->config.pwmconf.data);
tmc2240_reg_write(index, TMC2240_GSTAT, tmc->config.gstat.data);
}
void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, spi_gpio_group_t *gpios) void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, spi_gpio_group_t *gpios)
{ {
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
@ -45,7 +109,10 @@ void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, spi_gpio_group_t *gp
tmc->spi = spi_create(SPI_TYPE_NORMAL, *gpios, 0); tmc->spi = spi_create(SPI_TYPE_NORMAL, *gpios, 0);
DBG_ASSERT(tmc->spi != NULL __DBG_LINE); DBG_ASSERT(tmc->spi != NULL __DBG_LINE);
osel_memset((uint8_t *)&tmc->config, 0, sizeof(tmc2240_config_t));
osel_memset((uint8_t *)&tmc->read_config, 0, sizeof(tmc2240_config_t));
tmc->spi->interface.hardware_enable(tmc->spi, SPIx); tmc->spi->interface.hardware_enable(tmc->spi, SPIx);
tmc2240_config(index);
} }
tmc2240_t *tmc2240_get(tmc2240_index_e index) tmc2240_t *tmc2240_get(tmc2240_index_e index)
@ -54,41 +121,26 @@ tmc2240_t *tmc2240_get(tmc2240_index_e index)
return &_tmc2240[index]; return &_tmc2240[index];
} }
void tmc2240_config(tmc2240_index_e index) void tmc2240_velocity(tmc2240_index_e index, int32_t vel)
{
uint8_t wdata[5];
wdata[0] = TMC2240_HIGHT_BIT | TMC2240_REG_GCONF; // 写入 GCONF 寄存器
wdata[1] = 0x00;
wdata[2] = 0x00;
wdata[3] = 0x00;
wdata[4] = 0xE4;
tmc2240_write(index, wdata);
uint8_t rdata[5] = {0};
osel_memset(wdata, 0, 5);
wdata[0] = TMC2240_REG_GCONF;
tmc2240_read(index, wdata, rdata);
_tmc2240[index].data.gconf = rdata[4];
}
int32_t tmc2240_position_read(tmc2240_index_e index)
{ {
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE); DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
tmc2240_t *tmc = &_tmc2240[index]; tmc2240_t *tmc = &_tmc2240[index];
uint8_t wdata[5] = {0}; DBG_ASSERT(tmc != NULL __DBG_LINE);
uint8_t rdata[5] = {0}; }
wdata[0] = TMC2240_REG_XACTUAL; // XACTUAL register address void tmc2240_test(tmc2240_index_e index)
tmc2240_read(index, wdata, rdata); {
DBG_ASSERT(index < TMC2240_MAX __DBG_LINE);
int32_t response = 0; tmc2240_t *tmc = &_tmc2240[index];
response |= (rdata[1]); DBG_ASSERT(tmc != NULL __DBG_LINE);
response <<= 8;
response |= (rdata[2]); tmc->read_config.gconf.data = tmc2240_reg_read(index, TMC2240_GCONF);
response <<= 8; tmc->read_config.chopconf.data = tmc2240_reg_read(index, TMC2240_CHOPCONF);
response |= (rdata[3]); tmc->read_config.drvconf.data = tmc2240_reg_read(index, TMC2240_DRV_CONF);
response <<= 8; tmc->read_config.global_scaler.data = tmc2240_reg_read(index, TMC2240_GLOBAL_SCALER);
response |= (rdata[4]); tmc->read_config.ihold_irun.data = tmc2240_reg_read(index, TMC2240_IHOLD_IRUN);
tmc->data.position = response; tmc->read_config.pwmconf.data = tmc2240_reg_read(index, TMC2240_PWMCONF);
return response; tmc->read_config.gstat.data = tmc2240_reg_read(index, TMC2240_GSTAT);
tmc->adc_temp = tmc2240_reg_read(index, TMC2240_ADC_TEMP);
tmc->temperature = (float32)(tmc->adc_temp - 2038) / 7.7;
} }

View File

@ -12,9 +12,90 @@
#include "main.h" #include "main.h"
#include "spis.h" #include "spis.h"
/*
0x00 = 0x00002108 ;; writing GCONF @ address 0=0x00 with 0x00002108=8456=0.0
0x03 = 0x00000000 ;; writing SLAVECONF @ address 1=0x03 with 0x00000000=0=0.0
0x04 = 0x4001682C ;; writing IOIN @ address 2=0x04 with 0x4001682C=1073834028=0.0
0x0A = 0x00000021 ;; writing DRV_CONF @ address 3=0x0A with 0x00000021=33=0.0
0x0B = 0x00000000 ;; writing GLOBAL_SCALER @ address 4=0x0B with 0x00000000=0=0.0
0x10 = 0x00001208 ;; writing IHOLD_IRUN @ address 5=0x10 with 0x00001208=4616=0.0
0x11 = 0x00000000 ;; writing TPOWERDOWN @ address 6=0x11 with 0x00000000=0=0.0
0x13 = 0x00000000 ;; writing TPWMTHRS @ address 7=0x13 with 0x00000000=0=0.0
0x14 = 0x000003BE ;; writing TCOOLTHRS @ address 8=0x14 with 0x000003BE=958=0.0
0x15 = 0x00000000 ;; writing THIGH @ address 9=0x15 with 0x00000000=0=0.0
0x2D = 0x00000000 ;; writing DIRECT_MODE @ address 10=0x2D with 0x00000000=0=0.0
0x38 = 0x00000000 ;; writing ENCMODE @ address 11=0x38 with 0x00000000=0=0.0
0x39 = 0x00000000 ;; writing X_ENC @ address 12=0x39 with 0x00000000=0=0.0
0x3A = 0x00010000 ;; writing ENC_CONST @ address 13=0x3A with 0x00010000=65536=0.0
0x52 = 0x0B920F25 ;; writing OTW_OV_VTH @ address 14=0x52 with 0x0B920F25=194121509=0.0
0x60 = 0xAAAAB554 ;; writing MSLUT[0] @ address 15=0x60 with 0xAAAAB554=0=0.0
0x61 = 0x4A9554AA ;; writing MSLUT[1] @ address 16=0x61 with 0x4A9554AA=1251300522=0.0
0x62 = 0x24492929 ;; writing MSLUT[2] @ address 17=0x62 with 0x24492929=608774441=0.0
0x63 = 0x10104222 ;; writing MSLUT[3] @ address 18=0x63 with 0x10104222=269500962=0.0
0x64 = 0xFBFFFFFF ;; writing MSLUT[4] @ address 19=0x64 with 0xFBFFFFFF=0=0.0
0x65 = 0xB5BB777D ;; writing MSLUT[5] @ address 20=0x65 with 0xB5BB777D=0=0.0
0x66 = 0x49295556 ;; writing MSLUT[6] @ address 21=0x66 with 0x49295556=1227445590=0.0
0x67 = 0x00404222 ;; writing MSLUT[7] @ address 22=0x67 with 0x00404222=4211234=0.0
0x68 = 0xFFFF8056 ;; writing MSLUTSEL @ address 23=0x68 with 0xFFFF8056=0=0.0
0x69 = 0x00F70000 ;; writing MSLUTSTART @ address 24=0x69 with 0x00F70000=16187392=0.0
0x6C = 0x00410153 ;; writing CHOPCONF @ address 25=0x6C with 0x00410153=4260179=0.0
0x6D = 0x00040000 ;; writing COOLCONF @ address 26=0x6D with 0x00040000=262144=0.0
0x70 = 0xC44C001E ;; writing PWMCONF @ address 27=0x70 with 0xC44C001E=0=0.0
0x74 = 0x00000000 ;; writing SG4_THRS @ address 28=0x74 with 0x00000000=0=0.0
*/
#define TMC2240_GCONF 0x00
#define TMC2240_GSTAT 0x01
#define TMC2240_IFCNT 0x02
#define TMC2240_SLAVECONF 0x03
#define TMC2240_IOIN 0x04
#define TMC2240_DRV_CONF 0x0A
#define TMC2240_GLOBAL_SCALER 0x0B
#define TMC2240_IHOLD_IRUN 0x10
#define TMC2240_TPOWERDOWN 0x11
#define TMC2240_TSTEP 0x12
#define TMC2240_TPWMTHRS 0x13
#define TMC2240_TCOOLTHRS 0x14
#define TMC2240_THIGH 0x15
#define TMC2240_DIRECT_MODE 0x2D
#define TMC2240_ENCMODE 0x38
#define TMC2240_XENC 0x39
#define TMC2240_ENC_CONST 0x3A
#define TMC2240_ENC_STATUS 0x3B
#define TMC2240_ENC_LATCH 0x3C
#define TMC2240_ADC_VSUPPLY_AIN 0x50
#define TMC2240_ADC_TEMP 0x51
#define TMC2240_OTW_OV_VTH 0x52
#define TMC2240_MSLUT0 0x60
#define TMC2240_MSLUT1 0x61
#define TMC2240_MSLUT2 0x62
#define TMC2240_MSLUT3 0x63
#define TMC2240_MSLUT4 0x64
#define TMC2240_MSLUT5 0x65
#define TMC2240_MSLUT6 0x66
#define TMC2240_MSLUT7 0x67
#define TMC2240_MSLUTSEL 0x68
#define TMC2240_MSLUTSTART 0x69
#define TMC2240_MSCNT 0x6A
#define TMC2240_MSCURACT 0x6B
#define TMC2240_CHOPCONF 0x6C
#define TMC2240_COOLCONF 0x6D
#define TMC2240_DCCTRL 0x6E
#define TMC2240_DRVSTATUS 0x6F
#define TMC2240_PWMCONF 0x70
#define TMC2240_PWMSCALE 0x71
#define TMC2240_PWM_AUTO 0x72
#define TMC2240_SG4_THRS 0x74
#define TMC2240_SG4_RESULT 0x75
#define TMC2240_SG4_IND 0x76
#define TMC2240_HIGHT_BIT 0x80 #define TMC2240_HIGHT_BIT 0x80
#define TMC2240_REG_GCONF 0x00
#define TMC2240_REG_XACTUAL 0x21
typedef enum typedef enum
{ {
@ -22,19 +103,262 @@ typedef enum
TMC2240_MAX, TMC2240_MAX,
} tmc2240_index_e; } tmc2240_index_e;
// 0x00 GCONF
typedef union
{
uint32_t data;
struct
{
uint32_t reserved1 : 1;
/**
*
* 0x02^20
* 0x12^18
*/
uint32_t fast_standstill : 1;
/**
* StealthChop2模式
* 0x0StealthChop2
* 0x1StealthChop2电压PWM模式使能()
lHOLD =
*/
uint32_t en_pwm_mode : 1;
/**
* StealthChop2的步进输入筛选
* 0x0StealthChop2
* 0x1StealthChop2电压PWM模式使能
()
lHOLD=
*/
uint32_t multistep_filt : 1;
/**
* /
* 0x0
* 0x1
*/
uint32_t shaft : 1;
uint32_t diag0_error : 1;
uint32_t diag0_otpw : 1;
uint32_t diag0_stall : 1;
uint32_t diag1_stall : 1;
uint32_t diag1_index : 1;
uint32_t diag1_onstate : 1;
uint32_t reserved2 : 1;
uint32_t diag0_pushpull : 1;
uint32_t diag1_pushpull : 1;
uint32_t small_hysteresis : 1;
/**
*
* 0x0
* 0x1ENCA停止定序器
(
)
*/
uint32_t stop_enable : 1;
/**
* motpr相电流控制
* 0x0
* 0x1线
(0x2D)线A
(8..0)线B电流(24..16)
lHOLD设置进行定标
StealthChop2电流调节
StealthChop2电流调节仅适用于
*/
uint32_t direct_mode : 1;
} bits;
} gconf_u;
// 0x01 GSTAT
typedef union
{
uint32_t data;
struct
{
uint32_t reset : 1;
uint32_t drv_err : 1;
uint32_t uv_cp : 1;
uint32_t register_reset : 1;
uint32_t vm_uvlo : 1;
} bits;
} gstat_u;
// 0x04 IOIN
typedef union
{
uint32_t data;
struct
{
uint32_t step : 1;
uint32_t dir : 1;
} bits;
} ioin_u;
// 0x0A DRVCONF
typedef union
{
uint32_t data;
struct
{
uint32_t current_range : 2; // 0-1
uint32_t reserved1 : 2; // 2-3
uint32_t slope_control : 2; // 4-5
} bits;
} drvconf_u;
// 0x0B GLOBAL_SCALER
typedef union
{
uint32_t data;
struct
{
uint32_t global_scale : 8; // 0-7
} bits;
} global_scaler_u;
// 0x10 IHOLD_IRUN
typedef union
{
uint32_t data;
struct
{
uint32_t ihold : 5; // 0-4
uint32_t reserved1 : 3; // 5-7
uint32_t irun : 5; // 8-12
uint32_t reserved2 : 3; // 13-15
uint32_t iholddelay : 4; // 16-19
uint32_t reserved3 : 4; // 20-23
uint32_t irundelay : 4; // 24-27
} bits;
} ihold_irun_u;
// 0x11 TPOWERDOWN
typedef union
{
uint32_t data;
struct
{
/**
* TPOWERDOW将电机停顿后的延迟时间(STST)
04
2
SteaIhChop2脉宽调制自动关闭
=10
0...((2^8)-1)x 2^18 tCLK
*/
uint32_t tpow : 8; // 0-9
uint32_t reserved1 : 24;
} bits;
} tpowerdown_u;
// 0x13 TPWMTHRS
typedef union
{
uint32_t data;
struct
{
uint32_t tpwmthrs : 20; // 0-19
uint32_t reserved1 : 12; // 20-31
} bits;
} tpwmthrs_u;
// 0x2D DIRECT_MODE
typedef union
{
uint32_t data;
struct
{
uint32_t direct_coil_a : 9; // 0-8
uint32_t reserved1 : 7; // 9-15
uint32_t direct_coil_b : 9; // 16-24
uint32_t reserved2 : 7; // 25-31
} bits;
} direct_mode_u;
// 0x6C CHOPCONF
typedef union
{
uint32_t data;
struct
{
uint32_t toff : 4; // 0-3
uint32_t hstrt : 3; // 4-6
uint32_t hend : 4; // 7-10
uint32_t fd3 : 1; // 11
uint32_t disfdcc : 1; // 12
uint32_t reserved1 : 1;
uint32_t chm : 1; // 14
uint32_t tbl : 2; // 15-16
uint32_t reserved2 : 1;
uint32_t vhighfs : 1; // 18
uint32_t vhighchm : 1; // 19
uint32_t tpfd : 4; // 20-23
uint32_t mres : 4; // 24-27
uint32_t intpol : 1; // 28
uint32_t dedge : 1; // 29
uint32_t diss2g : 1; // 30
uint32_t diss2vs : 1; // 31
} bits;
} chopconf_u;
// 0x70 PWMCONF
typedef union
{
uint32_t data;
struct
{
/**
* PWM 0-255CS_ACTUAL=31 =30 使 PWM_OFS
* PWM_OFS pwm_autoscale 0 pwm_autoscale 1
* StealthChop2 PWM_OFS = 0 使
* PWM_OFS > 0 PWM
* IHOLD_IRUN
*/
uint32_t pwm_ofs : 8;
/**
* PWM PWM_GRAD x 256 / TSTEP PWM_OFS 使 PWM_GRAD
* PWM_GRAD pwm_autoscale 0 pwm_autoscale 1
* StealthChop2 PWM_GRAD_AUTO
*/
uint32_t pwm_grad : 8;
uint32_t pwm_freq : 2;
uint32_t pwm_autoscale : 1;
uint32_t pwm_autograd : 1;
} bits;
} pwmconf_u;
typedef struct
{
gconf_u gconf; // 0x00 GCONF
gstat_u gstat; // 0x01 GSTAT
ioin_u ioin; // 0x04 IOIN
drvconf_u drvconf; // 0x0A DRVCONF
global_scaler_u global_scaler; // 0x0B GLOBAL_SCALER
ihold_irun_u ihold_irun; // 0x10 IHOLD_IRUN
tpowerdown_u tpowerdown; // 0x11 TPOWERDOWN
direct_mode_u direct_mode; // 0x2D DIRECT_MODE
chopconf_u chopconf; // 0x6C CHOPCONF
pwmconf_u pwmconf; // 0x70 PWMCONF
} tmc2240_config_t;
typedef struct typedef struct
{ {
spi_t *spi; spi_t *spi;
struct tmc2240_config_t config;
{ tmc2240_config_t read_config;
int32_t gconf;
int32_t position; uint16_t adc_temp;
} data; float32 temperature;
} tmc2240_t; } tmc2240_t;
void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, spi_gpio_group_t *gpios); void tmc2240_init(tmc2240_index_e index, SPI_TypeDef *SPIx, spi_gpio_group_t *gpios);
void tmc2240_config(tmc2240_index_e index);
tmc2240_t *tmc2240_get(tmc2240_index_e index); tmc2240_t *tmc2240_get(tmc2240_index_e index);
int32_t tmc2240_position_read(tmc2240_index_e index); void tmc2240_velocity(tmc2240_index_e index, int32_t vel);
void tmc2240_test(tmc2240_index_e index);
#endif // __TMC2240_H #endif // __TMC2240_H

View File

@ -34,31 +34,30 @@ Mcu.IP2=RCC
Mcu.IP3=SPI1 Mcu.IP3=SPI1
Mcu.IP4=SYS Mcu.IP4=SYS
Mcu.IP5=TIM1 Mcu.IP5=TIM1
Mcu.IP6=TIM2 Mcu.IP6=TIM3
Mcu.IP7=TIM3 Mcu.IP7=USART1
Mcu.IP8=USART1 Mcu.IPNb=8
Mcu.IPNb=9
Mcu.Name=STM32F103C(8-B)Tx Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48 Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PD0-OSC_IN Mcu.Pin1=PD0-OSC_IN
Mcu.Pin10=PB13 Mcu.Pin10=PB12
Mcu.Pin11=PA9 Mcu.Pin11=PB13
Mcu.Pin12=PA10 Mcu.Pin12=PA9
Mcu.Pin13=PA13 Mcu.Pin13=PA10
Mcu.Pin14=PA14 Mcu.Pin14=PA13
Mcu.Pin15=VP_SYS_VS_Systick Mcu.Pin15=PA14
Mcu.Pin16=VP_TIM1_VS_ClockSourceINT Mcu.Pin16=VP_SYS_VS_Systick
Mcu.Pin17=VP_TIM2_VS_ClockSourceINT Mcu.Pin17=VP_TIM1_VS_ClockSourceINT
Mcu.Pin18=VP_TIM3_VS_ClockSourceINT Mcu.Pin18=VP_TIM3_VS_ClockSourceINT
Mcu.Pin2=PD1-OSC_OUT Mcu.Pin2=PD1-OSC_OUT
Mcu.Pin3=PA1 Mcu.Pin3=PA3
Mcu.Pin4=PA3 Mcu.Pin4=PA4
Mcu.Pin5=PA4 Mcu.Pin5=PA5
Mcu.Pin6=PA5 Mcu.Pin6=PA6
Mcu.Pin7=PA6 Mcu.Pin7=PA7
Mcu.Pin8=PA7 Mcu.Pin8=PB0
Mcu.Pin9=PB12 Mcu.Pin9=PB1
Mcu.PinsNb=19 Mcu.PinsNb=19
Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5 Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5
Mcu.ThirdPartyNb=1 Mcu.ThirdPartyNb=1
@ -82,7 +81,6 @@ NVIC.TIM1_UP_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.TIM3_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true NVIC.TIM3_IRQn=true\:3\:0\:true\:false\:true\:true\:true\:true
NVIC.USART1_IRQn=true\:5\:0\:true\:false\:true\:true\:true\:true NVIC.USART1_IRQn=true\:5\:0\:true\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
PA1.Signal=S_TIM2_CH2
PA10.Mode=Asynchronous PA10.Mode=Asynchronous
PA10.Signal=USART1_RX PA10.Signal=USART1_RX
PA13.Mode=Serial_Wire PA13.Mode=Serial_Wire
@ -113,6 +111,12 @@ PA7.Mode=Full_Duplex_Master
PA7.Signal=SPI1_MOSI PA7.Signal=SPI1_MOSI
PA9.Mode=Asynchronous PA9.Mode=Asynchronous
PA9.Signal=USART1_TX PA9.Signal=USART1_TX
PB0.GPIOParameters=GPIO_Label
PB0.GPIO_Label=TMC2240_STEP
PB0.Signal=S_TIM3_CH3
PB1.GPIOParameters=GPIO_Label
PB1.GPIO_Label=TMC2240_DIR
PB1.Signal=GPIO_Output
PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB12.GPIO_Label=OLED_SDA PB12.GPIO_Label=OLED_SDA
PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
@ -165,7 +169,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath= ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_DMA_Init-DMA-false-LL-true,4-MX_TIM2_Init-TIM2-false-LL-true,5-MX_USART1_UART_Init-USART1-false-LL-true,6-MX_TIM1_Init-TIM1-false-LL-true,7-MX_TIM3_Init-TIM3-false-LL-true,8-MX_SPI1_Init-SPI1-false-LL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_DMA_Init-DMA-false-LL-true,4-MX_USART1_UART_Init-USART1-false-LL-true,5-MX_TIM1_Init-TIM1-false-LL-true,6-MX_TIM3_Init-TIM3-false-LL-true,7-MX_SPI1_Init-SPI1-false-LL-true
RCC.ADCFreqValue=36000000 RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000 RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2 RCC.APB1CLKDivider=RCC_HCLK_DIV2
@ -195,8 +199,8 @@ RealThread.RT-Thread.3.1.5.RT_USING_COMPONENTS_INIT=1
RealThread.RT-Thread.3.1.5.RT_USING_CONSOLE=0 RealThread.RT-Thread.3.1.5.RT_USING_CONSOLE=0
RealThread.RT-Thread.3.1.5.RT_USING_DEVICE=1 RealThread.RT-Thread.3.1.5.RT_USING_DEVICE=1
RealThread.RT-Thread.3.1.5_SwParameter=RTOSJjkernel\:true;RTOSJjshell\:true;RTOSJjdevice\:true; RealThread.RT-Thread.3.1.5_SwParameter=RTOSJjkernel\:true;RTOSJjshell\:true;RTOSJjdevice\:true;
SH.S_TIM2_CH2.0=TIM2_CH2,PWM Generation2 CH2 SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3
SH.S_TIM2_CH2.ConfNb=1 SH.S_TIM3_CH3.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16
SPI1.CLKPhase=SPI_PHASE_2EDGE SPI1.CLKPhase=SPI_PHASE_2EDGE
SPI1.CLKPolarity=SPI_POLARITY_HIGH SPI1.CLKPolarity=SPI_POLARITY_HIGH
@ -208,27 +212,17 @@ SPI1.VirtualType=VM_MASTER
TIM1.IPParameters=Prescaler,Period TIM1.IPParameters=Prescaler,Period
TIM1.Period=99 TIM1.Period=99
TIM1.Prescaler=7199 TIM1.Prescaler=7199
TIM2.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE TIM3.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
TIM2.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3
TIM2.CounterMode=TIM_COUNTERMODE_UP TIM3.IPParameters=Prescaler,Period,Channel-PWM Generation3 CH3,AutoReloadPreload
TIM2.IPParameters=Prescaler,Period,CounterMode,AutoReloadPreload,OCPolarity_2,TIM_MasterOutputTrigger,Channel-PWM Generation2 CH2,OCFastMode_PWM-PWM Generation2 CH2,OCMode_PWM-PWM Generation2 CH2 TIM3.Period=1000
TIM2.OCFastMode_PWM-PWM\ Generation2\ CH2=TIM_OCFAST_ENABLE TIM3.Prescaler=71
TIM2.OCMode_PWM-PWM\ Generation2\ CH2=TIM_OCMODE_PWM2
TIM2.OCPolarity_2=TIM_OCPOLARITY_LOW
TIM2.Period=7199
TIM2.Prescaler=0
TIM2.TIM_MasterOutputTrigger=TIM_TRGO_RESET
TIM3.IPParameters=Prescaler,Period
TIM3.Period=99
TIM3.Prescaler=7199
USART1.IPParameters=VirtualMode USART1.IPParameters=VirtualMode
USART1.VirtualMode=VM_ASYNC USART1.VirtualMode=VM_ASYNC
VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Mode=SysTick
VP_SYS_VS_Systick.Signal=SYS_VS_Systick VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM2_VS_ClockSourceINT.Mode=Internal
VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceINT.Mode=Internal VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
board=custom board=custom