This commit is contained in:
nzasch
2025-06-28 00:58:29 +02:00
parent b9232f66b0
commit 28b7af65b6
123 changed files with 105128 additions and 104148 deletions

View File

@@ -50,6 +50,7 @@ I2C_HandleTypeDef hi2c1;
TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3;
TIM_HandleTypeDef htim8;
UART_HandleTypeDef huart1;
DMA_HandleTypeDef hdma_usart1_rx;
@@ -69,6 +70,7 @@ static void MX_TIM3_Init(void);
static void MX_ADC1_Init(void);
static void MX_ADC2_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_TIM8_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
@@ -114,11 +116,13 @@ int main(void)
MX_ADC1_Init();
MX_ADC2_Init();
MX_USART1_UART_Init();
MX_TIM8_Init();
/* USER CODE BEGIN 2 */
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)&UART_RX_buf, UART_RX_BUF_SIZE);
// HAL_Delay(50);
// HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)&UART_RX_buf, UART_RX_BUF_SIZE);
// ADC1 audio
// ADC1 audio
HAL_ADC_Start_IT(&hadc1);
// timer audio e pwm
@@ -132,16 +136,32 @@ int main(void)
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
// timer led
HAL_TIM_Base_Start_IT(&htim8);
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
// serve, lo start nonfa partire i CHN
TIM_CCxChannelCmd(htim8.Instance, TIM_CHANNEL_3, TIM_CCxN_ENABLE);
squeow_init();
squeow_ui_init();
// prima lettura
/*
#ifdef SQUEOW_SYNTH
squeow_synth_init();
squeow_synth_set(DEFAULT_SYNTH_FREQUENCY);
squeow_synth_on();
#endif
*/
#ifdef SQUEOW_UI_SERIOW
seriow_stab_dump();
#endif
// prima lettura
HAL_ADC_Start_DMA(&hadc2, adc2_valori, 4);
squeow_synth_init();
// HAL_Delay(50);
squeow_synth_set(DEFAULT_SYNTH_FREQUENCY);
squeow_synth_on();
if (UART_TX_buf_lenght)
serial_write(UART_TX_buf, UART_TX_buf_lenght);
/* USER CODE END 2 */
/* Infinite loop */
@@ -151,20 +171,42 @@ int main(void)
/* USER CODE BEGIN 3 */
if (sys_tick) {
// 100hz
if (adc2_done) {
adc_rileva_soglie(adc2_valori);
HAL_ADC_Start_DMA(&hadc2, adc2_valori, 4);
adc2_done = 0;
}
if ((sys_tick_prescale > SYS_TICK_PRESCALE_1HZ) && (uart_sent||1)) {
seriow_var_dump();
sys_tick_prescale = 0;
squeow_synth_set(DEFAULT_SYNTH_FREQUENCY);
squeow_synth_on();
}
#ifdef SQUEOW_UI_LED
// visualizza LED volume con valore aggiornato da vu_meter
led_pwm_duty(ui_volume >> 3);
processa_blocco();
sys_tick_prescale++;
if (codice_allarme)
led_blocco(codice_allarme);
#endif
// eventi lenti
if (sys_tick_prescale > SYS_TICK_PRESCALE_10HZ) {
sys_tick_prescale = 0;
#ifdef SQUEOW_UI_TOSTA
tosta_var_bars();
#endif
#ifdef SQUEOW_UI_SERIOW
seriow_var_dump();
#endif
if (HAL_GPIO_ReadPin(G1_GPIO_Port, G1_Pin) == GPIO_PIN_RESET) {
blocco = 0;
}
if (UART_TX_buf_lenght)
serial_write(UART_TX_buf, UART_TX_buf_lenght);
} else {
sys_tick_prescale++;
}
sys_tick = 0;
}
}
@@ -192,7 +234,7 @@ void SystemClock_Config(void)
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2;
RCC_OscInitStruct.PLL.PLLN = 54;
RCC_OscInitStruct.PLL.PLLN = 28;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
@@ -214,7 +256,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
HAL_RCC_MCOConfig(RCC_MCO_PG10, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);
}
/**
@@ -343,7 +385,7 @@ static void MX_ADC2_Init(void)
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
@@ -356,7 +398,7 @@ static void MX_ADC2_Init(void)
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
@@ -402,7 +444,7 @@ static void MX_I2C1_Init(void)
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x40B282BD;
hi2c1.Init.Timing = 0x50916E9F;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
@@ -527,9 +569,9 @@ static void MX_TIM3_Init(void)
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 41471;
htim3.Init.Prescaler = 16799;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 399;
htim3.Init.Period = 99;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
@@ -553,6 +595,88 @@ static void MX_TIM3_Init(void)
}
/**
* @brief TIM8 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM8_Init(void)
{
/* USER CODE BEGIN TIM8_Init 0 */
/* USER CODE END TIM8_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM8_Init 1 */
/* USER CODE END TIM8_Init 1 */
htim8.Instance = TIM8;
htim8.Init.Prescaler = 1679;
htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
htim8.Init.Period = 255;
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim8.Init.RepetitionCounter = 0;
htim8.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim8) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim8, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim8) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM8_Init 2 */
htim8.Instance->BDTR |= 0x8000;
/* USER CODE END TIM8_Init 2 */
HAL_TIM_MspPostInit(&htim8);
}
/**
* @brief USART1 Initialization Function
* @param None
@@ -569,7 +693,7 @@ static void MX_USART1_UART_Init(void)
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.BaudRate = 38400;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
@@ -632,46 +756,48 @@ static void MX_DMA_Init(void)
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, AUDIO_OL_Pin|RESET_BTN_Pin|TEMP_OL_Pin|REFL_OL_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, G2_Pin|G4_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : PG10 */
GPIO_InitStruct.Pin = GPIO_PIN_10;
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : AUDIO_OL_Pin RESET_BTN_Pin TEMP_OL_Pin REFL_OL_Pin */
GPIO_InitStruct.Pin = AUDIO_OL_Pin|RESET_BTN_Pin|TEMP_OL_Pin|REFL_OL_Pin;
/*Configure GPIO pin : G1_Pin */
GPIO_InitStruct.Pin = G1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(G1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : G2_Pin G4_Pin */
GPIO_InitStruct.Pin = G2_Pin|G4_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc) {
// analog_wd_status = 3;
// analog_wd_status = 3;
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {
adc2_done = 1;
// TIM2->CCR1
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { adc2_done = 1; }
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t offset) {
static uint16_t last_offset = 0;
@@ -689,9 +815,11 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t offset) {
}
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
uart_sent = 1;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { uart_sent = 1; }
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) { uart_sent = 1; }
void UART_DMATransmitCplt(UART_HandleTypeDef *huart) { uart_sent = 1; }
/* USER CODE END 4 */

