#include "stm32f407xx.h" int data[3]; int tempc = 0; double voltage = 0; void delay(){ int i = 1000; while(i >= 0){ --i; } GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1 i = 10000; while(i >= 0){ --i; } GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 1 } void RCC_init(void) { //HSE RCC->CR |= RCC_CR_HSEON; //flash FLASH->ACR |= FLASH_ACR_PRFTEN; FLASH->ACR |= FLASH_ACR_LATENCY_3WS; //pll RCC->PLLCFGR &= RCC_PLLCFGR_PLLM_4; RCC->PLLCFGR &= RCC_PLLCFGR_PLLN_6; RCC->PLLCFGR |= RCC_PLLCFGR_PLLSRC_HSE; RCC->PLLCFGR |= RCC_PLLCFGR_PLLM_2; RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_3; RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_5; RCC->PLLCFGR |= RCC_PLLCFGR_PLLN_7; RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; RCC->CR |= RCC_CR_PLLON; //MCO RCC->CFGR |= RCC_CFGR_MCO1PRE_2; RCC->CFGR |= RCC_CFGR_MCO1_0; RCC->CFGR |= RCC_CFGR_MCO1_1; RCC->CFGR |= RCC_CFGR_SW_1; //GPIO RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; //PERIPH RCC->APB2ENR |= RCC_APB2ENR_USART1EN; RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; } void GPIO_init(void) { GPIOA->MODER |= GPIO_MODER_MODE8_1; GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED8_0; //1 в 0-й бит скорости пина 8 MCO GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED8_1; //1 в 1-й бит скорости пина GPIOA->MODER |= GPIO_MODER_MODE9_1; //альтернативный режим для Tx пина usart1 GPIOA->MODER |= GPIO_MODER_MODE10_1; //альтернативный режим для Rx пина usart1 GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10_1; //высокая скорость для Tx пина usart1 GPIOA->AFR[1]|=0x770; //единичка в массиве указывает на AFRH, для ввода в AFRL нужен 0. 0x770 = 0111 0111 0000 на каждый пин 4 бита, 0111 на 10, 0111 на 9, 0000 на 8 GPIOA->AFR[0]|=0x55550000; // GPIOB->AFR[0]|=0x555000; GPIOA->MODER |= GPIO_MODER_MODE7_1; GPIOA->MODER |= GPIO_MODER_MODE6_1; // GPIOA->MODER |= GPIO_MODER_MODE4_1; //режим альтернативный GPIOA->MODER |= GPIO_MODER_MODE4_0; GPIOA->MODER |= GPIO_MODER_MODE5_1; //режим альтернативный GPIOA->MODER |= GPIO_MODER_MODE0_0; GPIOA->MODER |= GPIO_MODER_MODE1_0; GPIOA->MODER |= GPIO_MODER_MODE2_0; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5; } void usart1_init(void){ USART1->CR1 |= USART_CR1_UE; //включение usart // USART1->CR1 |= USART_CR1_M; //длина слова 9 бит // скорости usart, высчитываются по fapb2/baudrate (84000000/9600или115200) // USART1->BRR = 8750; //9600 бод USART1->BRR |= 0x2D9; //=729 115200 бод USART1->CR1 |= USART_CR1_TE; USART1->CR1 |= USART_CR1_RE; } void spi1_init(void) { // SPI1->CR1 |= SPI_CR1_CPOL; SPI1->CR1 |= SPI_CR1_BR; // SPI1->CR1 |= SPI_CR1_RXONLY; // SPI1->CR1 |= SPI_CR1_CPOL; SPI1->CR1 |= SPI_CR1_SSM; SPI1->CR1 |= SPI_CR1_SSI; SPI1->CR1 |= SPI_CR1_MSTR; // SPI1->CR1 |= SPI_CR1_DFF; //16 бит режим SPI1->CR1 |= SPI_CR1_SPE; // SPI1->CR1 |= SPI_CR1_CPHA; } void DISPLAY_init(){ GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1 int i = 10000; while(i >= 0){ --i; } GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0 GPIOA->BSRR |= GPIO_BSRR_BS1; //RESET HIGH GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 0 SPI1->DR = 0x1; i = 1000000; while(i >= 0){ --i; } SPI1->DR = 0x11; while(!(SPI1->SR & SPI_SR_TXE)){}; i = 1000000; while(i >= 0){ --i; } delay(); // SPI1->DR = 0x21; // while(!(SPI1->SR & SPI_SR_TXE)){}; // delay(); SPI1->DR = 0x13; while(!(SPI1->SR & SPI_SR_TXE)){}; delay(); SPI1->DR = 0x29; while(!(SPI1->SR & SPI_SR_TXE)){}; delay(); SPI1->DR = 0x3A; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1 SPI1->DR = 0x55; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0 SPI1->DR = 0x36; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1 SPI1->DR = 0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0 SPI1->DR = 0x2A; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1 SPI1->DR =0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0xEF; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0 SPI1->DR =0x2B; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1 delay(); SPI1->DR = 0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR = 0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR = 0x1; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR = 0x3F; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BR0; //DATA 0 delay(); SPI1->DR = 0x2C; while(!(SPI1->SR & SPI_SR_TXE)){}; while(SPI1->SR & SPI_SR_BSY){}; delay(); GPIOA->BSRR |= GPIO_BSRR_BS0; //DATA 1 delay(); GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 1 GPIOA->BSRR |= GPIO_BSRR_BR2; //CS 0 } void displaydata(){ int i = 77000; while(i>=0){ --i; SPI1->DR = 0x00; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR = 0x00; while(!(SPI1->SR & SPI_SR_TXE)){}; } GPIOA->BSRR |= GPIO_BSRR_BS2; //CS 0 } void ADC_init(){ GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH int i = 1000; while(i >= 0){ --i; } GPIOA->BSRR |= GPIO_BSRR_BR4; //CHIPSELECT LOW SPI1->DR = 0x40; //WREG while(!(SPI1->SR & SPI_SR_TXE)){}; //ждём пока регистр отправки не опустеет SPI1->DR = 0x1; //01 REG while(!(SPI1->SR & SPI_SR_TXE)){}; //PGA_BYPASS = 1 SPI1->DR = 0x44; //WREG while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0xC4; while(!(SPI1->SR & SPI_SR_TXE)){}; //1000sps , CM = 1 SPI1->DR = 0x8; //start/sync while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0x48; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0x20; while(!(SPI1->SR & SPI_SR_TXE)){}; //50hz rejection SPI1->DR =0x4C; while(!(SPI1->SR & SPI_SR_TXE)){}; SPI1->DR =0x0; while(!(SPI1->SR & SPI_SR_TXE)){}; // ничего while(SPI1->SR & SPI_SR_BSY){}; GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH i = 1000000; while(i >= 0){ --i; } } float ADC_READ(){ GPIOA->BSRR |= GPIO_BSRR_BR4; //CHIPSELECT LOW while(SPI1->SR & SPI_SR_BSY){}; SPI1->DR = 0; while(SPI1->SR & SPI_SR_BSY){}; data[0] = SPI1->DR; //чтение первых 8 бит SPI1->DR = 0; while(SPI1->SR & SPI_SR_BSY){}; data[1] = SPI1->DR; //ещё 8 SPI1->DR = 0; while(SPI1->SR & SPI_SR_BSY){}; data[2] = SPI1->DR; // и ещё tempc = data[0]; tempc <<= 8; tempc = tempc | data[1]; tempc <<= 8; tempc = tempc | data[2]; //складывание элементов массива voltage = tempc * 0.000000298023; //множитель из таблицы ADS1220 while(SPI1->SR & SPI_SR_BSY){}; GPIOA->BSRR |= GPIO_BSRR_BS4; //CHIPSELECT HIGH return voltage; } int main(void) { double vol; RCC_init(); GPIO_init(); usart1_init(); spi1_init(); DISPLAY_init(); displaydata(); ADC_init(); vol = ADC_READ(); }