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

dosikus

Members
  • Постов

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

  • Посещение

Информация о dosikus

  • День рождения 01.04.1972

Информация

  • Пол
    Мужчина
  • Интересы
    Электроника
  • Город
    Ярославль

Электроника

  • Стаж в электронике
    Не связан с электроникой

Посетители профиля

4 001 просмотр профиля

Достижения dosikus

Экспериментатор

Экспериментатор (5/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме
  • 10 лет  на форуме

Последние значки

13

Репутация

  1. Непонятно одно, зачем это делать через ж. то бишь в аурдунье?
  2. Увы это не так. Сплошные костыли . Начни изучать таймеры как таковые ,а в частности DMA burst...
  3. Поищите на изиэлектроникс...
  4. #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 ; } }
  5. optima , можно еще сказок о шифровании CAN шины. Что-то скучно в последнее время. Задно можно шифрование любого транспорта присовокупить ...
  6. Конденсатор не обсуждаем, он там должен быть. А теперь о подстраховаться, от чего и зачем? Четко и внятно отвечаем... А вот получить хорошую оплеуху вы можете. В свое время некоторые умники палили ключ ресета , вот так же поставив пуллап ...
  7. Я не тыкаюсь в отличии от вас и не уверовал в калокуб. Этот код абсолютно рабочий, то что счас он не читаем заслуга движка форума. Завтра , как и писал исправлю...
  8. Внимательней смотрите, этот код абсолютно рабочий, при любй оптимизации.
  9. Пуллап на ресет и на не нужен, это не авр . Там уже есть встроенный. Минимально необходимая обвязка расписана в 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
  10. Работает с строками и в 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++; } }
  11. dosikus

    I2C в STM32F030

    Я что-то так же граблей не обнаружил. Модуль намного лучше чем в F1.
  12. Alex, rev это команда асма. Реверс в армах аппаратный.
  13. Сбросить с помощью RCC_APBхRSTR вместо деинициализации и тырканья тактирования, затем инит .
×
×
  • Создать...