Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7844c8bdce | |||
| 4b467f6701 | 
@ -24,7 +24,7 @@
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.755606893" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1771260818" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1811760675" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F407VGTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/CMSIS/Include ||  ||  || USE_HAL_DRIVER | STM32F407xx ||  || Drivers | Core/Startup | Core ||  ||  || ${workspace_loc:/${ProjName}/STM32F407VGTX_FLASH.ld} || true || NonSecure ||  || secure_nsclib.o ||  || None ||  ||  || " valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.2006503660" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="32" valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.2006503660" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="16" valueType="string"/>
 | 
			
		||||
							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.188797436" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
 | 
			
		||||
							<builder buildPath="${workspace_loc:/test1}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.901063855" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
 | 
			
		||||
							<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1851291017" name="MCU/MPU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
 | 
			
		||||
@ -36,7 +36,7 @@
 | 
			
		||||
							</tool>
 | 
			
		||||
							<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1285639549" name="MCU/MPU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
 | 
			
		||||
								<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.75005491" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g3" valueType="enumerated"/>
 | 
			
		||||
								<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1711938240" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false"/>
 | 
			
		||||
								<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.1711938240" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.o0" valueType="enumerated"/>
 | 
			
		||||
								<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1662015804" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
 | 
			
		||||
									<listOptionValue builtIn="false" value="DEBUG"/>
 | 
			
		||||
									<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
 | 
			
		||||
@ -104,7 +104,7 @@
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.1646548773" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="true" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1901965124" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.859080388" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32F407VGTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Core/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc | ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy | ../Drivers/CMSIS/Device/ST/STM32F4xx/Include | ../Drivers/CMSIS/Include ||  ||  || USE_HAL_DRIVER | STM32F407xx ||  || Drivers | Core/Startup | Core ||  ||  || ${workspace_loc:/${ProjName}/STM32F407VGTX_FLASH.ld} || true || NonSecure ||  || secure_nsclib.o ||  || None ||  ||  || " valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1202403298" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="32" valueType="string"/>
 | 
			
		||||
							<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1202403298" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="16" valueType="string"/>
 | 
			
		||||
							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.584865598" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
 | 
			
		||||
							<builder buildPath="${workspace_loc:/test1}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1873374287" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
 | 
			
		||||
							<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1806292512" name="MCU/MPU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
 | 
			
		||||
@ -150,7 +150,7 @@
 | 
			
		||||
						</toolChain>
 | 
			
		||||
					</folderInfo>
 | 
			
		||||
					<sourceEntries>
 | 
			
		||||
						<entry excluding="Src/mock_lcd.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
 | 
			
		||||
						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
 | 
			
		||||
						<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
 | 
			
		||||
					</sourceEntries>
 | 
			
		||||
				</configuration>
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
#ifndef __EEPROM_24AA02E48
 | 
			
		||||
#define __EEPROM_24AA02E48
 | 
			
		||||
 | 
			
		||||
int EEPROM_24AA02E48_run_test(void);
 | 
			
		||||