View File

@@ -1,182 +0,0 @@
#include "main.h"
#include "stm32g4xx_hal.h"
#include <math.h>
#include "si5351.h"
uint8_t oeb;
void si5351_write8 (uint8_t reg, uint8_t value){
while (HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(SI5351_ADDRESS<<1), 3, 100) != HAL_OK) { }
HAL_I2C_Mem_Write(&hi2c1, (uint8_t)(SI5351_ADDRESS<<1), (uint8_t)reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)(&value), 1, 100);
}
uint8_t si5351_read8(uint8_t reg, uint8_t *value){
HAL_StatusTypeDef status = HAL_OK;
while (HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(SI5351_ADDRESS<<1), 3, 100) != HAL_OK) { }
status = HAL_I2C_Mem_Read(&hi2c1, // i2c handle
(uint8_t)(SI5351_ADDRESS<<1), // i2c address, left aligned
(uint8_t)reg, // register address
I2C_MEMADD_SIZE_8BIT, // si5351 uses 8bit register addresses
(uint8_t*)(&value), // write returned data to this variable
1, // how many bytes to expect returned
100); // timeout
return status;
}
void CalcRegisters(uint32_t fout, uint8_t *regs){
// uint32_t fref = SI5351_CRYSTAL_FREQ; // The reference frequency
// Calc Output Multisynth Divider and R with e = 0 and f = 1 => msx_p2 = 0 and msx_p3 = 1
uint32_t d = 4;
uint32_t msx_p1 = 0; // If fout > 150 MHz then MSx_P1 = 0 and MSx_DIVBY4 = 0xC0, see datasheet 4.1.3
int msx_divby4 = 0;
int rx_div = 0;
int r = 1;
if (fout > 150e6)
msx_divby4 = 0x0C; // MSx_DIVBY4[1:0] = 0b11, see datasheet 4.1.3
else if (fout < 292969UL) // If fout < 500 kHz then use R divider, see datasheet 4.2.2. In reality this means > 292 968,75 Hz when d = 2048
{
int rd = 0;
while ((r < 128) && (r * fout < 292969UL))
{
r <<= 1;
rd++;
}
rx_div = rd << 4;
d = 600e6 / (r * fout); // Use lowest VCO frequency but handle d minimum
if (d % 2) // Make d even to reduce spurious and phase noise/jitter, see datasheet 4.1.2.1.
d++;
if (d * r * fout < 600e6) // VCO frequency to low check and maintain an even d value
d += 2;
}
else // 292968 Hz <= fout <= 150 MHz
{
d = 600e6 / fout; // Use lowest VCO frequency but handle d minimum
if (d < 6)
d = 6;
else if (d % 2) // Make d even to reduce phase noise/jitter, see datasheet 4.1.2.1.
d++;
if (d * fout < 600e6) // VCO frequency to low check and maintain an even d value
d += 2;
}
msx_p1 = 128 * d - 512;
uint32_t fvco = (uint32_t) d * r * fout;
// Calc Feedback Multisynth Divider
double fmd = (double)fvco / SI5351_CRYSTAL_FREQ; // The FMD value has been found
int a = fmd; // a is the integer part of the FMD value
double b_c = (double)fmd - a; // Get b/c
uint32_t c = 1048575UL;
uint32_t b = (double)b_c * c;
if (b > 0)
{
c = (double)b / b_c + 0.5; // Improves frequency precision in some cases
if (c > 1048575UL)
c = 1048575UL;
}
uint32_t msnx_p1 = 128 * a + 128 * b / c - 512; // See datasheet 3.2
uint32_t msnx_p2 = 128 * b - c * (128 * b / c);
uint32_t msnx_p3 = c;
// Feedback Multisynth Divider registers
regs[0] = (msnx_p3 >> 8) & 0xFF;
regs[1] = msnx_p3 & 0xFF;
regs[2] = (msnx_p1 >> 16) & 0x03;
regs[3] = (msnx_p1 >> 8) & 0xFF;
regs[4] = msnx_p1 & 0xFF;
regs[5] = ((msnx_p3 >> 12) & 0xF0) + ((msnx_p2 >> 16) & 0x0F);
regs[6] = (msnx_p2 >> 8) & 0xFF;
regs[7] = msnx_p2 & 0xFF;
// Output Multisynth Divider registers
regs[8] = 0; // (msx_p3 >> 8) & 0xFF
regs[9] = 1; // msx_p3 & 0xFF
regs[10] = rx_div + msx_divby4 + ((msx_p1 >> 16) & 0x03);
regs[11] = (msx_p1 >> 8) & 0xFF;
regs[12] = msx_p1 & 0xFF;
regs[13] = 0; // ((msx_p3 >> 12) & 0xF0) + (msx_p2 >> 16) & 0x0F
regs[14] = 0; // (msx_p2 >> 8) & 0xFF
regs[15] = 0; // msx_p2 & 0xFF
// HAL_I2C_Master_Transmit(&hi2c2, Si5351_ConfigStruct->HW_I2C_Address, reg_data, sizeof(reg_data), HAL_MAX_DELAY);
return;
}
void si5351_initialize(){
uint8_t dummy;
// Initialize Si5351A
while (si5351_read8(0,dummy) & 0x80); // Wait for Si5351A to initialize
oeb = 0xFF;
si5351_write8(SI5351_OUT_ENABLE, oeb); // Output Enable Control, disable all
si5351_write8(SI5351_INPUT_SOURCE, 0x00); // PLL Input Source, select the XTAL input as the reference clock for PLLA and PLLB
si5351_write8(SI5351_OUT_DIS_STATE, 0x00); // stato bassa Z giu se disabilitati
// Output MultisynthN, e = 0, f = 1, MS0_P2 and MSO_P3
si5351_write8(SI5351_MULTISYNTH0, 0x00);
si5351_write8(SI5351_MULTISYNTH0+1, 0x01);
si5351_write8(SI5351_MULTISYNTH0+5, 0x00);
si5351_write8(SI5351_MULTISYNTH0+6, 0x00);
si5351_write8(SI5351_MULTISYNTH0+7, 0x00);
si5351_write8(SI5351_MULTISYNTH1, 0x00);
si5351_write8(SI5351_MULTISYNTH1+1, 0x01);
si5351_write8(SI5351_MULTISYNTH1+5, 0x00);
si5351_write8(SI5351_MULTISYNTH1+6, 0x00);
si5351_write8(SI5351_MULTISYNTH1+7, 0x00);
si5351_write8(SI5351_MULTISYNTH2, 0x00);
si5351_write8(SI5351_MULTISYNTH2+1, 0x01);
si5351_write8(SI5351_MULTISYNTH2+5, 0x00);
si5351_write8(SI5351_MULTISYNTH2+6, 0x00);
si5351_write8(SI5351_MULTISYNTH2+7, 0x00);
si5351_write8(SI5351_CLK0_CONTROL, 0x4F); // Power up CLK0, PLLA, MS0 operates in integer mode, Output Clock 0 is not inverted, Select MultiSynth 0 as the source for CLK0 and 8 mA
si5351_write8(SI5351_CLK1_CONTROL, 0x5F); // Power up CLK1, PLLA, MS0 operates in integer mode, Output Clock 1 is inverted, Select MultiSynth 1 as the source for CLK1 and 8 mA
si5351_write8(SI5351_CLK2_CONTROL, 0x6F); // Power up CLK2, PLLB, int, non inv, multisynth 2, 8 ma
// Reference load configuration
si5351_write8(SI5351_CRYSTAL_LOAD, 0x12); // Set reference load C: 6 pF = 0x12, 8 pF = 0x92, 10 pF = 0xD2
}
void si5351_set_frequency(uint32_t freq, uint8_t pll){
uint8_t regs[16];
CalcRegisters(freq, regs);
// Load Output Multisynth0 with d (e and f already set during init. and never changed)
if(pll == 0){
for (int i = 0; i < 8; i++)
si5351_write8(SI5351_PLLA + i, regs[i]);
for (int i = 10; i < 13; i++)
si5351_write8(34 + i, regs[i]);
} else if(pll == 1){
for (int i = 0; i < 8; i++)
si5351_write8(SI5351_PLLB + i, regs[i]);
for (int i = 10; i < 13; i++)
si5351_write8(42 + i, regs[i]);
}
// Reset PLLA
// delayMicroseconds(500); // Allow registers to settle before resetting the PLL
si5351_write8(SI5351_RESET, 0x20);
}
void si5351_off_clk(uint8_t clk){
oeb |= 1U << clk;
si5351_write8(SI5351_OUT_ENABLE, oeb);
}
void si5351_on_clk(uint8_t clk){
oeb &= ~(1U << clk);
si5351_write8(SI5351_OUT_ENABLE, oeb);
}

