условно работающий первый канал, не вычисляется только duration
This commit is contained in:
parent
b577be4b82
commit
40fca38a75
@ -61,7 +61,8 @@ void Error_Handler(void);
|
|||||||
#define LED_GPIO_Port GPIOC
|
#define LED_GPIO_Port GPIOC
|
||||||
|
|
||||||
/* USER CODE BEGIN Private defines */
|
/* USER CODE BEGIN Private defines */
|
||||||
|
#define LED_On() LED_GPIO_Port->BSRR = (LED_Pin << 16)
|
||||||
|
#define LED_Off() LED_GPIO_Port->BSRR = (LED_Pin)
|
||||||
/* USER CODE END Private defines */
|
/* USER CODE END Private defines */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -9,25 +9,25 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// размер буфера, должен быть 2^x
|
// размер буфера, должен быть 2^x
|
||||||
#define CHANNEL_BUFFER_SIZE 1024
|
#define CHANNEL_BUFFER_SIZE 2048
|
||||||
#define CHANNEL_BUFFER_SIZE_MASK (CHANNEL_BUFFER_SIZE - 1)
|
#define CHANNEL_BUFFER_SIZE_MASK (CHANNEL_BUFFER_SIZE - 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint64_t timepoint;
|
uint64_t timepoint;
|
||||||
uint32_t duration;
|
uint32_t duration;
|
||||||
} BufferItem;
|
} BufferItem_t;
|
||||||
|
|
||||||
// Структура кольцевого буфера
|
// Структура кольцевого буфера
|
||||||
typedef struct {
|
typedef struct {
|
||||||
volatile uint32_t head;
|
volatile uint32_t head;
|
||||||
volatile uint32_t tail;
|
volatile uint32_t tail;
|
||||||
volatile uint32_t overruns;
|
volatile uint32_t overruns;
|
||||||
BufferItem buffer[CHANNEL_BUFFER_SIZE];
|
BufferItem_t buffer[CHANNEL_BUFFER_SIZE];
|
||||||
} ChannelBuffer_t;
|
} ChannelBuffer_t;
|
||||||
|
|
||||||
void ChannelBuffer_reset(ChannelBuffer_t *buffer);
|
void ChannelBuffer_reset(ChannelBuffer_t *buffer);
|
||||||
void ChannelBuffer_push(ChannelBuffer_t *buffer, BufferItem item);
|
void ChannelBuffer_push(ChannelBuffer_t *buffer, const BufferItem_t* item);
|
||||||
int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem* dest);
|
int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem_t* dest);
|
||||||
|
|
||||||
extern ChannelBuffer_t buffer_ch1;
|
extern ChannelBuffer_t buffer_ch1;
|
||||||
extern ChannelBuffer_t buffer_ch2;
|
extern ChannelBuffer_t buffer_ch2;
|
||||||
|
@ -119,6 +119,7 @@ int main(void)
|
|||||||
|
|
||||||
{
|
{
|
||||||
HAL_Delay(1000);
|
HAL_Delay(1000);
|
||||||
|
LED_On();
|
||||||
if (isIwdgReset) {
|
if (isIwdgReset) {
|
||||||
char msg[] = "RESET_IWDG\r\nINIT_COMPLETE\r\n";
|
char msg[] = "RESET_IWDG\r\nINIT_COMPLETE\r\n";
|
||||||
CDC_Transmit_FS(msg, 27);
|
CDC_Transmit_FS(msg, 27);
|
||||||
@ -126,6 +127,7 @@ int main(void)
|
|||||||
char msg[] = "INIT_COMPLETE\r\n";
|
char msg[] = "INIT_COMPLETE\r\n";
|
||||||
CDC_Transmit_FS(msg, 15);
|
CDC_Transmit_FS(msg, 15);
|
||||||
}
|
}
|
||||||
|
LED_Off();
|
||||||
}
|
}
|
||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
/* USER CODE END 2 */
|
/* USER CODE END 2 */
|
||||||
@ -136,13 +138,51 @@ int main(void)
|
|||||||
/* USER CODE END WHILE */
|
/* USER CODE END WHILE */
|
||||||
|
|
||||||
/* USER CODE BEGIN 3 */
|
/* USER CODE BEGIN 3 */
|
||||||
LED_GPIO_Port->ODR |= LED_Pin;
|
HAL_TIM_Base_Start(&htim2);
|
||||||
|
HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_1);
|
||||||
|
HAL_TIM_IC_Start(&htim2, TIM_CHANNEL_2);
|
||||||
|
htim2.Instance->DIER = (TIM_DIER_UIE | TIM_DIER_CC2IE);
|
||||||
while (1) {
|
while (1) {
|
||||||
for (int i = 0; i < 7; i++) {
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
HAL_Delay(100);
|
// for (int i = 0; i < 7; i++) {
|
||||||
LED_GPIO_Port->ODR ^= LED_Pin;
|
// HAL_Delay(100);
|
||||||
}
|
// LED_GPIO_Port->ODR ^= LED_Pin;
|
||||||
HAL_Delay(500);
|
// }
|
||||||
|
// HAL_Delay(500);
|
||||||
|
BufferItem_t bi;
|
||||||
|
if (ChannelBuffer_pop(&buffer_ch1, &bi)) {
|
||||||
|
char tmp[64];
|
||||||
|
LED_On();
|
||||||
|
CDC_Transmit_FS(tmp, sprintf(tmp, "D1;0x%llX,0x%lX\r\n", bi.timepoint, bi.duration));
|
||||||
|
LED_Off();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_ch1.overruns) {
|
||||||
|
uint32_t overs = buffer_ch1.overruns;
|
||||||
|
buffer_ch1.overruns = 0;
|
||||||
|
|
||||||
|
char tmp[64];
|
||||||
|
LED_On();
|
||||||
|
CDC_Transmit_FS(tmp, sprintf(tmp, "D1OVR;0x%lX\r\n", overs));
|
||||||
|
LED_Off();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ChannelBuffer_pop(&buffer_ch2, &bi)) {
|
||||||
|
char tmp[64];
|
||||||
|
LED_On();
|
||||||
|
CDC_Transmit_FS(tmp, sprintf(tmp, "D2;0x%llX,0x%lX\r\n", bi.timepoint, bi.duration));
|
||||||
|
LED_Off();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_ch2.overruns) {
|
||||||
|
uint32_t overs = buffer_ch2.overruns;
|
||||||
|
buffer_ch2.overruns = 0;
|
||||||
|
|
||||||
|
char tmp[64];
|
||||||
|
LED_On();
|
||||||
|
CDC_Transmit_FS(tmp, sprintf(tmp, "D2OVR;0x%lX\r\n", overs));
|
||||||
|
LED_Off();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* USER CODE END 3 */
|
/* USER CODE END 3 */
|
||||||
}
|
}
|
||||||
|
@ -11,18 +11,19 @@ void ChannelBuffer_reset(ChannelBuffer_t *buffer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Функция добавления элемента в буфер
|
// Функция добавления элемента в буфер
|
||||||
void ChannelBuffer_push(ChannelBuffer_t *buffer, BufferItem item) {
|
void ChannelBuffer_push(ChannelBuffer_t *buffer, const BufferItem_t* item) {
|
||||||
|
if (!item) { return; }
|
||||||
// Проверка на переполнение буфера
|
// Проверка на переполнение буфера
|
||||||
if (((buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK) == buffer->head) {
|
if (((buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK) == buffer->head) {
|
||||||
buffer->overruns = buffer->overruns + 1;
|
buffer->overruns = buffer->overruns + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer->buffer[buffer->tail] = item;
|
buffer->buffer[buffer->tail] = *item;
|
||||||
buffer->tail = (buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK;
|
buffer->tail = (buffer->tail + 1) & CHANNEL_BUFFER_SIZE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Функция извлечения элемента из буфера
|
// Функция извлечения элемента из буфера
|
||||||
int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem* dest) {
|
int ChannelBuffer_pop(ChannelBuffer_t *buffer, BufferItem_t* dest) {
|
||||||
const uint32_t h = buffer->head;
|
const uint32_t h = buffer->head;
|
||||||
if (h == buffer->tail) {
|
if (h == buffer->tail) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "stm32f4xx_it.h"
|
#include "stm32f4xx_it.h"
|
||||||
/* Private includes ----------------------------------------------------------*/
|
/* Private includes ----------------------------------------------------------*/
|
||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
|
#include "recorder_buffer.h"
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
@ -252,9 +253,28 @@ void TIM1_TRG_COM_TIM11_IRQHandler(void)
|
|||||||
void TIM2_IRQHandler(void)
|
void TIM2_IRQHandler(void)
|
||||||
{
|
{
|
||||||
/* USER CODE BEGIN TIM2_IRQn 0 */
|
/* USER CODE BEGIN TIM2_IRQn 0 */
|
||||||
|
static uint32_t overflows = 0;
|
||||||
|
const uint16_t sr = TIM2->SR;
|
||||||
|
TIM2->SR = 0;
|
||||||
|
|
||||||
|
if (sr & TIM_SR_UIF) {
|
||||||
|
overflows++;
|
||||||
|
}
|
||||||
|
if (sr & (TIM_SR_CC1OF | TIM_SR_CC2OF)) {
|
||||||
|
// overrun, skip processing
|
||||||
|
buffer_ch1.overruns = buffer_ch1.overruns + 1;
|
||||||
|
} else if (sr & TIM_SR_CC2IF) {
|
||||||
|
BufferItem_t b;
|
||||||
|
b.duration = TIM2->CCR1;
|
||||||
|
b.timepoint = TIM2->CCR2;
|
||||||
|
b.duration = b.duration - b.timepoint;
|
||||||
|
b.timepoint |= (uint64_t)(overflows) << 32;
|
||||||
|
ChannelBuffer_push(&buffer_ch1, &b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* USER CODE END TIM2_IRQn 0 */
|
/* USER CODE END TIM2_IRQn 0 */
|
||||||
HAL_TIM_IRQHandler(&htim2);
|
//HAL_TIM_IRQHandler(&htim2);
|
||||||
/* USER CODE BEGIN TIM2_IRQn 1 */
|
/* USER CODE BEGIN TIM2_IRQn 1 */
|
||||||
|
|
||||||
/* USER CODE END TIM2_IRQn 1 */
|
/* USER CODE END TIM2_IRQn 1 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user