void EEPROM_24AA02E48_run_test(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
#ifndef __CS43L22
 | 
			
		||||
#define __CS43L22
 | 
			
		||||
 | 
			
		||||
int CS43L22_run_test(void);
 | 
			
		||||
void CS43L22_run_test(void);
 | 
			
		||||
void CS43L22_cleanup(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,6 @@
 | 
			
		||||
#define SKIP_LOW while (!(GPIOD->IDR & 0x0800)) {}
 | 
			
		||||
#define SKIP_HIGH while (GPIOD->IDR & 0x0800) {}
 | 
			
		||||
 | 
			
		||||
__attribute__((packed))
 | 
			
		||||
struct DHT11_Data {
 | 
			
		||||
	uint8_t humid_integral;
 | 
			
		||||
	uint8_t humid_decimal;
 | 
			
		||||
@ -13,6 +12,6 @@ struct DHT11_Data {
 | 
			
		||||
	uint8_t crc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int DHT11_run_test(void);
 | 
			
		||||
void DHT11_run_test(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
 | 
			
		||||
extern ADC_HandleTypeDef hadc1;
 | 
			
		||||
 | 
			
		||||
int DNI_show_celsius(void);
 | 
			
		||||
int DNI_show_fahrenheit(void);
 | 
			
		||||
void DNI_show_celsius(void);
 | 
			
		||||
void DNI_show_fahrenheit(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,11 +0,0 @@
 | 
			
		||||
#ifndef __KSZ8081RND
 | 
			
		||||
#define __KSZ8081RND
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int KSZ8081RND_run_test(void);
 | 
			
		||||
 | 
			
		||||
int ReadRegister(uint32_t reg, uint16_t *value);
 | 
			
		||||
int WriteRegister(uint32_t reg, uint16_t value);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
#ifndef __LIS302DL
 | 
			
		||||
#define __LIS302DL
 | 
			
		||||
 | 
			
		||||
int LIS302DL_run_test(void);
 | 
			
		||||
int LIS302DL_run_test_dynamic(void);
 | 
			
		||||
void LIS302DL_run_test(void);
 | 
			
		||||
void LIS302DL_run_test_dynamic(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
#ifndef __LSM9DS1
 | 
			
		||||
#define __LSM9DS1
 | 
			
		||||
 | 
			
		||||
int LSM9DS1_test_accel(void);
 | 
			
		||||
void LSM9DS1_test_accel(void);
 | 
			
		||||
void LSM9DS1_cleanup_accel(void);
 | 
			
		||||
int LSM9DS1_test_magnet(void);
 | 
			
		||||
void LSM9DS1_test_magnet(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
#ifndef __MP45DT02
 | 
			
		||||
#define __MP45DT02
 | 
			
		||||
 | 
			
		||||
int MP45DT02_run_test(void);
 | 
			
		||||
void MP45DT02_run_test(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
#ifndef __PCA9685
 | 
			
		||||
#define __PCA9685
 | 
			
		||||
 | 
			
		||||
int PCA9685_run_test(void);
 | 
			
		||||
void PCA9685_run_test(void);
 | 
			
		||||
void PCA9685_cleanup(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
#ifndef __SST25VF016B
 | 
			
		||||
#define __SST25VF016B
 | 
			
		||||
 | 
			
		||||
int SST25VF016B_run_test(void);
 | 
			
		||||
void SST25VF016B_run_test(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,6 @@
 | 
			
		||||
#define DISPLAY_RW  ((uint16_t) (0x1U << 10))
 | 
			
		||||
#define DISPLAY_ENA ((uint16_t) (0x1U << 11))
 | 
			
		||||
 | 
			
		||||
#define DISPLAY_FRAMES_AVAILABLE 14
 | 
			
		||||
 | 
			
		||||
#define DISPLAY_POLL_UNTIL_READY do { while (display_read_status() & 0x80) {} } while (0)
 | 
			
		||||
 | 
			
		||||
#define DISPLAY_SET_INCREMENT do { display_write_instruction_byte(0x06); } while (0)
 | 
			
		||||
@ -18,17 +16,11 @@
 | 
			
		||||
 | 
			
		||||
#define DISPLAY_CLEAR do { display_write_instruction_byte(0x01); } while (0)
 | 
			
		||||
 | 
			
		||||
struct Display_emu_state {
 | 
			
		||||
	size_t cursor_offset:5;
 | 
			
		||||
	size_t next:1;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void display_init(void);
 | 
			
		||||
uint8_t display_read_status(void);
 | 
			
		||||
void display_write_instruction_byte(uint8_t code);
 | 
			
		||||
void display_write_data_byte(uint8_t code);
 | 
			
		||||
void display_write_data_seq(char *codes);
 | 
			
		||||
void display_to_framebuffer(void);
 | 
			
		||||
void display_to_direct(void);
 | 
			
		||||
void display_load(uint32_t frame_no);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -32,8 +32,6 @@ extern "C" {
 | 
			
		||||
/* Private includes ----------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN Includes */
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Exported types ------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,7 @@
 | 
			
		||||
/* #define HAL_SDRAM_MODULE_ENABLED */
 | 
			
		||||
/* #define HAL_HASH_MODULE_ENABLED */
 | 
			
		||||
#define HAL_I2C_MODULE_ENABLED
 | 
			
		||||
/* #define HAL_I2S_MODULE_ENABLED */
 | 
			
		||||
#define HAL_I2S_MODULE_ENABLED
 | 
			
		||||
/* #define HAL_IWDG_MODULE_ENABLED */
 | 
			
		||||
/* #define HAL_LTDC_MODULE_ENABLED */
 | 
			
		||||
/* #define HAL_RNG_MODULE_ENABLED */
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
extern I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
void EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("24AA02E48 EEPROM");
 | 
			
		||||
@ -13,9 +13,9 @@ int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
	size_t err_count = 0;
 | 
			
		||||
 | 
			
		||||
	// write the Address Pointer register
 | 
			
		||||
	uint8_t data_buffer[9];
 | 
			
		||||
	data_buffer[8] = '\0';
 | 
			
		||||
	data_buffer[0] = 0xF8;
 | 
			
		||||
	uint8_t data_buffer[13];
 | 
			
		||||
	data_buffer[12] = '\0';
 | 
			
		||||
	data_buffer[0] = 0xF4;
 | 
			
		||||
 | 
			
		||||
	for (size_t t = 0; t < 5; t++) {
 | 
			
		||||
		op_result = HAL_I2C_Master_Transmit(&hi2c1, 0xA0, data_buffer, 1, 2000);
 | 
			
		||||
@ -26,7 +26,7 @@ int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
			DISPLAY_CLEAR;
 | 
			
		||||
			display_write_data_seq("24AA02E48 EEPROM");
 | 
			
		||||
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
			display_write_data_seq("W ");
 | 
			
		||||
			display_write_data_byte('1' + t);
 | 
			
		||||
			display_write_data_seq("/5 ");
 | 
			
		||||
@ -52,7 +52,7 @@ int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (size_t t = 0; t < 5; t++) {
 | 
			
		||||
		op_result = HAL_I2C_Master_Receive(&hi2c1, 0xA1, data_buffer, 8, 2000);
 | 
			
		||||
		op_result = HAL_I2C_Master_Receive(&hi2c1, 0xA1, data_buffer, 12, 2000);
 | 
			
		||||
 | 
			
		||||
		if (op_result) {
 | 
			
		||||
			err_count++;
 | 
			
		||||
@ -60,7 +60,7 @@ int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
			DISPLAY_CLEAR;
 | 
			
		||||
			display_write_data_seq("24AA02E48 EEPROM");
 | 
			
		||||
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
			display_write_data_seq("R ");
 | 
			
		||||
			display_write_data_byte('1' + t);
 | 
			
		||||
			display_write_data_seq("/5 ");
 | 
			
		||||
@ -89,18 +89,14 @@ int EEPROM_24AA02E48_run_test(void)
 | 
			
		||||
	display_write_data_seq("24AA02E48 EEPROM");
 | 
			
		||||
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		display_write_data_byte('0' + (err_count / 10) % 10);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + err_count / 10 % 10);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq("E ");
 | 
			
		||||
		display_write_data_seq((char *) data_buffer);
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK ");
 | 
			
		||||
		display_write_data_seq((char *) data_buffer);
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
extern I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
int CS43L22_run_test(void)
 | 
			
		||||
void CS43L22_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("CS43L22 Audio");
 | 
			
		||||
@ -54,16 +54,12 @@ int CS43L22_run_test(void)
 | 
			
		||||
	display_write_data_seq("CS43L22 Audio");
 | 
			
		||||
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq(" Errors");
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@
 | 
			
		||||
 | 
			
		||||
extern TIM_HandleTypeDef htim2;
 | 
			
		||||
 | 
			
		||||
static inline void wait(uint32_t wait_us)
 | 
			
		||||
static void wait(uint32_t wait_us)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t target_time = TIM2->CNT;
 | 
			
		||||
	target_time += wait_us << 4;
 | 
			
		||||
@ -13,7 +13,7 @@ static inline void wait(uint32_t wait_us)
 | 
			
		||||
	while (TIM2->CNT < target_time) {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline size_t dht11_measure_high_duration(void)
 | 
			
		||||
static size_t dht11_measure_high_duration(void)
 | 
			
		||||
{
 | 
			
		||||
	SKIP_LOW;
 | 
			
		||||
	uint32_t start_time = TIM2->CNT;
 | 
			
		||||
@ -31,34 +31,29 @@ static size_t dht11_read_value(struct DHT11_Data *data)
 | 
			
		||||
 | 
			
		||||
	register uint32_t read_register = 0;
 | 
			
		||||
 | 
			
		||||
	TIM2->CNT = 0;
 | 
			
		||||
	HAL_TIM_Base_Start(&htim2);
 | 
			
		||||
 | 
			
		||||
	// try to trigger the output
 | 
			
		||||
	for (int t = 0; t < 10; t++) {
 | 
			
		||||
		TIM2->CNT = 0;
 | 
			
		||||
	GPIOD->MODER |= 0x00400000;      // enable output mode on GPIOD 11
 | 
			
		||||
 | 
			
		||||
		GPIOD->MODER |= 0x00400000;       // enable output mode on GPIOD 11
 | 
			
		||||
	GPIOD->BSRR = GPIO_PIN_11;       // enable DHT11
 | 
			
		||||
	wait(18000);                     // hold HIGH for 18 ms
 | 
			
		||||
	GPIOD->BSRR = GPIO_PIN_11 << 16; // start signal
 | 
			
		||||
	wait(20);                        // hold it for 20 us
 | 
			
		||||
	GPIOD->BSRR = GPIO_PIN_11;       // pull up, DHT will now take control over the connection
 | 
			
		||||
	wait(40);
 | 
			
		||||
 | 
			
		||||
		GPIOD->BSRR = GPIO_PIN_11;        // enable DHT11
 | 
			
		||||
		wait(50000);                      // hold HIGH for 50 ms
 | 
			
		||||
		GPIOD->BSRR = GPIO_PIN_11 << 16;  // start signal
 | 
			
		||||
		wait(30000);                      // hold it for 30 ms
 | 
			
		||||
		GPIOD->BSRR = GPIO_PIN_11;        // pull up, DHT will now take control over the connection
 | 
			
		||||
	GPIOD->MODER &= 0xFF3FFFFF;      // switch GPIOD 11 to input mode
 | 
			
		||||
 | 
			
		||||
		wait(100);
 | 
			
		||||
		GPIOD->MODER &= 0xFF3FFFFF;       // switch GPIOD 11 to input mode
 | 
			
		||||
	// reading pull down from DHT11
 | 
			
		||||
	SKIP_LOW;
 | 
			
		||||
 | 
			
		||||
		// reading pull down from DHT11
 | 
			
		||||
		SKIP_LOW;
 | 
			
		||||
 | 
			
		||||
		// waiting for response
 | 
			
		||||
		for (size_t i = TIM2->CNT + (200000 << 4); TIM2->CNT <= i; )
 | 
			
		||||
			if (!(GPIOD->IDR & 0x0800))
 | 
			
		||||
				goto reading_data;
 | 
			
		||||
	}
 | 
			
		||||
	// waiting for 500ms max
 | 
			
		||||
	for (size_t i = TIM2->CNT + (500000 << 4); TIM2->CNT <= i; )
 | 
			
		||||
		if (!(GPIOD->IDR & 0x0800))
 | 
			
		||||
			goto reading_data;
 | 
			
		||||
 | 
			
		||||
	// if didn't exit through goto, then DHT11 awaiting has timed out
 | 
			
		||||
	HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
	return 1;
 | 
			
		||||
 | 
			
		||||
reading_data:
 | 
			
		||||
@ -77,7 +72,7 @@ reading_data:
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DHT11_run_test(void)
 | 
			
		||||
void DHT11_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("DHT11 Temp+Humid");
 | 
			
		||||
@ -85,34 +80,11 @@ int DHT11_run_test(void)
 | 
			
		||||
	struct DHT11_Data data;
 | 
			
		||||
	size_t result = dht11_read_value(&data);
 | 
			
		||||
 | 
			
		||||
	size_t checksum_mismatch = ((
 | 
			
		||||
			data.humid_decimal
 | 
			
		||||
			+ data.humid_integral
 | 
			
		||||
			+ data.temp_decimal
 | 
			
		||||
			+ data.temp_integral
 | 
			
		||||
			) & 0xFF) != data.crc;
 | 
			
		||||
 | 
			
		||||
	if (result) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		display_write_data_seq("StartTimeout");
 | 
			
		||||
	} else if (checksum_mismatch) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		display_write_data_seq("CRC Fault");
 | 
			
		||||
	if (result == 1) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("START TIMEOUT");
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 7);
 | 
			
		||||
		display_write_data_byte('0' + (data.humid_integral/10)%10);
 | 
			
		||||
		display_write_data_byte('0' + (data.humid_integral)%10);
 | 
			
		||||
		display_write_data_seq("% ");
 | 
			
		||||
 | 
			
		||||
		display_write_data_byte('0' + (data.temp_integral/10)%10);
 | 
			
		||||
		display_write_data_byte('0' + (data.temp_integral)%10);
 | 
			
		||||
		display_write_data_byte('.');
 | 
			
		||||
		display_write_data_byte('0' + data.temp_decimal);
 | 
			
		||||
		display_write_data_seq("C");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (result || checksum_mismatch);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -3,23 +3,25 @@
 | 
			
		||||
#include "lcd.h"
 | 
			
		||||
#include "DNI.h"
 | 
			
		||||
 | 
			
		||||
static int DNI_read(void)
 | 
			
		||||
static uint32_t DNI_read(void)
 | 
			
		||||
{
 | 
			
		||||
	HAL_ADC_Start(&hadc1);
 | 
			
		||||
	if (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK)
 | 
			
		||||
		PANIC(0x4000);
 | 
			
		||||
 | 
			
		||||
	HAL_StatusTypeDef s = HAL_ADC_PollForConversion(&hadc1, 100);
 | 
			
		||||
 | 
			
		||||
	if (HAL_OK != s)
 | 
			
		||||
		return -s;
 | 
			
		||||
	else
 | 
			
		||||
		return HAL_ADC_GetValue(&hadc1);
 | 
			
		||||
	return HAL_ADC_GetValue(&hadc1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int DNI_convert_to_celsius(int value)
 | 
			
		||||
static int DNI_convert_to_celsius(uint32_t value)
 | 
			
		||||
{
 | 
			
		||||
	return (2512 - value) << 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int DNI_convert_to_fahrenheit(uint32_t value)
 | 
			
		||||
{
 | 
			
		||||
	return (2953 - value) * 50 / 7;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void DNI_print(int temperature)
 | 
			
		||||
{
 | 
			
		||||
	int add_sign = temperature < 0;
 | 
			
		||||
@ -48,68 +50,49 @@ static void DNI_print(int temperature)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (add_sign) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 9);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('-');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void DNI_print_celsius(int temperature)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 15);
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 7);
 | 
			
		||||
	DISPLAY_SET_DECREMENT;
 | 
			
		||||
	display_write_data_seq("C ");
 | 
			
		||||
 | 
			
		||||
	DNI_print(temperature);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void print_ok(void)
 | 
			
		||||
static void DNI_print_fahrenheit(int temperature)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
	DISPLAY_SET_INCREMENT;
 | 
			
		||||
	display_write_data_seq("OK");
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 7);
 | 
			
		||||
	DISPLAY_SET_DECREMENT;
 | 
			
		||||
	display_write_data_seq("F ");
 | 
			
		||||
 | 
			
		||||
	DNI_print(temperature);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void print_error(int err_code)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
	DISPLAY_SET_INCREMENT;
 | 
			
		||||
 | 
			
		||||
	switch (err_code) {
 | 
			
		||||
	case HAL_OK:
 | 
			
		||||
		break;
 | 
			
		||||
	case HAL_ERROR:
 | 
			
		||||
		display_write_data_seq("HAL_ERROR");
 | 
			
		||||
		break;
 | 
			
		||||
	case HAL_BUSY:
 | 
			
		||||
		display_write_data_seq("HAL_BUSY");
 | 
			
		||||
		break;
 | 
			
		||||
	case HAL_TIMEOUT:
 | 
			
		||||
		display_write_data_seq("HAL_TIMEOUT");
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		display_write_data_seq("WRONG ERROR");
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DNI_show_celsius(void)
 | 
			
		||||
void DNI_show_celsius(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	DISPLAY_SET_INCREMENT;
 | 
			
		||||
 | 
			
		||||
	display_write_data_seq("DNI Temperature");
 | 
			
		||||
 | 
			
		||||
	int value = DNI_read();
 | 
			
		||||
 | 
			
		||||
	if (value < 0) {
 | 
			
		||||
		print_error(-value);
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		int temp = DNI_convert_to_celsius(value);
 | 
			
		||||
		DNI_print_celsius(temp);
 | 
			
		||||
 | 
			
		||||
		print_ok();
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	uint32_t value = DNI_read();
 | 
			
		||||
	int temp = DNI_convert_to_celsius(value);
 | 
			
		||||
	DNI_print_celsius(temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DNI_show_fahrenheit(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	DISPLAY_SET_INCREMENT;
 | 
			
		||||
 | 
			
		||||
	display_write_data_seq("DNI Temperature");
 | 
			
		||||
 | 
			
		||||
	uint32_t value = DNI_read();
 | 
			
		||||
	int temp = DNI_convert_to_fahrenheit(value);
 | 
			
		||||
	DNI_print_fahrenheit(temp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,138 +0,0 @@
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "lcd.h"
 | 
			
		||||
#include "KSZ8081RND.h"
 | 
			
		||||
 | 
			
		||||
#define RW_TIMEOUT_US 500000
 | 
			
		||||
 | 
			
		||||
extern TIM_HandleTypeDef htim2;
 | 
			
		||||
 | 
			
		||||
int KSZ8081RND_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("KSZ8081RND ETH");
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
 | 
			
		||||
	// enable clocks
 | 
			
		||||
	__HAL_RCC_ETH_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
	__HAL_RCC_GPIOC_CLK_ENABLE();
 | 
			
		||||
	__HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
	__HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
	// configure pins
 | 
			
		||||
	GPIO_InitTypeDef GPIO_InitStruct = {};
 | 
			
		||||
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
	GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
 | 
			
		||||
	HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
	GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
 | 
			
		||||
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
 | 
			
		||||
	GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
 | 
			
		||||
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	// hardware reset KSZ8081RND
 | 
			
		||||
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET);
 | 
			
		||||
	HAL_Delay(10);
 | 
			
		||||
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET);
 | 
			
		||||
	HAL_Delay(10);
 | 
			
		||||
 | 
			
		||||
	// enable PLL and REF_CLK output from KSZ8081RND
 | 
			
		||||
	uint16_t r;
 | 
			
		||||
 | 
			
		||||
	if (ReadRegister(0x1F, &r)) {
 | 
			
		||||
		display_write_data_seq("READ ERROR");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	r |= (1 << 7);
 | 
			
		||||
 | 
			
		||||
	if (WriteRegister(0x1F, r)) {
 | 
			
		||||
		display_write_data_seq("WRITE ERROR");
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// switch MAC to RMII interface
 | 
			
		||||
	__HAL_RCC_SYSCFG_CLK_ENABLE();
 | 
			
		||||
	SYSCFG->PMC |= (1 << 23);
 | 
			
		||||
	(void)SYSCFG->PMC;
 | 
			
		||||
 | 
			
		||||
	// check if software reset happens on MAC
 | 
			
		||||
	TIM2->CNT = 0;
 | 
			
		||||
 | 
			
		||||
	ETH->DMABMR |= 1; // assert software reset
 | 
			
		||||
	HAL_TIM_Base_Start(&htim2);
 | 
			
		||||
 | 
			
		||||
	while (ETH->DMABMR & 1) {
 | 
			
		||||
		if (TIM2->CNT > (500000 << 4)) {
 | 
			
		||||
			// MAC software reset timed out -> no REF_CLK output from PHY?
 | 
			
		||||
			HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
			display_write_data_seq("SR ERROR");
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
	display_write_data_seq("OK");
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ReadRegister(uint32_t reg, uint16_t *value)
 | 
			
		||||
{
 | 
			
		||||
	uint16_t tmpreg1;
 | 
			
		||||
 | 
			
		||||
	tmpreg1 = (reg << 6);
 | 
			
		||||
	tmpreg1 |= 1;
 | 
			
		||||
 | 
			
		||||
	ETH->MACMIIAR = tmpreg1;
 | 
			
		||||
 | 
			
		||||
	TIM2->CNT = 0;
 | 
			
		||||
	HAL_TIM_Base_Start(&htim2);
 | 
			
		||||
 | 
			
		||||
	while (ETH->MACMIIAR & 1) {
 | 
			
		||||
		if (TIM2->CNT > (RW_TIMEOUT_US << 4)) {
 | 
			
		||||
			HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
	*value = (uint16_t) (ETH->MACMIIDR);
 | 
			
		||||
	return HAL_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int WriteRegister(uint32_t reg, uint16_t value)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t tmpreg1;
 | 
			
		||||
 | 
			
		||||
	tmpreg1 = (reg << 6);
 | 
			
		||||
	tmpreg1 |= 3;
 | 
			
		||||
 | 
			
		||||
	ETH->MACMIIDR = value;
 | 
			
		||||
	ETH->MACMIIAR = tmpreg1;
 | 
			
		||||
 | 
			
		||||
	TIM2->CNT = 0;
 | 
			
		||||
	HAL_TIM_Base_Start(&htim2);
 | 
			
		||||
 | 
			
		||||
	while (ETH->MACMIIAR & 1) {
 | 
			
		||||
		if (TIM2->CNT > (RW_TIMEOUT_US << 4)) {
 | 
			
		||||
			HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -33,7 +33,7 @@ static void print_error_message(HAL_StatusTypeDef result, size_t *err_count, siz
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LIS302DL Accel ");
 | 
			
		||||
	display_write_data_seq(postfix);
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
	display_write_data_seq(prefix);
 | 
			
		||||
	display_write_data_byte(' ');
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,7 @@ static void retrieve_data(size_t *err_count, uint8_t *data_xyz, char *postfix)
 | 
			
		||||
	FAILSAFE_POST_OP("RZ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int LIS302DL_run_test(void)
 | 
			
		||||
void LIS302DL_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LIS302DL Accel");
 | 
			
		||||
@ -125,21 +125,17 @@ int LIS302DL_run_test(void)
 | 
			
		||||
 | 
			
		||||
	// print the execution stats
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		display_write_data_byte('0' + (err_count / 10) % 10);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + err_count / 10 % 10);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq(" errs");
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int LIS302DL_run_test_dynamic(void)
 | 
			
		||||
void LIS302DL_run_test_dynamic(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LIS302DL Accel D");
 | 
			
		||||
@ -152,23 +148,19 @@ int LIS302DL_run_test_dynamic(void)
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LIS302DL Accel D");
 | 
			
		||||
 | 
			
		||||
	// output retrieved values
 | 
			
		||||
	print_at(data_xyz[2], 14);
 | 
			
		||||
	print_at(data_xyz[1], 11);
 | 
			
		||||
	print_at(data_xyz[0], 8);
 | 
			
		||||
 | 
			
		||||
	// print the execution stats
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + err_count / 10 % 10);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq(" errs");
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		// output retrieved values
 | 
			
		||||
		print_at(data_xyz[2], 14);
 | 
			
		||||
		print_at(data_xyz[1], 11);
 | 
			
		||||
		print_at(data_xyz[0], 8);
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -10,7 +10,7 @@ extern I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
static void print_error_message(HAL_StatusTypeDef result, size_t *err_count, size_t t, char *prefix)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
	display_write_data_seq(prefix);
 | 
			
		||||
	display_write_data_byte(' ');
 | 
			
		||||
 | 
			
		||||
@ -32,6 +32,8 @@ static void print_error_message(HAL_StatusTypeDef result, size_t *err_count, siz
 | 
			
		||||
		display_write_data_seq("TIMEOUT");
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HAL_Delay(1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void print_error_accel(HAL_StatusTypeDef result, size_t *err_count, size_t t, char *prefix)
 | 
			
		||||
@ -50,7 +52,7 @@ static void print_error_magnet(HAL_StatusTypeDef result, size_t *err_count, size
 | 
			
		||||
	print_error_message(result, err_count, t, prefix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int LSM9DS1_test_accel(void)
 | 
			
		||||
void LSM9DS1_test_accel(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LSM9DS1 Accel");
 | 
			
		||||
@ -80,12 +82,13 @@ int LSM9DS1_test_accel(void)
 | 
			
		||||
	FAILSAFE_POST_OP_ACCEL("R");
 | 
			
		||||
 | 
			
		||||
	if (!err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		return 1;
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + ((err_count / 10) % 10));
 | 
			
		||||
		display_write_data_byte('0' + (err_count % 10));
 | 
			
		||||
		display_write_data_seq(" errors");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -96,7 +99,7 @@ void LSM9DS1_cleanup_accel(void)
 | 
			
		||||
	HAL_I2C_Master_Transmit(&hi2c1, 0xD6, buffer, 2, 1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int LSM9DS1_test_magnet(void)
 | 
			
		||||
void LSM9DS1_test_magnet(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("LSM9DS1 Magnet");
 | 
			
		||||
@ -117,11 +120,12 @@ int LSM9DS1_test_magnet(void)
 | 
			
		||||
	FAILSAFE_POST_OP_MAGNET("R");
 | 
			
		||||
 | 
			
		||||
	if (!err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		return 1;
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + ((err_count / 10) % 10));
 | 
			
		||||
		display_write_data_byte('0' + (err_count % 10));
 | 
			
		||||
		display_write_data_seq(" errors");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,12 +4,9 @@
 | 
			
		||||
 | 
			
		||||
#define SAMPLE_AMOUNT 256
 | 
			
		||||
 | 
			
		||||
struct TestResult {
 | 
			
		||||
	unsigned int lo_present:1;
 | 
			
		||||
	unsigned int hi_present:1;
 | 
			
		||||
};
 | 
			
		||||
extern I2S_HandleTypeDef hi2s2;
 | 
			
		||||
 | 
			
		||||
int MP45DT02_run_test(void)
 | 
			
		||||
void MP45DT02_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("MP45DT02 Mic");
 | 
			
		||||
@ -17,67 +14,40 @@ int MP45DT02_run_test(void)
 | 
			
		||||
	uint16_t sample_buffer[SAMPLE_AMOUNT];
 | 
			
		||||
 | 
			
		||||
	for (size_t t = 0; t < 5; t++) {
 | 
			
		||||
		// gather samples
 | 
			
		||||
		register unsigned int reset_value = (GPIO_PIN_10 << 16);
 | 
			
		||||
		HAL_I2S_Receive(&hi2s2, sample_buffer, SAMPLE_AMOUNT, 1000);
 | 
			
		||||
 | 
			
		||||
		for (size_t i = 0; i < SAMPLE_AMOUNT; i++) {
 | 
			
		||||
			sample_buffer[i] = 0;
 | 
			
		||||
			for (size_t j = 0; j < 16; j++) {
 | 
			
		||||
				for (int k = 0; k < 16; k++) {
 | 
			
		||||
					GPIOB->BSRR = reset_value;
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					asm("nop");
 | 
			
		||||
					GPIOB->BSRR = GPIO_PIN_10;
 | 
			
		||||
				}
 | 
			
		||||
				sample_buffer[i] <<= 1;
 | 
			
		||||
				sample_buffer[i] |= (GPIOC->IDR & (1 << 3)) >> 3;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		struct TestResult res = {};
 | 
			
		||||
 | 
			
		||||
		// look for zeros
 | 
			
		||||
		for (size_t i = 0; i < SAMPLE_AMOUNT / 2; i++)
 | 
			
		||||
			if (~((uint32_t *) sample_buffer)[i]) {
 | 
			
		||||
				res.lo_present = 1;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		// look for ones
 | 
			
		||||
		for (size_t i = 0; i < SAMPLE_AMOUNT / 2; i++)
 | 
			
		||||
			if (((uint32_t *) sample_buffer)[i]) {
 | 
			
		||||
				res.hi_present = 1;
 | 
			
		||||
				break;
 | 
			
		||||
				DISPLAY_CLEAR;
 | 
			
		||||
				display_write_data_seq("MP45DT02 Mic");
 | 
			
		||||
 | 
			
		||||
				if (!t) {
 | 
			
		||||
					DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
					display_write_data_seq("OK");
 | 
			
		||||
				} else {
 | 
			
		||||
					DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
					display_write_data_byte('0' + t);
 | 
			
		||||
					display_write_data_seq(" full 0 samples");
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		// if ended up here, then no samples equaled to 1; that is not a good sign
 | 
			
		||||
		DISPLAY_CLEAR;
 | 
			
		||||
		display_write_data_seq("MP45DT02 Mic");
 | 
			
		||||
 | 
			
		||||
		if (t) {
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 14);
 | 
			
		||||
			display_write_data_byte('T');
 | 
			
		||||
			display_write_data_byte('0' + t + 1);
 | 
			
		||||
		}
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('1' + t);
 | 
			
		||||
		display_write_data_seq("/5: no 1 sampled");
 | 
			
		||||
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		if (res.lo_present & res.hi_present) {
 | 
			
		||||
			display_write_data_seq("OK");
 | 
			
		||||
			return 0;
 | 
			
		||||
		} else if (res.lo_present) {
 | 
			
		||||
			display_write_data_seq("ALWAYS LO");
 | 
			
		||||
		} else if (res.hi_present) {
 | 
			
		||||
			display_write_data_seq("ALWAYS HI");
 | 
			
		||||
		}
 | 
			
		||||
		HAL_Delay(1000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
	// t = 5, not a single 1 was recorded; microphone might be broken
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("MP45DT02 Mic");
 | 
			
		||||
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
	display_write_data_seq("No good samples!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
extern I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
int PCA9685_run_test(void)
 | 
			
		||||
void PCA9685_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("PCA9685 PWM");
 | 
			
		||||
@ -30,7 +30,7 @@ int PCA9685_run_test(void)
 | 
			
		||||
 | 
			
		||||
				DISPLAY_CLEAR;
 | 
			
		||||
				display_write_data_seq("PCA9685 PWM");
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
 | 
			
		||||
				display_write_data_seq("B");
 | 
			
		||||
				display_write_data_byte('0' + i);
 | 
			
		||||
@ -64,17 +64,13 @@ int PCA9685_run_test(void)
 | 
			
		||||
	display_write_data_seq("PCA9685 PWM");
 | 
			
		||||
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
		display_write_data_byte('0' + err_count / 10 % 10);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq(" errors");
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
 | 
			
		||||
		return 0;
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK  OUT ENABLED");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,14 +4,13 @@
 | 
			
		||||
 | 
			
		||||
extern SPI_HandleTypeDef hspi1;
 | 
			
		||||
 | 
			
		||||
int SST25VF016B_run_test(void)
 | 
			
		||||
void SST25VF016B_run_test(void)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
	display_write_data_seq("SST25VF016B Flas");
 | 
			
		||||
 | 
			
		||||
	HAL_StatusTypeDef op_result;
 | 
			
		||||
	size_t err_count = 0;
 | 
			
		||||
	size_t chip_id_fault = 0;
 | 
			
		||||
 | 
			
		||||
	uint8_t tx_buffer[8] = {0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 | 
			
		||||
	uint8_t rx_buffer[9];
 | 
			
		||||
@ -30,7 +29,7 @@ int SST25VF016B_run_test(void)
 | 
			
		||||
			DISPLAY_CLEAR;
 | 
			
		||||
			display_write_data_seq("SST25VF016B Flas");
 | 
			
		||||
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
			DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
			display_write_data_byte('1' + t);
 | 
			
		||||
			display_write_data_seq("/5 ");
 | 
			
		||||
 | 
			
		||||
@ -47,6 +46,8 @@ int SST25VF016B_run_test(void)
 | 
			
		||||
				display_write_data_seq("TIMEOUT");
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			HAL_Delay(2000);
 | 
			
		||||
		} else {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
@ -58,22 +59,17 @@ int SST25VF016B_run_test(void)
 | 
			
		||||
	display_write_data_seq("SST25VF016B Flas");
 | 
			
		||||
 | 
			
		||||
	if (err_count) {
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_byte('0' + err_count % 10);
 | 
			
		||||
		display_write_data_seq(" Errors");
 | 
			
		||||
 | 
			
		||||
		return 1;
 | 
			
		||||
	} else {
 | 
			
		||||
		for (size_t i = 0; i < 4; i += 2) {
 | 
			
		||||
			// odd reads MUST result in 0xBF
 | 
			
		||||
			if (rx_buffer[4+i] != 0xBF) {
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
				display_write_data_byte('B');
 | 
			
		||||
				display_write_data_byte('1'+i);
 | 
			
		||||
				display_write_data_seq(" WRONG");
 | 
			
		||||
 | 
			
		||||
				chip_id_fault = 1;
 | 
			
		||||
 | 
			
		||||
				goto write_retrieved_data;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -81,18 +77,15 @@ int SST25VF016B_run_test(void)
 | 
			
		||||
		for (size_t i = 1; i < 4; i += 2) {
 | 
			
		||||
			// even reads MUST result in 0x41
 | 
			
		||||
			if (rx_buffer[4+i] != 0x41) {
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
				DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
				display_write_data_byte('B');
 | 
			
		||||
				display_write_data_byte('1'+i);
 | 
			
		||||
				display_write_data_seq(" WRONG");
 | 
			
		||||
 | 
			
		||||
				chip_id_fault = 1;
 | 
			
		||||
 | 
			
		||||
				goto write_retrieved_data;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 4);
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
		display_write_data_seq("OK");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -101,6 +94,4 @@ int SST25VF016B_run_test(void)
 | 
			
		||||
	display_write_data_seq((char *) &(rx_buffer[4]));
 | 
			
		||||
 | 
			
		||||
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
	return (err_count || chip_id_fault);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										114
									
								
								Core/Src/lcd.c
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								Core/Src/lcd.c
									
									
									
									
									
								
							@ -2,45 +2,22 @@
 | 
			
		||||
#include "lcd.h"
 | 
			
		||||
#include "generic_macros.h"
 | 
			
		||||
 | 
			
		||||
static char display_framebuffer[16*2*DISPLAY_FRAMES_AVAILABLE];
 | 
			
		||||
size_t display_current_frame;
 | 
			
		||||
static size_t display_framebuffer_mode;
 | 
			
		||||
 | 
			
		||||
static struct Display_emu_state des;
 | 
			
		||||
 | 
			
		||||
void display_init(void)
 | 
			
		||||
{
 | 
			
		||||
	// prepare virtual framebuffer
 | 
			
		||||
	display_current_frame = 0;
 | 
			
		||||
	display_framebuffer_mode = 0;
 | 
			
		||||
	des.cursor_offset = 0;
 | 
			
		||||
	des.next = 0;
 | 
			
		||||
	memset(display_framebuffer, 0x20, 16*2*DISPLAY_FRAMES_AVAILABLE);
 | 
			
		||||
 | 
			
		||||
	// switch to 4-bit 2-line mode
 | 
			
		||||
	display_write_instruction_byte(0x28);
 | 
			
		||||
	  display_write_instruction_byte(0x28);
 | 
			
		||||
 | 
			
		||||
	// clear display
 | 
			
		||||
	display_write_instruction_byte(0x01);
 | 
			
		||||
	  // clear display
 | 
			
		||||
	  display_write_instruction_byte(0x01);
 | 
			
		||||
 | 
			
		||||
	// enable display
 | 
			
		||||
	display_write_instruction_byte(0x0C);
 | 
			
		||||
	  // enable display
 | 
			
		||||
	  display_write_instruction_byte(0x0C);
 | 
			
		||||
 | 
			
		||||
	// move cursor to first line
 | 
			
		||||
	display_write_instruction_byte(0x80);
 | 
			
		||||
	  // move cursor to first line
 | 
			
		||||
	  display_write_instruction_byte(0x80);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_to_framebuffer(void)
 | 
			
		||||
{
 | 
			
		||||
	display_framebuffer_mode = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_to_direct(void)
 | 
			
		||||
{
 | 
			
		||||
	display_framebuffer_mode = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint8_t display_read_status(void)
 | 
			
		||||
uint8_t display_read_status(void)
 | 
			
		||||
{
 | 
			
		||||
	// make sure GPIOE is in correct mode
 | 
			
		||||
	GPIOE->MODER = 0x00504000;
 | 
			
		||||
@ -66,7 +43,7 @@ static uint8_t display_read_status(void)
 | 
			
		||||
	return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void display_write_instruction_byte_direct(uint8_t code)
 | 
			
		||||
void display_write_instruction_byte(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_POLL_UNTIL_READY;
 | 
			
		||||
 | 
			
		||||
@ -85,37 +62,7 @@ static void display_write_instruction_byte_direct(uint8_t code)
 | 
			
		||||
	GPIOE->BSRR = (DISPLAY_ENA << 16);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void display_write_instruction_byte_framebuffer(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	// emulate physical display behavior on receiving instructions
 | 
			
		||||
	if (code & 0x80) {
 | 
			
		||||
		// decode new cursor offset
 | 
			
		||||
		size_t offset = ((code & 0x40) >> 2) | (code & 0xF);
 | 
			
		||||
		des.cursor_offset = offset;
 | 
			
		||||
	} else if (code == 0x01) {
 | 
			
		||||
		// reset screen
 | 
			
		||||
		memset(&(display_framebuffer[16*2*display_current_frame]), 0x20, 16*2);
 | 
			
		||||
		des.cursor_offset = 0;
 | 
			
		||||
		des.next = 0;
 | 
			
		||||
	} else if (code == 0x06) {
 | 
			
		||||
		// set increment mode
 | 
			
		||||
		des.next = 0;
 | 
			
		||||
	} else if (code == 0x04) {
 | 
			
		||||
		// set decrement mode
 | 
			
		||||
		des.next = 1;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_write_instruction_byte(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	if (display_framebuffer_mode) {
 | 
			
		||||
		display_write_instruction_byte_framebuffer(code);
 | 
			
		||||
	} else {
 | 
			
		||||
		display_write_instruction_byte_direct(code);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void display_write_data_byte_direct(uint8_t code)
 | 
			
		||||
void display_write_data_byte(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	DISPLAY_POLL_UNTIL_READY;
 | 
			
		||||
 | 
			
		||||
@ -134,51 +81,12 @@ static void display_write_data_byte_direct(uint8_t code)
 | 
			
		||||
	GPIOE->BSRR = DISPLAY_ENA << 16;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void display_write_data_byte_framebuffer(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	if (display_current_frame >= DISPLAY_FRAMES_AVAILABLE)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (((int) des.cursor_offset >= 32) || ((int) des.cursor_offset < 0))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	display_framebuffer[16*2*display_current_frame + des.cursor_offset] = (char) code;
 | 
			
		||||
	des.cursor_offset += des.next ? -1 : 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_write_data_byte(uint8_t code)
 | 
			
		||||
{
 | 
			
		||||
	if (display_framebuffer_mode) {
 | 
			
		||||
		display_write_data_byte_framebuffer(code);
 | 
			
		||||
	} else {
 | 
			
		||||
		display_write_data_byte_direct(code);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_write_data_seq(char *codes)
 | 
			
		||||
{
 | 
			
		||||
	for (size_t i = 0; i < 16; i++) {
 | 
			
		||||
		if (codes[i])
 | 
			
		||||
		if (codes[i] != 0)
 | 
			
		||||
			display_write_data_byte(codes[i]);
 | 
			
		||||
		else
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void display_load(uint32_t frame_no)
 | 
			
		||||
{
 | 
			
		||||
	if (display_framebuffer_mode)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	DISPLAY_CLEAR;
 | 
			
		||||
 | 
			
		||||
	for (uint32_t i = 0; i < 16; i++) {
 | 
			
		||||
		display_write_data_byte_direct(display_framebuffer[16*2*display_current_frame + i]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
 | 
			
		||||
	for (uint32_t i = 0; i < 16; i++) {
 | 
			
		||||
		display_write_data_byte_direct(display_framebuffer[16*2*display_current_frame + i + 16]);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										384
									
								
								Core/Src/main.c
									
									
									
									
									
								
							
							
						
						
									
										384
									
								
								Core/Src/main.c
									
									
									
									
									
								
							@ -30,10 +30,9 @@
 | 
			
		||||
#include "CS43L22.h"
 | 
			
		||||
#include "SST25VF016B.h"
 | 
			
		||||
#include "LIS302DL.h"
 | 
			
		||||
#include "DHT11.h"
 | 
			
		||||
#include "MP45DT02.h"
 | 
			
		||||
#include "LSM9DS1.h"
 | 
			
		||||
#include "DHT11.h"
 | 
			
		||||
#include "KSZ8081RND.h"
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
@ -48,17 +47,6 @@
 | 
			
		||||
#define WAIT_UNTIL_CB_PRESSED while (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) && HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8))
 | 
			
		||||
#define WAIT_UNTIL_CB_RELEASED while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) || !HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8))
 | 
			
		||||
 | 
			
		||||
#define UB (GPIOA->IDR & GPIO_PIN_0)
 | 
			
		||||
#define SWT1 !(GPIOC->IDR & GPIO_PIN_11)
 | 
			
		||||
#define SWT2 !(GPIOA->IDR & GPIO_PIN_15)
 | 
			
		||||
#define SWT3 !(GPIOC->IDR & GPIO_PIN_9)
 | 
			
		||||
#define SWT4 !(GPIOC->IDR & GPIO_PIN_6)
 | 
			
		||||
#define SWT5 !(GPIOC->IDR & GPIO_PIN_8)
 | 
			
		||||
 | 
			
		||||
#define WAIT_UNTIL_ALL_BUTTONS_RELEASED do {} while ( UB || SWT1 || SWT2 || SWT3 || SWT4 || SWT5 )
 | 
			
		||||
 | 
			
		||||
#define LEN(x) ( sizeof(x) / sizeof((x)[0]) )
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PD */
 | 
			
		||||
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
@ -71,29 +59,31 @@ ADC_HandleTypeDef hadc1;
 | 
			
		||||
 | 
			
		||||
I2C_HandleTypeDef hi2c1;
 | 
			
		||||
 | 
			
		||||
I2S_HandleTypeDef hi2s2;
 | 
			
		||||
 | 
			
		||||
SPI_HandleTypeDef hspi1;
 | 
			
		||||
 | 
			
		||||
TIM_HandleTypeDef htim2;
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
extern size_t display_current_frame;
 | 
			
		||||
 | 
			
		||||
static const int ((*executors[])(void)) = {
 | 
			
		||||
void ((*executors[])(void)) = {
 | 
			
		||||
		DNI_show_celsius,
 | 
			
		||||
		DNI_show_fahrenheit,
 | 
			
		||||
		PCA9685_run_test,
 | 
			
		||||
		EEPROM_24AA02E48_run_test,
 | 
			
		||||
		CS43L22_run_test,
 | 
			
		||||
		SST25VF016B_run_test,
 | 
			
		||||
		LIS302DL_run_test,
 | 
			
		||||
		LIS302DL_run_test_dynamic,
 | 
			
		||||
		MP45DT02_run_test,
 | 
			
		||||
		LSM9DS1_test_accel,
 | 
			
		||||
		LSM9DS1_test_magnet,
 | 
			
		||||
		DHT11_run_test,
 | 
			
		||||
		KSZ8081RND_run_test
 | 
			
		||||
		DHT11_run_test
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const void ((*cleanup_functions[])(void)) = {
 | 
			
		||||
void ((*cleanup_functions[])(void)) = {
 | 
			
		||||
		NULL,
 | 
			
		||||
		NULL,
 | 
			
		||||
		PCA9685_cleanup,
 | 
			
		||||
		NULL,
 | 
			
		||||
@ -101,13 +91,30 @@ static const void ((*cleanup_functions[])(void)) = {
 | 
			
		||||
		NULL,
 | 
			
		||||
		NULL,
 | 
			
		||||
		NULL,
 | 
			
		||||
		LSM9DS1_cleanup_accel,
 | 
			
		||||
		NULL,
 | 
			
		||||
		LSM9DS1_cleanup_accel,
 | 
			
		||||
		NULL,
 | 
			
		||||
		NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
unsigned int eth_errorred = 0;
 | 
			
		||||
int delay_between_runs[] = {
 | 
			
		||||
		250,
 | 
			
		||||
		250,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		200,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1,
 | 
			
		||||
		-1
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
size_t current_executor_id = 11;
 | 
			
		||||
 | 
			
		||||
size_t buttons_interrupt_enabled;
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PV */
 | 
			
		||||
 | 
			
		||||
@ -118,6 +125,7 @@ static void MX_ADC1_Init(void);
 | 
			
		||||
static void MX_I2C1_Init(void);
 | 
			
		||||
static void MX_SPI1_Init(void);
 | 
			
		||||
static void MX_TIM2_Init(void);
 | 
			
		||||
static void MX_I2S2_Init(void);
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
@ -125,6 +133,132 @@ static void MX_TIM2_Init(void);
 | 
			
		||||
/* Private user code ---------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN 0 */
 | 
			
		||||
 | 
			
		||||
void switch_to_next_test(void)
 | 
			
		||||
{
 | 
			
		||||
	current_executor_id += 1;
 | 
			
		||||
	current_executor_id %= 12;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void buttons_switch_to_interrupt(void)
 | 
			
		||||
{
 | 
			
		||||
	// save current executor ID
 | 
			
		||||
	size_t tmp = current_executor_id;
 | 
			
		||||
 | 
			
		||||
	// configure user button
 | 
			
		||||
	GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_0;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
 | 
			
		||||
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);
 | 
			
		||||
 | 
			
		||||
	// configure SW5 (alternative advancing method)
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_8;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
 | 
			
		||||
	HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
 | 
			
		||||
 | 
			
		||||
	// restore current executor ID
 | 
			
		||||
	current_executor_id = tmp;
 | 
			
		||||
 | 
			
		||||
	// set interrupt mode flag
 | 
			
		||||
	buttons_interrupt_enabled = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void buttons_switch_to_input(void)
 | 
			
		||||
{
 | 
			
		||||
	// configure user button
 | 
			
		||||
	GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_0;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	HAL_NVIC_DisableIRQ(EXTI0_IRQn);
 | 
			
		||||
 | 
			
		||||
	// configure SW5 (alternative input method)
 | 
			
		||||
	GPIO_InitStruct.Pin = GPIO_PIN_8;
 | 
			
		||||
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
	HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
	HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
 | 
			
		||||
 | 
			
		||||
	// clear interrupt mode flag
 | 
			
		||||
	buttons_interrupt_enabled = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void button_init_and_test(void)
 | 
			
		||||
{
 | 
			
		||||
	// letting the buttons be tested
 | 
			
		||||
	display_write_data_seq("Fill any bar:");
 | 
			
		||||
	DISPLAY_SET_CURSOR(1, 5);
 | 
			
		||||
	display_write_data_seq("[-] [-----]");
 | 
			
		||||
 | 
			
		||||
	size_t pressed_elements;
 | 
			
		||||
 | 
			
		||||
	uint32_t sw_button_locations[5][2] = {
 | 
			
		||||
			{GPIOC, GPIO_PIN_11},
 | 
			
		||||
			{GPIOA, GPIO_PIN_15},
 | 
			
		||||
			{GPIOC, GPIO_PIN_9},
 | 
			
		||||
			{GPIOC, GPIO_PIN_6},
 | 
			
		||||
			{GPIOC, GPIO_PIN_8}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		HAL_Delay(100);
 | 
			
		||||
		pressed_elements = 0;
 | 
			
		||||
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 6);
 | 
			
		||||
 | 
			
		||||
		if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) {
 | 
			
		||||
			pressed_elements |= 0x20;
 | 
			
		||||
			display_write_data_byte('*');
 | 
			
		||||
		} else {
 | 
			
		||||
			display_write_data_byte('-');
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		DISPLAY_SET_CURSOR(1, 10);
 | 
			
		||||
 | 
			
		||||
		for (size_t i = 0; i < 5; i++) {
 | 
			
		||||
			pressed_elements >>= 1;
 | 
			
		||||
 | 
			
		||||
			size_t input = !HAL_GPIO_ReadPin(sw_button_locations[i][0], sw_button_locations[i][1]);
 | 
			
		||||
 | 
			
		||||
			if (input) {
 | 
			
		||||
				pressed_elements |= 0x20;
 | 
			
		||||
				display_write_data_byte('*');
 | 
			
		||||
			} else {
 | 
			
		||||
				display_write_data_byte('-');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} while (!(((pressed_elements & 0x1) == 0x1) || ((pressed_elements & 0x3E) == 0x3E)));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// visual reaction to bar fill
 | 
			
		||||
	DISPLAY_SET_CURSOR(0, 0);
 | 
			
		||||
	display_write_data_seq("Release buttons");
 | 
			
		||||
 | 
			
		||||
	GPIOD->ODR = 0x1000;
 | 
			
		||||
	HAL_Delay(500);
 | 
			
		||||
	GPIOD->ODR = 0x2000;
 | 
			
		||||
	HAL_Delay(500);
 | 
			
		||||
	GPIOD->ODR = 0x4000;
 | 
			
		||||
	HAL_Delay(500);
 | 
			
		||||
	GPIOD->ODR = 0x8000;
 | 
			
		||||
	HAL_Delay(500);
 | 
			
		||||
 | 
			
		||||
	// waiting for control buttons to be released
 | 
			
		||||
	WAIT_UNTIL_CB_RELEASED;
 | 
			
		||||
	GPIOD->ODR = 0x0000;
 | 
			
		||||
	HAL_Delay(200);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -160,114 +294,49 @@ int main(void)
 | 
			
		||||
  MX_I2C1_Init();
 | 
			
		||||
  MX_SPI1_Init();
 | 
			
		||||
  MX_TIM2_Init();
 | 
			
		||||
  MX_I2S2_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  buttons_interrupt_enabled = 0;
 | 
			
		||||
 | 
			
		||||
  GPIOD->BSRR = 0x1000;
 | 
			
		||||
  HAL_TIM_Base_Start(&htim2);
 | 
			
		||||
  TIM2->CNT = 0;
 | 
			
		||||
  HAL_TIM_Base_Stop(&htim2);
 | 
			
		||||
 | 
			
		||||
  GPIOD->ODR = 0x1000;
 | 
			
		||||
  display_init();
 | 
			
		||||
 | 
			
		||||
  GPIOD->BSRR = 0xF000;
 | 
			
		||||
 | 
			
		||||
  // perform all tests
 | 
			
		||||
  size_t successful_tests = 0;
 | 
			
		||||
  size_t failed_tests = 0;
 | 
			
		||||
 | 
			
		||||
  const int test_amount = LEN(executors);
 | 
			
		||||
 | 
			
		||||
  for (display_current_frame = 1; display_current_frame < LEN(executors)+1; display_current_frame++)
 | 
			
		||||
  {
 | 
			
		||||
	  DISPLAY_CLEAR;
 | 
			
		||||
	  display_write_data_seq("Testing...");
 | 
			
		||||
 | 
			
		||||
	  DISPLAY_SET_CURSOR(1, 2);
 | 
			
		||||
	  display_write_data_seq("P:");
 | 
			
		||||
	  display_write_data_byte('0' + (successful_tests / 10) % 10);
 | 
			
		||||
	  display_write_data_byte('0' + (successful_tests) % 10);
 | 
			
		||||
 | 
			
		||||
	  DISPLAY_SET_CURSOR(1, 10);
 | 
			
		||||
	  display_write_data_seq("F:");
 | 
			
		||||
	  display_write_data_byte('0' + (failed_tests / 10) % 10);
 | 
			
		||||
	  display_write_data_byte('0' + (failed_tests) % 10);
 | 
			
		||||
 | 
			
		||||
	  display_to_framebuffer();
 | 
			
		||||
 | 
			
		||||
	  // test
 | 
			
		||||
	  if (executors[display_current_frame-1]())
 | 
			
		||||
		  failed_tests++;
 | 
			
		||||
	  else
 | 
			
		||||
		  successful_tests++;
 | 
			
		||||
 | 
			
		||||
	  // cleanup (if required)
 | 
			
		||||
	  if (cleanup_functions[display_current_frame-1])
 | 
			
		||||
		  cleanup_functions[display_current_frame-1]();
 | 
			
		||||
 | 
			
		||||
	  // write test number tag onto this framebuffer
 | 
			
		||||
	  DISPLAY_SET_CURSOR(1, 0);
 | 
			
		||||
	  DISPLAY_SET_INCREMENT;
 | 
			
		||||
	  display_write_data_byte('T');
 | 
			
		||||
	  display_write_data_byte('0' + (display_current_frame / 10) % 10);
 | 
			
		||||
	  display_write_data_byte('0' + display_current_frame % 10);
 | 
			
		||||
 | 
			
		||||
	  display_to_direct();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // render final result to first framebuffer
 | 
			
		||||
  display_to_framebuffer();
 | 
			
		||||
  display_current_frame = 0;
 | 
			
		||||
 | 
			
		||||
  DISPLAY_CLEAR;
 | 
			
		||||
  if (successful_tests == LEN(executors))
 | 
			
		||||
	  display_write_data_seq("All tests done!");
 | 
			
		||||
  else
 | 
			
		||||
	  display_write_data_seq("Failures found!");
 | 
			
		||||
 | 
			
		||||
  DISPLAY_SET_CURSOR(1, 1);
 | 
			
		||||
  display_write_data_seq("PASSED   /");
 | 
			
		||||
 | 
			
		||||
  DISPLAY_SET_CURSOR(1, 8);
 | 
			
		||||
  display_write_data_byte('0' + (successful_tests / 10) % 10);
 | 
			
		||||
  display_write_data_byte('0' + successful_tests % 10);
 | 
			
		||||
 | 
			
		||||
  DISPLAY_SET_CURSOR(1, 11);
 | 
			
		||||
  display_write_data_byte('0' + (test_amount / 10) % 10);
 | 
			
		||||
  display_write_data_byte('0' + test_amount % 10);
 | 
			
		||||
 | 
			
		||||
  display_to_direct();
 | 
			
		||||
  GPIOD->ODR = 0xF000;
 | 
			
		||||
  button_init_and_test();
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
  /* Infinite loop */
 | 
			
		||||
  /* USER CODE BEGIN WHILE */
 | 
			
		||||
  while (1) {
 | 
			
		||||
	  WAIT_UNTIL_ALL_BUTTONS_RELEASED;
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
	if (delay_between_runs[current_executor_id] == -1 && buttons_interrupt_enabled)
 | 
			
		||||
		buttons_switch_to_input();
 | 
			
		||||
	else if (delay_between_runs[current_executor_id] != -1 && !buttons_interrupt_enabled)
 | 
			
		||||
		buttons_switch_to_interrupt();
 | 
			
		||||
 | 
			
		||||
	  display_load(display_current_frame);
 | 
			
		||||
	executors[current_executor_id]();
 | 
			
		||||
 | 
			
		||||
	  while (1) {
 | 
			
		||||
		  HAL_Delay(15);
 | 
			
		||||
	if (delay_between_runs[current_executor_id] == -1) {
 | 
			
		||||
		WAIT_UNTIL_CB_PRESSED;
 | 
			
		||||
		HAL_Delay(150);
 | 
			
		||||
		GPIOD->BSRR = 0x1000;
 | 
			
		||||
 | 
			
		||||
		  // go to next report
 | 
			
		||||
		  if (UB || SWT1 || SWT5) {
 | 
			
		||||
			  display_current_frame += 1;
 | 
			
		||||
			  display_current_frame %= LEN(executors)+1;
 | 
			
		||||
			  break;
 | 
			
		||||
		  }
 | 
			
		||||
		WAIT_UNTIL_CB_RELEASED;
 | 
			
		||||
		HAL_Delay(150);
 | 
			
		||||
		GPIOD->BSRR = 0x1000 << 16;
 | 
			
		||||
 | 
			
		||||
		  // go to previous report
 | 
			
		||||
		  else if (SWT3 || SWT4) {
 | 
			
		||||
			  display_current_frame -= 1;
 | 
			
		||||
		if (cleanup_functions[current_executor_id])
 | 
			
		||||
			cleanup_functions[current_executor_id]();
 | 
			
		||||
 | 
			
		||||
			  if ((int) display_current_frame == -1)
 | 
			
		||||
				  display_current_frame = LEN(executors);
 | 
			
		||||
 | 
			
		||||
			  break;
 | 
			
		||||
		  }
 | 
			
		||||
 | 
			
		||||
		  // return to summary frame
 | 
			
		||||
		  else if (SWT2) {
 | 
			
		||||
			  display_current_frame = 0;
 | 
			
		||||
			  break;
 | 
			
		||||
		  }
 | 
			
		||||
	  }
 | 
			
		||||
		switch_to_next_test();
 | 
			
		||||
	} else {
 | 
			
		||||
		HAL_Delay(delay_between_runs[current_executor_id]);
 | 
			
		||||
	}
 | 
			
		||||
    /* USER CODE END WHILE */
 | 
			
		||||
 | 
			
		||||
    /* USER CODE BEGIN 3 */
 | 
			
		||||
@ -284,6 +353,14 @@ void SystemClock_Config(void)
 | 
			
		||||
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 | 
			
		||||
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 | 
			
		||||
 | 
			
		||||
  /** Macro to configure the PLL multiplication factor
 | 
			
		||||
  */
 | 
			
		||||
  __HAL_RCC_PLL_PLLM_CONFIG(16);
 | 
			
		||||
 | 
			
		||||
  /** Macro to configure the PLL clock source
 | 
			
		||||
  */
 | 
			
		||||
  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSI);
 | 
			
		||||
 | 
			
		||||
  /** Configure the main internal regulator output voltage
 | 
			
		||||
  */
 | 
			
		||||
  __HAL_RCC_PWR_CLK_ENABLE();
 | 
			
		||||
@ -295,12 +372,8 @@ void SystemClock_Config(void)
 | 
			
		||||
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
 | 
			
		||||
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 | 
			
		||||
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLM = 16;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLN = 128;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
 | 
			
		||||
  RCC_OscInitStruct.PLL.PLLQ = 4;
 | 
			
		||||
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
@ -310,12 +383,12 @@ void SystemClock_Config(void)
 | 
			
		||||
  */
 | 
			
		||||
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 | 
			
		||||
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 | 
			
		||||
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 | 
			
		||||
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
 | 
			
		||||
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 | 
			
		||||
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
 | 
			
		||||
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;
 | 
			
		||||
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 | 
			
		||||
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 | 
			
		||||
 | 
			
		||||
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
 | 
			
		||||
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
@ -407,6 +480,40 @@ static void MX_I2C1_Init(void)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief I2S2 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_I2S2_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2S2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2S2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2S2_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2S2_Init 1 */
 | 
			
		||||
  hi2s2.Instance = SPI2;
 | 
			
		||||
  hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
 | 
			
		||||
  hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
 | 
			
		||||
  hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
 | 
			
		||||
  hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
 | 
			
		||||
  hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_48K;
 | 
			
		||||
  hi2s2.Init.CPOL = I2S_CPOL_LOW;
 | 
			
		||||
  hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
 | 
			
		||||
  hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
 | 
			
		||||
  if (HAL_I2S_Init(&hi2s2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN I2S2_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2S2_Init 2 */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief SPI1 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
@ -512,20 +619,12 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
 | 
			
		||||
                          |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10|GPIO_PIN_7, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
 | 
			
		||||
                          |GPIO_PIN_15|GPIO_PIN_4|GPIO_PIN_7, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PC3 PC6 PC8 PC9
 | 
			
		||||
                           PC11 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9
 | 
			
		||||
                          |GPIO_PIN_11;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PA0 PA15 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_15;
 | 
			
		||||
@ -542,13 +641,6 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PB10 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_10;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PD11 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_11;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
@ -565,6 +657,12 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PC6 PC8 PC9 PC11 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PB7 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_7;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
@ -588,10 +686,6 @@ void Error_Handler(void)
 | 
			
		||||
{
 | 
			
		||||
  /* USER CODE BEGIN Error_Handler_Debug */
 | 
			
		||||
  /* User can add his own implementation to report the HAL error return state */
 | 
			
		||||
  eth_errorred = 1;
 | 
			
		||||
  return;
 | 
			
		||||
  //goto back_to_life;
 | 
			
		||||
 | 
			
		||||
  __disable_irq();
 | 
			
		||||
  while (1)
 | 
			
		||||
  {
 | 
			
		||||
 | 
			
		||||
@ -208,6 +208,96 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @brief I2S MSP Initialization
 | 
			
		||||
* This function configures the hardware resources used in this example
 | 
			
		||||
* @param hi2s: I2S handle pointer
 | 
			
		||||
* @retval None
 | 
			
		||||
*/
 | 
			
		||||
void HAL_I2S_MspInit(I2S_HandleTypeDef* hi2s)
 | 
			
		||||
{
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
 | 
			
		||||
  if(hi2s->Instance==SPI2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /** Initializes the peripherals clock
 | 
			
		||||
  */
 | 
			
		||||
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
 | 
			
		||||
    PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;
 | 
			
		||||
    PeriphClkInitStruct.PLLI2S.PLLI2SR = 2;
 | 
			
		||||
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
 | 
			
		||||
    {
 | 
			
		||||
      Error_Handler();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_SPI2_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOC_CLK_ENABLE();
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**I2S2 GPIO Configuration
 | 
			
		||||
    PC3     ------> I2S2_SD
 | 
			
		||||
    PB10     ------> I2S2_CK
 | 
			
		||||
    PB12     ------> I2S2_WS
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_3;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | 
			
		||||
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @brief I2S MSP De-Initialization
 | 
			
		||||
* This function freeze the hardware resources used in this example
 | 
			
		||||
* @param hi2s: I2S handle pointer
 | 
			
		||||
* @retval None
 | 
			
		||||
*/
 | 
			
		||||
void HAL_I2S_MspDeInit(I2S_HandleTypeDef* hi2s)
 | 
			
		||||
{
 | 
			
		||||
  if(hi2s->Instance==SPI2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_SPI2_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**I2S2 GPIO Configuration
 | 
			
		||||
    PC3     ------> I2S2_SD
 | 
			
		||||
    PB10     ------> I2S2_CK
 | 
			
		||||
    PB12     ------> I2S2_WS
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3);
 | 
			
		||||
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_12);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN SPI2_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END SPI2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @brief SPI MSP Initialization
 | 
			
		||||
* This function configures the hardware resources used in this example
 | 
			
		||||
 | 
			
		||||
@ -204,7 +204,7 @@ void EXTI0_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
	GPIOD->ODR = 0x1000;
 | 
			
		||||
 | 
			
		||||
	//switch_to_next_test();
 | 
			
		||||
	switch_to_next_test();
 | 
			
		||||
 | 
			
		||||
	for (int i = 300000; i > 0; i--) asm("nop");
 | 
			
		||||
 | 
			
		||||
@ -217,7 +217,7 @@ void EXTI9_5_IRQHandler(void)
 | 
			
		||||
{
 | 
			
		||||
	GPIOD->ODR = 0x1000;
 | 
			
		||||
 | 
			
		||||
	//switch_to_next_test();
 | 
			
		||||
	switch_to_next_test();
 | 
			
		||||
 | 
			
		||||
	for (int i = 300000; i > 0; i--) asm("nop");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@
 | 
			
		||||
C_SRCS += \
 | 
			
		||||
../Core/Src/24AA02E48.c \
 | 
			
		||||
../Core/Src/CS43L22.c \
 | 
			
		||||
../Core/Src/DHT11.c \
 | 
			
		||||
../Core/Src/DNI.c \
 | 
			
		||||
../Core/Src/LIS302DL.c \
 | 
			
		||||
../Core/Src/LSM9DS1.c \
 | 
			
		||||
@ -24,6 +25,7 @@ C_SRCS += \
 | 
			
		||||
OBJS += \
 | 
			
		||||
./Core/Src/24AA02E48.o \
 | 
			
		||||
./Core/Src/CS43L22.o \
 | 
			
		||||
./Core/Src/DHT11.o \
 | 
			
		||||
./Core/Src/DNI.o \
 | 
			
		||||
./Core/Src/LIS302DL.o \
 | 
			
		||||
./Core/Src/LSM9DS1.o \
 | 
			
		||||
@ -41,6 +43,7 @@ OBJS += \
 | 
			
		||||
C_DEPS += \
 | 
			
		||||
./Core/Src/24AA02E48.d \
 | 
			
		||||
./Core/Src/CS43L22.d \
 | 
			
		||||
./Core/Src/DHT11.d \
 | 
			
		||||
./Core/Src/DNI.d \
 | 
			
		||||
./Core/Src/LIS302DL.d \
 | 
			
		||||
./Core/Src/LSM9DS1.d \
 | 
			
		||||
@ -63,7 +66,7 @@ Core/Src/%.o Core/Src/%.su Core/Src/%.cyclo: ../Core/Src/%.c Core/Src/subdir.mk
 | 
			
		||||
clean: clean-Core-2f-Src
 | 
			
		||||
 | 
			
		||||
clean-Core-2f-Src:
 | 
			
		||||
	-$(RM) ./Core/Src/24AA02E48.cyclo ./Core/Src/24AA02E48.d ./Core/Src/24AA02E48.o ./Core/Src/24AA02E48.su ./Core/Src/CS43L22.cyclo ./Core/Src/CS43L22.d ./Core/Src/CS43L22.o ./Core/Src/CS43L22.su ./Core/Src/DNI.cyclo ./Core/Src/DNI.d ./Core/Src/DNI.o ./Core/Src/DNI.su ./Core/Src/LIS302DL.cyclo ./Core/Src/LIS302DL.d ./Core/Src/LIS302DL.o ./Core/Src/LIS302DL.su ./Core/Src/LSM9DS1.cyclo ./Core/Src/LSM9DS1.d ./Core/Src/LSM9DS1.o ./Core/Src/LSM9DS1.su ./Core/Src/MP45DT02.cyclo ./Core/Src/MP45DT02.d ./Core/Src/MP45DT02.o ./Core/Src/MP45DT02.su ./Core/Src/PCA9685.cyclo ./Core/Src/PCA9685.d ./Core/Src/PCA9685.o ./Core/Src/PCA9685.su ./Core/Src/SST25VF016B.cyclo ./Core/Src/SST25VF016B.d ./Core/Src/SST25VF016B.o ./Core/Src/SST25VF016B.su ./Core/Src/lcd.cyclo ./Core/Src/lcd.d ./Core/Src/lcd.o ./Core/Src/lcd.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.cyclo ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.cyclo ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.cyclo ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su
 | 
			
		||||
	-$(RM) ./Core/Src/24AA02E48.cyclo ./Core/Src/24AA02E48.d ./Core/Src/24AA02E48.o ./Core/Src/24AA02E48.su ./Core/Src/CS43L22.cyclo ./Core/Src/CS43L22.d ./Core/Src/CS43L22.o ./Core/Src/CS43L22.su ./Core/Src/DHT11.cyclo ./Core/Src/DHT11.d ./Core/Src/DHT11.o ./Core/Src/DHT11.su ./Core/Src/DNI.cyclo ./Core/Src/DNI.d ./Core/Src/DNI.o ./Core/Src/DNI.su ./Core/Src/LIS302DL.cyclo ./Core/Src/LIS302DL.d ./Core/Src/LIS302DL.o ./Core/Src/LIS302DL.su ./Core/Src/LSM9DS1.cyclo ./Core/Src/LSM9DS1.d ./Core/Src/LSM9DS1.o ./Core/Src/LSM9DS1.su ./Core/Src/MP45DT02.cyclo ./Core/Src/MP45DT02.d ./Core/Src/MP45DT02.o ./Core/Src/MP45DT02.su ./Core/Src/PCA9685.cyclo ./Core/Src/PCA9685.d ./Core/Src/PCA9685.o ./Core/Src/PCA9685.su ./Core/Src/SST25VF016B.cyclo ./Core/Src/SST25VF016B.d ./Core/Src/SST25VF016B.o ./Core/Src/SST25VF016B.su ./Core/Src/lcd.cyclo ./Core/Src/lcd.d ./Core/Src/lcd.o ./Core/Src/lcd.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.cyclo ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.cyclo ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.cyclo ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su
 | 
			
		||||
 | 
			
		||||
.PHONY: clean-Core-2f-Src
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
"./Core/Src/24AA02E48.o"
 | 
			
		||||
"./Core/Src/CS43L22.o"
 | 
			
		||||
"./Core/Src/DHT11.o"
 | 
			
		||||
"./Core/Src/DNI.o"
 | 
			
		||||
"./Core/Src/LIS302DL.o"
 | 
			
		||||
"./Core/Src/LSM9DS1.o"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										618
									
								
								Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										618
									
								
								Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,618 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    stm32f4xx_hal_i2s.h
 | 
			
		||||
  * @author  MCD Application Team
 | 
			
		||||
  * @brief   Header file of I2S HAL module.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * Copyright (c) 2016 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.
 | 
			
		||||
  *
 | 
			
		||||
  * This software is licensed under terms that can be found in the LICENSE file
 | 
			
		||||
  * in the root directory of this software component.
 | 
			
		||||
  * If no LICENSE file comes with this software, it is provided AS-IS.
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Define to prevent recursive inclusion -------------------------------------*/
 | 
			
		||||
#ifndef STM32F4xx_HAL_I2S_H
 | 
			
		||||
#define STM32F4xx_HAL_I2S_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "stm32f4xx_hal_def.h"
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_HAL_Driver
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup I2S
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Exported types ------------------------------------------------------------*/
 | 
			
		||||
/** @defgroup I2S_Exported_Types I2S Exported Types
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief I2S Init structure definition
 | 
			
		||||
  */
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  uint32_t Mode;                /*!< Specifies the I2S operating mode.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_Mode */
 | 
			
		||||
 | 
			
		||||
  uint32_t Standard;            /*!< Specifies the standard used for the I2S communication.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_Standard */
 | 
			
		||||
 | 
			
		||||
  uint32_t DataFormat;          /*!< Specifies the data format for the I2S communication.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_Data_Format */
 | 
			
		||||
 | 
			
		||||
  uint32_t MCLKOutput;          /*!< Specifies whether the I2S MCLK output is enabled or not.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_MCLK_Output */
 | 
			
		||||
 | 
			
		||||
  uint32_t AudioFreq;           /*!< Specifies the frequency selected for the I2S communication.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_Audio_Frequency */
 | 
			
		||||
 | 
			
		||||
  uint32_t CPOL;                /*!< Specifies the idle state of the I2S clock.
 | 
			
		||||
                                     This parameter can be a value of @ref I2S_Clock_Polarity */
 | 
			
		||||
 | 
			
		||||
  uint32_t ClockSource;     /*!< Specifies the I2S Clock Source.
 | 
			
		||||
                                 This parameter can be a value of @ref I2S_Clock_Source */
 | 
			
		||||
  uint32_t FullDuplexMode;  /*!< Specifies the I2S FullDuplex mode.
 | 
			
		||||
                                 This parameter can be a value of @ref I2S_FullDuplex_Mode */
 | 
			
		||||
} I2S_InitTypeDef;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  HAL State structures definition
 | 
			
		||||
  */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  HAL_I2S_STATE_RESET      = 0x00U,  /*!< I2S not yet initialized or disabled                */
 | 
			
		||||
  HAL_I2S_STATE_READY      = 0x01U,  /*!< I2S initialized and ready for use                  */
 | 
			
		||||
  HAL_I2S_STATE_BUSY       = 0x02U,  /*!< I2S internal process is ongoing                    */
 | 
			
		||||
  HAL_I2S_STATE_BUSY_TX    = 0x03U,  /*!< Data Transmission process is ongoing               */
 | 
			
		||||
  HAL_I2S_STATE_BUSY_RX    = 0x04U,  /*!< Data Reception process is ongoing                  */
 | 
			
		||||
  HAL_I2S_STATE_BUSY_TX_RX = 0x05U,  /*!< Data Transmission and Reception process is ongoing */
 | 
			
		||||
  HAL_I2S_STATE_TIMEOUT    = 0x06U,  /*!< I2S timeout state                                  */
 | 
			
		||||
  HAL_I2S_STATE_ERROR      = 0x07U   /*!< I2S error state                                    */
 | 
			
		||||
} HAL_I2S_StateTypeDef;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief I2S handle Structure definition
 | 
			
		||||
  */
 | 
			
		||||
typedef struct __I2S_HandleTypeDef
 | 
			
		||||
{
 | 
			
		||||
  SPI_TypeDef                *Instance;    /*!< I2S registers base address */
 | 
			
		||||
 | 
			
		||||
  I2S_InitTypeDef            Init;         /*!< I2S communication parameters */
 | 
			
		||||
 | 
			
		||||
  uint16_t                   *pTxBuffPtr;  /*!< Pointer to I2S Tx transfer buffer */
 | 
			
		||||
 | 
			
		||||
  __IO uint16_t              TxXferSize;   /*!< I2S Tx transfer size */
 | 
			
		||||
 | 
			
		||||
  __IO uint16_t              TxXferCount;  /*!< I2S Tx transfer Counter */
 | 
			
		||||
 | 
			
		||||
  uint16_t                   *pRxBuffPtr;  /*!< Pointer to I2S Rx transfer buffer */
 | 
			
		||||
 | 
			
		||||
  __IO uint16_t              RxXferSize;   /*!< I2S Rx transfer size */
 | 
			
		||||
 | 
			
		||||
  __IO uint16_t              RxXferCount;  /*!< I2S Rx transfer counter
 | 
			
		||||
                                              (This field is initialized at the
 | 
			
		||||
                                               same value as transfer size at the
 | 
			
		||||
                                               beginning of the transfer and
 | 
			
		||||
                                               decremented when a sample is received
 | 
			
		||||
                                               NbSamplesReceived = RxBufferSize-RxBufferCount) */
 | 
			
		||||
  void (*IrqHandlerISR)(struct __I2S_HandleTypeDef *hi2s);         /*!< I2S function pointer on IrqHandler   */
 | 
			
		||||
 | 
			
		||||
  DMA_HandleTypeDef          *hdmatx;      /*!< I2S Tx DMA handle parameters */
 | 
			
		||||
 | 
			
		||||
  DMA_HandleTypeDef          *hdmarx;      /*!< I2S Rx DMA handle parameters */
 | 
			
		||||
 | 
			
		||||
  __IO HAL_LockTypeDef       Lock;         /*!< I2S locking object */
 | 
			
		||||
 | 
			
		||||
  __IO HAL_I2S_StateTypeDef  State;        /*!< I2S communication state */
 | 
			
		||||
 | 
			
		||||
  __IO uint32_t              ErrorCode;    /*!< I2S Error code
 | 
			
		||||
                                                This parameter can be a value of @ref I2S_Error */
 | 
			
		||||
 | 
			
		||||
#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
  void (* TxCpltCallback)(struct __I2S_HandleTypeDef *hi2s);             /*!< I2S Tx Completed callback          */
 | 
			
		||||
  void (* RxCpltCallback)(struct __I2S_HandleTypeDef *hi2s);             /*!< I2S Rx Completed callback          */
 | 
			
		||||
  void (* TxRxCpltCallback)(struct __I2S_HandleTypeDef *hi2s);           /*!< I2S TxRx Completed callback        */
 | 
			
		||||
  void (* TxHalfCpltCallback)(struct __I2S_HandleTypeDef *hi2s);         /*!< I2S Tx Half Completed callback     */
 | 
			
		||||
  void (* RxHalfCpltCallback)(struct __I2S_HandleTypeDef *hi2s);         /*!< I2S Rx Half Completed callback     */
 | 
			
		||||
  void (* TxRxHalfCpltCallback)(struct __I2S_HandleTypeDef *hi2s);       /*!< I2S TxRx Half Completed callback   */
 | 
			
		||||
  void (* ErrorCallback)(struct __I2S_HandleTypeDef *hi2s);              /*!< I2S Error callback                 */
 | 
			
		||||
  void (* MspInitCallback)(struct __I2S_HandleTypeDef *hi2s);            /*!< I2S Msp Init callback              */
 | 
			
		||||
  void (* MspDeInitCallback)(struct __I2S_HandleTypeDef *hi2s);          /*!< I2S Msp DeInit callback            */
 | 
			
		||||
 | 
			
		||||
#endif  /* USE_HAL_I2S_REGISTER_CALLBACKS */
 | 
			
		||||
} I2S_HandleTypeDef;
 | 
			
		||||
 | 
			
		||||
#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  HAL I2S Callback ID enumeration definition
 | 
			
		||||
  */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  HAL_I2S_TX_COMPLETE_CB_ID             = 0x00U,    /*!< I2S Tx Completed callback ID         */
 | 
			
		||||
  HAL_I2S_RX_COMPLETE_CB_ID             = 0x01U,    /*!< I2S Rx Completed callback ID         */
 | 
			
		||||
  HAL_I2S_TX_RX_COMPLETE_CB_ID          = 0x02U,    /*!< I2S TxRx Completed callback ID       */
 | 
			
		||||
  HAL_I2S_TX_HALF_COMPLETE_CB_ID        = 0x03U,    /*!< I2S Tx Half Completed callback ID    */
 | 
			
		||||
  HAL_I2S_RX_HALF_COMPLETE_CB_ID        = 0x04U,    /*!< I2S Rx Half Completed callback ID    */
 | 
			
		||||
  HAL_I2S_TX_RX_HALF_COMPLETE_CB_ID     = 0x05U,    /*!< I2S TxRx Half Completed callback ID  */
 | 
			
		||||
  HAL_I2S_ERROR_CB_ID                   = 0x06U,    /*!< I2S Error callback ID                */
 | 
			
		||||
  HAL_I2S_MSPINIT_CB_ID                 = 0x07U,    /*!< I2S Msp Init callback ID             */
 | 
			
		||||
  HAL_I2S_MSPDEINIT_CB_ID               = 0x08U     /*!< I2S Msp DeInit callback ID           */
 | 
			
		||||
 | 
			
		||||
} HAL_I2S_CallbackIDTypeDef;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief  HAL I2S Callback pointer definition
 | 
			
		||||
  */
 | 
			
		||||
typedef  void (*pI2S_CallbackTypeDef)(I2S_HandleTypeDef *hi2s); /*!< pointer to an I2S callback function */
 | 
			
		||||
 | 
			
		||||
#endif /* USE_HAL_I2S_REGISTER_CALLBACKS */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Exported constants --------------------------------------------------------*/
 | 
			
		||||
/** @defgroup I2S_Exported_Constants I2S Exported Constants
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
/** @defgroup I2S_Error I2S Error
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define HAL_I2S_ERROR_NONE               (0x00000000U)  /*!< No error                    */
 | 
			
		||||
#define HAL_I2S_ERROR_TIMEOUT            (0x00000001U)  /*!< Timeout error               */
 | 
			
		||||
#define HAL_I2S_ERROR_OVR                (0x00000002U)  /*!< OVR error                   */
 | 
			
		||||
#define HAL_I2S_ERROR_UDR                (0x00000004U)  /*!< UDR error                   */
 | 
			
		||||
#define HAL_I2S_ERROR_DMA                (0x00000008U)  /*!< DMA transfer error          */
 | 
			
		||||
#define HAL_I2S_ERROR_PRESCALER          (0x00000010U)  /*!< Prescaler Calculation error */
 | 
			
		||||
#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
#define HAL_I2S_ERROR_INVALID_CALLBACK   (0x00000020U)  /*!< Invalid Callback error      */
 | 
			
		||||
#endif /* USE_HAL_I2S_REGISTER_CALLBACKS */
 | 
			
		||||
#define HAL_I2S_ERROR_BUSY_LINE_RX       (0x00000040U)  /*!< Busy Rx Line error          */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Mode I2S Mode
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_MODE_SLAVE_TX                (0x00000000U)
 | 
			
		||||
#define I2S_MODE_SLAVE_RX                (SPI_I2SCFGR_I2SCFG_0)
 | 
			
		||||
#define I2S_MODE_MASTER_TX               (SPI_I2SCFGR_I2SCFG_1)
 | 
			
		||||
#define I2S_MODE_MASTER_RX               ((SPI_I2SCFGR_I2SCFG_0 | SPI_I2SCFGR_I2SCFG_1))
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Standard I2S Standard
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_STANDARD_PHILIPS             (0x00000000U)
 | 
			
		||||
#define I2S_STANDARD_MSB                 (SPI_I2SCFGR_I2SSTD_0)
 | 
			
		||||
#define I2S_STANDARD_LSB                 (SPI_I2SCFGR_I2SSTD_1)
 | 
			
		||||
#define I2S_STANDARD_PCM_SHORT           ((SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1))
 | 
			
		||||
#define I2S_STANDARD_PCM_LONG            ((SPI_I2SCFGR_I2SSTD_0 | SPI_I2SCFGR_I2SSTD_1 | SPI_I2SCFGR_PCMSYNC))
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Data_Format I2S Data Format
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_DATAFORMAT_16B               (0x00000000U)
 | 
			
		||||
#define I2S_DATAFORMAT_16B_EXTENDED      (SPI_I2SCFGR_CHLEN)
 | 
			
		||||
#define I2S_DATAFORMAT_24B               ((SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_0))
 | 
			
		||||
#define I2S_DATAFORMAT_32B               ((SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN_1))
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_MCLK_Output I2S MCLK Output
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_MCLKOUTPUT_ENABLE            (SPI_I2SPR_MCKOE)
 | 
			
		||||
#define I2S_MCLKOUTPUT_DISABLE           (0x00000000U)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Audio_Frequency I2S Audio Frequency
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_AUDIOFREQ_192K               (192000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_96K                (96000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_48K                (48000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_44K                (44100U)
 | 
			
		||||
#define I2S_AUDIOFREQ_32K                (32000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_22K                (22050U)
 | 
			
		||||
#define I2S_AUDIOFREQ_16K                (16000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_11K                (11025U)
 | 
			
		||||
#define I2S_AUDIOFREQ_8K                 (8000U)
 | 
			
		||||
#define I2S_AUDIOFREQ_DEFAULT            (2U)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_FullDuplex_Mode I2S FullDuplex Mode
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_FULLDUPLEXMODE_DISABLE       (0x00000000U)
 | 
			
		||||
#define I2S_FULLDUPLEXMODE_ENABLE        (0x00000001U)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Clock_Polarity I2S Clock Polarity
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_CPOL_LOW                     (0x00000000U)
 | 
			
		||||
#define I2S_CPOL_HIGH                    (SPI_I2SCFGR_CKPOL)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Interrupts_Definition I2S Interrupts Definition
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_IT_TXE                       SPI_CR2_TXEIE
 | 
			
		||||
#define I2S_IT_RXNE                      SPI_CR2_RXNEIE
 | 
			
		||||
#define I2S_IT_ERR                       SPI_CR2_ERRIE
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Flags_Definition I2S Flags Definition
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_FLAG_TXE                     SPI_SR_TXE
 | 
			
		||||
#define I2S_FLAG_RXNE                    SPI_SR_RXNE
 | 
			
		||||
 | 
			
		||||
#define I2S_FLAG_UDR                     SPI_SR_UDR
 | 
			
		||||
#define I2S_FLAG_OVR                     SPI_SR_OVR
 | 
			
		||||
#define I2S_FLAG_FRE                     SPI_SR_FRE
 | 
			
		||||
 | 
			
		||||
#define I2S_FLAG_CHSIDE                  SPI_SR_CHSIDE
 | 
			
		||||
#define I2S_FLAG_BSY                     SPI_SR_BSY
 | 
			
		||||
 | 
			
		||||
#define I2S_FLAG_MASK                   (SPI_SR_RXNE\
 | 
			
		||||
                                         | SPI_SR_TXE | SPI_SR_UDR | SPI_SR_OVR | SPI_SR_FRE | SPI_SR_CHSIDE | SPI_SR_BSY)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @defgroup I2S_Clock_Source I2S Clock Source Definition
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||     defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||     defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||     defined(STM32F479xx)
 | 
			
		||||
#define I2S_CLOCK_PLL                    (0x00000000U)
 | 
			
		||||
#define I2S_CLOCK_EXTERNAL               (0x00000001U)
 | 
			
		||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
 | 
			
		||||
          STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||    defined(STM32F413xx) || defined(STM32F423xx)
 | 
			
		||||
#define I2S_CLOCK_PLL                    (0x00000000U)
 | 
			
		||||
#define I2S_CLOCK_EXTERNAL               (0x00000001U)
 | 
			
		||||
#define I2S_CLOCK_PLLR                   (0x00000002U)
 | 
			
		||||
#define I2S_CLOCK_PLLSRC                 (0x00000003U)
 | 
			
		||||
#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx)
 | 
			
		||||
#define I2S_CLOCK_PLLSRC                 (0x00000000U)
 | 
			
		||||
#define I2S_CLOCK_EXTERNAL               (0x00000001U)
 | 
			
		||||
#define I2S_CLOCK_PLLR                   (0x00000002U)
 | 
			
		||||
#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Exported macros -----------------------------------------------------------*/
 | 
			
		||||
/** @defgroup I2S_Exported_macros I2S Exported Macros
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @brief  Reset I2S handle state
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
#define __HAL_I2S_RESET_HANDLE_STATE(__HANDLE__)                do{                                                  \
 | 
			
		||||
                                                                    (__HANDLE__)->State = HAL_I2S_STATE_RESET;       \
 | 
			
		||||
                                                                    (__HANDLE__)->MspInitCallback = NULL;            \
 | 
			
		||||
                                                                    (__HANDLE__)->MspDeInitCallback = NULL;          \
 | 
			
		||||
                                                                  } while(0)
 | 
			
		||||
#else
 | 
			
		||||
#define __HAL_I2S_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2S_STATE_RESET)
 | 
			
		||||
#endif /* USE_HAL_I2S_REGISTER_CALLBACKS */
 | 
			
		||||
 | 
			
		||||
/** @brief  Enable the specified SPI peripheral (in I2S mode).
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_ENABLE(__HANDLE__)    (SET_BIT((__HANDLE__)->Instance->I2SCFGR, SPI_I2SCFGR_I2SE))
 | 
			
		||||
 | 
			
		||||
/** @brief  Disable the specified SPI peripheral (in I2S mode).
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_DISABLE(__HANDLE__) (CLEAR_BIT((__HANDLE__)->Instance->I2SCFGR, SPI_I2SCFGR_I2SE))
 | 
			
		||||
 | 
			
		||||
/** @brief  Enable the specified I2S interrupts.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the interrupt source to enable or disable.
 | 
			
		||||
  *         This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_ENABLE_IT(__HANDLE__, __INTERRUPT__)    (SET_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)))
 | 
			
		||||
 | 
			
		||||
/** @brief  Disable the specified I2S interrupts.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the interrupt source to enable or disable.
 | 
			
		||||
  *         This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__) (CLEAR_BIT((__HANDLE__)->Instance->CR2,(__INTERRUPT__)))
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks if the specified I2S interrupt source is enabled or disabled.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  *         This parameter can be I2S where x: 1, 2, or 3 to select the I2S peripheral.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the I2S interrupt source to check.
 | 
			
		||||
  *          This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval The new state of __IT__ (TRUE or FALSE).
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2\
 | 
			
		||||
                                                              & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks whether the specified I2S flag is set or not.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @param  __FLAG__ specifies the flag to check.
 | 
			
		||||
  *         This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_FLAG_RXNE: Receive buffer not empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_TXE: Transmit buffer empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_UDR: Underrun flag
 | 
			
		||||
  *            @arg I2S_FLAG_OVR: Overrun flag
 | 
			
		||||
  *            @arg I2S_FLAG_FRE: Frame error flag
 | 
			
		||||
  *            @arg I2S_FLAG_CHSIDE: Channel Side flag
 | 
			
		||||
  *            @arg I2S_FLAG_BSY: Busy flag
 | 
			
		||||
  * @retval The new state of __FLAG__ (TRUE or FALSE).
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__))
 | 
			
		||||
 | 
			
		||||
/** @brief Clears the I2S OVR pending flag.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_CLEAR_OVRFLAG(__HANDLE__) do{ \
 | 
			
		||||
                                                __IO uint32_t tmpreg_ovr = 0x00U; \
 | 
			
		||||
                                                tmpreg_ovr = (__HANDLE__)->Instance->DR; \
 | 
			
		||||
                                                tmpreg_ovr = (__HANDLE__)->Instance->SR; \
 | 
			
		||||
                                                UNUSED(tmpreg_ovr); \
 | 
			
		||||
                                              }while(0U)
 | 
			
		||||
/** @brief Clears the I2S UDR pending flag.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_CLEAR_UDRFLAG(__HANDLE__) do{\
 | 
			
		||||
                                                __IO uint32_t tmpreg_udr = 0x00U;\
 | 
			
		||||
                                                tmpreg_udr = ((__HANDLE__)->Instance->SR);\
 | 
			
		||||
                                                UNUSED(tmpreg_udr); \
 | 
			
		||||
                                              }while(0U)
 | 
			
		||||
/** @brief Flush the I2S DR Register.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2S_FLUSH_RX_DR(__HANDLE__)  do{\
 | 
			
		||||
                                                __IO uint32_t tmpreg_dr = 0x00U;\
 | 
			
		||||
                                                tmpreg_dr = ((__HANDLE__)->Instance->DR);\
 | 
			
		||||
                                                UNUSED(tmpreg_dr); \
 | 
			
		||||
                                              }while(0U)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Include I2S Extension module */
 | 
			
		||||
#include "stm32f4xx_hal_i2s_ex.h"
 | 
			
		||||
 | 
			
		||||
/* Exported functions --------------------------------------------------------*/
 | 
			
		||||
/** @addtogroup I2S_Exported_Functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup I2S_Exported_Functions_Group1
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
/* Initialization/de-initialization functions  ********************************/
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
 | 
			
		||||
/* Callbacks Register/UnRegister functions  ***********************************/
 | 
			
		||||
#if (USE_HAL_I2S_REGISTER_CALLBACKS == 1U)
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_RegisterCallback(I2S_HandleTypeDef *hi2s, HAL_I2S_CallbackIDTypeDef CallbackID,
 | 
			
		||||
                                           pI2S_CallbackTypeDef pCallback);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_UnRegisterCallback(I2S_HandleTypeDef *hi2s, HAL_I2S_CallbackIDTypeDef CallbackID);
 | 
			
		||||
#endif /* USE_HAL_I2S_REGISTER_CALLBACKS */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup I2S_Exported_Functions_Group2
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
/* I/O operation functions  ***************************************************/
 | 
			
		||||
/* Blocking mode: Polling */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout);
 | 
			
		||||
 | 
			
		||||
/* Non-Blocking mode: Interrupt */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size);
 | 
			
		||||
void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
 | 
			
		||||
/* Non-Blocking mode: DMA */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size);
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
 | 
			
		||||
/* Callbacks used in non blocking modes (Interrupt and DMA) *******************/
 | 
			
		||||
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup I2S_Exported_Functions_Group3
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
/* Peripheral Control and State functions  ************************************/
 | 
			
		||||
HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Private types -------------------------------------------------------------*/
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* Private constants ---------------------------------------------------------*/
 | 
			
		||||
/* Private macros ------------------------------------------------------------*/
 | 
			
		||||
/** @defgroup I2S_Private_Macros I2S Private Macros
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @brief  Check whether the specified SPI flag is set or not.
 | 
			
		||||
  * @param  __SR__  copy of I2S SR register.
 | 
			
		||||
  * @param  __FLAG__ specifies the flag to check.
 | 
			
		||||
  *         This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_FLAG_RXNE: Receive buffer not empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_TXE: Transmit buffer empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_UDR: Underrun error flag
 | 
			
		||||
  *            @arg I2S_FLAG_OVR: Overrun flag
 | 
			
		||||
  *            @arg I2S_FLAG_CHSIDE: Channel side flag
 | 
			
		||||
  *            @arg I2S_FLAG_BSY: Busy flag
 | 
			
		||||
  * @retval SET or RESET.
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_CHECK_FLAG(__SR__, __FLAG__)         ((((__SR__)\
 | 
			
		||||
                                                    & ((__FLAG__) & I2S_FLAG_MASK)) == ((__FLAG__) & I2S_FLAG_MASK)) ? SET : RESET)
 | 
			
		||||
 | 
			
		||||
/** @brief  Check whether the specified SPI Interrupt is set or not.
 | 
			
		||||
  * @param  __CR2__  copy of I2S CR2 register.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the SPI interrupt source to check.
 | 
			
		||||
  *         This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval SET or RESET.
 | 
			
		||||
  */
 | 
			
		||||
#define I2S_CHECK_IT_SOURCE(__CR2__, __INTERRUPT__)      ((((__CR2__)\
 | 
			
		||||
                                                            & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks if I2S Mode parameter is in allowed range.
 | 
			
		||||
  * @param  __MODE__ specifies the I2S Mode.
 | 
			
		||||
  *         This parameter can be a value of @ref I2S_Mode
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define IS_I2S_MODE(__MODE__) (((__MODE__) == I2S_MODE_SLAVE_TX)  || \
 | 
			
		||||
                               ((__MODE__) == I2S_MODE_SLAVE_RX)  || \
 | 
			
		||||
                               ((__MODE__) == I2S_MODE_MASTER_TX) || \
 | 
			
		||||
                               ((__MODE__) == I2S_MODE_MASTER_RX))
 | 
			
		||||
 | 
			
		||||
#define IS_I2S_STANDARD(__STANDARD__) (((__STANDARD__) == I2S_STANDARD_PHILIPS)   || \
 | 
			
		||||
                                       ((__STANDARD__) == I2S_STANDARD_MSB)       || \
 | 
			
		||||
                                       ((__STANDARD__) == I2S_STANDARD_LSB)       || \
 | 
			
		||||
                                       ((__STANDARD__) == I2S_STANDARD_PCM_SHORT) || \
 | 
			
		||||
                                       ((__STANDARD__) == I2S_STANDARD_PCM_LONG))
 | 
			
		||||
 | 
			
		||||
#define IS_I2S_DATA_FORMAT(__FORMAT__) (((__FORMAT__) == I2S_DATAFORMAT_16B)          || \
 | 
			
		||||
                                        ((__FORMAT__) == I2S_DATAFORMAT_16B_EXTENDED) || \
 | 
			
		||||
                                        ((__FORMAT__) == I2S_DATAFORMAT_24B)          || \
 | 
			
		||||
                                        ((__FORMAT__) == I2S_DATAFORMAT_32B))
 | 
			
		||||
 | 
			
		||||
#define IS_I2S_MCLK_OUTPUT(__OUTPUT__) (((__OUTPUT__) == I2S_MCLKOUTPUT_ENABLE) || \
 | 
			
		||||
                                        ((__OUTPUT__) == I2S_MCLKOUTPUT_DISABLE))
 | 
			
		||||
 | 
			
		||||
#define IS_I2S_AUDIO_FREQ(__FREQ__) ((((__FREQ__) >= I2S_AUDIOFREQ_8K)    && \
 | 
			
		||||
                                      ((__FREQ__) <= I2S_AUDIOFREQ_192K)) || \
 | 
			
		||||
                                     ((__FREQ__) == I2S_AUDIOFREQ_DEFAULT))
 | 
			
		||||
 | 
			
		||||
#define IS_I2S_FULLDUPLEX_MODE(MODE) (((MODE) == I2S_FULLDUPLEXMODE_DISABLE) || \
 | 
			
		||||
                                      ((MODE) == I2S_FULLDUPLEXMODE_ENABLE))
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks if I2S Serial clock steady state parameter is in allowed range.
 | 
			
		||||
  * @param  __CPOL__ specifies the I2S serial clock steady state.
 | 
			
		||||
  *         This parameter can be a value of @ref I2S_Clock_Polarity
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define IS_I2S_CPOL(__CPOL__) (((__CPOL__) == I2S_CPOL_LOW) || \
 | 
			
		||||
                               ((__CPOL__) == I2S_CPOL_HIGH))
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||     defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||     defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||     defined(STM32F479xx)
 | 
			
		||||
#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLL))
 | 
			
		||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx ||
 | 
			
		||||
          STM32F401xC || STM32F401xE || STM32F411xE || STM32F469xx || STM32F479xx */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx)  ||    defined(STM32F412Rx) || defined(STM32F412Cx) || defined (STM32F413xx) ||    defined(STM32F423xx)
 | 
			
		||||
#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLL)      ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLLSRC)   ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLLR))
 | 
			
		||||
#endif /* STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx)
 | 
			
		||||
#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLLSRC)     ||\
 | 
			
		||||
                                   ((CLOCK) == I2S_CLOCK_PLLR))
 | 
			
		||||
#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* STM32F4xx_HAL_I2S_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										183
									
								
								Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_i2s_ex.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,183 @@
 | 
			
		||||
/**
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @file    stm32f4xx_hal_i2s_ex.h
 | 
			
		||||
  * @author  MCD Application Team
 | 
			
		||||
  * @brief   Header file of I2S HAL module.
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  * @attention
 | 
			
		||||
  *
 | 
			
		||||
  * Copyright (c) 2016 STMicroelectronics.
 | 
			
		||||
  * All rights reserved.
 | 
			
		||||
  *
 | 
			
		||||
  * This software is licensed under terms that can be found in the LICENSE file
 | 
			
		||||
  * in the root directory of this software component.
 | 
			
		||||
  * If no LICENSE file comes with this software, it is provided AS-IS.
 | 
			
		||||
  *
 | 
			
		||||
  ******************************************************************************
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Define to prevent recursive inclusion -------------------------------------*/
 | 
			
		||||
#ifndef STM32F4xx_HAL_I2S_EX_H
 | 
			
		||||
#define STM32F4xx_HAL_I2S_EX_H
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Includes ------------------------------------------------------------------*/
 | 
			
		||||
#include "stm32f4xx_hal_def.h"
 | 
			
		||||
 | 
			
		||||
/** @addtogroup STM32F4xx_HAL_Driver
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
#if defined(SPI_I2S_FULLDUPLEX_SUPPORT)
 | 
			
		||||
/** @addtogroup I2SEx I2SEx
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Exported types ------------------------------------------------------------*/
 | 
			
		||||
/* Exported constants --------------------------------------------------------*/
 | 
			
		||||
/* Exported macros -----------------------------------------------------------*/
 | 
			
		||||
/** @defgroup I2SEx_Exported_Macros I2S Extended Exported Macros
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#define I2SxEXT(__INSTANCE__) ((__INSTANCE__) == (SPI2)? (SPI_TypeDef *)(I2S2ext_BASE): (SPI_TypeDef *)(I2S3ext_BASE))
 | 
			
		||||
 | 
			
		||||
/** @brief  Enable or disable the specified I2SExt peripheral.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_ENABLE(__HANDLE__) (I2SxEXT((__HANDLE__)->Instance)->I2SCFGR |= SPI_I2SCFGR_I2SE)
 | 
			
		||||
#define __HAL_I2SEXT_DISABLE(__HANDLE__) (I2SxEXT((__HANDLE__)->Instance)->I2SCFGR &= ~SPI_I2SCFGR_I2SE)
 | 
			
		||||
 | 
			
		||||
/** @brief  Enable or disable the specified I2SExt interrupts.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the interrupt source to enable or disable.
 | 
			
		||||
  *        This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_ENABLE_IT(__HANDLE__, __INTERRUPT__) (I2SxEXT((__HANDLE__)->Instance)->CR2 |= (__INTERRUPT__))
 | 
			
		||||
#define __HAL_I2SEXT_DISABLE_IT(__HANDLE__, __INTERRUPT__) (I2SxEXT((__HANDLE__)->Instance)->CR2 &= ~(__INTERRUPT__))
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks if the specified I2SExt interrupt source is enabled or disabled.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  *         This parameter can be I2S where x: 1, 2, or 3 to select the I2S peripheral.
 | 
			
		||||
  * @param  __INTERRUPT__ specifies the I2S interrupt source to check.
 | 
			
		||||
  *          This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_IT_TXE: Tx buffer empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_RXNE: RX buffer not empty interrupt enable
 | 
			
		||||
  *            @arg I2S_IT_ERR: Error interrupt enable
 | 
			
		||||
  * @retval The new state of __IT__ (TRUE or FALSE).
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((I2SxEXT((__HANDLE__)->Instance)->CR2\
 | 
			
		||||
                                                                 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
 | 
			
		||||
 | 
			
		||||
/** @brief  Checks whether the specified I2SExt flag is set or not.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @param  __FLAG__ specifies the flag to check.
 | 
			
		||||
  *        This parameter can be one of the following values:
 | 
			
		||||
  *            @arg I2S_FLAG_RXNE: Receive buffer not empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_TXE: Transmit buffer empty flag
 | 
			
		||||
  *            @arg I2S_FLAG_UDR: Underrun flag
 | 
			
		||||
  *            @arg I2S_FLAG_OVR: Overrun flag
 | 
			
		||||
  *            @arg I2S_FLAG_FRE: Frame error flag
 | 
			
		||||
  *            @arg I2S_FLAG_CHSIDE: Channel Side flag
 | 
			
		||||
  *            @arg I2S_FLAG_BSY: Busy flag
 | 
			
		||||
  * @retval The new state of __FLAG__ (TRUE or FALSE).
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_GET_FLAG(__HANDLE__, __FLAG__) (((I2SxEXT((__HANDLE__)->Instance)->SR) & (__FLAG__)) == (__FLAG__))
 | 
			
		||||
 | 
			
		||||
/** @brief Clears the I2SExt OVR pending flag.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_CLEAR_OVRFLAG(__HANDLE__) do{                                                 \
 | 
			
		||||
                                                   __IO uint32_t tmpreg_ovr = 0x00U;                \
 | 
			
		||||
                                                   tmpreg_ovr = I2SxEXT((__HANDLE__)->Instance)->DR;\
 | 
			
		||||
                                                   tmpreg_ovr = I2SxEXT((__HANDLE__)->Instance)->SR;\
 | 
			
		||||
                                                   UNUSED(tmpreg_ovr);                              \
 | 
			
		||||
                                                  }while(0U)
 | 
			
		||||
/** @brief Clears the I2SExt UDR pending flag.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_CLEAR_UDRFLAG(__HANDLE__) do{                                                 \
 | 
			
		||||
                                                   __IO uint32_t tmpreg_udr = 0x00U;                \
 | 
			
		||||
                                                   tmpreg_udr = I2SxEXT((__HANDLE__)->Instance)->SR;\
 | 
			
		||||
                                                   UNUSED(tmpreg_udr);                              \
 | 
			
		||||
                                                  }while(0U)
 | 
			
		||||
/** @brief Flush the I2S and I2SExt DR Registers.
 | 
			
		||||
  * @param  __HANDLE__ specifies the I2S Handle.
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
#define __HAL_I2SEXT_FLUSH_RX_DR(__HANDLE__) do{                                                    \
 | 
			
		||||
                                                   __IO uint32_t tmpreg_dr = 0x00U;                 \
 | 
			
		||||
                                                   tmpreg_dr = I2SxEXT((__HANDLE__)->Instance)->DR; \
 | 
			
		||||
                                                   tmpreg_dr = ((__HANDLE__)->Instance->DR);        \
 | 
			
		||||
                                                   UNUSED(tmpreg_dr);                               \
 | 
			
		||||
                                                  }while(0U)
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Exported functions --------------------------------------------------------*/
 | 
			
		||||
/** @addtogroup I2SEx_Exported_Functions I2S Extended Exported Functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/** @addtogroup I2SEx_Exported_Functions_Group1 I2S Extended IO operation functions
 | 
			
		||||
  * @{
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Extended features functions *************************************************/
 | 
			
		||||
/* Blocking mode: Polling */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData,
 | 
			
		||||
                                            uint16_t Size, uint32_t Timeout);
 | 
			
		||||
/* Non-Blocking mode: Interrupt */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData,
 | 
			
		||||
                                               uint16_t Size);
 | 
			
		||||
/* Non-Blocking mode: DMA */
 | 
			
		||||
HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData,
 | 
			
		||||
                                                uint16_t Size);
 | 
			
		||||
/* I2S IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */
 | 
			
		||||
void HAL_I2SEx_FullDuplex_IRQHandler(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2SEx_TxRxHalfCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
void HAL_I2SEx_TxRxCpltCallback(I2S_HandleTypeDef *hi2s);
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
/* Private types -------------------------------------------------------------*/
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
/* Private constants ---------------------------------------------------------*/
 | 
			
		||||
/* Private macros ------------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
/* Private functions ---------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#endif /* SPI_I2S_FULLDUPLEX_SUPPORT */
 | 
			
		||||
/**
 | 
			
		||||
  * @}
 | 
			
		||||
  */
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /* STM32F4xx_HAL_I2S_EX_H */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2092
									
								
								Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2092
									
								
								Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1131
									
								
								Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1131
									
								
								Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										109
									
								
								test1.ioc
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								test1.ioc
									
									
									
									
									
								
							@ -12,51 +12,62 @@ CAD.pinconfig=
 | 
			
		||||
CAD.provider=
 | 
			
		||||
File.Version=6
 | 
			
		||||
GPIO.groupedBy=Group By Peripherals
 | 
			
		||||
I2S2.AudioFreq=I2S_AUDIOFREQ_48K
 | 
			
		||||
I2S2.DataFormat=I2S_DATAFORMAT_16B
 | 
			
		||||
I2S2.ErrorAudioFreq=-0.79 %
 | 
			
		||||
I2S2.FullDuplexMode=I2S_FULLDUPLEXMODE_DISABLE
 | 
			
		||||
I2S2.IPParameters=Instance,VirtualMode,FullDuplexMode,RealAudioFreq,ErrorAudioFreq,Mode,DataFormat,AudioFreq
 | 
			
		||||
I2S2.Instance=SPI$Index
 | 
			
		||||
I2S2.Mode=I2S_MODE_MASTER_RX
 | 
			
		||||
I2S2.RealAudioFreq=47.619 KHz
 | 
			
		||||
I2S2.VirtualMode=I2S_MODE_MASTER
 | 
			
		||||
KeepUserPlacement=false
 | 
			
		||||
Mcu.CPN=STM32F407VGT6
 | 
			
		||||
Mcu.Family=STM32F4
 | 
			
		||||
Mcu.IP0=ADC1
 | 
			
		||||
Mcu.IP1=I2C1
 | 
			
		||||
Mcu.IP2=NVIC
 | 
			
		||||
Mcu.IP3=RCC
 | 
			
		||||
Mcu.IP4=SPI1
 | 
			
		||||
Mcu.IP5=SYS
 | 
			
		||||
Mcu.IP6=TIM2
 | 
			
		||||
Mcu.IPNb=7
 | 
			
		||||
Mcu.IP2=I2S2
 | 
			
		||||
Mcu.IP3=NVIC
 | 
			
		||||
Mcu.IP4=RCC
 | 
			
		||||
Mcu.IP5=SPI1
 | 
			
		||||
Mcu.IP6=SYS
 | 
			
		||||
Mcu.IP7=TIM2
 | 
			
		||||
Mcu.IPNb=8
 | 
			
		||||
Mcu.Name=STM32F407V(E-G)Tx
 | 
			
		||||
Mcu.Package=LQFP100
 | 
			
		||||
Mcu.Pin0=PC3
 | 
			
		||||
Mcu.Pin1=PA0-WKUP
 | 
			
		||||
Mcu.Pin10=PE15
 | 
			
		||||
Mcu.Pin11=PB10
 | 
			
		||||
Mcu.Pin12=PD11
 | 
			
		||||
Mcu.Pin13=PD12
 | 
			
		||||
Mcu.Pin14=PD13
 | 
			
		||||
Mcu.Pin15=PD14
 | 
			
		||||
Mcu.Pin16=PD15
 | 
			
		||||
Mcu.Pin17=PC6
 | 
			
		||||
Mcu.Pin18=PC8
 | 
			
		||||
Mcu.Pin19=PC9
 | 
			
		||||
Mcu.Pin12=PB12
 | 
			
		||||
Mcu.Pin13=PD11
 | 
			
		||||
Mcu.Pin14=PD12
 | 
			
		||||
Mcu.Pin15=PD13
 | 
			
		||||
Mcu.Pin16=PD14
 | 
			
		||||
Mcu.Pin17=PD15
 | 
			
		||||
Mcu.Pin18=PC6
 | 
			
		||||
Mcu.Pin19=PC8
 | 
			
		||||
Mcu.Pin2=PA5
 | 
			
		||||
Mcu.Pin20=PA15
 | 
			
		||||
Mcu.Pin21=PC11
 | 
			
		||||
Mcu.Pin22=PD4
 | 
			
		||||
Mcu.Pin23=PD7
 | 
			
		||||
Mcu.Pin24=PB4
 | 
			
		||||
Mcu.Pin25=PB5
 | 
			
		||||
Mcu.Pin26=PB6
 | 
			
		||||
Mcu.Pin27=PB7
 | 
			
		||||
Mcu.Pin28=PB9
 | 
			
		||||
Mcu.Pin29=VP_SYS_VS_Systick
 | 
			
		||||
Mcu.Pin20=PC9
 | 
			
		||||
Mcu.Pin21=PA15
 | 
			
		||||
Mcu.Pin22=PC11
 | 
			
		||||
Mcu.Pin23=PD4
 | 
			
		||||
Mcu.Pin24=PD7
 | 
			
		||||
Mcu.Pin25=PB4
 | 
			
		||||
Mcu.Pin26=PB5
 | 
			
		||||
Mcu.Pin27=PB6
 | 
			
		||||
Mcu.Pin28=PB7
 | 
			
		||||
Mcu.Pin29=PB9
 | 
			
		||||
Mcu.Pin3=PB1
 | 
			
		||||
Mcu.Pin30=VP_TIM2_VS_ClockSourceINT
 | 
			
		||||
Mcu.Pin30=VP_SYS_VS_Systick
 | 
			
		||||
Mcu.Pin31=VP_TIM2_VS_ClockSourceINT
 | 
			
		||||
Mcu.Pin4=PE7
 | 
			
		||||
Mcu.Pin5=PE10
 | 
			
		||||
Mcu.Pin6=PE11
 | 
			
		||||
Mcu.Pin7=PE12
 | 
			
		||||
Mcu.Pin8=PE13
 | 
			
		||||
Mcu.Pin9=PE14
 | 
			
		||||
Mcu.PinsNb=31
 | 
			
		||||
Mcu.PinsNb=32
 | 
			
		||||
Mcu.ThirdPartyNb=0
 | 
			
		||||
Mcu.UserConstants=
 | 
			
		||||
Mcu.UserName=STM32F407VGTx
 | 
			
		||||
@ -81,10 +92,11 @@ PA5.Mode=Full_Duplex_Master
 | 
			
		||||
PA5.Signal=SPI1_SCK
 | 
			
		||||
PB1.Locked=true
 | 
			
		||||
PB1.Signal=ADCx_IN9
 | 
			
		||||
PB10.GPIOParameters=GPIO_Speed
 | 
			
		||||
PB10.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
 | 
			
		||||
PB10.Locked=true
 | 
			
		||||
PB10.Signal=GPIO_Output
 | 
			
		||||
PB10.Mode=Half_Duplex_Master
 | 
			
		||||
PB10.Signal=I2S2_CK
 | 
			
		||||
PB12.Mode=Half_Duplex_Master
 | 
			
		||||
PB12.Signal=I2S2_WS
 | 
			
		||||
PB4.Locked=true
 | 
			
		||||
PB4.Mode=Full_Duplex_Master
 | 
			
		||||
PB4.Signal=SPI1_MISO
 | 
			
		||||
@ -101,7 +113,8 @@ PB9.Signal=I2C1_SDA
 | 
			
		||||
PC11.Locked=true
 | 
			
		||||
PC11.Signal=GPIO_Input
 | 
			
		||||
PC3.Locked=true
 | 
			
		||||
PC3.Signal=GPIO_Input
 | 
			
		||||
PC3.Mode=Half_Duplex_Master
 | 
			
		||||
PC3.Signal=I2S2_SD
 | 
			
		||||
PC6.Locked=true
 | 
			
		||||
PC6.Signal=GPIO_Input
 | 
			
		||||
PC8.Locked=true
 | 
			
		||||
@ -169,43 +182,37 @@ ProjectManager.ToolChainLocation=
 | 
			
		||||
ProjectManager.UAScriptAfterPath=
 | 
			
		||||
ProjectManager.UAScriptBeforePath=
 | 
			
		||||
ProjectManager.UnderRoot=true
 | 
			
		||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_ETH_Init-ETH-false-HAL-true
 | 
			
		||||
RCC.48MHZClocksFreq_Value=32000000
 | 
			
		||||
RCC.AHBFreq_Value=32000000
 | 
			
		||||
RCC.APB1CLKDivider=RCC_HCLK_DIV4
 | 
			
		||||
RCC.APB1Freq_Value=8000000
 | 
			
		||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_TIM2_Init-TIM2-false-HAL-true,7-MX_I2S2_Init-I2S2-false-HAL-true
 | 
			
		||||
RCC.AHBFreq_Value=16000000
 | 
			
		||||
RCC.APB1Freq_Value=16000000
 | 
			
		||||
RCC.APB1TimFreq_Value=16000000
 | 
			
		||||
RCC.APB2CLKDivider=RCC_HCLK_DIV4
 | 
			
		||||
RCC.APB2Freq_Value=8000000
 | 
			
		||||
RCC.APB2Freq_Value=16000000
 | 
			
		||||
RCC.APB2TimFreq_Value=16000000
 | 
			
		||||
RCC.CortexFreq_Value=32000000
 | 
			
		||||
RCC.EthernetFreq_Value=32000000
 | 
			
		||||
RCC.FCLKCortexFreq_Value=32000000
 | 
			
		||||
RCC.CortexFreq_Value=16000000
 | 
			
		||||
RCC.EthernetFreq_Value=16000000
 | 
			
		||||
RCC.FCLKCortexFreq_Value=16000000
 | 
			
		||||
RCC.FamilyName=M
 | 
			
		||||
RCC.HCLKFreq_Value=32000000
 | 
			
		||||
RCC.HCLKFreq_Value=16000000
 | 
			
		||||
RCC.HSE_VALUE=25000000
 | 
			
		||||
RCC.HSI_VALUE=16000000
 | 
			
		||||
RCC.I2SClocksFreq_Value=96000000
 | 
			
		||||
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLN,PLLP,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
 | 
			
		||||
RCC.IPParameters=AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
 | 
			
		||||
RCC.LSE_VALUE=32768
 | 
			
		||||
RCC.LSI_VALUE=32000
 | 
			
		||||
RCC.MCO2PinFreq_Value=32000000
 | 
			
		||||
RCC.PLLCLKFreq_Value=32000000
 | 
			
		||||
RCC.PLLN=128
 | 
			
		||||
RCC.PLLP=RCC_PLLP_DIV4
 | 
			
		||||
RCC.PLLQCLKFreq_Value=32000000
 | 
			
		||||
RCC.MCO2PinFreq_Value=16000000
 | 
			
		||||
RCC.PLLCLKFreq_Value=96000000
 | 
			
		||||
RCC.PLLQCLKFreq_Value=48000000
 | 
			
		||||
RCC.RTCFreq_Value=32000
 | 
			
		||||
RCC.RTCHSEDivFreq_Value=12500000
 | 
			
		||||
RCC.SYSCLKFreq_VALUE=32000000
 | 
			
		||||
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
 | 
			
		||||
RCC.SYSCLKFreq_VALUE=16000000
 | 
			
		||||
RCC.VCOI2SOutputFreq_Value=192000000
 | 
			
		||||
RCC.VCOInputFreq_Value=1000000
 | 
			
		||||
RCC.VCOOutputFreq_Value=128000000
 | 
			
		||||
RCC.VCOOutputFreq_Value=192000000
 | 
			
		||||
RCC.VcooutputI2S=96000000
 | 
			
		||||
SH.ADCx_IN9.0=ADC1_IN9,IN9
 | 
			
		||||
SH.ADCx_IN9.ConfNb=1
 | 
			
		||||
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16
 | 
			
		||||
SPI1.CalculateBaudRate=500.0 KBits/s
 | 
			
		||||
SPI1.CalculateBaudRate=1000.0 KBits/s
 | 
			
		||||
SPI1.Direction=SPI_DIRECTION_2LINES
 | 
			
		||||
SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
 | 
			
		||||
SPI1.Mode=SPI_MODE_MASTER
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user