HAL callbacks rework.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12470 110e8d01-0319-4d1e-a829-52ad28d1bb01
This commit is contained in:
parent
984f865b45
commit
f20ecc7817
|
@ -104,11 +104,8 @@ typedef struct hal_adc_configuration_group ADCConversionGroup;
|
||||||
* @brief Type of an ADC notification callback.
|
* @brief Type of an ADC notification callback.
|
||||||
*
|
*
|
||||||
* @param[in] adcp pointer to the @p ADCDriver object triggering the
|
* @param[in] adcp pointer to the @p ADCDriver object triggering the
|
||||||
* callback
|
|
||||||
* @param[in] buffer pointer to the most recent samples data
|
|
||||||
* @param[in] n number of buffer rows available starting from @p buffer
|
|
||||||
*/
|
*/
|
||||||
typedef void (*adccallback_t)(ADCDriver *adcp, adcsample_t *buffer, size_t n);
|
typedef void (*adccallback_t)(ADCDriver *adcp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Type of an ADC error callback.
|
* @brief Type of an ADC error callback.
|
||||||
|
@ -203,6 +200,26 @@ struct hal_adc_driver {
|
||||||
/* Driver macros. */
|
/* Driver macros. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Macro Functions
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Buffer state.
|
||||||
|
* @note This function is meant to be called from the SPI callback only.
|
||||||
|
*
|
||||||
|
* @param[in] adcp pointer to the @p ADCDriver object
|
||||||
|
* @return The buffer state.
|
||||||
|
* @retval false if the driver filled/sent the first half of the
|
||||||
|
* buffer.
|
||||||
|
* @retval true if the driver filled/sent the second half of the
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* @special
|
||||||
|
*/
|
||||||
|
#define adcIsBufferComplete(adcp) ((bool)((adcp)->state == ADC_COMPLETE))
|
||||||
|
/** @} */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name Low level driver helper macros
|
* @name Low level driver helper macros
|
||||||
* @{
|
* @{
|
||||||
|
@ -275,7 +292,7 @@ struct hal_adc_driver {
|
||||||
*/
|
*/
|
||||||
#define _adc_isr_half_code(adcp) { \
|
#define _adc_isr_half_code(adcp) { \
|
||||||
if ((adcp)->grpp->end_cb != NULL) { \
|
if ((adcp)->grpp->end_cb != NULL) { \
|
||||||
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth / 2); \
|
(adcp)->grpp->end_cb(adcp); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,15 +314,10 @@ struct hal_adc_driver {
|
||||||
if ((adcp)->grpp->circular) { \
|
if ((adcp)->grpp->circular) { \
|
||||||
/* Callback handling.*/ \
|
/* Callback handling.*/ \
|
||||||
if ((adcp)->grpp->end_cb != NULL) { \
|
if ((adcp)->grpp->end_cb != NULL) { \
|
||||||
if ((adcp)->depth > 1) { \
|
(adcp)->state = ADC_COMPLETE; \
|
||||||
/* Invokes the callback passing the 2nd half of the buffer.*/ \
|
(adcp)->grpp->end_cb(adcp); \
|
||||||
size_t half = (adcp)->depth / 2; \
|
if ((adcp)->state == ADC_COMPLETE) { \
|
||||||
size_t half_index = half * (adcp)->grpp->num_channels; \
|
(adcp)->state = ADC_ACTIVE; \
|
||||||
(adcp)->grpp->end_cb(adcp, (adcp)->samples + half_index, half); \
|
|
||||||
} \
|
|
||||||
else { \
|
|
||||||
/* Invokes the callback passing the whole buffer.*/ \
|
|
||||||
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth); \
|
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
@ -314,8 +326,7 @@ struct hal_adc_driver {
|
||||||
adc_lld_stop_conversion(adcp); \
|
adc_lld_stop_conversion(adcp); \
|
||||||
if ((adcp)->grpp->end_cb != NULL) { \
|
if ((adcp)->grpp->end_cb != NULL) { \
|
||||||
(adcp)->state = ADC_COMPLETE; \
|
(adcp)->state = ADC_COMPLETE; \
|
||||||
/* Invoke the callback passing the whole buffer.*/ \
|
(adcp)->grpp->end_cb(adcp); \
|
||||||
(adcp)->grpp->end_cb(adcp, (adcp)->samples, (adcp)->depth); \
|
|
||||||
if ((adcp)->state == ADC_COMPLETE) { \
|
if ((adcp)->state == ADC_COMPLETE) { \
|
||||||
(adcp)->state = ADC_READY; \
|
(adcp)->state = ADC_READY; \
|
||||||
(adcp)->grpp = NULL; \
|
(adcp)->grpp = NULL; \
|
||||||
|
|
|
@ -99,11 +99,8 @@ typedef struct hal_dac_conversion_group DACConversionGroup;
|
||||||
* @brief DAC notification callback type.
|
* @brief DAC notification callback type.
|
||||||
*
|
*
|
||||||
* @param[in] dacp pointer to the @p DACDriver object triggering the
|
* @param[in] dacp pointer to the @p DACDriver object triggering the
|
||||||
* @param[in] buffer pointer to the next semi-buffer to be filled
|
|
||||||
* @param[in] n number of buffer rows available starting from @p buffer
|
|
||||||
* callback
|
|
||||||
*/
|
*/
|
||||||
typedef void (*daccallback_t)(DACDriver *dacp, dacsample_t *buffer, size_t n);
|
typedef void (*daccallback_t)(DACDriver *dacp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief DAC error callback type.
|
* @brief DAC error callback type.
|
||||||
|
@ -193,6 +190,21 @@ struct hal_dac_driver {
|
||||||
* @name Low level driver helper macros
|
* @name Low level driver helper macros
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Buffer state.
|
||||||
|
* @note This function is meant to be called from the DAC callback only.
|
||||||
|
*
|
||||||
|
* @param[in] dacp pointer to the @p DACDriver object
|
||||||
|
* @return The buffer state.
|
||||||
|
* @retval false if the driver filled/sent the first half of the
|
||||||
|
* buffer.
|
||||||
|
* @retval true if the driver filled/sent the second half of the
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* @special
|
||||||
|
*/
|
||||||
|
#define dacIsBufferComplete(dacp) ((bool)((dacp)->state == DAC_COMPLETE))
|
||||||
|
|
||||||
#if (DAC_USE_WAIT == TRUE) || defined(__DOXYGEN__)
|
#if (DAC_USE_WAIT == TRUE) || defined(__DOXYGEN__)
|
||||||
/**
|
/**
|
||||||
* @brief Waits for operation completion.
|
* @brief Waits for operation completion.
|
||||||
|
@ -274,7 +286,7 @@ struct hal_dac_driver {
|
||||||
*/
|
*/
|
||||||
#define _dac_isr_half_code(dacp) { \
|
#define _dac_isr_half_code(dacp) { \
|
||||||
if ((dacp)->grpp->end_cb != NULL) { \
|
if ((dacp)->grpp->end_cb != NULL) { \
|
||||||
(dacp)->grpp->end_cb(dacp, (dacp)->samples, (dacp)->depth / 2); \
|
(dacp)->grpp->end_cb(dacp); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -282,7 +294,6 @@ struct hal_dac_driver {
|
||||||
* @brief Common ISR code, full buffer event.
|
* @brief Common ISR code, full buffer event.
|
||||||
* @details This code handles the portable part of the ISR code:
|
* @details This code handles the portable part of the ISR code:
|
||||||
* - Callback invocation.
|
* - Callback invocation.
|
||||||
* - Waiting thread wakeup, if any.
|
|
||||||
* - Driver state transitions.
|
* - Driver state transitions.
|
||||||
* .
|
* .
|
||||||
* @note This macro is meant to be used in the low level drivers
|
* @note This macro is meant to be used in the low level drivers
|
||||||
|
@ -293,17 +304,11 @@ struct hal_dac_driver {
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
#define _dac_isr_full_code(dacp) { \
|
#define _dac_isr_full_code(dacp) { \
|
||||||
if ((dacp)->grpp->end_cb != NULL) { \
|
if ((dacp)->grpp->end_cb) { \
|
||||||
if ((dacp)->depth > 1) { \
|
(dacp)->state = DAC_COMPLETE; \
|
||||||
/* Invokes the callback passing the 2nd half of the buffer.*/ \
|
(dacp)->grpp->end_cb(dacp); \
|
||||||
size_t half = (dacp)->depth / 2; \
|
if ((dacp)->state == DAC_COMPLETE) \
|
||||||
size_t half_index = half * (dacp)->grpp->num_channels; \
|
(dacp)->state = DAC_ACTIVE; \
|
||||||
(dacp)->grpp->end_cb(dacp, (dacp)->samples + half_index, half); \
|
|
||||||
} \
|
|
||||||
else { \
|
|
||||||
/* Invokes the callback passing the whole buffer.*/ \
|
|
||||||
(dacp)->grpp->end_cb(dacp, (dacp)->samples, (dacp)->depth); \
|
|
||||||
} \
|
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,10 +76,8 @@ typedef struct hal_i2s_config I2SConfig;
|
||||||
* @brief I2S notification callback type.
|
* @brief I2S notification callback type.
|
||||||
*
|
*
|
||||||
* @param[in] i2sp pointer to the @p I2SDriver object
|
* @param[in] i2sp pointer to the @p I2SDriver object
|
||||||
* @param[in] offset offset in buffers of the data to read/write
|
|
||||||
* @param[in] n number of samples to read/write
|
|
||||||
*/
|
*/
|
||||||
typedef void (*i2scallback_t)(I2SDriver *i2sp, size_t offset, size_t n);
|
typedef void (*i2scallback_t)(I2SDriver *i2sp);
|
||||||
|
|
||||||
/* Including the low level driver header, it exports information required
|
/* Including the low level driver header, it exports information required
|
||||||
for completing types.*/
|
for completing types.*/
|
||||||
|
@ -135,6 +133,21 @@ struct hal_i2s_config {
|
||||||
* @name Macro Functions
|
* @name Macro Functions
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Buffer state.
|
||||||
|
* @note This function is meant to be called from the SPI callback only.
|
||||||
|
*
|
||||||
|
* @param[in] i2sp pointer to the @p I2SDriver object
|
||||||
|
* @return The buffer state.
|
||||||
|
* @retval false if the driver filled/sent the first half of the
|
||||||
|
* buffer.
|
||||||
|
* @retval true if the driver filled/sent the second half of the
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* @special
|
||||||
|
*/
|
||||||
|
#define i2sIsBufferComplete(i2sp) ((bool)((i2sp)->state == I2S_COMPLETE))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Starts a I2S data exchange.
|
* @brief Starts a I2S data exchange.
|
||||||
*
|
*
|
||||||
|
@ -175,7 +188,7 @@ struct hal_i2s_config {
|
||||||
*/
|
*/
|
||||||
#define _i2s_isr_half_code(i2sp) { \
|
#define _i2s_isr_half_code(i2sp) { \
|
||||||
if ((i2sp)->config->end_cb != NULL) { \
|
if ((i2sp)->config->end_cb != NULL) { \
|
||||||
(i2sp)->config->end_cb(i2sp, 0, (i2sp)->config->size / 2); \
|
(i2sp)->config->end_cb(i2sp); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,9 +208,7 @@ struct hal_i2s_config {
|
||||||
#define _i2s_isr_full_code(i2sp) { \
|
#define _i2s_isr_full_code(i2sp) { \
|
||||||
if ((i2sp)->config->end_cb) { \
|
if ((i2sp)->config->end_cb) { \
|
||||||
(i2sp)->state = I2S_COMPLETE; \
|
(i2sp)->state = I2S_COMPLETE; \
|
||||||
(i2sp)->config->end_cb(i2sp, \
|
(i2sp)->config->end_cb(i2sp); \
|
||||||
(i2sp)->config->size / 2, \
|
|
||||||
(i2sp)->config->size / 2); \
|
|
||||||
if ((i2sp)->state == I2S_COMPLETE) { \
|
if ((i2sp)->state == I2S_COMPLETE) { \
|
||||||
(i2sp)->state = I2S_ACTIVE; \
|
(i2sp)->state = I2S_ACTIVE; \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -225,6 +225,21 @@ struct hal_spi_driver {
|
||||||
* @name Macro Functions
|
* @name Macro Functions
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
/**
|
||||||
|
* @brief Buffer state.
|
||||||
|
* @note This function is meant to be called from the SPI callback only.
|
||||||
|
*
|
||||||
|
* @param[in] spip pointer to the @p SPIDriver object
|
||||||
|
* @return The buffer state.
|
||||||
|
* @retval false if the driver filled/sent the first half of the
|
||||||
|
* buffer.
|
||||||
|
* @retval true if the driver filled/sent the second half of the
|
||||||
|
* buffer.
|
||||||
|
*
|
||||||
|
* @special
|
||||||
|
*/
|
||||||
|
#define spiIsBufferComplete(spip) ((bool)((spip)->state == SPI_COMPLETE))
|
||||||
|
|
||||||
#if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined(__DOXYGEN__)
|
#if (SPI_SELECT_MODE == SPI_SELECT_MODE_LLD) || defined(__DOXYGEN__)
|
||||||
/**
|
/**
|
||||||
* @brief Asserts the slave select signal and prepares for transfers.
|
* @brief Asserts the slave select signal and prepares for transfers.
|
||||||
|
@ -408,7 +423,7 @@ do { \
|
||||||
#endif /* !SPI_USE_WAIT */
|
#endif /* !SPI_USE_WAIT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Common ISR code.
|
* @brief Common ISR code when circular mode is not supported.
|
||||||
* @details This code handles the portable part of the ISR code:
|
* @details This code handles the portable part of the ISR code:
|
||||||
* - Callback invocation.
|
* - Callback invocation.
|
||||||
* - Waiting thread wakeup, if any.
|
* - Waiting thread wakeup, if any.
|
||||||
|
@ -434,7 +449,7 @@ do { \
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Common ISR code in circular mode.
|
* @brief Half buffer filled ISR code in circular mode.
|
||||||
* @details This code handles the portable part of the ISR code:
|
* @details This code handles the portable part of the ISR code:
|
||||||
* - Callback invocation.
|
* - Callback invocation.
|
||||||
* .
|
* .
|
||||||
|
@ -445,14 +460,14 @@ do { \
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
#define _spi_isr_code_half1(spip) { \
|
#define _spi_isr_half_code(spip) { \
|
||||||
if ((spip)->config->end_cb) { \
|
if ((spip)->config->end_cb) { \
|
||||||
(spip)->config->end_cb(spip); \
|
(spip)->config->end_cb(spip); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Common ISR code in circular mode.
|
* @brief Full buffer filled ISR code in circular mode.
|
||||||
* @details This code handles the portable part of the ISR code:
|
* @details This code handles the portable part of the ISR code:
|
||||||
* - Callback invocation.
|
* - Callback invocation.
|
||||||
* - Driver state transitions.
|
* - Driver state transitions.
|
||||||
|
@ -464,7 +479,7 @@ do { \
|
||||||
*
|
*
|
||||||
* @notapi
|
* @notapi
|
||||||
*/
|
*/
|
||||||
#define _spi_isr_code_half2(spip) { \
|
#define _spi_isr_full_code(spip) { \
|
||||||
if ((spip)->config->end_cb) { \
|
if ((spip)->config->end_cb) { \
|
||||||
(spip)->state = SPI_COMPLETE; \
|
(spip)->state = SPI_COMPLETE; \
|
||||||
(spip)->config->end_cb(spip); \
|
(spip)->config->end_cb(spip); \
|
||||||
|
|
|
@ -143,11 +143,11 @@ static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) {
|
||||||
if (spip->config->circular) {
|
if (spip->config->circular) {
|
||||||
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
||||||
/* Half buffer interrupt.*/
|
/* Half buffer interrupt.*/
|
||||||
_spi_isr_code_half1(spip);
|
_spi_isr_half_code(spip);
|
||||||
}
|
}
|
||||||
else {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
|
||||||
/* End buffer interrupt.*/
|
/* End buffer interrupt.*/
|
||||||
_spi_isr_code_half2(spip);
|
_spi_isr_full_code(spip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -198,11 +198,11 @@ static void i2s_lld_serve_tx_interrupt(I2SDriver *i2sp, uint32_t flags) {
|
||||||
level driver.*/
|
level driver.*/
|
||||||
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
||||||
/* Transfer complete processing.*/
|
/* Transfer complete processing.*/
|
||||||
_i2s_isr_full_code(i2sp);
|
_i2s_isr_code_half2(i2sp);
|
||||||
}
|
}
|
||||||
else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
|
else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
|
||||||
/* Half transfer processing.*/
|
/* Half transfer processing.*/
|
||||||
_i2s_isr_half_code(i2sp);
|
_i2s_isr_code_half1(i2sp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -143,11 +143,11 @@ static void spi_lld_serve_rx_interrupt(SPIDriver *spip, uint32_t flags) {
|
||||||
if (spip->config->circular) {
|
if (spip->config->circular) {
|
||||||
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
||||||
/* Half buffer interrupt.*/
|
/* Half buffer interrupt.*/
|
||||||
_spi_isr_code_half1(spip);
|
_spi_isr_half_code(spip);
|
||||||
}
|
}
|
||||||
else {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
|
||||||
/* End buffer interrupt.*/
|
/* End buffer interrupt.*/
|
||||||
_spi_isr_code_half2(spip);
|
_spi_isr_full_code(spip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -198,11 +198,11 @@ static void i2s_lld_serve_tx_interrupt(I2SDriver *i2sp, uint32_t flags) {
|
||||||
level driver.*/
|
level driver.*/
|
||||||
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0) {
|
||||||
/* Transfer complete processing.*/
|
/* Transfer complete processing.*/
|
||||||
_i2s_isr_full_code(i2sp);
|
_i2s_isr_code_half2(i2sp);
|
||||||
}
|
}
|
||||||
else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
|
else if ((flags & STM32_DMA_ISR_HTIF) != 0) {
|
||||||
/* Half transfer processing.*/
|
/* Half transfer processing.*/
|
||||||
_i2s_isr_half_code(i2sp);
|
_i2s_isr_code_half1(i2sp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -96,11 +96,11 @@ static void spi_lld_serve_bdma_rx_interrupt(SPIDriver *spip, uint32_t flags) {
|
||||||
if (spip->config->circular) {
|
if (spip->config->circular) {
|
||||||
if ((flags & STM32_BDMA_ISR_HTIF) != 0U) {
|
if ((flags & STM32_BDMA_ISR_HTIF) != 0U) {
|
||||||
/* Half buffer interrupt.*/
|
/* Half buffer interrupt.*/
|
||||||
_spi_isr_code_half1(spip);
|
_spi_isr_half_code(spip);
|
||||||
}
|
}
|
||||||
else {
|
if ((flags & STM32_BDMA_ISR_TCIF) != 0U) {
|
||||||
/* End buffer interrupt.*/
|
/* End buffer interrupt.*/
|
||||||
_spi_isr_code_half2(spip);
|
_spi_isr_full_code(spip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -159,11 +159,11 @@ static void spi_lld_serve_dma_rx_interrupt(SPIDriver *spip, uint32_t flags) {
|
||||||
if (spip->config->circular) {
|
if (spip->config->circular) {
|
||||||
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
if ((flags & STM32_DMA_ISR_HTIF) != 0U) {
|
||||||
/* Half buffer interrupt.*/
|
/* Half buffer interrupt.*/
|
||||||
_spi_isr_code_half1(spip);
|
_spi_isr_half_code(spip);
|
||||||
}
|
}
|
||||||
else {
|
if ((flags & STM32_DMA_ISR_TCIF) != 0U) {
|
||||||
/* End buffer interrupt.*/
|
/* End buffer interrupt.*/
|
||||||
_spi_isr_code_half2(spip);
|
_spi_isr_full_code(spip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -181,7 +181,6 @@ void adcStartConversionI(ADCDriver *adcp,
|
||||||
osalDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL) &&
|
osalDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL) &&
|
||||||
(depth > 0U) && ((depth == 1U) || ((depth & 1U) == 0U)));
|
(depth > 0U) && ((depth == 1U) || ((depth & 1U) == 0U)));
|
||||||
osalDbgAssert((adcp->state == ADC_READY) ||
|
osalDbgAssert((adcp->state == ADC_READY) ||
|
||||||
(adcp->state == ADC_COMPLETE) ||
|
|
||||||
(adcp->state == ADC_ERROR),
|
(adcp->state == ADC_ERROR),
|
||||||
"not ready");
|
"not ready");
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,13 @@
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
*** Next ***
|
*** Next ***
|
||||||
|
- NEW: The callback of drivers with circular buffers (ADC, DAC, I2S, SPI) has
|
||||||
|
been simplified, no parameters. A driver function xxxIsBufferComplete()
|
||||||
|
has been added to determine if it is the half buffer callback or the
|
||||||
|
final callback.
|
||||||
|
- NEW: ADC driver state machine change, now the state ADC_COMPLETE is set
|
||||||
|
before calling the 2nd callback even in circular mode. This has been
|
||||||
|
done for consistency with other drivers with circular buffers.
|
||||||
- NEW: Low level drivers simplification. There is a new template of LLD, now
|
- NEW: Low level drivers simplification. There is a new template of LLD, now
|
||||||
driver and configuration types are defined in the HLD, LLD just exports
|
driver and configuration types are defined in the HLD, LLD just exports
|
||||||
macros with the fields to be added to the structures.
|
macros with the fields to be added to the structures.
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
||||||
* DAC streaming callback.
|
* DAC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0, nz = 0;
|
size_t nx = 0, ny = 0, nz = 0;
|
||||||
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
static void end_cb1(DACDriver *dacp) {
|
||||||
|
|
||||||
(void)dacp;
|
|
||||||
|
|
||||||
nz++;
|
nz++;
|
||||||
if (dac_buffer == buffer) {
|
if (dacIsBufferComplete(dacp)) {
|
||||||
nx += n;
|
nx += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((nz % 1000) == 0) {
|
if ((nz % 1000) == 0) {
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
||||||
* DAC streaming callback.
|
* DAC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0, nz = 0;
|
size_t nx = 0, ny = 0, nz = 0;
|
||||||
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
static void end_cb1(DACDriver *dacp) {
|
||||||
|
|
||||||
(void)dacp;
|
|
||||||
|
|
||||||
nz++;
|
nz++;
|
||||||
if (dac_buffer == buffer) {
|
if (dacIsBufferComplete(dacp)) {
|
||||||
nx += n;
|
nx += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((nz % 1000) == 0) {
|
if ((nz % 1000) == 0) {
|
||||||
|
|
|
@ -59,16 +59,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
||||||
* DAC streaming callback.
|
* DAC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0, nz = 0;
|
size_t nx = 0, ny = 0, nz = 0;
|
||||||
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
static void end_cb1(DACDriver *dacp) {
|
||||||
|
|
||||||
(void)dacp;
|
|
||||||
|
|
||||||
nz++;
|
nz++;
|
||||||
if (dac_buffer == buffer) {
|
if (dacIsBufferComplete(dacp)) {
|
||||||
nx += n;
|
nx += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((nz % 1000) == 0) {
|
if ((nz % 1000) == 0) {
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
static uint16_t i2s_rx_buf[I2S_BUF_SIZE];
|
static uint16_t i2s_rx_buf[I2S_BUF_SIZE];
|
||||||
|
|
||||||
static void i2scallback(I2SDriver *i2sp, size_t offset, size_t n);
|
static void i2scallback(I2SDriver *i2sp);
|
||||||
|
|
||||||
static const I2SConfig i2scfg = {
|
static const I2SConfig i2scfg = {
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -32,11 +32,14 @@ static const I2SConfig i2scfg = {
|
||||||
16
|
16
|
||||||
};
|
};
|
||||||
|
|
||||||
static void i2scallback(I2SDriver *i2sp, size_t offset, size_t n) {
|
static void i2scallback(I2SDriver *i2sp) {
|
||||||
|
|
||||||
(void)i2sp;
|
if (i2sIsBufferComplete(i2sp)) {
|
||||||
(void)offset;
|
/* 2nd buffer half processing.*/
|
||||||
(void)n;
|
}
|
||||||
|
else {
|
||||||
|
/* 1st buffer half processing.*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -57,7 +57,7 @@ static adcsample_t samples1[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
#if !DMA_BUFFERS_COHERENCE
|
#if !DMA_BUFFERS_COHERENCE
|
||||||
/* DMA buffer invalidation because data cache, only invalidating the
|
/* DMA buffer invalidation because data cache, only invalidating the
|
||||||
|
@ -65,16 +65,14 @@ static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
||||||
Only required if the ADC buffer is placed in a cache-able area.*/
|
Only required if the ADC buffer is placed in a cache-able area.*/
|
||||||
dmaBufferInvalidate(buffer,
|
dmaBufferInvalidate(buffer,
|
||||||
n * adcp->grpp->num_channels * sizeof (adcsample_t));
|
n * adcp->grpp->num_channels * sizeof (adcsample_t));
|
||||||
#else
|
|
||||||
(void)adcp;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Updating counters.*/
|
/* Updating counters.*/
|
||||||
if (samples1 == buffer) {
|
if (adcIsBufferComplete(adcp)) {
|
||||||
nx += n;
|
nx += 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
# Compiler options here.
|
# Compiler options here.
|
||||||
ifeq ($(USE_OPT),)
|
ifeq ($(USE_OPT),)
|
||||||
USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16
|
USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# C specific options here (added to USE_OPT).
|
# C specific options here (added to USE_OPT).
|
||||||
|
|
|
@ -1,52 +1,52 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<launchConfiguration type="org.eclipse.cdt.debug.gdbjtag.launchConfigurationType">
|
<launchConfiguration type="org.eclipse.cdt.debug.gdbjtag.launchConfigurationType">
|
||||||
<stringAttribute key="bad_container_name" value="\STM32L4xx-ADC\debug"/>
|
<stringAttribute key="bad_container_name" value="\STM32L4xx-ADC\debug"/>
|
||||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.delay" value="1"/>
|
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.delay" value="1"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="true"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value="set remotetimeout 20 monitor reset init monitor sleep 50 "/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value="set remotetimeout 20 monitor reset init monitor sleep 50 "/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="Generic TCP/IP"/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="Generic TCP/IP"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
|
||||||
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/>
|
<stringAttribute key="org.eclipse.cdt.debug.mi.core.DEBUG_NAME" value="arm-none-eabi-gdb"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard"/>
|
<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
|
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
|
||||||
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?><contentList/>"/>
|
<stringAttribute key="org.eclipse.cdt.launch.FORMAT" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?><contentList/>"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <globalVariableList/> "/>
|
<stringAttribute key="org.eclipse.cdt.launch.GLOBAL_VARIABLES" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <globalVariableList/> "/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList/> "/>
|
<stringAttribute key="org.eclipse.cdt.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList/> "/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="./build/ch.elf"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="STM32L4xx-ADC"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="STM32L4xx-ADC"/>
|
||||||
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
|
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
|
||||||
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="0.1093754934"/>
|
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="0.1093754934"/>
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
|
||||||
<listEntry value="/STM32L4xx-ADC"/>
|
<listEntry value="/STM32L4xx-ADC"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
|
||||||
<listEntry value="4"/>
|
<listEntry value="4"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
|
||||||
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
|
||||||
</listAttribute>
|
</listAttribute>
|
||||||
</launchConfiguration>
|
</launchConfiguration>
|
||||||
|
|
|
@ -30,14 +30,13 @@ static adcsample_t samples2[ADC_GRP2_NUM_CHANNELS * ADC_GRP2_BUF_DEPTH];
|
||||||
* ADC streaming callback.
|
* ADC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0;
|
size_t nx = 0, ny = 0;
|
||||||
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) {
|
static void adccallback(ADCDriver *adcp) {
|
||||||
|
|
||||||
(void)adcp;
|
if (adcIsBufferComplete(adcp)) {
|
||||||
if (samples2 == buffer) {
|
nx += 1;
|
||||||
nx += n;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +160,7 @@ int main(void) {
|
||||||
* Normal main() thread activity, in this demo it does nothing.
|
* Normal main() thread activity, in this demo it does nothing.
|
||||||
*/
|
*/
|
||||||
while (true) {
|
while (true) {
|
||||||
if (palReadPad(GPIOC, GPIOC_BUTTON)) {
|
if (!palReadPad(GPIOC, GPIOC_BUTTON)) {
|
||||||
adcStopConversion(&ADCD1);
|
adcStopConversion(&ADCD1);
|
||||||
}
|
}
|
||||||
chThdSleepMilliseconds(500);
|
chThdSleepMilliseconds(500);
|
||||||
|
|
|
@ -61,16 +61,14 @@ static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = {
|
||||||
* DAC streaming callback.
|
* DAC streaming callback.
|
||||||
*/
|
*/
|
||||||
size_t nx = 0, ny = 0, nz = 0;
|
size_t nx = 0, ny = 0, nz = 0;
|
||||||
static void end_cb1(DACDriver *dacp, dacsample_t *buffer, size_t n) {
|
static void end_cb1(DACDriver *dacp) {
|
||||||
|
|
||||||
(void)dacp;
|
|
||||||
|
|
||||||
nz++;
|
nz++;
|
||||||
if (dac_buffer == buffer) {
|
if (dacIsBufferComplete(dacp)) {
|
||||||
nx += n;
|
nx += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ny += n;
|
ny += DAC_BUFFER_SIZE / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((nz % 1000) == 0) {
|
if ((nz % 1000) == 0) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ CC_ALIGN(32) static uint8_t rxbuf[512];
|
||||||
*/
|
*/
|
||||||
void spi_circular_cb(SPIDriver *spip) {
|
void spi_circular_cb(SPIDriver *spip) {
|
||||||
|
|
||||||
if(spip->state == SPI_COMPLETE) {
|
if (spiIsBufferComplete(spip)) {
|
||||||
/* 2nd half.*/
|
/* 2nd half.*/
|
||||||
palWriteLine(PORTAB_LINE_LED1, PORTAB_LED_OFF);
|
palWriteLine(PORTAB_LINE_LED1, PORTAB_LED_OFF);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue