/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
struct usb usb;
+volatile byte timer_ticked;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
+static void MX_DMA_Init(void);
static void MX_USB_PCD_Init(void);
static void MX_TIM4_Init(void);
static void MX_USART1_UART_Init(void);
+static void MX_TIM3_Init(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN 0 */
+static void process_packet(void)
+{
+ uint cmd = get_u32_be(rx_packet);
+ uint arg = get_u32_be(rx_packet+4);
+ debug_printf("<< cmd %08x %08x\n", cmd, arg);
+
+ memset(tx_packet, 0, sizeof(tx_packet));
+ put_u32_be(tx_packet, 1);
+
+ switch (cmd)
+ {
+ case 1:
+ if (arg < 16)
+ {
+ if (arg & 1)
+ LL_GPIO_ResetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
+ if (arg & 2)
+ LL_GPIO_ResetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
+ if (arg & 4)
+ LL_GPIO_ResetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
+ if (arg & 8)
+ LL_GPIO_ResetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
+ else
+ LL_GPIO_SetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
+ put_u32_be(tx_packet, 0);
+ }
+ break;
+
+ case 2:
+ put_u32_be(tx_packet, 0);
+ put_u32_be(tx_packet+4, ds_current_temp);
+ break;
+ }
+
+ debug_printf(">> status %08x\n", get_u32_be(tx_packet));
+}
+
/* USER CODE END 0 */
/**
/* Initialize all configured peripherals */
MX_GPIO_Init();
+ MX_DMA_Init();
// A hack to let USB host reset us
LL_GPIO_InitTypeDef gpio;
MX_USB_PCD_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
+ MX_TIM3_Init();
/* USER CODE BEGIN 2 */
usb_start(&usb);
LL_TIM_EnableIT_UPDATE(TIM4);
LL_TIM_GenerateEvent_UPDATE(TIM4);
+ ds_init();
+
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
- static byte led_state;
- if (led_state)
+ if (timer_ticked)
{
- LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
- LL_GPIO_SetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
- LL_GPIO_SetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
- LL_GPIO_SetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
- LL_GPIO_SetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
+ timer_ticked = 0;
+ static byte led_state;
+ if (led_state)
+ LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
+ else
+ LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin);
+ led_state ^= 1;
+ ds_step();
}
- else
- {
- LL_GPIO_ResetOutputPin(LED_GPIO_Port, LED_Pin);
- static byte xxx;
- switch (xxx)
- {
- case 0:
- LL_GPIO_ResetOutputPin(SSR1_GPIO_Port, SSR1_Pin);
- break;
- case 1:
- LL_GPIO_ResetOutputPin(SSR2_GPIO_Port, SSR2_Pin);
- break;
- case 2:
- LL_GPIO_ResetOutputPin(SSR3_GPIO_Port, SSR3_Pin);
- break;
- case 3:
- LL_GPIO_ResetOutputPin(SSR4_GPIO_Port, SSR4_Pin);
- break;
- }
- xxx = (xxx+1) % 4;
- }
- led_state ^= 1;
if (rx_packet_state == 1 && !tx_packet_state)
{
tx_packet_state = 1;
- put_u32_be(tx_packet, 42);
+ process_packet();
usb_ep_send(&usb, 0x82, tx_packet, 12);
rx_packet_state = 0;
usb_ep_receive(&usb, 0x01, rx_packet, 64);
}
- // debug_printf("Counter = %d\n", cnt);
+#if 0
+ static int cnt;
+ debug_printf("Counter = %d\n", cnt);
+ cnt++;
+#endif
- //__WFI();
- LL_mDelay(1000);
+ __WFI();
+ // LL_mDelay(1000);
/* USER CODE END WHILE */
NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
}
+/* TIM3 init function */
+static void MX_TIM3_Init(void)
+{
+
+ LL_TIM_InitTypeDef TIM_InitStruct;
+ LL_TIM_OC_InitTypeDef TIM_OC_InitStruct;
+
+ LL_GPIO_InitTypeDef GPIO_InitStruct;
+
+ /* Peripheral clock enable */
+ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
+
+ /* TIM3 DMA Init */
+
+ /* TIM3_CH1_TRIG Init */
+ LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_6, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
+
+ LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_6, LL_DMA_PRIORITY_VERYHIGH);
+
+ LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_6, LL_DMA_MODE_NORMAL);
+
+ LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_6, LL_DMA_PERIPH_NOINCREMENT);
+
+ LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_6, LL_DMA_MEMORY_INCREMENT);
+
+ LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_6, LL_DMA_PDATAALIGN_HALFWORD);
+
+ LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_6, LL_DMA_MDATAALIGN_HALFWORD);
+
+ /* TIM3 interrupt Init */
+ NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
+ NVIC_EnableIRQ(TIM3_IRQn);
+
+ TIM_InitStruct.Prescaler = 71;
+ TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
+ TIM_InitStruct.Autoreload = 0;
+ TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
+ LL_TIM_Init(TIM3, &TIM_InitStruct);
+
+ LL_TIM_DisableARRPreload(TIM3);
+
+ LL_TIM_SetClockSource(TIM3, LL_TIM_CLOCKSOURCE_INTERNAL);
+
+ TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_FROZEN;
+ TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
+ TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
+ TIM_OC_InitStruct.CompareValue = 0;
+ TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
+ LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct);
+
+ LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH1);
+
+ TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_ACTIVE;
+ TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
+ TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
+ LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);
+
+ LL_TIM_OC_DisableFast(TIM3, LL_TIM_CHANNEL_CH2);
+
+ LL_TIM_SetTriggerOutput(TIM3, LL_TIM_TRGO_RESET);
+
+ LL_TIM_DisableMasterSlaveMode(TIM3);
+
+ /**TIM3 GPIO Configuration
+ PA7 ------> TIM3_CH2
+ */
+ GPIO_InitStruct.Pin = THERMO_Pin;
+ GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
+ GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
+ GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
+ LL_GPIO_Init(THERMO_GPIO_Port, &GPIO_InitStruct);
+
+}
+
/* TIM4 init function */
static void MX_TIM4_Init(void)
{
}
+/**
+ * Enable DMA controller clock
+ */
+static void MX_DMA_Init(void)
+{
+ /* Init with LL driver */
+ /* DMA controller clock enable */
+ LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
+
+ /* DMA interrupt init */
+ /* DMA1_Channel6_IRQn interrupt configuration */
+ NVIC_SetPriority(DMA1_Channel6_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
+ NVIC_EnableIRQ(DMA1_Channel6_IRQn);
+
+}
+
/** Configure pins as
* Analog
* Input
/* GPIO Ports Clock Enable */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
- LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
+ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
/* LED output is OC, active low, defaults to high */
LL_GPIO_SetOutputPin(LED_GPIO_Port, LED_Pin);
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ // XXX: By some magic, the above initialization does not always work,
+ // so we repeat it here.
+ LL_GPIO_SetOutputPin(GPIOB, SSR3_Pin|SSR4_Pin|SSR1_Pin|SSR2_Pin);
+
}
/* USER CODE BEGIN 4 */