1
squeow_sw/Src/si5351.c Symbolic link
View File

@@ -0,0 +1 @@
../../../../../uC_driver/synth/si5351/si5351.c

View File

@@ -9,56 +9,58 @@
/* SQUEOW
TIM3 eventi 98304000/(49152×200) 10hz
TIM2 PWM 98304000/2048 48khz
TIM2 PWM 168000000/4096 = 41015,625 Hz
TIM3 sys_tick 168000000/(16800×100) 100hz
risoluzione PWM 4*2048 -> 8192 (13bit)
risoluzione PWM 4096 (12bit)
ADC1 agganciato a TIM2, valore passato attraverso TIM2_IRQHandler a TIM2->CCR1
ADC2 lanciato da software, quando completo adc2_done viene settato in HAL_ADC_ConvCpltCallback
*/
extern I2C_HandleTypeDef hi2c1;
// SYS
uint8_t sys_tick, sys_tick_prescale, pwm_tick;
volatile uint8_t sys_tick, sys_tick_prescale;
// UART
uint8_t UART_RX_buf[UART_RX_BUF_SIZE];
uint8_t UART_TX_buf[UART_TX_BUF_SIZE];
uint8_t UART_TX_buf_lenght;
// SYNTH
uint32_t freq;
// ADC1
uint16_t adc1_valore;
// ADC2 (16 o 32?) per usare buffer da 32 settare WORD nel canale DMA
uint32_t adc2_valori[4];
uint8_t adc2_done, blocco, blocco_fatto, codice_allarme;
// ADC2
uint16_t adc2_valori[4];
uint8_t adc2_done, adc_blocco, adc_allarmi[4];
// audio
uint16_t sample_value;
uint8_t stato_audio;
double sine_increment;
uint16_t samples_ringbuf[SAMPLES_BUFFER_SIZE]; ///< buffer ad anello dei dati RX
uint32_t samples_ringbuf_input_index, samples_ringbuf_output_index;
uint8_t usb_audio_tick;
// VU
uint8_t analog_wd_status;
// MOD
uint16_t pwm_value1, pwm_value2, pwm_value3, pwm_value4;
uint8_t rails_number;
// ###################################
int serial_write(char *ptr, size_t len) {
// todo sia dma che it corrompono (vedi sotto, static)
HAL_UART_Transmit_DMA(&huart1, ptr, len);
// HAL_UART_Transmit_IT(&huart1, ptr, len);
// HAL_UART_Transmit(&huart1, ptr, len, 1000);
// uart_sent = 0;
UART_TX_buf_lenght = 0;
return len;
}
void squeow_init(void) {
seriow_log(2, "squeow init");
sine_increment = 0.4;
samples_ringbuf_input_index = 0;
samples_ringbuf_output_index = 0;
freq = DEFAULT_SYNTH_FREQUENCY;
adc2_valori[0] = 10;
adc2_valori[1] = 20;
adc2_valori[2] = 30;
adc2_valori[3] = 40;
blocco = 0;
adc2_valori[0] = 0;
adc2_valori[1] = 0;
adc2_valori[2] = 0;
adc2_valori[3] = 0;
codice_allarme = 0;
}
uint32_t sat_sub(uint16_t x, uint16_t y) {
@@ -67,121 +69,165 @@ uint32_t sat_sub(uint16_t x, uint16_t y) {
return res;
}
uint16_t u12_sine(void) {
static double angle;
angle += sine_increment;
if (angle >= 6.28)
angle = 0;
return (uint16_t)((sin(angle) * 0x7ff) + 0x7ff);
}
/*
uint16_t get_adc_sample(void) {
uint16_t adc_sample_value;
// stato_audio == STATO_AUDIO_ADC;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
// store_sample(HAL_ADC_GetValue(&hadc1) << 4);
adc_sample_value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return adc_sample_value;
}
*/
void store_samples(uint16_t *data, uint32_t size) {
for (uint32_t i = 0; i < size; ++i) {
store_sample(data[i]);
}
}
void store_sample(uint16_t sample) {
samples_ringbuf[samples_ringbuf_input_index] = sample;
ringbuf_increment(&samples_ringbuf_input_index, SAMPLES_BUFFER_SIZE_MASK);
}
uint16_t get_sample(void) {
ringbuf_increment(&samples_ringbuf_output_index, SAMPLES_BUFFER_SIZE_MASK);
return samples_ringbuf[samples_ringbuf_output_index];
}
uint32_t ringbuf_increment(uint32_t *index, uint32_t buff_size_mask) {
(*index)++;
*index &= buff_size_mask;
return *index;
}
void store_buffer(uint8_t *buf, uint32_t size) {
for (uint32_t s = 0; s < size / 4; s++) {
uint16_t LL = buf[s * 2];
uint16_t RR = buf[(s * 2) + 1];
store_sample(RR);
}
}
int vu_meter(uint16_t sample) {
#define ZEROD 2047
#define ZEROU 2048
uint16_t abs_sample;
uint8_t scaled_abs_sample;
abs_sample = (sample > ZEROD) ? sample - ZEROU : ZEROD - sample;
scaled_abs_sample = abs_sample >> 3;
if (scaled_abs_sample >= vu_tmp_value)
return scaled_abs_sample;
else {
return vu_tmp_value;
}
}
// adc
void adc_rileva_soglie(uint16_t *adc_valori) {
if (adc_valori[0] > SOGLIA_TEMPERATURA) {
seriow_log(1, "ADC0 threshold detect");
HAL_GPIO_WritePin(TEMP_OL_GPIO_Port, TEMP_OL_Pin, 1);
adc_allarmi[0] = 1;
adc_blocco = 1;
}
if (adc_valori[1] > SOGLIA_CORRENTE) {
seriow_log(1, "ADC1 threshold detect");
adc_allarmi[1] = 1;
adc_blocco = 1;
}
if (adc_valori[3] > SOGLIA_RIFLESSA) {
seriow_log(1, "ADC3 threshold detect");
HAL_GPIO_WritePin(REFL_OL_GPIO_Port, REFL_OL_Pin, 1);
adc_allarmi[3] = 1;
adc_blocco = 1;
void adc_rileva_soglie(uint32_t *adc_valori) {
if (!blocco) {
#ifdef SQUEOW_SONDA_CORRENTE
if (adc_valori[SQUEOW_ADC_CORRENTE] > SOGLIA_CORRENTE) {
codice_allarme = SQUEOW_CODICE_CORRENTE;
blocco = 1;
}
#endif
#ifdef SQUEOW_SONDA_TEMPERATURA
if (adc_valori[SQUEOW_ADC_TEMPERATURA] > SOGLIA_TEMPERATURA) {
codice_allarme = SQUEOW_CODICE_TEMPERATURA;
blocco = 1;
}
#endif
#ifdef SQUEOW_SONDA_DIRETTA
if (adc_valori[SQUEOW_ADC_DIRETTA] > SOGLIA_DIRETTA) {
codice_allarme = SQUEOW_CODICE_DIRETTA;
blocco = 1;
}
#endif
#ifdef SQUEOW_SONDA_RIFLESSA
if (adc_valori[SQUEOW_ADC_RIFLESSA] > SOGLIA_RIFLESSA) {
codice_allarme = SQUEOW_CODICE_RIFLESSA;
blocco = 1;
}
#endif
}
}
void array_values_mean(uint16_t *valori, uint16_t *medie, uint8_t dimensione){
void processa_blocco(void) {
static uint8_t vecchio_stato_blocco;
static uint16_t timer_blocco;
// è appena stato impostato blocco
if (blocco && !vecchio_stato_blocco) {
// è appena stato impostato blocco
#ifdef SQUEOW_UI_SERIOW
seriow_log('E', "LOCK!");
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('E', "LOCK!");
#endif
#ifdef MODALITA_BLOCCO_PERMANENTE
#endif
#ifdef MODALITA_BLOCCO_BASSA_POTENZA
#endif
#ifdef MODALITA_BLOCCO_TEMPORANEO
timer_blocco = 0;
#endif
vecchio_stato_blocco = blocco;
} else if (!blocco && vecchio_stato_blocco) {
// è appena stato disinserito il blocco
#ifdef SQUEOW_UI_SERIOW
seriow_log('I', "UNLOCK");
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('I', "UNLOCK");
#endif
codice_allarme = 0;
led_blocco(codice_allarme);
vecchio_stato_blocco = blocco;
}
#ifdef MODALITA_BLOCCO_TEMPORANEO
else {
// solo temporaneo
if (timer_blocco > TEMPO_BLOCCO_TEMPORANEO) {
timer_blocco = 0;
blocco = 0;
} else {
timer_blocco++;
}
}
#endif
}
// synth
void squeow_synth_init(void) {
// occhio che blocca!
seriow_log(2, "synth init");
// occhio che blocca!
#ifdef SQUEOW_UI_SERIOW
seriow_log('I', "synth init");
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('I', "synth init");
#endif
si5351_initialize();
}
void squeow_synth_set(freq) {
seriow_log(2, "synth set freq");
void squeow_synth_set(uint32_t freq) {
#ifdef SQUEOW_UI_SERIOW
// seriow_log('I', "synth set freq");
#endif
#ifdef SQUEOW_UI_TOSTA
// tosta_log('I', "synth set freq");
#endif
si5351_set_frequency(freq, 0);
si5351_set_frequency(freq, 1);
}
void squeow_synth_on(void) {
seriow_log(2, "synth on");
#ifdef SQUEOW_UI_SERIOW
seriow_log('I', "synth on");
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('I', "synth on");
#endif
si5351_on_clk(0);
si5351_on_clk(1);
}
void squeow_synth_off(void) {
seriow_log(2, "synth off");
#ifdef SQUEOW_UI_SERIOW
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('I', "synth off");
#endif
si5351_off_clk(0);
si5351_off_clk(1);
}
void i2c_write8(I2C_HandleTypeDef handler, uint8_t address, uint8_t reg, uint8_t value) {
while (HAL_I2C_IsDeviceReady(&handler, (uint16_t)(address << 1), 3, 100) != HAL_OK) {
}
HAL_I2C_Mem_Write(&handler, (uint8_t)(address << 1), (uint8_t)reg, I2C_MEMADD_SIZE_8BIT, (uint8_t *)(&value), 1, 100);
}
uint8_t i2c_read8(I2C_HandleTypeDef handler, uint8_t address, uint8_t reg, uint8_t *value) {
HAL_StatusTypeDef status = HAL_OK;
while (HAL_I2C_IsDeviceReady(&handler, (uint16_t)(address << 1), 3, 100) != HAL_OK) {
}
status = HAL_I2C_Mem_Read(&handler, // i2c handle
(uint8_t)(address << 1), // i2c address, left aligned
(uint8_t)reg, // register address
I2C_MEMADD_SIZE_8BIT, // 8bit register addresses
(uint8_t *)(&value), // write returned data to this variable
1, // how many bytes to expect returned
100); // timeout
return status;
}
void si5351_write8(uint8_t reg, uint8_t value) { i2c_write8(hi2c1, SI5351_ADDRESS, reg, value); }
uint8_t si5351_read8(uint8_t reg, uint8_t *value) { return i2c_read8(hi2c1, SI5351_ADDRESS, reg, value); }

View File

@@ -9,51 +9,186 @@
/* SQUEOW UI
su tosta (8x16 caratteri)
F: stringa frequenza
V: barra volume
D: barra diretta
R: barra riflessa
T: barra temperatura
S: stringa stato
*/
// VU
uint8_t vu_on, vu_value, vu_tmp_value;
uint8_t adc_stampa;
uint16_t ui_volume;
uint8_t uart_sent;
volatile uint8_t uart_sent;
// ################
void squeow_ui_init(void) {
vu_on = 1;
adc_stampa = 1;
#ifdef SQUEOW_UI_SERIOW
seriow_log('I', "seriow UI init");
#endif
#ifdef SQUEOW_UI_TOSTA
tosta_log('I', "UI init");
#endif
}
// seriow
// https://git.lattuga.net/boyska/seriow
// 10hz
void seriow_var_dump(void) {
char buf[64];
snprintf(buf, 64, "\e[3dDMP V=%lu T=%u C=%u D=%u R=%u\n", vu_value, adc2_valori[0], adc2_valori[1], adc2_valori[2], adc2_valori[3]);
serial_write(buf, strlen(buf));
vu_tmp_value = 0;
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "DMP V=%u ", riscala_valori(ui_volume, 0, 2048, 0, 100));
#ifdef SQUEOW_SONDA_CORRENTE
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "C=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_CORRENTE], 0, 4095, 0, 100));
#endif
#ifdef SQUEOW_SONDA_TEMPERATURA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "T=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_TEMPERATURA], 0, 4095, 0, 100));
#endif
#ifdef SQUEOW_SONDA_DIRETTA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "D=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_DIRETTA], 0, 4095, 0, 100));
#endif
#ifdef SQUEOW_SONDA_RIFLESSA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "R=%u ", riscala_valori(adc2_valori[SQUEOW_ADC_RIFLESSA], 0, 4095, 0, 100));
#endif
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\n");
}
// ogni 5sec
void seriow_stab_dump(void) {
char buf[64];
snprintf(buf, 64, "DMP F=%lu\n", freq);
serial_write(buf, strlen(buf));
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "DMP F=%lu ", freq);
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "VPK=%u ", VU_METER_SOGLIA_PICCO);
#ifdef SQUEOW_SONDA_CORRENTE
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SC=%u ", SOGLIA_CORRENTE);
#endif
#ifdef SQUEOW_SONDA_TEMPERATURA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "ST=%u ", SOGLIA_TEMPERATURA);
#endif
#ifdef SQUEOW_SONDA_DIRETTA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SD=%u ", SOGLIA_DIRETTA);
#endif
#ifdef SQUEOW_SONDA_RIFLESSA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "SR=%u ", SOGLIA_RIFLESSA);
#endif
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\n");
}
void seriow_log(uint8_t sev, char *msg) {
char buf[64];
snprintf(buf, 64, "\e[2dLOG %u %s\n", sev, msg);
serial_write(buf, strlen(buf));
void seriow_log(uint8_t sev, char *msg) { UART_TX_buf_lenght = snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "LOG %c %s\n", sev, msg); }
// tosta
void tosta_freq(void) {
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\e[1d\e[0GF: %lu", freq);
}
int serial_write(char *ptr, int len) {
// todo sia dma che it corrompono
// HAL_UART_Transmit_DMA(&huart1, ptr, len);
// HAL_UART_Transmit_IT(&huart1, ptr, len);
HAL_UART_Transmit(&huart1, ptr, len, 1000);
uart_sent = 0;
return len;
void tosta_var_bars(void) {
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\f\e[2d\e[0GV:\e[%ub\n", ui_volume);
#ifdef SQUEOW_SONDA_CORRENTE
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "C:\e[%ub\nu", riscala_valori(adc2_valori[SQUEOW_ADC_CORRENTE], 0, 4095, 0, 50));
#endif
#ifdef SQUEOW_SONDA_TEMPERATURA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "T:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_TEMPERATURA], 0, 4095, 0, 50));
#endif
#ifdef SQUEOW_SONDA_DIRETTA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "D:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_DIRETTA], 0, 4095, 0, 50));
#endif
#ifdef SQUEOW_SONDA_RIFLESSA
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "R:\e[%ub\n", riscala_valori(adc2_valori[SQUEOW_ADC_RIFLESSA], 0, 4095, 0, 50));
#endif
}
void tosta_log(uint8_t sev, char *msg) {
UART_TX_buf_lenght += snprintf(UART_TX_buf + UART_TX_buf_lenght, UART_TX_BUF_SIZE, "\e[8d\e[0GLOG: %c %s", sev, msg);
}
// LED
void led_blocco(uint8_t led_blocco_lampi) {
// fasi
// 0 lampo acceso
// 1 lampo spento
// 2 pausa
static uint16_t led_blocco_timer;
static uint8_t led_blocco_fase = 0, led_blocco_lampi_fatti = 0;
if (led_blocco_lampi > 0) {
if (led_blocco_fase == 0 && led_blocco_timer == 0) {
// inizio lampo acceso
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_SET);
led_blocco_timer = 1;
} else if (led_blocco_fase == 0 && led_blocco_timer >= SQUEOW_LED_BLOCCO_LAMPO) {
// fine lampo acceso, inizio lampo spento
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
led_blocco_fase = 1;
led_blocco_timer = 0;
} else if (led_blocco_fase == 1 && led_blocco_timer >= SQUEOW_LED_BLOCCO_LAMPO) {
// fine lampo spento
if (led_blocco_lampi_fatti >= (led_blocco_lampi - 1)) {
// fine lampi, inizio pausa
led_blocco_fase = 2;
led_blocco_lampi_fatti = 0;
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
} else {
led_blocco_lampi_fatti++;
led_blocco_fase = 0;
}
led_blocco_timer = 0;
} else if (led_blocco_fase == 2 && led_blocco_timer >= SQUEOW_LED_BLOCCO_PAUSA) {
// fine pausa
led_blocco_fase = 0;
led_blocco_timer = 0;
} else {
led_blocco_timer++;
}
} else {
HAL_GPIO_WritePin(G2_GPIO_Port, G2_Pin, GPIO_PIN_RESET);
}
}
void led_pwm_duty(uint8_t duty) { TIM8->CCR3 = duty; }
uint16_t vu_meter(uint16_t campione) {
#define ZEROD 2047
#define ZEROU 2048
static uint16_t vu_valore_temp, vu_timer_picco;
uint16_t abs_campione;
// se è sopra lo zero analogico, sottrailo, se no inverti
abs_campione = (campione > ZEROD) ? campione - ZEROU : ZEROD - campione;
#ifdef SQUEOW_UI_LED
// gestione picco
if (abs_campione > VU_METER_SOGLIA_PICCO) {
vu_timer_picco = 0;
HAL_GPIO_WritePin(G4_GPIO_Port, G4_Pin, GPIO_PIN_SET);
} else if (vu_timer_picco >= VU_METER_TEMPO_PICCO) {
HAL_GPIO_WritePin(G4_GPIO_Port, G4_Pin, GPIO_PIN_RESET);
vu_timer_picco = 0;
} else {
vu_timer_picco++;
}
#endif
// vu meter
if (abs_campione >= vu_valore_temp) {
vu_valore_temp = abs_campione;
} else {
vu_valore_temp -= VU_METER_RILASCIO;
}
return vu_valore_temp;
}
uint16_t riscala_valori(uint16_t valore_in, uint16_t valore_in_minimo, uint16_t valore_in_massimo, uint16_t valore_out_minimo, uint16_t valore_out_massimo) {
uint16_t range_in, range_out, valore_in_limitato;
float scala;
range_in = valore_in_massimo - valore_in_minimo;
range_out = valore_out_massimo - valore_out_minimo;
scala = range_in / range_out;
valore_in_limitato = (((valore_in) < (valore_in_massimo)) ? (valore_in) : (valore_in_massimo));
return valore_out_minimo + ((valore_in_limitato - valore_in_minimo) / scala);
}

View File

@@ -64,7 +64,7 @@ extern DMA_HandleTypeDef hdma_usart1_tx;
/* USER CODE END 0 */
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
/**
/**
* Initializes the Global MSP.
*/
void HAL_MspInit(void)
@@ -91,20 +91,20 @@ void HAL_MspInit(void)
static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0;
/**
* @brief ADC MSP Initialization
* This function configures the hardware resources used in this example
* @param hadc: ADC handle pointer
* @retval None
*/
* @brief ADC MSP Initialization
* This function configures the hardware resources used in this example
* @param hadc: ADC handle pointer
* @retval None
*/
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hadc->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/** Initializes the peripherals clocks
*/
@@ -125,23 +125,23 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN15
*/
GPIO_InitStruct.Pin = AUDIO_IN_Pin;
GPIO_InitStruct.Pin = A1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(AUDIO_IN_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_Init(A1_GPIO_Port, &GPIO_InitStruct);
/* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
}
else if(hadc->Instance==ADC2)
{
/* USER CODE BEGIN ADC2_MspInit 0 */
/* USER CODE BEGIN ADC2_MspInit 0 */
/* USER CODE END ADC2_MspInit 0 */
/* USER CODE END ADC2_MspInit 0 */
/** Initializes the peripherals clocks
*/
@@ -165,7 +165,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
PA6 ------> ADC2_IN3
PA7 ------> ADC2_IN4
*/
GPIO_InitStruct.Pin = TEMPERATURA_Pin|CORRENTE_Pin|DIRETTA_Pin|RIFLESSA_Pin;
GPIO_InitStruct.Pin = A5_Pin|A4_Pin|A3_Pin|A2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
@@ -177,8 +177,8 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
hdma_adc2.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_adc2.Init.Mode = DMA_NORMAL;
hdma_adc2.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_adc2) != HAL_OK)
@@ -191,26 +191,26 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
/* ADC2 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
/* USER CODE BEGIN ADC2_MspInit 1 */
/* USER CODE BEGIN ADC2_MspInit 1 */
/* USER CODE END ADC2_MspInit 1 */
/* USER CODE END ADC2_MspInit 1 */
}
}
/**
* @brief ADC MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hadc: ADC handle pointer
* @retval None
*/
* @brief ADC MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hadc: ADC handle pointer
* @retval None
*/
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */
HAL_RCC_ADC12_CLK_ENABLED--;
if(HAL_RCC_ADC12_CLK_ENABLED==0){
@@ -220,26 +220,26 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
/**ADC1 GPIO Configuration
PB0 ------> ADC1_IN15
*/
HAL_GPIO_DeInit(AUDIO_IN_GPIO_Port, AUDIO_IN_Pin);
HAL_GPIO_DeInit(A1_GPIO_Port, A1_Pin);
/* ADC1 interrupt DeInit */
/* USER CODE BEGIN ADC1:ADC1_2_IRQn disable */
/* USER CODE BEGIN ADC1:ADC1_2_IRQn disable */
/**
* Uncomment the line below to disable the "ADC1_2_IRQn" interrupt
* Be aware, disabling shared interrupt may affect other IPs
*/
/* HAL_NVIC_DisableIRQ(ADC1_2_IRQn); */
/* USER CODE END ADC1:ADC1_2_IRQn disable */
/* USER CODE END ADC1:ADC1_2_IRQn disable */
/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */
}
else if(hadc->Instance==ADC2)
{
/* USER CODE BEGIN ADC2_MspDeInit 0 */
/* USER CODE BEGIN ADC2_MspDeInit 0 */
/* USER CODE END ADC2_MspDeInit 0 */
/* USER CODE END ADC2_MspDeInit 0 */
/* Peripheral clock disable */
HAL_RCC_ADC12_CLK_ENABLED--;
if(HAL_RCC_ADC12_CLK_ENABLED==0){
@@ -252,42 +252,42 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
PA6 ------> ADC2_IN3
PA7 ------> ADC2_IN4
*/
HAL_GPIO_DeInit(GPIOA, TEMPERATURA_Pin|CORRENTE_Pin|DIRETTA_Pin|RIFLESSA_Pin);
HAL_GPIO_DeInit(GPIOA, A5_Pin|A4_Pin|A3_Pin|A2_Pin);
/* ADC2 DMA DeInit */
HAL_DMA_DeInit(hadc->DMA_Handle);
/* ADC2 interrupt DeInit */
/* USER CODE BEGIN ADC2:ADC1_2_IRQn disable */
/* USER CODE BEGIN ADC2:ADC1_2_IRQn disable */
/**
* Uncomment the line below to disable the "ADC1_2_IRQn" interrupt
* Be aware, disabling shared interrupt may affect other IPs
*/
/* HAL_NVIC_DisableIRQ(ADC1_2_IRQn); */
/* USER CODE END ADC2:ADC1_2_IRQn disable */
/* USER CODE END ADC2:ADC1_2_IRQn disable */
/* USER CODE BEGIN ADC2_MspDeInit 1 */
/* USER CODE BEGIN ADC2_MspDeInit 1 */
/* USER CODE END ADC2_MspDeInit 1 */
/* USER CODE END ADC2_MspDeInit 1 */
}
}
/**
* @brief I2C MSP Initialization
* This function configures the hardware resources used in this example
* @param hi2c: I2C handle pointer
* @retval None
*/
* @brief I2C MSP Initialization
* This function configures the hardware resources used in this example
* @param hi2c: I2C handle pointer
* @retval None
*/
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hi2c->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
/** Initializes the peripherals clocks
*/
@@ -320,27 +320,27 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
/* Peripheral clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}
/**
* @brief I2C MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hi2c: I2C handle pointer
* @retval None
*/
* @brief I2C MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hi2c: I2C handle pointer
* @retval None
*/
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
if(hi2c->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspDeInit 0 */
/* USER CODE BEGIN I2C1_MspDeInit 0 */
/* USER CODE END I2C1_MspDeInit 0 */
/* USER CODE END I2C1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_I2C1_CLK_DISABLE();
@@ -352,48 +352,59 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
/* USER CODE BEGIN I2C1_MspDeInit 1 */
/* USER CODE BEGIN I2C1_MspDeInit 1 */
/* USER CODE END I2C1_MspDeInit 1 */
/* USER CODE END I2C1_MspDeInit 1 */
}
}
/**
* @brief TIM_Base MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
* @brief TIM_Base MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE BEGIN TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* USER CODE END TIM2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE BEGIN TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
/* USER CODE END TIM2_MspInit 1 */
}
else if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE BEGIN TIM3_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* USER CODE END TIM3_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM3_CLK_ENABLE();
/* TIM3 interrupt Init */
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE BEGIN TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
/* USER CODE END TIM3_MspInit 1 */
}
else if(htim_base->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspInit 0 */
/* USER CODE END TIM8_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM8_CLK_ENABLE();
/* USER CODE BEGIN TIM8_MspInit 1 */
/* USER CODE END TIM8_MspInit 1 */
}
}
@@ -403,10 +414,9 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(htim->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspPostInit 0 */
/* USER CODE END TIM2_MspPostInit 0 */
/* USER CODE BEGIN TIM2_MspPostInit 0 */
/* USER CODE END TIM2_MspPostInit 0 */
__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM2 GPIO Configuration
PA0 ------> TIM2_CH1
@@ -421,66 +431,98 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN TIM2_MspPostInit 1 */
/* USER CODE BEGIN TIM2_MspPostInit 1 */
/* USER CODE END TIM2_MspPostInit 1 */
/* USER CODE END TIM2_MspPostInit 1 */
}
else if(htim->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspPostInit 0 */
/* USER CODE END TIM8_MspPostInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM8 GPIO Configuration
PB5 ------> TIM8_CH3N
*/
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN TIM8_MspPostInit 1 */
/* USER CODE END TIM8_MspPostInit 1 */
}
}
/**
* @brief TIM_Base MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
* @brief TIM_Base MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM2)
{
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE BEGIN TIM2_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* USER CODE END TIM2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM2_CLK_DISABLE();
/* TIM2 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM2_IRQn);
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* USER CODE BEGIN TIM2_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
/* USER CODE END TIM2_MspDeInit 1 */
}
else if(htim_base->Instance==TIM3)
{
/* USER CODE BEGIN TIM3_MspDeInit 0 */
/* USER CODE BEGIN TIM3_MspDeInit 0 */
/* USER CODE END TIM3_MspDeInit 0 */
/* USER CODE END TIM3_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM3_CLK_DISABLE();
/* TIM3 interrupt DeInit */
HAL_NVIC_DisableIRQ(TIM3_IRQn);
/* USER CODE BEGIN TIM3_MspDeInit 1 */
/* USER CODE BEGIN TIM3_MspDeInit 1 */
/* USER CODE END TIM3_MspDeInit 1 */
/* USER CODE END TIM3_MspDeInit 1 */
}
else if(htim_base->Instance==TIM8)
{
/* USER CODE BEGIN TIM8_MspDeInit 0 */
/* USER CODE END TIM8_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM8_CLK_DISABLE();
/* USER CODE BEGIN TIM8_MspDeInit 1 */
/* USER CODE END TIM8_MspDeInit 1 */
}
}
/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/** Initializes the peripherals clocks
*/
@@ -544,27 +586,27 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart)
/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
}
/**
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspDeInit 0 */
/* USER CODE BEGIN USART1_MspDeInit 0 */
/* USER CODE END USART1_MspDeInit 0 */
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
@@ -580,9 +622,9 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
/* USART1 interrupt DeInit */
HAL_NVIC_DisableIRQ(USART1_IRQn);
/* USER CODE BEGIN USART1_MspDeInit 1 */
/* USER CODE BEGIN USART1_MspDeInit 1 */
/* USER CODE END USART1_MspDeInit 1 */
/* USER CODE END USART1_MspDeInit 1 */
}
}

