1.驱动优化。

This commit is contained in:
MacRsh
2024-01-13 03:12:09 +08:00
parent 01dd617216
commit f68d2d0ab0
8 changed files with 66 additions and 64 deletions

View File

@@ -18,6 +18,7 @@ enum drv_adc_index
#ifdef MR_USING_ADC2
DRV_INDEX_ADC2,
#endif /* MR_USING_ADC2 */
DRV_INDEX_ADC_MAX
};
static const char *adc_name[] =
@@ -114,7 +115,7 @@ static uint32_t drv_adc_read(struct mr_adc *adc, int channel)
{
struct drv_adc_data *adc_data = (struct drv_adc_data *)adc->dev.drv->data;
struct drv_adc_channel_data *adc_channel_data = drv_adc_get_channel_data(channel);
int i = 0;
size_t i = 0;
/* Check channel is valid */
if (adc_channel_data == NULL)
@@ -124,15 +125,15 @@ static uint32_t drv_adc_read(struct mr_adc *adc, int channel)
/* Read data */
#ifdef MR_USING_CH32V00X
ADC_RegularChannelConfig(adc_data->instance, adc_channel_data->channel, 1, ADC_SampleTime_43Cycles);
ADC_RegularChannelConfig(adc_data->instance, adc_channel_data->channel, 1, ADC_SampleTime_15Cycles);
#else
ADC_RegularChannelConfig(adc_data->instance, adc_channel_data->channel, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(adc_data->instance, adc_channel_data->channel, 1, ADC_SampleTime_13Cycles5);
#endif /* MR_USING_CH32V00X */
ADC_SoftwareStartConvCmd(adc_data->instance, ENABLE);
while (ADC_GetFlagStatus(adc_data->instance, ADC_FLAG_EOC) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return 0;
}
@@ -166,13 +167,11 @@ static struct mr_drv adc_drv[] =
#endif /* MR_USING_ADC2 */
};
int drv_adc_init(void)
static int drv_adc_init(void)
{
int index = 0;
for (index = 0; index < MR_ARRAY_NUM(adc_dev); index++)
for (size_t i = 0; i < MR_ARRAY_NUM(adc_dev); i++)
{
mr_adc_register(&adc_dev[index], adc_name[index], &adc_drv[index]);
mr_adc_register(&adc_dev[i], adc_name[i], &adc_drv[i]);
}
return MR_EOK;
}

View File

@@ -149,7 +149,7 @@ static struct mr_drv dac_drv =
&dac_drv_data,
};
int drv_dac_init(void)
static int drv_dac_init(void)
{
return mr_dac_register(&dac_dev, "dac1", &dac_drv);
}

View File

