Demo of low res colour vga video for stm32f3 discovery board
Dependencies: STM32F3-Discovery-minimal
Fork of Space_Invaders_Demo by
compass.c
- Committer:
- MartinJohnson
- Date:
- 2019-04-03
- Revision:
- 17:833f1b69e11d
- Parent:
- 3:93e488fbb8a2
File content as of revision 17:833f1b69e11d:
#include "stm32f30x.h" #include "stm32f3_discovery.h" #include <stdio.h> #include "stm32f3_discovery_lsm303dlhc.h" #define GPIO_MODE_INPUT 0 #define GPIO_MODE_OUTPUT 1 #define GPIO_MODE_AF 2 #define GPIO_NO_PULL 0 #define GPIO_PULL_UP 1 #define GPIO_PULL_DOWN 2 #define GPIO_OUTPUT_PUSH_PULL 0 #define GPIO_SPEED_MEDIUM 1 #define GPIO_SPEED_LOW 0 #define GPIO_SPEED_HIGH 3 extern void gpio_set_mode(GPIO_TypeDef *g,int n,int mode); extern void gpio_set_af(GPIO_TypeDef *g,int n,int af, int otype, int pupd, int speed); void i2cInit() { RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; RCC->AHBENR |= RCC_AHBENR_GPIOBEN; // configure GPIOPB6 and 7 gpio_set_af(GPIOB,6,4,GPIO_OUTPUT_PUSH_PULL,GPIO_PULL_DOWN,GPIO_SPEED_LOW); gpio_set_af(GPIOB,7,4,GPIO_OUTPUT_PUSH_PULL,GPIO_PULL_DOWN,GPIO_SPEED_LOW); I2C1->TIMINGR = 0x00902025; I2C1->CR1 |= I2C_CR1_PE; } #define I2C_CR2_CLEAR_MASK ~(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP) void i2cWrite(int address, int reg, int val) { while(I2C1->ISR & I2C_ISR_BUSY); I2C1->CR2 = (I2C1->CR2 & I2C_CR2_CLEAR_MASK) | I2C_CR2_RELOAD | I2C_CR2_START | (1<<16) | address; while(!(I2C1->ISR & I2C_ISR_TXIS)); I2C1->TXDR=reg; while(!(I2C1->ISR & I2C_ISR_TCR)); I2C1->CR2 = (I2C1->CR2 & I2C_CR2_CLEAR_MASK) | I2C_CR2_AUTOEND | (1<<16) | address; while(!(I2C1->ISR & I2C_ISR_TXIS)); I2C1->TXDR=val; while(!(I2C1->ISR & I2C_ISR_STOPF)); I2C1->ICR = I2C_ICR_STOPCF; } void i2cRead(int address, int reg, uint8_t *data, int nbytes) { while(I2C1->ISR & I2C_ISR_BUSY); I2C1->CR2 = (I2C1->CR2 & I2C_CR2_CLEAR_MASK) | I2C_CR2_START | (1<<16) | address; while(!(I2C1->ISR & I2C_ISR_TXIS)); if(nbytes>1) reg |= 0x80; I2C1->TXDR=reg; while(!(I2C1->ISR & I2C_ISR_TC)); I2C1->CR2 = (I2C1->CR2 & I2C_CR2_CLEAR_MASK) | I2C_CR2_AUTOEND | I2C_CR2_START | I2C_CR2_RD_WRN | (nbytes<<16) | address; while(nbytes--) { while(!(I2C1->ISR & I2C_ISR_RXNE)); *data++=I2C1->RXDR; } while(!(I2C1->ISR & I2C_ISR_STOPF)); I2C1->ICR = I2C_ICR_STOPCF; } void MemsConfig(void) { i2cInit(); i2cWrite(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG1_A,LSM303DLHC_NORMAL_MODE | LSM303DLHC_ODR_50_HZ | LSM303DLHC_AXES_ENABLE); i2cWrite(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG4_A,LSM303DLHC_FULLSCALE_2G | LSM303DLHC_BlockUpdate_Continous | LSM303DLHC_BLE_LSB | LSM303DLHC_HR_ENABLE); i2cWrite(ACC_I2C_ADDRESS, LSM303DLHC_CTRL_REG2_A,LSM303DLHC_HPM_NORMAL_MODE | LSM303DLHC_HPFCF_16 | LSM303DLHC_HPF_AOI1_DISABLE | LSM303DLHC_HPF_AOI2_DISABLE); i2cWrite(MAG_I2C_ADDRESS, LSM303DLHC_CRA_REG_M, LSM303DLHC_TEMPSENSOR_ENABLE | LSM303DLHC_ODR_30_HZ); i2cWrite(MAG_I2C_ADDRESS, LSM303DLHC_CRB_REG_M, LSM303DLHC_FS_8_1_GA); i2cWrite(MAG_I2C_ADDRESS, LSM303DLHC_MR_REG_M,LSM303DLHC_CONTINUOS_CONVERSION); } void ReadAccelerometer(int16_t * data) { i2cRead(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A, (uint8_t *)data, 6); } void ReadMagnetometer(int16_t * data) { i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_L_M, (uint8_t *)data, 1); i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, (uint8_t *)data+1, 1); i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_M, (uint8_t *)data+2, 1); i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_M, (uint8_t *)data+3, 1); i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_M, (uint8_t *)data+4, 1); i2cRead(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_M, (uint8_t *)data+5, 1); }