/* main.c - Full Traffic Light Controller with Yellow LEDs for STM32C031C6 */
#include "main.h"
/* Logic level definitions (adapt to your hardware wiring) */
#define NEG_ON GPIO_PIN_RESET /* Negative logic: low turns LED on */
#define NEG_OFF GPIO_PIN_SET
#define POS_ON GPIO_PIN_SET /* Positive logic: high turns LED on */
#define POS_OFF GPIO_PIN_RESET
/* Pin assignments (based on your image and original init) */
// North (negative logic)
#define NORTH_GREEN_PIN GPIO_PIN_0
#define NORTH_YELLOW_PIN GPIO_PIN_4
#define NORTH_RED_PIN GPIO_PIN_1
// South (negative logic)
#define SOUTH_GREEN_PIN GPIO_PIN_5
#define SOUTH_YELLOW_PIN GPIO_PIN_7
#define SOUTH_RED_PIN GPIO_PIN_6
// East (positive logic)
#define EAST_GREEN_PIN GPIO_PIN_0
#define EAST_YELLOW_PIN GPIO_PIN_2
#define EAST_RED_PIN GPIO_PIN_1
// West (positive logic)
#define WEST_GREEN_PIN GPIO_PIN_10
#define WEST_YELLOW_PIN GPIO_PIN_12
#define WEST_RED_PIN GPIO_PIN_11
/* Timing constants (milliseconds) */
#define GREEN_TIME 30000
#define YELLOW_TIME 3000
#define ALL_RED_TIME 2000
/* Function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void set_all_red(void);
void set_ns_green(void);
void set_ns_yellow(void);
void set_ew_green(void);
void set_ew_yellow(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// 1. North-South Green, East-West Red
set_ns_green();
HAL_Delay(GREEN_TIME);
// 2. North-South Yellow, East-West Red
set_ns_yellow();
HAL_Delay(YELLOW_TIME);
// 3. All Red
set_all_red();
HAL_Delay(ALL_RED_TIME);
// 4. East-West Green, North-South Red
set_ew_green();
HAL_Delay(GREEN_TIME);
// 5. East-West Yellow, North-South Red
set_ew_yellow();
HAL_Delay(YELLOW_TIME);
// 6. All Red
set_all_red();
HAL_Delay(ALL_RED_TIME);
}
}
/**
* @brief Turn all red LEDs on, all others off
*/
void set_all_red(void)
{
// North (negative logic)
HAL_GPIO_WritePin(GPIOA, NORTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_RED_PIN, NEG_ON);
// South
HAL_GPIO_WritePin(GPIOA, SOUTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_RED_PIN, NEG_ON);
// East (positive logic)
HAL_GPIO_WritePin(GPIOB, EAST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_RED_PIN, POS_ON);
// West
HAL_GPIO_WritePin(GPIOB, WEST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_RED_PIN, POS_ON);
}
/**
* @brief North-South green, East-West red
*/
void set_ns_green(void)
{
// North-South: green ON, yellow OFF, red OFF
HAL_GPIO_WritePin(GPIOA, NORTH_GREEN_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, NORTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_RED_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_GREEN_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, SOUTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_RED_PIN, NEG_OFF);
// East-West: red ON, others OFF
HAL_GPIO_WritePin(GPIOB, EAST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_RED_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, WEST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_RED_PIN, POS_ON);
}
/**
* @brief North-South yellow, East-West red
*/
void set_ns_yellow(void)
{
// North-South: yellow ON, green OFF, red OFF
HAL_GPIO_WritePin(GPIOA, NORTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_YELLOW_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, NORTH_RED_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_YELLOW_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, SOUTH_RED_PIN, NEG_OFF);
// East-West: red ON, others OFF
HAL_GPIO_WritePin(GPIOB, EAST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_RED_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, WEST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_RED_PIN, POS_ON);
}
/**
* @brief East-West green, North-South red
*/
void set_ew_green(void)
{
// East-West: green ON, yellow OFF, red OFF
HAL_GPIO_WritePin(GPIOB, EAST_GREEN_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, EAST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_RED_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_GREEN_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, WEST_YELLOW_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_RED_PIN, POS_OFF);
// North-South: red ON, others OFF
HAL_GPIO_WritePin(GPIOA, NORTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_RED_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, SOUTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_RED_PIN, NEG_ON);
}
/**
* @brief East-West yellow, North-South red
*/
void set_ew_yellow(void)
{
// East-West: yellow ON, green OFF, red OFF
HAL_GPIO_WritePin(GPIOB, EAST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, EAST_YELLOW_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, EAST_RED_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_GREEN_PIN, POS_OFF);
HAL_GPIO_WritePin(GPIOB, WEST_YELLOW_PIN, POS_ON);
HAL_GPIO_WritePin(GPIOB, WEST_RED_PIN, POS_OFF);
// North-South: red ON, others OFF
HAL_GPIO_WritePin(GPIOA, NORTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, NORTH_RED_PIN, NEG_ON);
HAL_GPIO_WritePin(GPIOA, SOUTH_GREEN_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_YELLOW_PIN, NEG_OFF);
HAL_GPIO_WritePin(GPIOA, SOUTH_RED_PIN, NEG_ON);
}
/**
* @brief GPIO Initialization (all 12 pins used)
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Enable clocks for GPIOA and GPIOB */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* Configure all North & South pins (PA0,1,4,5,6,7) */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 |
GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Configure all East & West pins (PB0,1,2,10,11,12) */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |
GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* Ensure all outputs start in a safe state (all red) */
set_all_red();
}
/**
* @brief System Clock Configuration for STM32C031
* @note Uses HSI (8 MHz) directly. No PLL, no voltage scaling.
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/* Configure HSI as system clock source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* 8 MHz */
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/* Configure system clocks (AHB and APB1 prescalers = 1) */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
/* FLASH latency set to 0 because CPU frequency ≤ 8 MHz */
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief This function is executed in case of error occurrence.
*/
void Error_Handler(void)
{
while(1) { }
}(click to edit)
NORTH
WEST
EAST
SOUTH