/
AVLGU
/
STM32F072_Programming
Обзор
Документация
Войти
/
AVLGU
/
STM32F072_Programming
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
SPI.c
117 строк
3 KB
AVLGU
рабочая версия на неправильном прерывании и обработчике
17 дек 2025, 08:53
17 дек 2025, 08:53
d6a77f2
Код
Авторство
О чём код?
#include "SPI.h" void SPI2_Init_TransmitOnly(void) { RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; RCC->AHBENR |= RCC_AHBENR_GPIOAEN; RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // PB13, PB15 - ALT FUN GPIOB->MODER &= ~(GPIO_MODER_MODER13 | GPIO_MODER_MODER15); // reset on legs 13,15 GPIOB->MODER |= (GPIO_MODER_MODER13_1 | GPIO_MODER_MODER15_1); // 1 on 1st bit on legs 13,15 GPIOB->AFR[1] &= (GPIO_AFRH_AFRH5 | GPIO_AFRH_AFRH7); //AF0 on PB13, PB15 // PA8 -OUTPUT GPIOA->MODER &= ~(GPIO_MODER_MODER8); // reset on leg 8 GPIOA->MODER |= (GPIO_MODER_MODER8_0); // 1 on 0st bit on leg 8 SPI2->CR1 = SPI_CR1_BIDIOE | SPI_CR1_LSBFIRST | SPI_CR1_BR | SPI_CR1_MSTR ; /* SIMPLEX; fPCLK/256; Master; */ SPI2->CR2 = SPI_CR2_DS;// | SPI_CR2_TXEIE;// 16bit data; interrupt when empty TX SPI2->CR1 |= SPI_CR1_SPE; /* SPI enabled */ } void initScreen(void){ RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN; // GPIOA & GPIOB ENABLE RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; // SPI2 ENABLE GPIOA->MODER &= ~(GPIO_MODER_MODER8); // clear mode GPIOA->MODER |= (GPIO_MODER_MODER8_0); // set output mode for GPO Latch Enable GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_8); // output push-pull GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR8; GPIOA->BSRR = GPIO_BSRR_BR_8; GPIOB->MODER &= ~(GPIO_MODER_MODER15 | GPIO_MODER_MODER13); // clear mode GPIOB->MODER |= (GPIO_MODER_MODER15_1 | GPIO_MODER_MODER13_1); // set alternate function GPIOB->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR13 | GPIO_OSPEEDR_OSPEEDR15); GPIOB->OTYPER &= ~(GPIO_OTYPER_OT_13 | GPIO_OTYPER_OT_15); GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPDR13 | GPIO_PUPDR_PUPDR15); GPIOB->AFR[1] &= ~((0xFU << ((13 - 8) * 4)) | (0xFU << ((15 - 8) * 4))); NVIC_EnableIRQ(SPI2_IRQn);//enable NVIC controller SPI2->CR1 |= SPI_CR1_MSTR | SPI_CR1_BR | SPI_CR1_SSM | SPI_CR1_SSI; SPI2->CR2 |= SPI_CR2_DS | SPI_CR2_FRXTH | SPI_CR2_TXEIE; SPI2->CR1 |= SPI_CR1_SPE; SPI2->DR = 0;//for 1st } //volatile uint8_t curr_row=0; void SPI2_IRQHandler(void) {/* GPIOA->BSRR = GPIO_BSRR_BS_8;//end prev message if (curr_row<8) { SPI2->DR = CurrDataCalc(); GPIOA->BSRR = GPIO_BSRR_BR_8;//start new message curr_row++; } else curr_row=0;*/ DisplayOnScreen(); } static uint16_t Data2massTo_16Uuint(const uint16_t data_raw[8], const uint16_t data_column[8]) { volatile uint16_t result_column = 0; volatile uint16_t result_raw = 0; volatile uint8_t position = 0; for (position = 0; position < 8; position++) { result_column |= data_column[position]<<position; } for (position = 8; position >0; --position) { result_raw |= data_raw[position]<<position; } return (result_column | (result_raw<<8)); } //for SPI old interrupt on Tx void SPI2_Transmit(const uint16_t data) { //const uint16_t data = Data2massTo_16Uuint(data_raw, data_column); GPIOA->BSRR = GPIO_BSRR_BR_8; SPI2->DR = data; while (SPI2->SR & SPI_SR_BSY) {/* waight*/} //spi_curr = 0; GPIOA->BSRR = GPIO_BSRR_BS_8; /*if ((SPI2->SR & SPI_SR_TXE) == SPI_SR_TXE) //Test Tx empty { // Will inititiate 8-bit transmission if TXE *(uint16_t *)(SPI2->DR) = data; //LEG PA8 GPIOA->BSRR = GPIO_BSRR_BS_8; __NOP(); GPIOA->BSRR = GPIO_BSRR_BR_8; }*/ }