Finally fixed LED driving code

This commit is contained in:
jaseg 2020-01-30 17:45:53 +01:00
parent da3a283593
commit a6f75b2ce5
3 changed files with 24 additions and 27 deletions

View file

@ -49,4 +49,13 @@ extern volatile unsigned int sys_time_seconds;
#define UNUSED(var) ((void)var)
union leds {
struct {
unsigned int pps, sd_card, usb, ocxo, error, _nc1, _nc2, _nc3;
};
unsigned int arr[8];
};
extern volatile union leds leds;
#endif/*__GLOBAL_H__*/

View file

@ -21,17 +21,7 @@
volatile unsigned int sys_time_seconds = 0;
void update_leds() {
}
volatile union {
struct {
unsigned int usb, ocxo, error, _nc1, _nc2, _nc3, pps, sd_card;
};
unsigned int arr[8];
} leds;
volatile union leds leds;
int main(void) {
RCC->CR |= RCC_CR_HSEON;
@ -79,22 +69,23 @@ int main(void) {
SPI1->CR1 =
SPI_CR1_SSM
| SPI_CR1_SSI
| SPI_CR1_CPOL
| SPI_CR1_CPHA
| (4<<SPI_CR1_BR_Pos) /* /32 ~1.5MHz */
| SPI_CR1_MSTR;
SPI1->CR2 = (7<<SPI_CR2_DS_Pos);
SPI1->CR1 |= SPI_CR1_SPE;
NVIC_EnableIRQ(SPI1_IRQn);
NVIC_SetPriority(SPI1_IRQn, 2<<5);
TIM16->CR2 = 0;
TIM16->DIER = TIM_DIER_UIE;
TIM16->DIER = TIM_DIER_UIE | TIM_DIER_CC1IE;
TIM16->CCMR1 = 0;
TIM16->CCR1 = 32;
TIM16->PSC = 48-1; /* 1us */
TIM16->ARR = 1000-1; /* 1ms */
TIM16->CR1 = TIM_CR1_CEN;
NVIC_EnableIRQ(TIM16_IRQn);
NVIC_SetPriority(TIM16_IRQn, 2<<5);
NVIC_SetPriority(TIM16_IRQn, 3<<5);
adc_configure_scope_mode(1000000);
@ -108,21 +99,13 @@ int main(void) {
}
}
void SPI1_IRQHandler(void) {
if (SPI1->SR & SPI_SR_TXE) {
/* LED_STB */
GPIOA->BSRR = 1<<3;
SPI1->CR2 &= ~SPI_CR2_TXEIE;
}
}
void TIM16_IRQHandler(void) {
static int leds_update_counter = 0;
if (TIM16->SR & TIM_SR_UIF) {
TIM16->SR &= ~TIM_SR_UIF;
uint8_t bits = 0, mask = 1;
for (size_t i=0; i<sizeof(leds)/sizeof(leds.arr[0]); i++) {
for (int i=0; i<8; i++) {
if (leds.arr[i]) {
leds.arr[i]--;
bits |= mask;
@ -137,9 +120,11 @@ void TIM16_IRQHandler(void) {
* data register is accessed through a 16-bit write. Unfortunately, the STMCube register defs define DR as an
* uint16_t, so we have to do some magic here to force an 8-bit write. */
*((volatile uint8_t*)&(SPI1->DR)) = bits;
SPI1->CR2 |= SPI_CR2_TXEIE;
GPIOA->BRR = 1<<3;
}
} else {
TIM16->SR &= ~TIM_SR_CC1IF;
GPIOA->BSRR = 1<<3;
}
}
@ -166,7 +151,7 @@ void SysTick_Handler(void) {
if (n++ == 10) {
n = 0;
sys_time_seconds++;
leds.pps = 100; /* ms */
leds.pps = 200; /* ms */
}
}

View file

@ -206,6 +206,7 @@ void usart_schedule_dma() {
xfr_len = sizeof(buf->data) - xfr_start;
}
leds.error = 250;
}
buf->xfr_start = xfr_start;
@ -264,6 +265,8 @@ int usart_send_packet_nonblocking(struct ll_pkt *pkt, size_t pkt_len) {
usart_tx_buf.packet_end[usart_tx_buf.wr_idx] = usart_tx_buf.wr_pos;
usart_tx_buf.wr_idx = (usart_tx_buf.wr_idx + 1) % ARRAY_LEN(usart_tx_buf.packet_end);
leds.usb = 100;
if (!(DMA1_Channel2->CCR & DMA_CCR_EN))
usart_schedule_dma();
return 0;