@@ -18,6 +18,7 @@ enum drv_i2c_index
#ifdef MR_USING_I2C2
DRV_INDEX_I2C2,
#endif /* MR_USING_I2C2 */
DRV_INDEX_I2C_MAX
};
static const char *i2c_bus_name[] =
@@ -122,22 +123,22 @@ static int drv_i2c_bus_configure(struct mr_i2c_bus *i2c_bus, struct mr_i2c_confi
I2C_ITConfig(i2c_bus_data->instance, I2C_IT_EVT, DISABLE);
} else
{
I2C_ClearITPendingBit(i2c_bus_data->instance, I2C_IT_RXNE);
I2C_ITConfig(i2c_bus_data->instance, I2C_IT_EVT, state);
}
I2C_ClearITPendingBit(i2c_bus_data->instance, I2C_IT_RXNE);
return MR_EOK;
}
static void drv_i2c_bus_start(struct mr_i2c_bus *i2c_bus)
{
struct drv_i2c_bus_data *i2c_bus_data = (struct drv_i2c_bus_data *)i2c_bus->dev.drv->data;
int i = 0;
size_t i = 0;
I2C_GenerateSTART(i2c_bus_data->instance, ENABLE);
while (I2C_CheckEvent(i2c_bus_data->instance, I2C_EVENT_MASTER_MODE_SELECT) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -147,13 +148,13 @@ static void drv_i2c_bus_start(struct mr_i2c_bus *i2c_bus)
static void drv_i2c_bus_send_addr(struct mr_i2c_bus *i2c_bus, int addr, int addr_bits)
{
struct drv_i2c_bus_data *i2c_bus_data = (struct drv_i2c_bus_data *)i2c_bus->dev.drv->data;
int i = 0;
size_t i = 0;
I2C_SendData(i2c_bus_data->instance, addr);
while (I2C_CheckEvent(i2c_bus_data->instance, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -166,7 +167,7 @@ static void drv_i2c_bus_send_addr(struct mr_i2c_bus *i2c_bus, int addr, int addr
while (I2C_CheckEvent(i2c_bus_data->instance, I2C_EVENT_MASTER_BYTE_TRANSMITTED) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -184,7 +185,7 @@ static void drv_i2c_bus_stop(struct mr_i2c_bus *i2c_bus)
static uint8_t drv_i2c_bus_read(struct mr_i2c_bus *i2c_bus, int ack_state)
{
struct drv_i2c_bus_data *i2c_bus_data = (struct drv_i2c_bus_data *)i2c_bus->dev.drv->data;
int i = 0;
size_t i = 0;
/* Control ack */
I2C_AcknowledgeConfig(i2c_bus_data->instance, ack_state);
@@ -193,7 +194,7 @@ static uint8_t drv_i2c_bus_read(struct mr_i2c_bus *i2c_bus, int ack_state)
while (I2C_CheckEvent(i2c_bus_data->instance, I2C_EVENT_MASTER_BYTE_RECEIVED) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return 0;
}
@@ -204,14 +205,14 @@ static uint8_t drv_i2c_bus_read(struct mr_i2c_bus *i2c_bus, int ack_state)
static void drv_i2c_bus_write(struct mr_i2c_bus *i2c_bus, uint8_t data)
{
struct drv_i2c_bus_data *i2c_bus_data = (struct drv_i2c_bus_data *)i2c_bus->dev.drv->data;
int i = 0;
size_t i = 0;
/* Write data */
I2C_SendData(i2c_bus_data->instance, data);
while (I2C_CheckEvent(i2c_bus_data->instance, I2C_EVENT_MASTER_BYTE_TRANSMITTED) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -273,13 +274,11 @@ static struct mr_drv i2c_bus_drv[] =
#endif /* MR_USING_I2C2 */
};
int drv_i2c_bus_init(void)
static int drv_i2c_bus_init(void)
{
int index = 0;
for (index = 0; index < MR_ARRAY_NUM(i2c_bus_dev); index++)
for (size_t i = 0; i < MR_ARRAY_NUM(i2c_bus_dev); i++)
{
mr_i2c_bus_register(&i2c_bus_dev[index], i2c_bus_name[index], &i2c_bus_drv[index]);
mr_i2c_bus_register(&i2c_bus_dev[i], i2c_bus_name[i], &i2c_bus_drv[i]);
}
return MR_EOK;
}

View File

@@ -447,7 +447,7 @@ static struct mr_drv pin_drv =
MR_NULL
};
int drv_pin_init(void)
static int drv_pin_init(void)
{
return mr_pin_register(&pin_dev, "pin", &pin_drv);
}

View File

@@ -36,6 +36,7 @@ enum drv_serial_index
#ifdef MR_USING_UART8
DRV_INDEX_UART8,
#endif /* MR_USING_UART8 */
DRV_INDEX_UART_MAX
};
static const char *serial_name[] =
@@ -241,26 +242,25 @@ static int drv_serial_configure(struct mr_serial *serial, struct mr_serial_confi
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
NVIC_Init(&NVIC_InitStructure);
USART_ClearITPendingBit(serial_data->instance, USART_IT_RXNE);
USART_ITConfig(serial_data->instance, USART_IT_RXNE, state);
if (state == DISABLE)
{
USART_ITConfig(serial_data->instance, USART_IT_TXE, DISABLE);
}
USART_ClearITPendingBit(serial_data->instance, USART_IT_RXNE);
USART_ClearITPendingBit(serial_data->instance, USART_IT_TXE);
return MR_EOK;
}
static uint8_t drv_serial_read(struct mr_serial *serial)
{
struct drv_serial_data *serial_data = (struct drv_serial_data *)serial->dev.drv->data;
int i = 0;
size_t i = 0;
/* Read data */
while (USART_GetFlagStatus(serial_data->instance, USART_FLAG_RXNE) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return 0;
}
@@ -271,14 +271,14 @@ static uint8_t drv_serial_read(struct mr_serial *serial)
static void drv_serial_write(struct mr_serial *serial, uint8_t data)
{
struct drv_serial_data *serial_data = (struct drv_serial_data *)serial->dev.drv->data;
int i = 0;
size_t i = 0;
/* Write data */
USART_SendData(serial_data->instance, data);
while (USART_GetFlagStatus(serial_data->instance, USART_FLAG_TC) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -290,6 +290,7 @@ static void drv_serial_start_tx(struct mr_serial *serial)
struct drv_serial_data *serial_data = (struct drv_serial_data *)serial->dev.drv->data;
/* Enable TX interrupt */
USART_ClearITPendingBit(serial_data->instance, USART_IT_TXE);
USART_ITConfig(serial_data->instance, USART_IT_TXE, ENABLE);
}
@@ -451,13 +452,11 @@ static struct mr_drv serial_drv[] =
#endif /* MR_USING_UART8 */
};
int drv_serial_init(void)
static int drv_serial_init(void)
{
int index = 0;
for (index = 0; index < MR_ARRAY_NUM(serial_dev); index++)
for (size_t i = 0; i < MR_ARRAY_NUM(serial_dev); i++)
{
mr_serial_register(&serial_dev[index], serial_name[index], &serial_drv[index]);
mr_serial_register(&serial_dev[i], serial_name[i], &serial_drv[i]);
}
return MR_EOK;
}

View File

@@ -21,6 +21,7 @@ enum drv_spi_bus_index
#ifdef MR_USING_SPI3
DRV_INDEX_SPI3,
#endif /* MR_USING_SPI3 */
DRV_INDEX_SPI_MAX
};
static const char *spi_bus_name[] =
@@ -257,21 +258,21 @@ static int drv_spi_bus_configure(struct mr_spi_bus *spi_bus, struct mr_spi_confi
SPI_I2S_ITConfig(spi_bus_data->instance, SPI_I2S_IT_RXNE, DISABLE);
} else
{
SPI_I2S_ClearITPendingBit(spi_bus_data->instance, SPI_I2S_IT_RXNE);
SPI_I2S_ITConfig(spi_bus_data->instance, SPI_I2S_IT_RXNE, state);
}
SPI_I2S_ClearITPendingBit(spi_bus_data->instance, SPI_I2S_IT_RXNE);
return MR_EOK;
}
static uint32_t drv_spi_bus_read(struct mr_spi_bus *spi_bus)
{
struct drv_spi_bus_data *spi_bus_data = (struct drv_spi_bus_data *)spi_bus->dev.drv->data;
int i = 0;
size_t i = 0;
while (SPI_I2S_GetFlagStatus(spi_bus_data->instance, SPI_I2S_FLAG_RXNE) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return 0;
}
@@ -282,13 +283,13 @@ static uint32_t drv_spi_bus_read(struct mr_spi_bus *spi_bus)
static void drv_spi_bus_write(struct mr_spi_bus *spi_bus, uint32_t data)
{
struct drv_spi_bus_data *spi_bus_data = (struct drv_spi_bus_data *)spi_bus->dev.drv->data;
int i = 0;
size_t i = 0;
SPI_I2S_SendData(spi_bus_data->instance, data);
while (SPI_I2S_GetFlagStatus(spi_bus_data->instance, SPI_I2S_FLAG_TXE) == RESET)
{
i++;
if (i > INT16_MAX)
if (i > UINT16_MAX)
{
return;
}
@@ -362,13 +363,11 @@ static struct mr_drv spi_bus_drv[] =
#endif /* MR_USING_SPI3 */
};
int drv_spi_bus_init(void)
static int drv_spi_bus_init(void)
{
int index = 0;
for (index = 0; index < MR_ARRAY_NUM(spi_bus_dev); index++)
for (size_t i = 0; i < MR_ARRAY_NUM(spi_bus_dev); i++)
{
mr_spi_bus_register(&spi_bus_dev[index], spi_bus_name[index], &spi_bus_drv[index]);
mr_spi_bus_register(&spi_bus_dev[i], spi_bus_name[i], &spi_bus_drv[i]);
}
return MR_EOK;
}

View File

@@ -42,6 +42,7 @@ enum drv_timer_index
#ifdef MR_USING_TIMER10
DRV_INDEX_TIMER10,
#endif /* MR_USING_TIMER10 */
DRV_INDEX_TIMER_MAX
};
static const char *timer_name[] =
@@ -173,8 +174,9 @@ static int drv_timer_configure(struct mr_timer *timer, int state)
/* Configure timer */
TIM_TimeBaseInitStructure.TIM_Period = 0;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(timer_data->instance, &TIM_TimeBaseInitStructure);
@@ -184,8 +186,10 @@ static int drv_timer_configure(struct mr_timer *timer, int state)
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = state;
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(timer_data->instance, TIM_IT_Update, state);
TIM_ClearITPendingBit(timer_data->instance, TIM_IT_Update);
if (state == DISABLE)
{
TIM_Cmd(timer_data->instance, DISABLE);
}
return MR_EOK;
}
@@ -194,9 +198,11 @@ static void drv_timer_start(struct mr_timer *timer, uint32_t prescaler, uint32_t
struct drv_timer_data *timer_data = (struct drv_timer_data *)timer->dev.drv->data;
/* Set the PSC and ARR, and enable the timer */
timer_data->instance->CNT = 0;
timer_data->instance->PSC = prescaler - 1;
timer_data->instance->ATRLR = period - 1;
TIM_SetCounter(timer_data->instance, 0);
TIM_SetAutoreload(timer_data->instance, period - 1);
TIM_PrescalerConfig(timer_data->instance, prescaler - 1, TIM_PSCReloadMode_Immediate);
TIM_ClearITPendingBit(timer_data->instance, TIM_IT_Update);
TIM_ITConfig(timer_data->instance, TIM_IT_Update, state);
TIM_Cmd(timer_data->instance, ENABLE);
}
@@ -212,7 +218,7 @@ static uint32_t drv_timer_get_count(struct mr_timer *timer)
{
struct drv_timer_data *timer_data = (struct drv_timer_data *)timer->dev.drv->data;
return timer_data->instance->CNT;
return TIM_GetCounter(timer_data->instance);
}
static void drv_timer_isr(struct mr_timer *timer)
@@ -388,13 +394,11 @@ static struct mr_drv timer_drv[] =
#endif /* MR_USING_TIMER10 */
};
int drv_timer_init(void)
static int drv_timer_init(void)
{
int index = 0;
for (index = 0; index < MR_ARRAY_NUM(timer_dev); index++)
for (size_t i = 0; i < MR_ARRAY_NUM(timer_dev); i++)
{
mr_timer_register(&timer_dev[index], timer_name[index], &timer_drv[index], &timer_info[index]);
mr_timer_register(&timer_dev[i], timer_name[i], &timer_drv[i], &timer_info[i]);
}
return MR_EOK;
}