#include #include #include #include /* * Part number: STM32F030F4C6 */ #define NBITS 12 void do_transpose(void); uint32_t brightness[8]; volatile uint8_t brightness_by_bit[NBITS]; int main(void) { RCC->CR |= RCC_CR_HSEON; while (!(RCC->CR&RCC_CR_HSERDY)); RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk; RCC->CFGR |= (2<CR |= RCC_CR_PLLON; while (!(RCC->CR&RCC_CR_PLLRDY)); RCC->CFGR |= (2<AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; RCC->APB2ENR |= RCC_APB2ENR_SPI1EN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_USART1EN | RCC_APB2ENR_ADCEN; GPIOA->MODER |= (3<MODER |= (1<OTYPER |= GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_4; /* LED outputs -> open drain */ /* Set shift register IO GPIO output speed */ GPIOA->OSPEEDR |= (3<AFR[0] |= (1<AFR[1] |= (2<BSRR = GPIO_BSRR_BR_1; /* clear output is active low */ /* Configure SPI controller */ /* CPOL=0, CPHA=0, prescaler=8 -> 1MBd */ // SPI1->CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | (2<CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | (0<CR2 = (7<CR1 = TIM_CR1_OPM | TIM_CR1_URS; // TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_URS; TIM1->CR1 = TIM_CR1_ARPE | TIM_CR1_OPM; // | TIM_CR1_URS; TIM1->CR2 = 0; //TIM_CR2_CCPC; TIM1->SMCR = 0; TIM1->DIER = 0; TIM1->PSC = 1; // debug /* CH2 - clear/!MR, CH3 - strobe/STCP */ TIM1->CCR2 = 1; TIM1->RCR = 0; TIM1->CCMR1 = (6<CCMR2 = (6<CCER |= TIM_CCER_CC2E | TIM_CCER_CC2NE | TIM_CCER_CC2P | TIM_CCER_CC3E; // TIM1->CCMR1 = (6<CCMR2 = (6<CCER = TIM_CCER_CC2E | TIM_CCER_CC3E; // TIM1->BDTR = TIM_BDTR_MOE; TIM1->DIER = TIM_DIER_UIE; NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn); NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 2); TIM1->EGR |= TIM_EGR_UG; while (42) { /* for (uint8_t i=0; i<8; i++) { brightness[1] = brightness[5] = i; brightness[2] = brightness[6] = 0; brightness[3] = brightness[7] = 0; do_transpose(); LL_mDelay(500); } for (uint8_t i=0; i<8; i++) { brightness[1] = brightness[5] = 0; brightness[2] = brightness[6] = i; brightness[3] = brightness[7] = 0; do_transpose(); LL_mDelay(500); } for (uint8_t i=0; i<8; i++) { brightness[1] = brightness[5] = 0; brightness[2] = brightness[6] = 0; brightness[3] = brightness[7] = i; do_transpose(); LL_mDelay(500); } for (uint8_t i=0; i<8; i++) { brightness[1] = brightness[5] = i; brightness[2] = brightness[6] = i; brightness[3] = brightness[7] = i; do_transpose(); LL_mDelay(500); } } { */ for (uint32_t i=0; i<6; i++) { for (uint32_t j=0; j<(1<ODR ^= GPIO_ODR_6; switch (i) { case 0: brightness[1] = brightness[5] = (1<= NBITS) idx = 0; GPIOA->ODR ^= GPIO_ODR_4; TIM1->CCMR1 = (4<DR = brightness_by_bit[idx]<<8; while (SPI1->SR & SPI_SR_BSY); const uint32_t period_base = 4; /* 1us */ const uint32_t period = period_base<BDTR = TIM_BDTR_MOE | (16<BDTR = TIM_BDTR_MOE | (0<CCR3 = period-1; TIM1->CNT = period-1; TIM1->ARR = period; TIM1->CCMR1 = (6<EGR |= TIM_EGR_UG; TIM1->ARR = 2; TIM1->CR1 |= TIM_CR1_CEN; TIM1->SR &= ~TIM_SR_UIF_Msk; } void NMI_Handler(void) { } void HardFault_Handler(void) { for(;;); } void SVC_Handler(void) { } void PendSV_Handler(void) { } void SysTick_Handler(void) { }