Перейти к содержанию

dosikus

Members
  • Постов

    293
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные dosikus

  1. #define APBCLK 48000000UL 
    
    #define BAUDRATE 115200UL
    
    
    
    void Usart_init (void) 
        {
          RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
          RCC->APB2ENR|=RCC_APB2ENR_USART1EN;
          
         
          
          GPIOA->MODER &= ~( GPIO_MODER_MODER10 |GPIO_MODER_MODER9);
          GPIOA->MODER |=   GPIO_MODER_MODER10_1 |GPIO_MODER_MODER9_1; 
        
          GPIOA->AFR[1] |=(1<<(4*1)) |(1<<(4*2));
          USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE;
          USART1->CR1 |= USART_CR1_TE |USART_CR1_RE|USART_CR1_RXNEIE; 
          USART1->CR1 |= USART_CR1_UE;
        	
          NVIC_SetPriority(USART1_IRQn, 0); 
          NVIC_EnableIRQ(USART1_IRQn); 
              
        }
        
     void Usart_Transmit(uint8_t Data)
    {
      while(!(USART1->ISR & USART_ISR_TC));
      USART1->TDR = Data;
    }
    
    void USART1_IRQHandler(void)
    {
    	uint8_t rx;
    	if(USART1->ISR & USART_ISR_RXNE)
    	{
    
     
        rx = (USART1->RDR); // Receive data, clear flag 
     
        
    	}
    }
    
    
    void USART1_str (const char * data)
    {
    
    	while((*data )){ 
    	  Usart_Transmit (*data);
        data++;
    	  }
    }

     

    До кучи i2c для F0

    #define RDA5807_OWN_ADDRESS (0x11)
    #define EEPROM_OWN_ADDRESS (0x50)
    
    void i2c_init(void)
        {
            RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
            
            RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
            RCC->CFGR3 |= RCC_CFGR3_I2C1SW; 
            
            GPIOB->AFR[0] |= (1<<(4*6)) |(1<<(4*7));
            GPIOB->MODER &= ~(GPIO_MODER_MODER6 |GPIO_MODER_MODER7);
            GPIOB->MODER |= (GPIO_MODER_MODER6_1 |GPIO_MODER_MODER7_1);
            GPIOB->OTYPER |=(GPIO_OTYPER_OT_6 |GPIO_OTYPER_OT_7);
            
            I2C1->TIMINGR = (uint32_t)0x00B01A4B; 
            I2C1->CR1 = I2C_CR1_PE; 
     
        }
    
    
    
    void 	rda5807_send_reg(uint8_t reg, uint8_t data_h,uint8_t data_l)
    		{
    		I2C1->CR2 =  I2C_CR2_AUTOEND | (3<<16) | (RDA5807_OWN_ADDRESS<<1); 
    		
    			/* Check Tx empty */
    	  while (!(I2C1->ISR & I2C_ISR_TXE) );
    	
    	 I2C1->TXDR = reg; /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = data_h; /* Byte to send */
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		
    		I2C1->TXDR = data_l; /* Byte to send */
    	
    			
    		}
    uint16_t 	rda5807_read16_reg(uint8_t reg)
    { 
    	 uint16_t temp=0;
    	I2C1->CR2 =   (1<<16) | (RDA5807_OWN_ADDRESS<<1); 
    	 while (!(I2C1->ISR & I2C_ISR_TXE) );
    	 I2C1->TXDR = reg; /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    	 while (!(I2C1->ISR & I2C_ISR_TC) ){};
    	 I2C1->CR2 =  I2C_CR2_AUTOEND | (2<<16) | 
    		            (RDA5807_OWN_ADDRESS<<1) |
    		             I2C_CR2_RD_WRN |
    		             I2C_CR2_NACK; 
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    	 while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
    	 temp  = (uint16_t)(I2C1->RXDR <<8);
    		while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
    	 temp |=  (uint16_t)I2C1->RXDR; 
    		 return temp;
    }
    	
    
    void 	rda5807_write16_reg(uint8_t reg, uint16_t data )
    {
    	I2C1->CR2 =  I2C_CR2_AUTOEND | (3<<16) | (RDA5807_OWN_ADDRESS<<1); 
    		
    			/* Check Tx empty */
    	  while (!(I2C1->ISR & I2C_ISR_TXE) );
    	
    	 I2C1->TXDR = reg; /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = (uint8_t)(data>>8); /* Byte to send */
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		
    		I2C1->TXDR = (uint8_t)(data &0x00FF); /* Byte to send */
    	
    }
    
    
    uint8_t eeprom_read(uint16_t address)
    {
    	 uint8_t temp=0;
    	I2C1->CR2 =   (2<<16) | (EEPROM_OWN_ADDRESS<<1); 
    	 while (!(I2C1->ISR & I2C_ISR_TXE) );
    	 I2C1->TXDR = (uint8_t) (address>>8); /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
    	 while (!(I2C1->ISR & I2C_ISR_TC) ){};
    	 I2C1->CR2 =  I2C_CR2_AUTOEND | 
    		             (1<<16) | 
    		            (EEPROM_OWN_ADDRESS<<1) |
    		             I2C_CR2_RD_WRN |
    		             I2C_CR2_NACK; 
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    	 while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
    	 temp  = I2C1->RXDR ;
    	
    		 return temp;
    }
    
    void eeprom_write(uint16_t address, uint8_t data)
    {
    	
    	I2C1->CR2 =  I2C_CR2_AUTOEND | (3<<16) | (EEPROM_OWN_ADDRESS<<1); 
    		
    			/* Check Tx empty */
    	  while (!(I2C1->ISR & I2C_ISR_TXE) );
    	
    	 I2C1->TXDR =(uint8_t) (address>>8); /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
    	
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		
    		I2C1->TXDR = data ; /* Byte to send */
    	 	
    }
    
    void eeprom_pagewrite(uint16_t address, uint8_t *buf,uint8_t nbytes)
    {
    	uint8_t index=0;
    	I2C1->CR2 =  I2C_CR2_AUTOEND | ((2+nbytes)<<16) | (EEPROM_OWN_ADDRESS<<1); 
    		
    			/* Check Tx empty */
    	  while (!(I2C1->ISR & I2C_ISR_TXE) );
    	
    	 I2C1->TXDR =(uint8_t) (address>>8); /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
    	for(index=0;index<=nbytes-1;index++)
    	 {
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		
    		I2C1->TXDR = buf[index] ; /* Byte to send */
    	 }
    }
    
    void eeprom_pageread(uint16_t address,uint8_t* buf,uint8_t nbytes)
    {
    	
    	uint8_t index=0;
    	I2C1->CR2 =   (2<<16) | (EEPROM_OWN_ADDRESS<<1); 
    	 while (!(I2C1->ISR & I2C_ISR_TXE) );
    	 I2C1->TXDR = (uint8_t) (address>>8); /* Byte to send */
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		while (!(I2C1->ISR & I2C_ISR_TXIS) );
    		I2C1->TXDR = (uint8_t)(address &0x00FF); /* Byte to send */
    	 while (!(I2C1->ISR & I2C_ISR_TC) ){};
    	 I2C1->CR2 =  I2C_CR2_AUTOEND |
                		 (nbytes<<16) | 
    		            (EEPROM_OWN_ADDRESS<<1) |
    		             I2C_CR2_RD_WRN |
    		             I2C_CR2_NACK; 
    	 I2C1->CR2 |= I2C_CR2_START; /* Go */
    		for(index=0;index<=nbytes-1;index++)
    	 { 
    	 while (!(I2C1->ISR & I2C_ISR_RXNE) ){};
    	 buf[index]  = I2C1->RXDR ;
    	
    	 }
    }

     

  2. Конденсатор не обсуждаем, он там должен быть.

    А теперь о подстраховаться, от чего и зачем? Четко и внятно отвечаем...

    А вот получить хорошую оплеуху вы можете. В свое время некоторые умники палили ключ ресета , вот так же поставив пуллап ...

  3. В 23.09.2018 в 18:01, GOR23 сказал:

    Ресет желательно подтянуть и поставить конденсатор в землю как на схеме. 

    Пуллап на ресет и на не нужен, это не авр . Там уже есть встроенный. Минимально необходимая обвязка расписана в AN2586: Getting started with STM32F10xxx hardware development
    https://www.st.com/content/ccc/resource/technical/document/application_note/6c/a3/24/49/a5/d4/4a/db/CD00164185.pdf/files/CD00164185.pdf/jcr:content/translations/en.CD00164185.pdf

     

     

  4. Скрытый текст

     

    Работает  с строками и в RAM и ROM.

    Завтра исправлю форматирование , почему-то в мобильной версии нет тэга код...

    #define APBCLK 48000000UL #define BAUDRATE 115200UL

     

     

    void Usart_init (void) { RCC>AHBENR |= RCC_AHBENR_GPIOAEN;

    RCC>APB2ENR|=RCC_APB2ENR_USART1EN;

    GPIOA->MODER &= ~( GPIO_MODER_MODER10 |GPIO_MODER_MODER9);

    GPIOA->MODER |= GPIO_MODER_MODER10_1 |GPIO_MODER_MODER9_1;

    GPIOA->AFR[1] |=(1<<(4*1)) |(1<<(4*2));

    USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRAE;

    USART1->CR1 |= USART_CR1_TE |USART_CR1_RE|USART_CR1_RXNEIE;

    USART1->CR1 |= USART_CR1_UE;

    NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn);

    }

    void Usart_Transmit(uint8_t Data) { while(!(USART1->ISR &USART_ISR_TC));

    USART1->TDR = Data; }

    void USART1_IRQHandler(void) {

    uint8_t rx;

    if(USART1->ISR & USART_ISR_RXNE)

    { rx = (USART1->RDR); // Receive data, clear flag } }

    void USART1_str (const char * data) { while((*data )){ Usart_Transmit (*data); data++; } }

  5. 18 часов назад, User_1 сказал:

    деинициализирую модуль SPI и выключаю его тактирование, затем включаю тактирование и снова инициализирую.

    Сбросить с помощью 

    RCC_APBхRSTR

    вместо деинициализации и тырканья тактирования, затем инит .

  6. 12 часа назад, GOR23 сказал:

    Первый раз такое вижу. Это чтение регистра в "пустоту"? 

    Любителям калокуба невдомек что флаги статуса сбрасываются чтением?

     А про "Первый раз такое вижу" - шедеврально, видимо уровень кодописательства  нуль?

×
×
  • Создать...