View File

@@ -1,20 +1,20 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32g4xx_it.c
* @brief Interrupt Service Routines.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
******************************************************************************
* @file stm32g4xx_it.c
* @brief Interrupt Service Routines.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
@@ -81,9 +81,8 @@ void NMI_Handler(void)
/* USER CODE END NonMaskableInt_IRQn 0 */
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
while (1)
{
}
while (1) {
}
/* USER CODE END NonMaskableInt_IRQn 1 */
}
@@ -274,11 +273,22 @@ void TIM2_IRQHandler(void)
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
uint16_t adc_val;
adc_val = HAL_ADC_GetValue(&hadc1);
vu_value = vu_meter(adc_val);
TIM2->CCR1 = adc_val;
TIM2->CCR2 = adc_val;
uint16_t adc_val;
adc_val = HAL_ADC_GetValue(&hadc1);
if (blocco) {
#ifdef MODALITA_BLOCCO_PERMANENTE
TIM2->CCR1 = 0;
TIM2->CCR2 = 0;
#endif
#ifdef MODALITA_BLOCCO_BASSA_POTENZA
TIM2->CCR1 = adc_val >> DIVISORE_BLOCCO_BASSA_POTENZA;
TIM2->CCR2 = adc_val >> DIVISORE_BLOCCO_BASSA_POTENZA;
#endif
} else {
TIM2->CCR1 = adc_val;
TIM2->CCR2 = adc_val; // ???
}
ui_volume = vu_meter(adc_val);
/* USER CODE END TIM2_IRQn 1 */
}
@@ -292,7 +302,8 @@ void TIM3_IRQHandler(void)
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */
sys_tick = 1;
// base tempi
sys_tick = 1;
/* USER CODE END TIM3_IRQn 1 */
}