Finally fixed LED driving code
This commit is contained in:
parent
da3a283593
commit
a6f75b2ce5
3 changed files with 24 additions and 27 deletions
|
|
@ -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__*/
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue