Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement